| Age | Commit message (Collapse) | Author |
|
|
|
- Add SQLite storage for tool traces (Omni/Ava/Trace.hs)
- Add web server to serve trace viewer (Omni/Ava/Web.hs)
- Add HTML/CSS/JS trace viewer UI (Omni/Ava/Web/trace.html)
- Integrate trace storage into Engine.hs tool execution callback
- Add trace links to Telegram responses when AVA_WEB_URL is set
- Configure Tailscale Funnel for public access
- Fix pre-push hook variable scope bug
- Add direnv, bash, nix to Ava service PATH
- Add mustache dep to Ava.hs for template rendering
Epic: t-272
|
|
- Telegram.hs: add loadTelegramSystemPrompt with fallback
- Subagent.hs: add loadSystemPromptForRole with fallback
- Coder.hs: add loadCoderSystemPrompt with fallback
- Ava.nix: add tmpfiles rules for /home/ava/prompts/
- Prompts.hs: fix test to expect .mustache extension
Templates loaded at runtime from $AVA_DATA_ROOT/prompts/.
Falls back to hardcoded prompts if templates not found.
Amp-Thread-ID: https://ampcode.com/threads/T-019b3878-73be-77ec-97cc-d092a28d211e
Co-authored-by: Amp <amp@ampcode.com>
|
|
- Add promptsDir to Paths.hs for $AVA_DATA_ROOT/prompts/
- Create Omni.Agent.Prompts module with:
- Mustache template loading and rendering
- Automatic partial resolution via automaticCompile
- Frontmatter/metadata parsing for list command
- Create omni-agent-prompt CLI for previewing prompts:
- list: show all available prompts
- render: render prompt with --var and --json context
- Prompts use .mustache extension for automaticCompile compatibility
- Partials referenced with full extension: {{> shared/memory.mustache}}
|
|
- Add AuditLog import to Telegram.hs
- Call writeAvaLog for user messages in both handleEngagement paths
- Call writeAvaLog for assistant responses
- Add logs directories to Ava.nix tmpfiles rules
|
|
- Add direnv to ava's PATH via wrapper
- Create .bashrc with direnv hook on activation
|
|
|
|
|
|
|
|
- Add chat_history table with embeddings in memory.db
- Add saveChatHistoryEntry for live message ingestion
- Add searchChatHistorySemantic for vector similarity search
- Update search_chat_history tool to use semantic search
- Add backfill command: run.sh Omni/Agent/Memory.hs backfill
- Add stats command: run.sh Omni/Agent/Memory.hs stats
- Change default memory.db path to ~/memory.db
- Wire Telegram message handling to save to chat_history async
|
|
Allows Ava to search her conversation logs for past discussions.
Searches UserMessage/AssistantMessage events with case-insensitive
matching, configurable days_back (default 7) and max_results (default 20).
|
|
|
|
Previously used 'enable --now' which only starts stopped services.
Now explicitly calls 'restart' to ensure running services pick up new versions.
|
|
|
|
The coder role no longer requires task_id, only namespace.
|
|
|
|
- Strengthen Telegram MarkdownV2 formatting guidance in Ava's system prompt
- Add DNS record beryl.bensima.com -> 100.127.197.132 (Tailscale IP)
- Modify push.sh to detect local deploys and skip SSH
- Add Tailscale hostname fallback when domain is unreachable
|
|
Remove task_id requirement and all jr task CLI calls. The Coder subagent
now only requires namespace and task description - no external task
tracking needed.
Changes:
- Remove coderTaskId from CoderConfig
- Remove jr task show/update/comment calls
- Commit message uses namespace prefix instead of task ID
- Recovery phase just reverts git, no task comment
- Subagent.hs only validates namespace for Coder role
|
|
Security improvement: subagents now require explicit user confirmation via
Telegram inline buttons, preventing the agent from bypassing approval.
Changes:
- Add InlineKeyboardMarkup, InlineKeyboardButton, CallbackQuery types
- Add parseCallbackQuery for handling button presses
- Add sendMessageWithKeyboard and answerCallbackQuery API functions
- Add PendingSpawn registry for tracking unconfirmed spawn requests
- Add spawnSubagentToolWithApproval that sends approval buttons
- Add handleCallbackQuery to process approve/reject button clicks
- Add approveAndSpawnSubagent and rejectPendingSpawn functions
Flow:
1. Agent calls spawn_subagent → creates pending request
2. User receives message with ✅ Approve / ❌ Reject buttons
3. Button click (outside agent loop) spawns or cancels
4. Pending requests expire after 10 minutes
|
|
- Add audio player to preview episode quality
- Restructure pricing and signup as side-by-side hero
- Add 'Sound Familiar?' problem statement section
- Add FAQ section answering common questions
- Remove redundant social proof section
- Improve visual hierarchy and call-to-action flow
|
|
- Add global subagent registry to track running handles by ID
- Modify executeSpawnSubagent to use spawnSubagentAsync and return immediately
- Add check_subagent tool for querying status or getting results
- Export subagentTools convenience function with both tools
- Update Telegram.hs to use subagentTools instead of just spawnSubagentTool
Ava can now spawn subagents in the background and continue
conversations while checking on progress via check_subagent.
|
|
|
|
- Add goatcounter NixOS service to Biz.nix (SQLite backend, port 8081)
- Add tracking script to UI.py PageLayout component
- Configure for proxy mode (behind Caddy)
|
|
Based on Anthropic's effective harnesses research.
New modules:
- Omni/Agent/AuditLog.hs: JSONL audit logging with SubagentId linking
- Omni/Agent/Tools/AvaLogs.hs: Tool for Ava to query her own logs
- Omni/Agent/Subagent/HARDENING.md: Design documentation
Key features:
- SubagentHandle with TVar status for async execution and polling
- spawnSubagentAsync, querySubagentStatus, waitSubagent, cancelSubagent
- User confirmation: spawn_subagent requires confirmed=true after approval
- Audit logs stored in $AVA_DATA_ROOT/logs/{ava,subagents}/
- CLI: ava logs [--last=N] [<subagent_id>]
- read_ava_logs tool for Ava self-diagnosis
Tasks: t-267, t-268, t-269, t-270, t-271
|
|
- Wrap ava binary with Python (requests, httpx, pandas, etc.)
- Add CLI tools: curl, pandoc, ffmpeg, imagemagick, csvkit
- Add local whisper-cli fallback when OPENAI_API_KEY unavailable
Amp-Thread-ID: https://ampcode.com/threads/T-019b2dc2-36e0-75e1-90c1-622901fc9847
Co-authored-by: Amp <amp@ampcode.com>
|
|
|
|
- Add LineBuffering to stdout/stderr in Ava.hs
- Add StandardOutput/StandardError=journal to systemd service
|
|
|
|
- Add Omni.Agent.Paths module for configurable AVA_DATA_ROOT
- Create ava Linux user in Users.nix with SSH key
- Add systemd service in Beryllium/Ava.nix with graceful shutdown
- Update Skills.hs and Outreach.hs to use configurable paths
- Add startup logging of resolved paths in Telegram.hs
- Create migration script for moving data from _/var/ava to /home/ava
- Add deployment documentation in Beryllium/AVA.md
In dev: AVA_DATA_ROOT unset uses _/var/ava/
In prod: AVA_DATA_ROOT=/home/ava via systemd
Amp-Thread-ID: https://ampcode.com/threads/T-019b2d7e-bd88-7355-8133-275c65157aaf
Co-authored-by: Amp <amp@ampcode.com>
|
|
Enables orchestrator to spawn specialized subagents for focused tasks:
- WebCrawler: web search + page reading (haiku, fast)
- CodeReviewer: code analysis tools (sonnet, thorough)
- DataExtractor: structured data extraction (haiku)
- Researcher: combined web + codebase research (sonnet)
Key features:
- spawn_subagent tool with role-based tool selection
- Per-subagent resource limits (timeout, cost, tokens)
- Structured output with citations (claim, source_url, quote)
- Separate API keys for OpenRouter vs Kagi
- Efficiency-focused system prompts
Defaults: 200k tokens, $1.00 cost cap, 600s timeout, 20 iterations
|
|
Homepage changes:
- New marketing-focused landing page for logged-out users
- Hero: 'Your Reading List, as a Podcast' with clear value prop
- How It Works: 3-step process cards (paste URL, convert, listen)
- Social proof: 'Join others' section with public feed
- Login form moved below social proof for better conversion flow
Dark mode fixes:
- Remove bg-light from Current Plan card on /account page
- Remove bg-white from metrics card headers on /admin/metrics
Layout improvements:
- Stack metrics tables vertically (full-width) instead of horizontal
- Add spacing between metric cards for better readability
|
|
Wrap parser chains in parentheses to fix compilation errors from
incorrect use of </ operator.
|
|
The deployer compared its in-memory stateServices map to decide if a
service needed restarting. When the deployer restarted, this state was
lost, causing it to think services were 'already at' the desired path
when they were actually running old code.
Changes:
- Add getRunningStorePath to Systemd module to read actual store path
- Update deployService to query systemd instead of stale in-memory state
- Add DerivingStrategies extension to Deployer.hs
|
|
|
|
- Systemd: use list comprehension instead of if-then-else
- Manifest: use </> operator, replace case with maybe
- Deployer: use newtype, use flip removeService
- Caddy: use newtype for single-field types
|
|
- Create Omni/Agent/Skills.hs with skill loader and tools
- Skills follow Claude Skills format (SKILL.md + scripts/references/assets)
- Directory structure: _/var/ava/skills/{shared,<user>}/
- Three tools: skill, list_skills, publish_skill
- Users can publish private skills to shared
- Integrate skills tools into Telegram bot
- Create skill-creator meta-skill at _/var/ava/skills/shared/skill-creator/
|
|
Added retry with backoff, parallel proccessing, editing pages down to main
content, summarization with haiku. It's so much faster and more reliable
now. Plus improved the logging system and distangled the status UI bar from the
logging module.
|
|
- Rename Omni/Bot.hs to Omni/Ava.hs
- Delete Omni/Bot.scm (unused Guile version)
- Remove cost limit (was 10 cents, now 0)
- Increase max iterations from 10 to 50
|
|
- Add Omni/Deploy/ with Manifest, Deployer, Systemd, Caddy modules
- Manifest CLI: show, update, add-service, list, rollback commands
- Deployer: polls S3 manifest, pulls closures, manages systemd units
- Caddy integration for dynamic reverse proxy routes
- bild: auto-cache to S3, outputs STORE_PATH for push.sh
- push.sh: supports both NixOS and service deploys
- Biz.nix: simplified to base OS + deployer only
- Services (podcastitlater-web/worker) now deployer-managed
- Documentation: README.md with operations guide
|
|
python_exec, http_get/post, outreach_*, feedback_list, and read_file
now require isBenAuthorized check, matching email/hledger pattern.
|
|
- Add feedback table with migration in Core.py
- Add FeedbackForm and FeedbackPage UI components
- Add /feedback GET/POST routes and /api/feedback JSON endpoint
- Add admin feedback view at /admin/feedback
- Create Omni/Agent/Tools/Feedback.hs with feedback_list tool
- Wire feedback tool into Telegram agent
|
|
- Add emailSendTool to Email.hs for sending approved drafts
- Add sendApprovedEmail function that checks draft status
- Use Network.Mail.Mime.simpleMail' with SMTP.sendMail
- Integrate with Outreach module to verify approval and mark sent
- Add tests for new tool
|
|
- Import Omni.Agent.Tools in Telegram.hs
- Add readFileTool to Ava's tool list
- Add podcastitlater context section to system prompt with key file paths
|
|
The haiku-based splitting was modifying message content. Replace
with deterministic paragraph-based splitting that preserves the
original text exactly.
|
|
- Create Omni/Agent/Tools/Outreach.hs with tools
- Drafts stored in _/var/ava/outreach/{pending,approved,...}
- Add Telegram commands: /review, /approve, /reject, /queue
- Integrate outreach tools into agent's tool list
Amp-Thread-ID: https://ampcode.com/threads/T-019b202c-2156-74db-aa4a-e0a2f4397fbb
Co-authored-by: Amp <amp@ampcode.com>
|
|
- Create Omni/Agent/Tools/Http.hs with http_get and http_post tools
- Support headers, query params, JSON body, 30s timeout
- Return structured JSON with status, headers, body
- Add 9 unit tests including real HTTP calls to httpbin.org
- Wire tools into Telegram agent's tool list
Completes t-265.2
|
|
- Create Omni/Agent/Tools/Python.hs with python_exec tool
- Execute Python snippets via subprocess with 30s default timeout
- Return structured JSON with stdout, stderr, exit_code
- Add 8 unit tests covering print, imports, errors, timeout
- Wire tool into Telegram agent's tool list
Completes t-265.1
|
|
- Replace openssl s_client with HaskellNet/HaskellNet-SSL for proper
IMAP client support (better protocol handling, no manual parsing)
- Add HaskellNet deps to Haskell.nix with doJailbreak for version bounds
- Fix lost messages: sendMessageReturningId now throws on API errors
instead of returning Nothing (which was incorrectly treated as success)
- Auto-retry markdown parse errors as plain text
- Hardcode benChatId for reliable email check loop startup
|
|
- New Omni/Agent/Tools/Hledger.hs with 5 tools:
- hledger_balance: query account balances
- hledger_register: show transaction history
- hledger_add: create new transactions
- hledger_income_statement: income vs expenses
- hledger_balance_sheet: net worth view
- All tools support currency parameter (default: USD)
- Balance, register, income_statement support period parameter
- Period uses hledger syntax (thismonth, 2024, from X to Y)
- Shell escaping fixed for multi-word period strings
- Authorization: only Ben and Kate get hledger tools
- Max iterations increased from 5 to 10
- Transactions written to ~/fund/telegram-transactions.journal
|
|
|