Skip to content

✨ feat: multi-user × multi-agent support#61

Merged
vaayne merged 70 commits intomainfrom
feat/multi-user-agent
Mar 17, 2026
Merged

✨ feat: multi-user × multi-agent support#61
vaayne merged 70 commits intomainfrom
feat/multi-user-agent

Conversation

@vaayne
Copy link
Copy Markdown
Owner

@vaayne vaayne commented Mar 16, 2026

Summary

Replace anna's single-user/single-agent architecture with N×N multi-user × multi-agent support.

  • DB consolidation: Single anna.db replaces config.yaml, state.yaml, and memory.db. 7 new tables (providers, agents, channels, users, settings, chat_agents, user_agent_memory) with normalized schema.
  • Config Store: DB-backed config.Store interface replaces YAML config loading. anna onboard seeds defaults and opens admin UI.
  • Multi-agent: PoolManager manages one Pool per enabled agent with per-agent workspace isolation, runner factory, and skills.
  • Multi-user: User resolution from platform identity, agent routing (DM → user default, group → chat_agents, fallback → first enabled), agent-scoped session keys.
  • Per-user memory: user_agent_memory table + user_memory tool replaces shared SOUL.md/USER.md files. System prompt composed from DB fields.
  • Agent switching: /agent Telegram command for DM/group agent selection. --agent CLI flag.
  • Admin panel: REST API (internal/admin/) + Alpine.js SPA for full CRUD of providers, agents, channels, users, sessions, scheduler, settings. Available via anna onboard and anna gateway --admin-port.
  • Scheduler: Jobs include agent_id/user_id, routed to correct agent pool via PoolManager.

96 files changed, 6270 insertions, 3279 deletions across 6 phases (44 commits).

Test plan

  • All 21 packages pass go test -race (unit tests)
  • Pre-existing integration tests (require API key) unchanged
  • New tests: identity resolution, session keys, user memory store/tool, admin API CRUD
  • Manual: anna onboard end-to-end on fresh ANNA_HOME
  • Manual: Telegram /agent switching between agents
  • Manual: anna chat --agent <name> uses correct agent identity
  • Manual: per-user memory isolation across users

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

ch := channelForChat(c)
selected, err := b.cmd.ModelSwitchByName(ch, name)

P1 Badge Route Telegram model switches to resolved agent pool

/model uses channelForChat(c) with b.cmd, but b.cmd is initialized against the fallback pool in New(), not the per-message pool returned by resolvePool. In chats routed to a non-default agent (DM default-agent override or group chat_agents mapping), this makes model switches rotate/update the wrong pool while reporting success, so subsequent replies from the routed agent keep using the old model.

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread cmd/anna/commands.go
Comment on lines +114 to 118
sharedTools = append(sharedTools,
memorytool.NewGrepTool(memoryEngine),
memorytool.NewDescribeTool(memoryEngine),
memorytool.NewExpandTool(memoryEngine),
)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Wire user_memory tool into runtime tool registration

Pool setup only registers grep_memory, describe_memory, and expand_memory from the memory tool package before constructing all agent pools; there is no runtime registration of user_memory. That means the assistant never receives a callable user_memory tool definition in production chats, so per-user memory in user_agent_memory cannot actually be read/written through tool calls.

Useful? React with 👍 / 👎.

vaayne added 29 commits March 17, 2026 00:42
Add ConfigureDB(db *sql.DB) that enables WAL mode and foreign keys
on an existing connection. OpenDB now delegates to ConfigureDB internally.
This allows multiple packages to share a single *sql.DB without
re-opening the database.

Entire-Checkpoint: b45afb0493dd
…engine

Add NewEngineFromDB(db, summarizer, opts) that accepts an existing
*sql.DB without opening a new one. The engine tracks ownership via
ownsDB flag — Close() only closes the connection when the engine
created it (via NewEngine). NewEngine now delegates to NewEngineFromDB.

Entire-Checkpoint: b9cac0823ab3
Add table definitions for settings, providers, agents, channels,
users, chat_agents, and user_agent_memory. These tables support
the new normalized config model and per-user-per-agent memory.

Entire-Checkpoint: a1c71faed2ba
Add nullable agent_id TEXT and user_id INTEGER columns to support
scoping conversations to specific agents and users.

Entire-Checkpoint: cf309e08b635
Add nullable agent_id TEXT and user_id INTEGER columns to support
routing scheduled jobs to specific agents and users.

Entire-Checkpoint: 4b1a19c6157f
…t schema

Update main.sql to import all new table schemas. Generate Atlas
migration 20260316075129_multi_user_agent that creates the 7 new
tables and adds agent_id/user_id columns to conversations and
scheduler_jobs. Regenerate sqlc models and queries.

Entire-Checkpoint: cb2c53668218
Add CRUD query files for settings, providers, agents, channels,
users, chat_agents, and user_agent_memory tables. Regenerate sqlc
to produce Go query functions for all new operations.

Entire-Checkpoint: 83fa95ecafb0
Add Store interface with typed CRUD methods for providers, agents, channels,
users, chat agents, user agent memory, and settings. Define lean domain types
(Provider, Agent, Channel, User) and a Snapshot type for downstream consumption.

Entire-Checkpoint: a4b5c3f55210
DB-backed Store implementation converting between domain types and sqlc types.
Includes env var fallbacks for provider API keys (ANTHROPIC_API_KEY, OPENAI_API_KEY),
Snapshot assembly from agent + provider + settings, and MaxOpenConns(1) for SQLite.

Entire-Checkpoint: 506233a6274b
Seeds default "anthropic" provider (API key from env) and default "anna" agent
with default soul system prompt when the DB is empty. Idempotent — skips if
providers/agents already exist.

Entire-Checkpoint: 2587ca558f62
Replace YAML-based config loading/saving with DB store. On startup:
create ANNA_HOME, open anna.db, seed defaults. Config GET/POST endpoints
now read/write via Store. Add newStreamProviderFromCreds helper.

Entire-Checkpoint: c3506a2623d7
Add ResolveModelID, ResolveModel, ResolveModelTier methods on Snapshot
for tier-based model resolution. Add SkillsPath and LogPath helpers.

Entire-Checkpoint: b2f5ee71e57f
- Delete config.Load(), LoadFrom(), Config struct, state.go, channels.go
- Keep paths.go (AnnaHome, DBPath, CachePath), model.go types, config subtypes
- Convert all callers to use DB-backed Store + Snapshot:
  - commands.go: setup() opens DB, creates Store, builds Snapshot
  - models.go: all subcommands use openStore() + defaultSnapshot()
  - skills.go: use Store for workspace path resolution
  - plugin.go: use settings table for plugin storage
  - gateway.go: load channel configs from DB JSON blobs
  - chat.go: use snap instead of cfg
- Update tests: remove YAML/env loading tests, add Snapshot/model resolution tests
- Remove caarlos0/env and gopkg.in/yaml.v3 from config package

Entire-Checkpoint: c2abfdc59c8f
SetupWorkspace(agentID, basePath) creates workspaces/{agentID}/skills/
directory structure for per-agent workspace isolation.

Entire-Checkpoint: ec279f7d1eac
Pool now stores which agent it belongs to, used for logging and
session scoping. AgentID() getter exposes the value.

Entire-Checkpoint: 5330f5d30daf
Move newRunnerFactory from cmd/anna/commands.go to
internal/agent/factory.go as NewRunnerFactory so PoolManager can
use it. Commands.go and tests now call the exported version.

Entire-Checkpoint: 886bf0843230
Clarify that the workspace parameter to NewTool should be a per-agent
workspace path for skill isolation.

Entire-Checkpoint: 7b27a0c27754
PoolManager maps agentID to Pool. StartAll reads enabled agents from
the config Store, sets up per-agent workspaces, creates runner factories,
and starts reaper goroutines. Supports shared and per-agent tools.

Entire-Checkpoint: 8d474829aba4
setup() now creates a PoolManager from enabled agents in DB instead of
a single Pool. setupResult holds both poolManager and pool (default
agent's pool) for backward compatibility with CLI/channel code.

Skills tool creation moved into PoolManager (per-agent). Shared tools
(scheduler, memory retrieval, plugins) passed via WithSharedExtraTools.

Entire-Checkpoint: 8d9f9ba88d41
Add ResolveUser function to internal/channel/identity.go that upserts
a user by external ID + platform, returning the user record from the
config Store. This is Phase 4, Task 4.1.

Entire-Checkpoint: db2c4ffb122e
Add ChatContext type and ResolveAgent function that routes messages to
the correct agent: group chat uses chat_agents mapping, DM uses user's
default_agent_id, fallback to first enabled agent. Phase 4, Task 4.2.

Entire-Checkpoint: d843004789a2
Add BuildSessionKey(agentID, platform, externalUserID, channelContext)
that produces keys in the format {agentID}:{platform}:{userID}:{context}.
Phase 4, Task 4.3.

Entire-Checkpoint: 6f61bb8b1e33
- Add AgentID and UserID fields to memory.SessionInfo
- Update CreateConversationFull query to accept agent_id and user_id
- Add UpdateConversationAgentUser query
- Update SaveInfo to write agent_id/user_id when creating conversations
- Update convToSessionInfo to read agent_id/user_id
- Update Pool.createSessionLocked to set agentID from pool and accept userID

Phase 4, Tasks 4.4 + 4.5.

Entire-Checkpoint: d30248bf8b47
Add UserMemoryStore wrapping config.Store for reading and writing
user_agent_memory content. Phase 4, Task 4.6.

Entire-Checkpoint: f50a56189c2e
Add UserMemoryTool that agents can use to read/write per-user notes
via the user_agent_memory table. Supports 'read' and 'write' actions.
Replaces the old SOUL.md/USER.md file editing. Phase 4, Task 4.7.

Entire-Checkpoint: c025b5669ecb
Add new BuildSystemPromptFromDB function that composes system prompts
from DB fields (agents.system_prompt + user_agent_memory.content)
instead of SOUL.md/USER.md files. The old BuildSystemPrompt is kept
for backward compatibility but marked as deprecated. Phase 4, Task 4.8.

Entire-Checkpoint: 575434625807
vaayne added 5 commits March 17, 2026 01:16
User agent memory is now loaded from the DB and injected into the system
prompt when a runner is created for a session. This means the agent always
has context about the user from the first message, not just via tool calls.

Key changes:
- NewRunnerFunc now accepts RunnerParams (model + user memory)
- Factory builds base prompt once, injects user memory per-session
- Pool loads user memory in getOrCreateRunner via UserMemoryStore
- PoolManager creates and wires UserMemoryStore into all pools
- Updated user_memory tool description with recommended structure
- Updated prompt framing to guide agent on using user preferences
…y write-only

System prompt is now composed in three clear layers:
1. Basic system prompt (embedded default, override by SYSTEM.md in workspace)
2. Agent soul prompt (DB system_prompt, override by SOUL.md in workspace)
3. User memory (always present from DB, updated via write-only user_memory tool)

Key changes:
- Removed old BuildSystemPrompt, InjectUserMemory, promptMemories, memoriesTmpl
- BuildSystemPromptFromDB now handles all 3 layers with file overrides
- user_memory tool simplified to write-only (no read — content is always in prompt)
- Factory builds full prompt per-session (not cached base + inject)
- GoRunner fallback uses BuildSystemPromptFromDB
- Removed unused embedded templates (defaultSoul, defaultUser, memoriesTemplate)
user.md and memories.md.tmpl are no longer referenced after the
3-layer prompt refactor. Soul/user identity is now managed via DB
(agents.system_prompt + user_agent_memory) with file overrides
(SOUL.md, SYSTEM.md).
- handoff.md: Add post-Phase 6 section documenting 3-layer prompt,
  write-only user_memory tool, per-session injection, deleted templates
- tasks.md: Add tasks 7.1-7.8 for system prompt & user memory work
- plan.md: Update system prompt assembly, assumptions, and final status

Entire-Checkpoint: 4b99fcd76bd1
Cover all CRUD operations for providers, agents, channels, users,
chat agents, user agent memory, settings, snapshot assembly, and
seed defaults. Raises total coverage from 49.5% to 51.4%.
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Mar 17, 2026

📊 Coverage Report

Total coverage: 50.5%

Per-package breakdown
github.com/vaayne/anna/cmd/anna/chat.go:13:                  2.9%
github.com/vaayne/anna/cmd/anna/commands.go:218:             7.7%
github.com/vaayne/anna/cmd/anna/commands.go:240:             0.0%
github.com/vaayne/anna/cmd/anna/commands.go:25:              100.0%
github.com/vaayne/anna/cmd/anna/commands.go:58:              68.1%
github.com/vaayne/anna/cmd/anna/gateway.go:206:              0.0%
github.com/vaayne/anna/cmd/anna/gateway.go:269:              37.5%
github.com/vaayne/anna/cmd/anna/gateway.go:27:               85.7%
github.com/vaayne/anna/cmd/anna/gateway.go:58:               15.3%
github.com/vaayne/anna/cmd/anna/main.go:9:                   0.0%
github.com/vaayne/anna/cmd/anna/models.go:112:               0.0%
github.com/vaayne/anna/cmd/anna/models.go:148:               0.0%
github.com/vaayne/anna/cmd/anna/models.go:162:               0.0%
github.com/vaayne/anna/cmd/anna/models.go:175:               0.0%
github.com/vaayne/anna/cmd/anna/models.go:183:               100.0%
github.com/vaayne/anna/cmd/anna/models.go:198:               100.0%
github.com/vaayne/anna/cmd/anna/models.go:206:               0.0%
github.com/vaayne/anna/cmd/anna/models.go:221:               7.1%
github.com/vaayne/anna/cmd/anna/models.go:253:               11.1%
github.com/vaayne/anna/cmd/anna/models.go:272:               5.3%
github.com/vaayne/anna/cmd/anna/models.go:310:               4.8%
github.com/vaayne/anna/cmd/anna/models.go:351:               0.0%
github.com/vaayne/anna/cmd/anna/models.go:35:                0.0%
github.com/vaayne/anna/cmd/anna/models.go:40:                0.0%
github.com/vaayne/anna/cmd/anna/models.go:53:                0.0%
github.com/vaayne/anna/cmd/anna/models.go:67:                0.0%
github.com/vaayne/anna/cmd/anna/onboard.go:22:               50.0%
github.com/vaayne/anna/cmd/anna/onboard.go:39:               0.0%
github.com/vaayne/anna/cmd/anna/onboard.go:95:               0.0%
github.com/vaayne/anna/cmd/anna/plugin.go:130:               4.3%
github.com/vaayne/anna/cmd/anna/plugin.go:16:                50.0%
github.com/vaayne/anna/cmd/anna/plugin.go:177:               0.0%
github.com/vaayne/anna/cmd/anna/plugin.go:190:               0.0%
github.com/vaayne/anna/cmd/anna/plugin.go:199:               0.0%
github.com/vaayne/anna/cmd/anna/plugin.go:214:               0.0%
github.com/vaayne/anna/cmd/anna/plugin.go:31:                50.0%
github.com/vaayne/anna/cmd/anna/plugin.go:41:                0.0%
github.com/vaayne/anna/cmd/anna/plugin.go:65:                3.6%
github.com/vaayne/anna/cmd/anna/skills.go:114:               25.0%
github.com/vaayne/anna/cmd/anna/skills.go:133:               0.0%
github.com/vaayne/anna/cmd/anna/skills.go:176:               0.0%
github.com/vaayne/anna/cmd/anna/skills.go:19:                50.0%
github.com/vaayne/anna/cmd/anna/skills.go:210:               6.7%
github.com/vaayne/anna/cmd/anna/skills.go:36:                5.3%
github.com/vaayne/anna/cmd/anna/skills.go:79:                5.9%
github.com/vaayne/anna/cmd/anna/version.go:101:              75.0%
github.com/vaayne/anna/cmd/anna/version.go:109:              0.0%
github.com/vaayne/anna/cmd/anna/version.go:117:              0.0%
github.com/vaayne/anna/cmd/anna/version.go:151:              0.0%
github.com/vaayne/anna/cmd/anna/version.go:185:              0.0%
github.com/vaayne/anna/cmd/anna/version.go:197:              0.0%
github.com/vaayne/anna/cmd/anna/version.go:202:              0.0%
github.com/vaayne/anna/cmd/anna/version.go:235:              0.0%
github.com/vaayne/anna/cmd/anna/version.go:271:              0.0%
github.com/vaayne/anna/cmd/anna/version.go:282:              0.0%
github.com/vaayne/anna/cmd/anna/version.go:327:              0.0%
github.com/vaayne/anna/cmd/anna/version.go:360:              0.0%
github.com/vaayne/anna/cmd/anna/version.go:376:              0.0%
github.com/vaayne/anna/cmd/anna/version.go:446:              0.0%
github.com/vaayne/anna/cmd/anna/version.go:462:              0.0%
github.com/vaayne/anna/cmd/anna/version.go:469:              75.0%
github.com/vaayne/anna/cmd/anna/version.go:54:               33.3%
github.com/vaayne/anna/cmd/anna/version.go:65:               6.2%
github.com/vaayne/anna/internal/admin/agents.go:18:          46.2%
github.com/vaayne/anna/internal/admin/agents.go:38:          66.7%
github.com/vaayne/anna/internal/admin/agents.go:48:          0.0%
github.com/vaayne/anna/internal/admin/agents.go:66:          0.0%
github.com/vaayne/anna/internal/admin/agents.go:9:           60.0%
github.com/vaayne/anna/internal/admin/channels.go:18:        0.0%
github.com/vaayne/anna/internal/admin/channels.go:28:        0.0%
github.com/vaayne/anna/internal/admin/channels.go:9:         0.0%
github.com/vaayne/anna/internal/admin/embed.go:11:           0.0%
github.com/vaayne/anna/internal/admin/providers.go:141:      0.0%
github.com/vaayne/anna/internal/admin/providers.go:15:       60.0%
github.com/vaayne/anna/internal/admin/providers.go:24:       46.2%
github.com/vaayne/anna/internal/admin/providers.go:44:       0.0%
github.com/vaayne/anna/internal/admin/providers.go:54:       0.0%
github.com/vaayne/anna/internal/admin/providers.go:72:       0.0%
github.com/vaayne/anna/internal/admin/providers.go:81:       0.0%
github.com/vaayne/anna/internal/admin/scheduler.go:146:      0.0%
github.com/vaayne/anna/internal/admin/scheduler.go:162:      0.0%
github.com/vaayne/anna/internal/admin/scheduler.go:183:      0.0%
github.com/vaayne/anna/internal/admin/scheduler.go:208:      0.0%
github.com/vaayne/anna/internal/admin/scheduler.go:29:       0.0%
github.com/vaayne/anna/internal/admin/scheduler.go:42:       0.0%
github.com/vaayne/anna/internal/admin/scheduler.go:88:       0.0%
github.com/vaayne/anna/internal/admin/server.go:112:         100.0%
github.com/vaayne/anna/internal/admin/server.go:118:         0.0%
github.com/vaayne/anna/internal/admin/server.go:125:         100.0%
github.com/vaayne/anna/internal/admin/server.go:25:          100.0%
github.com/vaayne/anna/internal/admin/server.go:85:          100.0%
github.com/vaayne/anna/internal/admin/server.go:90:          100.0%
github.com/vaayne/anna/internal/admin/sessions.go:103:       0.0%
github.com/vaayne/anna/internal/admin/sessions.go:125:       0.0%
github.com/vaayne/anna/internal/admin/sessions.go:166:       0.0%
github.com/vaayne/anna/internal/admin/sessions.go:189:       0.0%
github.com/vaayne/anna/internal/admin/sessions.go:198:       0.0%
github.com/vaayne/anna/internal/admin/sessions.go:237:       0.0%
github.com/vaayne/anna/internal/admin/sessions.go:251:       0.0%
github.com/vaayne/anna/internal/admin/sessions.go:33:        0.0%
github.com/vaayne/anna/internal/admin/sessions.go:46:        0.0%
github.com/vaayne/anna/internal/admin/sessions.go:63:        0.0%
github.com/vaayne/anna/internal/admin/settings.go:24:        0.0%
github.com/vaayne/anna/internal/admin/settings.go:8:         0.0%
github.com/vaayne/anna/internal/admin/users.go:17:           0.0%
github.com/vaayne/anna/internal/admin/users.go:37:           0.0%
github.com/vaayne/anna/internal/admin/users.go:51:           0.0%
github.com/vaayne/anna/internal/admin/users.go:72:           0.0%
github.com/vaayne/anna/internal/admin/users.go:8:            0.0%
github.com/vaayne/anna/internal/agent/engine/continue.go:12: 60.0%
github.com/vaayne/anna/internal/agent/engine/engine.go:122:  85.1%
github.com/vaayne/anna/internal/agent/engine/engine.go:20:   91.7%
github.com/vaayne/anna/internal/agent/engine/engine.go:212:  88.9%
github.com/vaayne/anna/internal/agent/engine/engine.go:227:  100.0%
github.com/vaayne/anna/internal/agent/engine/engine.go:42:   94.6%
github.com/vaayne/anna/internal/agent/engine/events.go:13:   100.0%
github.com/vaayne/anna/internal/agent/engine/events.go:20:   100.0%
github.com/vaayne/anna/internal/agent/engine/events.go:28:   100.0%
github.com/vaayne/anna/internal/agent/engine/events.go:35:   100.0%
github.com/vaayne/anna/internal/agent/engine/events.go:42:   100.0%
github.com/vaayne/anna/internal/agent/engine/events.go:49:   100.0%
github.com/vaayne/anna/internal/agent/engine/events.go:56:   100.0%
github.com/vaayne/anna/internal/agent/engine/events.go:63:   100.0%
github.com/vaayne/anna/internal/agent/engine/events.go:68:   100.0%
github.com/vaayne/anna/internal/agent/engine/events.go:75:   100.0%
github.com/vaayne/anna/internal/agent/engine/tool_execution.go:18: 73.5%
github.com/vaayne/anna/internal/agent/factory.go:17:         16.7%
github.com/vaayne/anna/internal/agent/pool.go:138:           100.0%
github.com/vaayne/anna/internal/agent/pool.go:147:           100.0%
github.com/vaayne/anna/internal/agent/pool.go:159:           75.0%
github.com/vaayne/anna/internal/agent/pool.go:169:           100.0%
github.com/vaayne/anna/internal/agent/pool.go:185:           83.3%
github.com/vaayne/anna/internal/agent/pool.go:197:           89.5%
github.com/vaayne/anna/internal/agent/pool.go:235:           100.0%
github.com/vaayne/anna/internal/agent/pool.go:246:           81.2%
github.com/vaayne/anna/internal/agent/pool.go:38:            100.0%
github.com/vaayne/anna/internal/agent/pool.go:402:           100.0%
github.com/vaayne/anna/internal/agent/pool.go:410:           100.0%
github.com/vaayne/anna/internal/agent/pool.go:417:           80.0%
github.com/vaayne/anna/internal/agent/pool.go:450:           91.3%
github.com/vaayne/anna/internal/agent/pool.go:57:            100.0%
github.com/vaayne/anna/internal/agent/pool.go:62:            100.0%
github.com/vaayne/anna/internal/agent/pool.go:71:            83.3%
github.com/vaayne/anna/internal/agent/pool.go:88:            75.0%
github.com/vaayne/anna/internal/agent/pool.go:98:            100.0%
github.com/vaayne/anna/internal/agent/pool_compaction.go:12: 100.0%
github.com/vaayne/anna/internal/agent/pool_compaction.go:17: 80.0%
github.com/vaayne/anna/internal/agent/pool_compaction.go:37: 100.0%
github.com/vaayne/anna/internal/agent/pool_manager.go:102:   75.0%
github.com/vaayne/anna/internal/agent/pool_manager.go:131:   80.8%
github.com/vaayne/anna/internal/agent/pool_manager.go:191:   80.0%
github.com/vaayne/anna/internal/agent/pool_manager.go:201:   81.8%
github.com/vaayne/anna/internal/agent/pool_manager.go:27:    0.0%
github.com/vaayne/anna/internal/agent/pool_manager.go:34:    0.0%
github.com/vaayne/anna/internal/agent/pool_manager.go:41:    0.0%
github.com/vaayne/anna/internal/agent/pool_manager.go:48:    0.0%
github.com/vaayne/anna/internal/agent/pool_manager.go:55:    0.0%
github.com/vaayne/anna/internal/agent/pool_manager.go:78:    75.0%
github.com/vaayne/anna/internal/agent/pool_manager.go:94:    100.0%
github.com/vaayne/anna/internal/agent/pool_options.go:14:    100.0%
github.com/vaayne/anna/internal/agent/pool_options.go:21:    100.0%
github.com/vaayne/anna/internal/agent/pool_options.go:28:    100.0%
github.com/vaayne/anna/internal/agent/pool_options.go:35:    100.0%
github.com/vaayne/anna/internal/agent/pool_options.go:42:    100.0%
github.com/vaayne/anna/internal/agent/pool_options.go:49:    0.0%
github.com/vaayne/anna/internal/agent/pool_options.go:56:    100.0%
github.com/vaayne/anna/internal/agent/pool_options.go:71:    100.0%
github.com/vaayne/anna/internal/agent/pool_reaper.go:13:     83.3%
github.com/vaayne/anna/internal/agent/pool_reaper.go:28:     89.5%
github.com/vaayne/anna/internal/agent/runner/builtin/embed.go:17: 0.0%
github.com/vaayne/anna/internal/agent/runner/gorunner.go:106: 100.0%
github.com/vaayne/anna/internal/agent/runner/gorunner.go:143: 100.0%
github.com/vaayne/anna/internal/agent/runner/gorunner.go:146: 100.0%
github.com/vaayne/anna/internal/agent/runner/gorunner.go:153: 100.0%
github.com/vaayne/anna/internal/agent/runner/gorunner.go:156: 100.0%
github.com/vaayne/anna/internal/agent/runner/gorunner.go:169: 94.4%
github.com/vaayne/anna/internal/agent/runner/gorunner.go:220: 90.5%
github.com/vaayne/anna/internal/agent/runner/gorunner.go:262: 100.0%
github.com/vaayne/anna/internal/agent/runner/gorunner.go:51: 95.0%
github.com/vaayne/anna/internal/agent/runner/prompt.go:106:  95.0%
github.com/vaayne/anna/internal/agent/runner/prompt.go:146:  100.0%
github.com/vaayne/anna/internal/agent/runner/prompt.go:36:   75.9%
github.com/vaayne/anna/internal/agent/runner/prompt.go:91:   85.7%
github.com/vaayne/anna/internal/agent/runner/runner.go:61:   100.0%
github.com/vaayne/anna/internal/agent/runner/runner.go:85:   75.0%
github.com/vaayne/anna/internal/agent/runner/skill.go:104:   100.0%
github.com/vaayne/anna/internal/agent/runner/skill.go:113:   85.7%
github.com/vaayne/anna/internal/agent/runner/skill.go:155:   85.7%
github.com/vaayne/anna/internal/agent/runner/skill.go:191:   91.7%
github.com/vaayne/anna/internal/agent/runner/skill.go:217:   100.0%
github.com/vaayne/anna/internal/agent/runner/skill.go:249:   91.7%
github.com/vaayne/anna/internal/agent/runner/skill.go:269:   100.0%
github.com/vaayne/anna/internal/agent/runner/skill.go:43:    100.0%
github.com/vaayne/anna/internal/agent/runner/skill.go:48:    92.6%
github.com/vaayne/anna/internal/agent/runner/stream_proxy.go:17: 80.0%
github.com/vaayne/anna/internal/agent/runner/stream_proxy.go:27: 82.4%
github.com/vaayne/anna/internal/agent/runner/stream_proxy.go:57: 100.0%
github.com/vaayne/anna/internal/agent/session.go:21:         100.0%
github.com/vaayne/anna/internal/agent/session.go:33:         100.0%
github.com/vaayne/anna/internal/agent/tool/bash.go:18:       100.0%
github.com/vaayne/anna/internal/agent/tool/bash.go:35:       100.0%
github.com/vaayne/anna/internal/agent/tool/bash.go:76:       100.0%
github.com/vaayne/anna/internal/agent/tool/bash.go:80:       40.0%
github.com/vaayne/anna/internal/agent/tool/delegate.go:139:  88.9%
github.com/vaayne/anna/internal/agent/tool/delegate.go:216:  100.0%
github.com/vaayne/anna/internal/agent/tool/delegate.go:255:  100.0%
github.com/vaayne/anna/internal/agent/tool/delegate.go:271:  100.0%
github.com/vaayne/anna/internal/agent/tool/delegate.go:279:  89.7%
github.com/vaayne/anna/internal/agent/tool/delegate.go:40:   100.0%
github.com/vaayne/anna/internal/agent/tool/delegate.go:44:   100.0%
github.com/vaayne/anna/internal/agent/tool/delegate.go:90:   90.9%
github.com/vaayne/anna/internal/agent/tool/edit.go:15:       100.0%
github.com/vaayne/anna/internal/agent/tool/edit.go:40:       85.0%
github.com/vaayne/anna/internal/agent/tool/read.go:107:      100.0%
github.com/vaayne/anna/internal/agent/tool/read.go:124:      76.2%
github.com/vaayne/anna/internal/agent/tool/read.go:160:      71.4%
github.com/vaayne/anna/internal/agent/tool/read.go:16:       100.0%
github.com/vaayne/anna/internal/agent/tool/read.go:172:      71.4%
github.com/vaayne/anna/internal/agent/tool/read.go:41:       94.4%
github.com/vaayne/anna/internal/agent/tool/tool.go:22:       100.0%
github.com/vaayne/anna/internal/agent/tool/tool.go:33:       0.0%
github.com/vaayne/anna/internal/agent/tool/tool.go:42:       100.0%
github.com/vaayne/anna/internal/agent/tool/tool.go:47:       100.0%
github.com/vaayne/anna/internal/agent/tool/tool.go:56:       100.0%
github.com/vaayne/anna/internal/agent/tool/tool.go:62:       100.0%
github.com/vaayne/anna/internal/agent/tool/truncate.go:102:  100.0%
github.com/vaayne/anna/internal/agent/tool/truncate.go:119:  66.7%
github.com/vaayne/anna/internal/agent/tool/truncate.go:132:  100.0%
github.com/vaayne/anna/internal/agent/tool/truncate.go:144:  94.1%
github.com/vaayne/anna/internal/agent/tool/truncate.go:22:   100.0%
github.com/vaayne/anna/internal/agent/tool/truncate.go:31:   100.0%
github.com/vaayne/anna/internal/agent/tool/truncate.go:42:   100.0%
github.com/vaayne/anna/internal/agent/tool/truncate.go:52:   100.0%
github.com/vaayne/anna/internal/agent/tool/truncate.go:58:   100.0%
github.com/vaayne/anna/internal/agent/tool/truncate.go:65:   92.9%
github.com/vaayne/anna/internal/agent/tool/truncate.go:89:   100.0%
github.com/vaayne/anna/internal/agent/tool/webfetch.go:109:  66.7%
github.com/vaayne/anna/internal/agent/tool/webfetch.go:118:  68.0%
github.com/vaayne/anna/internal/agent/tool/webfetch.go:164:  66.7%
github.com/vaayne/anna/internal/agent/tool/webfetch.go:175:  40.0%
github.com/vaayne/anna/internal/agent/tool/webfetch.go:188:  81.8%
github.com/vaayne/anna/internal/agent/tool/webfetch.go:206:  0.0%
github.com/vaayne/anna/internal/agent/tool/webfetch.go:214:  0.0%
github.com/vaayne/anna/internal/agent/tool/webfetch.go:237:  0.0%
github.com/vaayne/anna/internal/agent/tool/webfetch.go:263:  90.0%
github.com/vaayne/anna/internal/agent/tool/webfetch.go:282:  75.0%
github.com/vaayne/anna/internal/agent/tool/webfetch.go:40:   100.0%
github.com/vaayne/anna/internal/agent/tool/webfetch.go:46:   100.0%
github.com/vaayne/anna/internal/agent/tool/webfetch.go:69:   77.3%
github.com/vaayne/anna/internal/agent/tool/write.go:15:      100.0%
github.com/vaayne/anna/internal/agent/tool/write.go:36:      80.0%
github.com/vaayne/anna/internal/agent/workspace.go:12:       83.3%
github.com/vaayne/anna/internal/ai/events.go:103:            100.0%
github.com/vaayne/anna/internal/ai/events.go:111:            100.0%
github.com/vaayne/anna/internal/ai/events.go:119:            100.0%
github.com/vaayne/anna/internal/ai/events.go:124:            100.0%
github.com/vaayne/anna/internal/ai/events.go:16:             100.0%
github.com/vaayne/anna/internal/ai/events.go:24:             100.0%
github.com/vaayne/anna/internal/ai/events.go:33:             100.0%
github.com/vaayne/anna/internal/ai/events.go:42:             100.0%
github.com/vaayne/anna/internal/ai/events.go:50:             100.0%
github.com/vaayne/anna/internal/ai/events.go:59:             100.0%
github.com/vaayne/anna/internal/ai/events.go:68:             100.0%
github.com/vaayne/anna/internal/ai/events.go:76:             100.0%
github.com/vaayne/anna/internal/ai/events.go:87:             100.0%
github.com/vaayne/anna/internal/ai/events.go:96:             100.0%
github.com/vaayne/anna/internal/ai/message.go:101:           100.0%
github.com/vaayne/anna/internal/ai/message.go:111:           100.0%
github.com/vaayne/anna/internal/ai/message.go:26:            100.0%
github.com/vaayne/anna/internal/ai/message.go:35:            100.0%
github.com/vaayne/anna/internal/ai/message.go:43:            100.0%
github.com/vaayne/anna/internal/ai/message.go:46:            100.0%
github.com/vaayne/anna/internal/ai/message.go:58:            100.0%
github.com/vaayne/anna/internal/ai/message.go:72:            100.0%
github.com/vaayne/anna/internal/ai/message.go:86:            100.0%
github.com/vaayne/anna/internal/ai/message.go:98:            100.0%
github.com/vaayne/anna/internal/ai/provider.go:162:          100.0%
github.com/vaayne/anna/internal/ai/provider.go:167:          100.0%
github.com/vaayne/anna/internal/ai/provider.go:172:          100.0%
github.com/vaayne/anna/internal/ai/provider.go:177:          100.0%
github.com/vaayne/anna/internal/ai/provider.go:187:          100.0%
github.com/vaayne/anna/internal/ai/provider.go:195:          100.0%
github.com/vaayne/anna/internal/ai/provider.go:36:           100.0%
github.com/vaayne/anna/internal/ai/provider.go:46:           100.0%
github.com/vaayne/anna/internal/ai/provider.go:54:           100.0%
github.com/vaayne/anna/internal/ai/provider.go:61:           100.0%
github.com/vaayne/anna/internal/ai/provider.go:69:           100.0%
github.com/vaayne/anna/internal/ai/provider.go:78:           100.0%
github.com/vaayne/anna/internal/ai/provider.go:87:           97.1%
github.com/vaayne/anna/internal/ai/providers/anthropic/client.go:24: 100.0%
github.com/vaayne/anna/internal/ai/providers/anthropic/client.go:36: 100.0%
github.com/vaayne/anna/internal/ai/providers/anthropic/client.go:39: 0.0%
github.com/vaayne/anna/internal/ai/providers/anthropic/client.go:56: 0.0%
github.com/vaayne/anna/internal/ai/providers/anthropic/client.go:61: 0.0%
github.com/vaayne/anna/internal/ai/providers/anthropic/client.go:81: 100.0%
github.com/vaayne/anna/internal/ai/providers/anthropic/convert_messages.go:10: 100.0%
github.com/vaayne/anna/internal/ai/providers/anthropic/convert_messages.go:25: 100.0%
github.com/vaayne/anna/internal/ai/providers/anthropic/convert_messages.go:45: 100.0%
github.com/vaayne/anna/internal/ai/providers/anthropic/convert_messages.go:60: 100.0%
github.com/vaayne/anna/internal/ai/providers/anthropic/options.go:10: 100.0%
github.com/vaayne/anna/internal/ai/providers/anthropic/options.go:37: 100.0%
github.com/vaayne/anna/internal/ai/providers/anthropic/stream.go:21: 76.0%
github.com/vaayne/anna/internal/ai/providers/anthropic/stream.go:77: 100.0%
github.com/vaayne/anna/internal/ai/providers/anthropic/stream.go:9: 0.0%
github.com/vaayne/anna/internal/ai/providers/openai-response/client.go:105: 0.0%
github.com/vaayne/anna/internal/ai/providers/openai-response/client.go:110: 0.0%
github.com/vaayne/anna/internal/ai/providers/openai-response/client.go:130: 100.0%
github.com/vaayne/anna/internal/ai/providers/openai-response/client.go:27: 100.0%
github.com/vaayne/anna/internal/ai/providers/openai-response/client.go:42: 0.0%
github.com/vaayne/anna/internal/ai/providers/openai-response/client.go:59: 100.0%
github.com/vaayne/anna/internal/ai/providers/openai-response/client.go:79: 100.0%
github.com/vaayne/anna/internal/ai/providers/openai-response/client.go:84: 100.0%
github.com/vaayne/anna/internal/ai/providers/openai-response/client.go:87: 0.0%
github.com/vaayne/anna/internal/ai/providers/openai-response/convert_messages.go:13: 100.0%
github.com/vaayne/anna/internal/ai/providers/openai-response/convert_messages.go:34: 100.0%
github.com/vaayne/anna/internal/ai/providers/openai-response/convert_messages.go:68: 100.0%
github.com/vaayne/anna/internal/ai/providers/openai-response/options.go:11: 100.0%
github.com/vaayne/anna/internal/ai/providers/openai-response/options.go:39: 100.0%
github.com/vaayne/anna/internal/ai/providers/openai-response/stream.go:21: 100.0%
github.com/vaayne/anna/internal/ai/providers/openai-response/stream.go:74: 40.0%
github.com/vaayne/anna/internal/ai/providers/openai-response/stream.go:9: 0.0%
github.com/vaayne/anna/internal/ai/providers/openai/client.go:24: 100.0%
github.com/vaayne/anna/internal/ai/providers/openai/client.go:36: 100.0%
github.com/vaayne/anna/internal/ai/providers/openai/client.go:39: 0.0%
github.com/vaayne/anna/internal/ai/providers/openai/client.go:57: 0.0%
github.com/vaayne/anna/internal/ai/providers/openai/client.go:62: 0.0%
github.com/vaayne/anna/internal/ai/providers/openai/client.go:82: 100.0%
github.com/vaayne/anna/internal/ai/providers/openai/convert_messages.go:13: 100.0%
github.com/vaayne/anna/internal/ai/providers/openai/convert_messages.go:33: 100.0%
github.com/vaayne/anna/internal/ai/providers/openai/convert_messages.go:66: 100.0%
github.com/vaayne/anna/internal/ai/providers/openai/options.go:11: 100.0%
github.com/vaayne/anna/internal/ai/providers/openai/options.go:33: 100.0%
github.com/vaayne/anna/internal/ai/providers/openai/stream.go:22: 100.0%
github.com/vaayne/anna/internal/ai/providers/openai/stream.go:57: 100.0%
github.com/vaayne/anna/internal/ai/providers/openai/stream.go:9: 0.0%
github.com/vaayne/anna/internal/ai/providers/register_builtins.go:11: 0.0%
github.com/vaayne/anna/internal/ai/transform.go:42:          85.7%
github.com/vaayne/anna/internal/ai/transform.go:6:           93.8%
github.com/vaayne/anna/internal/channel/agent_command.go:17: 0.0%
github.com/vaayne/anna/internal/channel/agent_command.go:22: 0.0%
github.com/vaayne/anna/internal/channel/agent_command.go:29: 0.0%
github.com/vaayne/anna/internal/channel/agent_command.go:54: 0.0%
github.com/vaayne/anna/internal/channel/cli/chat.go:126:     75.0%
github.com/vaayne/anna/internal/channel/cli/chat.go:136:     16.7%
github.com/vaayne/anna/internal/channel/cli/chat.go:169:     0.0%
github.com/vaayne/anna/internal/channel/cli/chat.go:180:     0.0%
github.com/vaayne/anna/internal/channel/cli/chat.go:184:     38.5%
github.com/vaayne/anna/internal/channel/cli/chat.go:88:      84.6%
github.com/vaayne/anna/internal/channel/cli/chat_input.go:107: 20.0%
github.com/vaayne/anna/internal/channel/cli/chat_input.go:11: 43.4%
github.com/vaayne/anna/internal/channel/cli/chat_input.go:82: 72.7%
github.com/vaayne/anna/internal/channel/cli/chat_picker.go:96: 0.0%
github.com/vaayne/anna/internal/channel/cli/chat_picker.go:9: 0.0%
github.com/vaayne/anna/internal/channel/cli/chat_view.go:16: 77.3%
github.com/vaayne/anna/internal/channel/cli/chat_view.go:66: 66.7%
github.com/vaayne/anna/internal/channel/cli/chat_view.go:78: 100.0%
github.com/vaayne/anna/internal/channel/cli/chat_view.go:85: 100.0%
github.com/vaayne/anna/internal/channel/cli/chat_view.go:88: 0.0%
github.com/vaayne/anna/internal/channel/cli/chat_view.go:96: 0.0%
github.com/vaayne/anna/internal/channel/cli/cli.go:29:       0.0%
github.com/vaayne/anna/internal/channel/cli/cli.go:60:       0.0%
github.com/vaayne/anna/internal/channel/cli/command.go:22:   0.0%
github.com/vaayne/anna/internal/channel/cli/command.go:36:   0.0%
github.com/vaayne/anna/internal/channel/cli/model.go:17:     0.0%
github.com/vaayne/anna/internal/channel/cli/model.go:25:     0.0%
github.com/vaayne/anna/internal/channel/cli/model.go:41:     0.0%
github.com/vaayne/anna/internal/channel/command.go:22:       47.1%
github.com/vaayne/anna/internal/channel/command.go:63:       100.0%
github.com/vaayne/anna/internal/channel/command.go:68:       100.0%
github.com/vaayne/anna/internal/channel/command.go:78:       100.0%
github.com/vaayne/anna/internal/channel/feishu/feishu.go:106: 0.0%
github.com/vaayne/anna/internal/channel/feishu/feishu.go:142: 100.0%
github.com/vaayne/anna/internal/channel/feishu/feishu.go:150: 0.0%
github.com/vaayne/anna/internal/channel/feishu/feishu.go:182: 100.0%
github.com/vaayne/anna/internal/channel/feishu/feishu.go:186: 31.2%
github.com/vaayne/anna/internal/channel/feishu/feishu.go:225: 100.0%
github.com/vaayne/anna/internal/channel/feishu/feishu.go:235: 0.0%
github.com/vaayne/anna/internal/channel/feishu/feishu.go:249: 100.0%
github.com/vaayne/anna/internal/channel/feishu/feishu.go:256: 100.0%
github.com/vaayne/anna/internal/channel/feishu/feishu.go:274: 100.0%
github.com/vaayne/anna/internal/channel/feishu/feishu.go:287: 100.0%
github.com/vaayne/anna/internal/channel/feishu/feishu.go:316: 90.0%
github.com/vaayne/anna/internal/channel/feishu/feishu.go:338: 100.0%
github.com/vaayne/anna/internal/channel/feishu/feishu.go:34: 100.0%
github.com/vaayne/anna/internal/channel/feishu/feishu.go:72: 90.9%
github.com/vaayne/anna/internal/channel/feishu/handler.go:131: 0.0%
github.com/vaayne/anna/internal/channel/feishu/handler.go:151: 0.0%
github.com/vaayne/anna/internal/channel/feishu/handler.go:181: 100.0%
github.com/vaayne/anna/internal/channel/feishu/handler.go:195: 0.0%
github.com/vaayne/anna/internal/channel/feishu/handler.go:19: 0.0%
github.com/vaayne/anna/internal/channel/feishu/handler.go:230: 69.2%
github.com/vaayne/anna/internal/channel/feishu/handler.go:253: 0.0%
github.com/vaayne/anna/internal/channel/feishu/handler.go:273: 100.0%
github.com/vaayne/anna/internal/channel/feishu/handler.go:87: 0.0%
github.com/vaayne/anna/internal/channel/feishu/model.go:106: 100.0%
github.com/vaayne/anna/internal/channel/feishu/model.go:22:  100.0%
github.com/vaayne/anna/internal/channel/feishu/model.go:46:  53.3%
github.com/vaayne/anna/internal/channel/feishu/model.go:75:  100.0%
github.com/vaayne/anna/internal/channel/feishu/model.go:90:  100.0%
github.com/vaayne/anna/internal/channel/feishu/render.go:17: 0.0%
github.com/vaayne/anna/internal/channel/feishu/render.go:44: 18.2%
github.com/vaayne/anna/internal/channel/feishu/render.go:95: 100.0%
github.com/vaayne/anna/internal/channel/feishu/stream.go:129: 0.0%
github.com/vaayne/anna/internal/channel/feishu/stream.go:152: 0.0%
github.com/vaayne/anna/internal/channel/feishu/stream.go:172: 78.6%
github.com/vaayne/anna/internal/channel/feishu/stream.go:27: 100.0%
github.com/vaayne/anna/internal/channel/feishu/stream.go:53: 0.0%
github.com/vaayne/anna/internal/channel/identity.go:18:      75.0%
github.com/vaayne/anna/internal/channel/identity.go:30:      83.3%
github.com/vaayne/anna/internal/channel/notifier.go:37:      100.0%
github.com/vaayne/anna/internal/channel/notifier.go:42:      100.0%
github.com/vaayne/anna/internal/channel/notifier.go:50:      100.0%
github.com/vaayne/anna/internal/channel/notifier.go:88:      100.0%
github.com/vaayne/anna/internal/channel/notify_tool.go:16:   100.0%
github.com/vaayne/anna/internal/channel/notify_tool.go:43:   100.0%
github.com/vaayne/anna/internal/channel/notify_tool.go:51:   100.0%
github.com/vaayne/anna/internal/channel/qq/handler.go:105:   30.0%
github.com/vaayne/anna/internal/channel/qq/handler.go:139:   100.0%
github.com/vaayne/anna/internal/channel/qq/handler.go:152:   76.2%
github.com/vaayne/anna/internal/channel/qq/handler.go:189:   0.0%
github.com/vaayne/anna/internal/channel/qq/handler.go:19:    0.0%
github.com/vaayne/anna/internal/channel/qq/handler.go:230:   69.2%
github.com/vaayne/anna/internal/channel/qq/handler.go:254:   100.0%
github.com/vaayne/anna/internal/channel/qq/handler.go:259:   0.0%
github.com/vaayne/anna/internal/channel/qq/handler.go:269:   0.0%
github.com/vaayne/anna/internal/channel/qq/handler.go:281:   0.0%
github.com/vaayne/anna/internal/channel/qq/handler.go:55:    0.0%
github.com/vaayne/anna/internal/channel/qq/model.go:11:      100.0%
github.com/vaayne/anna/internal/channel/qq/model.go:21:      90.9%
github.com/vaayne/anna/internal/channel/qq/model.go:43:      91.7%
github.com/vaayne/anna/internal/channel/qq/model.go:78:      100.0%
github.com/vaayne/anna/internal/channel/qq/qq.go:137:        100.0%
github.com/vaayne/anna/internal/channel/qq/qq.go:145:        100.0%
github.com/vaayne/anna/internal/channel/qq/qq.go:148:        18.2%
github.com/vaayne/anna/internal/channel/qq/qq.go:178:        100.0%
github.com/vaayne/anna/internal/channel/qq/qq.go:187:        100.0%
github.com/vaayne/anna/internal/channel/qq/qq.go:192:        100.0%
github.com/vaayne/anna/internal/channel/qq/qq.go:198:        0.0%
github.com/vaayne/anna/internal/channel/qq/qq.go:24:         100.0%
github.com/vaayne/anna/internal/channel/qq/qq.go:59:         90.9%
github.com/vaayne/anna/internal/channel/qq/qq.go:92:         0.0%
github.com/vaayne/anna/internal/channel/qq/render.go:11:     0.0%
github.com/vaayne/anna/internal/channel/qq/render.go:41:     100.0%
github.com/vaayne/anna/internal/channel/qq/stream.go:131:    0.0%
github.com/vaayne/anna/internal/channel/qq/stream.go:171:    78.6%
github.com/vaayne/anna/internal/channel/qq/stream.go:27:     100.0%
github.com/vaayne/anna/internal/channel/qq/stream.go:53:     0.0%
github.com/vaayne/anna/internal/channel/resolved.go:25:      0.0%
github.com/vaayne/anna/internal/channel/resolved.go:28:      0.0%
github.com/vaayne/anna/internal/channel/resolved.go:33:      0.0%
github.com/vaayne/anna/internal/channel/resolved.go:38:      0.0%
github.com/vaayne/anna/internal/channel/resolved.go:44:      0.0%
github.com/vaayne/anna/internal/channel/resolved.go:54:      0.0%
github.com/vaayne/anna/internal/channel/telegram/handler.go:109: 0.0%
github.com/vaayne/anna/internal/channel/telegram/handler.go:118: 0.0%
github.com/vaayne/anna/internal/channel/telegram/handler.go:137: 0.0%
github.com/vaayne/anna/internal/channel/telegram/handler.go:161: 0.0%
github.com/vaayne/anna/internal/channel/telegram/handler.go:180: 0.0%
github.com/vaayne/anna/internal/channel/telegram/handler.go:19: 100.0%
github.com/vaayne/anna/internal/channel/telegram/handler.go:225: 0.0%
github.com/vaayne/anna/internal/channel/telegram/handler.go:27: 100.0%
github.com/vaayne/anna/internal/channel/telegram/handler.go:38: 0.0%
github.com/vaayne/anna/internal/channel/telegram/handler.go:42: 0.0%
github.com/vaayne/anna/internal/channel/telegram/model.go:126: 0.0%
github.com/vaayne/anna/internal/channel/telegram/model.go:14: 0.0%
github.com/vaayne/anna/internal/channel/telegram/model.go:21: 0.0%
github.com/vaayne/anna/internal/channel/telegram/model.go:88: 0.0%
github.com/vaayne/anna/internal/channel/telegram/render.go:22: 0.0%
github.com/vaayne/anna/internal/channel/telegram/render.go:32: 0.0%
github.com/vaayne/anna/internal/channel/telegram/render.go:48: 0.0%
github.com/vaayne/anna/internal/channel/telegram/render.go:67: 85.7%
github.com/vaayne/anna/internal/channel/telegram/stream.go:110: 100.0%
github.com/vaayne/anna/internal/channel/telegram/stream.go:138: 100.0%
github.com/vaayne/anna/internal/channel/telegram/stream.go:146: 100.0%
github.com/vaayne/anna/internal/channel/telegram/stream.go:153: 100.0%
github.com/vaayne/anna/internal/channel/telegram/stream.go:215: 100.0%
github.com/vaayne/anna/internal/channel/telegram/stream.go:235: 100.0%
github.com/vaayne/anna/internal/channel/telegram/stream.go:244: 75.0%
github.com/vaayne/anna/internal/channel/telegram/stream.go:262: 0.0%
github.com/vaayne/anna/internal/channel/telegram/stream.go:281: 0.0%
github.com/vaayne/anna/internal/channel/telegram/stream.go:338: 0.0%
github.com/vaayne/anna/internal/channel/telegram/stream.go:408: 85.7%
github.com/vaayne/anna/internal/channel/telegram/stream.go:437: 0.0%
github.com/vaayne/anna/internal/channel/telegram/stream.go:448: 0.0%
github.com/vaayne/anna/internal/channel/telegram/stream.go:60: 100.0%
github.com/vaayne/anna/internal/channel/telegram/stream.go:77: 100.0%
github.com/vaayne/anna/internal/channel/telegram/stream.go:97: 83.3%
github.com/vaayne/anna/internal/channel/telegram/telegram.go:102: 0.0%
github.com/vaayne/anna/internal/channel/telegram/telegram.go:122: 0.0%
github.com/vaayne/anna/internal/channel/telegram/telegram.go:128: 0.0%
github.com/vaayne/anna/internal/channel/telegram/telegram.go:131: 0.0%
github.com/vaayne/anna/internal/channel/telegram/telegram.go:168: 100.0%
github.com/vaayne/anna/internal/channel/telegram/telegram.go:171: 0.0%
github.com/vaayne/anna/internal/channel/telegram/telegram.go:195: 0.0%
github.com/vaayne/anna/internal/channel/telegram/telegram.go:207: 0.0%
github.com/vaayne/anna/internal/channel/telegram/telegram.go:213: 0.0%
github.com/vaayne/anna/internal/channel/telegram/telegram.go:226: 0.0%
github.com/vaayne/anna/internal/channel/telegram/telegram.go:244: 0.0%
github.com/vaayne/anna/internal/channel/telegram/telegram.go:253: 0.0%
github.com/vaayne/anna/internal/channel/telegram/telegram.go:25: 0.0%
github.com/vaayne/anna/internal/channel/telegram/telegram.go:56: 0.0%
github.com/vaayne/anna/internal/channel/util.go:13:          100.0%
github.com/vaayne/anna/internal/channel/util.go:42:          100.0%
github.com/vaayne/anna/internal/config/config.go:37:         100.0%
github.com/vaayne/anna/internal/config/config.go:49:         100.0%
github.com/vaayne/anna/internal/config/config.go:54:         66.7%
github.com/vaayne/anna/internal/config/config.go:62:         80.0%
github.com/vaayne/anna/internal/config/config.go:73:         100.0%
github.com/vaayne/anna/internal/config/dbstore.go:107:       100.0%
github.com/vaayne/anna/internal/config/dbstore.go:115:       85.7%
github.com/vaayne/anna/internal/config/dbstore.go:136:       71.4%
github.com/vaayne/anna/internal/config/dbstore.go:157:       100.0%
github.com/vaayne/anna/internal/config/dbstore.go:163:       85.7%
github.com/vaayne/anna/internal/config/dbstore.go:175:       100.0%
github.com/vaayne/anna/internal/config/dbstore.go:183:       100.0%
github.com/vaayne/anna/internal/config/dbstore.go:197:       85.7%
github.com/vaayne/anna/internal/config/dbstore.go:209:       100.0%
github.com/vaayne/anna/internal/config/dbstore.go:217:       75.0%
github.com/vaayne/anna/internal/config/dbstore.go:21:        100.0%
github.com/vaayne/anna/internal/config/dbstore.go:229:       100.0%
github.com/vaayne/anna/internal/config/dbstore.go:238:       100.0%
github.com/vaayne/anna/internal/config/dbstore.go:249:       100.0%
github.com/vaayne/anna/internal/config/dbstore.go:257:       100.0%
github.com/vaayne/anna/internal/config/dbstore.go:266:       83.3%
github.com/vaayne/anna/internal/config/dbstore.go:280:       100.0%
github.com/vaayne/anna/internal/config/dbstore.go:288:       0.0%
github.com/vaayne/anna/internal/config/dbstore.go:28:        85.7%
github.com/vaayne/anna/internal/config/dbstore.go:305:       0.0%
github.com/vaayne/anna/internal/config/dbstore.go:314:       83.3%
github.com/vaayne/anna/internal/config/dbstore.go:325:       100.0%
github.com/vaayne/anna/internal/config/dbstore.go:334:       86.7%
github.com/vaayne/anna/internal/config/dbstore.go:40:        100.0%
github.com/vaayne/anna/internal/config/dbstore.go:412:       76.5%
github.com/vaayne/anna/internal/config/dbstore.go:455:       100.0%
github.com/vaayne/anna/internal/config/dbstore.go:466:       100.0%
github.com/vaayne/anna/internal/config/dbstore.go:477:       100.0%
github.com/vaayne/anna/internal/config/dbstore.go:485:       100.0%
github.com/vaayne/anna/internal/config/dbstore.go:499:       100.0%
github.com/vaayne/anna/internal/config/dbstore.go:515:       100.0%
github.com/vaayne/anna/internal/config/dbstore.go:51:        75.0%
github.com/vaayne/anna/internal/config/dbstore.go:523:       100.0%
github.com/vaayne/anna/internal/config/dbstore.go:64:        75.0%
github.com/vaayne/anna/internal/config/dbstore.go:77:        100.0%
github.com/vaayne/anna/internal/config/dbstore.go:83:        85.7%
github.com/vaayne/anna/internal/config/dbstore.go:95:        85.7%
github.com/vaayne/anna/internal/config/model.go:33:          87.5%
github.com/vaayne/anna/internal/config/paths.go:17:          100.0%
github.com/vaayne/anna/internal/config/paths.go:24:          60.0%
github.com/vaayne/anna/internal/config/paths.go:42:          100.0%
github.com/vaayne/anna/internal/config/paths.go:48:          100.0%
github.com/vaayne/anna/internal/config/paths.go:53:          100.0%
github.com/vaayne/anna/internal/config/snapshot.go:100:      0.0%
github.com/vaayne/anna/internal/config/snapshot.go:111:      100.0%
github.com/vaayne/anna/internal/config/snapshot.go:116:      100.0%
github.com/vaayne/anna/internal/config/snapshot.go:43:       100.0%
github.com/vaayne/anna/internal/config/snapshot.go:52:       100.0%
github.com/vaayne/anna/internal/config/snapshot.go:67:       100.0%
github.com/vaayne/anna/internal/config/snapshot.go:75:       87.5%
github.com/vaayne/anna/internal/db/database.go:112:          0.0%
github.com/vaayne/anna/internal/db/database.go:132:          0.0%
github.com/vaayne/anna/internal/db/database.go:18:           0.0%
github.com/vaayne/anna/internal/db/database.go:44:           0.0%
github.com/vaayne/anna/internal/db/database.go:57:           0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_agent_memory.sql.go:125: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_agent_memory.sql.go:21: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_agent_memory.sql.go:35: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_agent_memory.sql.go:51: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_agent_memory.sql.go:83: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_conversations.sql.go:113: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_conversations.sql.go:136: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_conversations.sql.go:175: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_conversations.sql.go:220: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_conversations.sql.go:234: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_conversations.sql.go:243: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_conversations.sql.go:24: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_conversations.sql.go:252: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_conversations.sql.go:266: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_conversations.sql.go:280: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_conversations.sql.go:59: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_conversations.sql.go:90: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_items.sql.go:127: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_items.sql.go:174: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_items.sql.go:193: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_items.sql.go:220: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_items.sql.go:26: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_items.sql.go:41: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_items.sql.go:57: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_items.sql.go:66: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_items.sql.go:79: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_messages.sql.go:101: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_messages.sql.go:121: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_messages.sql.go:132: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_messages.sql.go:170: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_messages.sql.go:218: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_messages.sql.go:262: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_messages.sql.go:29: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_messages.sql.go:307: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_messages.sql.go:70: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_messages.sql.go:90: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_summaries.sql.go:100: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_summaries.sql.go:140: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_summaries.sql.go:167: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_summaries.sql.go:210: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_summaries.sql.go:249: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_summaries.sql.go:296: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_summaries.sql.go:312: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_summaries.sql.go:32: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_summaries.sql.go:330: 0.0%
github.com/vaayne/anna/internal/db/sqlc/ctx_summaries.sql.go:53: 0.0%
github.com/vaayne/anna/internal/db/sqlc/db.go:19:            0.0%
github.com/vaayne/anna/internal/db/sqlc/db.go:27:            0.0%
github.com/vaayne/anna/internal/db/sqlc/sched_jobs.sql.go:100: 0.0%
github.com/vaayne/anna/internal/db/sqlc/sched_jobs.sql.go:155: 0.0%
github.com/vaayne/anna/internal/db/sqlc/sched_jobs.sql.go:33: 0.0%
github.com/vaayne/anna/internal/db/sqlc/sched_jobs.sql.go:68: 0.0%
github.com/vaayne/anna/internal/db/sqlc/sched_jobs.sql.go:77: 0.0%
github.com/vaayne/anna/internal/db/sqlc/settings.sql.go:16:  0.0%
github.com/vaayne/anna/internal/db/sqlc/settings.sql.go:25:  0.0%
github.com/vaayne/anna/internal/db/sqlc/settings.sql.go:36:  0.0%
github.com/vaayne/anna/internal/db/sqlc/settings.sql.go:72:  0.0%
github.com/vaayne/anna/internal/db/sqlc/settings_agents.sql.go:129: 0.0%
github.com/vaayne/anna/internal/db/sqlc/settings_agents.sql.go:187: 0.0%
github.com/vaayne/anna/internal/db/sqlc/settings_agents.sql.go:29: 0.0%
github.com/vaayne/anna/internal/db/sqlc/settings_agents.sql.go:60: 0.0%
github.com/vaayne/anna/internal/db/sqlc/settings_agents.sql.go:69: 0.0%
github.com/vaayne/anna/internal/db/sqlc/settings_agents.sql.go:91: 0.0%
github.com/vaayne/anna/internal/db/sqlc/settings_channel_agents.sql.go:21: 0.0%
github.com/vaayne/anna/internal/db/sqlc/settings_channel_agents.sql.go:35: 0.0%
github.com/vaayne/anna/internal/db/sqlc/settings_channel_agents.sql.go:51: 0.0%
github.com/vaayne/anna/internal/db/sqlc/settings_channel_agents.sql.go:93: 0.0%
github.com/vaayne/anna/internal/db/sqlc/settings_channels.sql.go:16: 0.0%
github.com/vaayne/anna/internal/db/sqlc/settings_channels.sql.go:33: 0.0%
github.com/vaayne/anna/internal/db/sqlc/settings_channels.sql.go:77: 0.0%
github.com/vaayne/anna/internal/db/sqlc/settings_providers.sql.go:121: 0.0%
github.com/vaayne/anna/internal/db/sqlc/settings_providers.sql.go:25: 0.0%
github.com/vaayne/anna/internal/db/sqlc/settings_providers.sql.go:48: 0.0%
github.com/vaayne/anna/internal/db/sqlc/settings_providers.sql.go:57: 0.0%
github.com/vaayne/anna/internal/db/sqlc/settings_providers.sql.go:75: 0.0%
github.com/vaayne/anna/internal/db/sqlc/settings_users.sql.go:130: 0.0%
github.com/vaayne/anna/internal/db/sqlc/settings_users.sql.go:150: 0.0%
github.com/vaayne/anna/internal/db/sqlc/settings_users.sql.go:25: 0.0%
github.com/vaayne/anna/internal/db/sqlc/settings_users.sql.go:44: 0.0%
github.com/vaayne/anna/internal/db/sqlc/settings_users.sql.go:68: 0.0%
github.com/vaayne/anna/internal/db/sqlc/settings_users.sql.go:87: 0.0%
github.com/vaayne/anna/internal/memory/assembler.go:100:     85.7%
github.com/vaayne/anna/internal/memory/assembler.go:113:     66.7%
github.com/vaayne/anna/internal/memory/assembler.go:147:     100.0%
github.com/vaayne/anna/internal/memory/assembler.go:182:     87.5%
github.com/vaayne/anna/internal/memory/assembler.go:19:      100.0%
github.com/vaayne/anna/internal/memory/assembler.go:26:      90.9%
github.com/vaayne/anna/internal/memory/assembler.go:83:      100.0%
github.com/vaayne/anna/internal/memory/compaction.go:125:    100.0%
github.com/vaayne/anna/internal/memory/compaction.go:156:    82.4%
github.com/vaayne/anna/internal/memory/compaction.go:24:     100.0%
github.com/vaayne/anna/internal/memory/compaction.go:271:    88.2%
github.com/vaayne/anna/internal/memory/compaction.go:312:    100.0%
github.com/vaayne/anna/internal/memory/compaction.go:350:    81.0%
github.com/vaayne/anna/internal/memory/compaction.go:37:     81.8%
github.com/vaayne/anna/internal/memory/compaction.go:476:    100.0%
github.com/vaayne/anna/internal/memory/compaction.go:78:     63.6%
github.com/vaayne/anna/internal/memory/compaction.go:98:     87.5%
github.com/vaayne/anna/internal/memory/context.go:14:        0.0%
github.com/vaayne/anna/internal/memory/context.go:19:        0.0%
github.com/vaayne/anna/internal/memory/context.go:25:        0.0%
github.com/vaayne/anna/internal/memory/context.go:30:        0.0%
github.com/vaayne/anna/internal/memory/context.go:36:        0.0%
github.com/vaayne/anna/internal/memory/context.go:41:        0.0%
github.com/vaayne/anna/internal/memory/engine.go:107:        100.0%
github.com/vaayne/anna/internal/memory/engine.go:113:        80.0%
github.com/vaayne/anna/internal/memory/engine.go:124:        78.6%
github.com/vaayne/anna/internal/memory/engine.go:182:        75.0%
github.com/vaayne/anna/internal/memory/engine.go:191:        88.9%
github.com/vaayne/anna/internal/memory/engine.go:207:        85.7%
github.com/vaayne/anna/internal/memory/engine.go:220:        100.0%
github.com/vaayne/anna/internal/memory/engine.go:226:        75.0%
github.com/vaayne/anna/internal/memory/engine.go:275:        100.0%
github.com/vaayne/anna/internal/memory/engine.go:284:        90.9%
github.com/vaayne/anna/internal/memory/engine.go:304:        77.8%
github.com/vaayne/anna/internal/memory/engine.go:324:        66.7%
github.com/vaayne/anna/internal/memory/engine.go:331:        83.3%
github.com/vaayne/anna/internal/memory/engine.go:355:        100.0%
github.com/vaayne/anna/internal/memory/engine.go:363:        100.0%
github.com/vaayne/anna/internal/memory/engine.go:379:        75.0%
github.com/vaayne/anna/internal/memory/engine.go:406:        100.0%
github.com/vaayne/anna/internal/memory/engine.go:414:        80.0%
github.com/vaayne/anna/internal/memory/engine.go:475:        100.0%
github.com/vaayne/anna/internal/memory/engine.go:488:        83.3%
github.com/vaayne/anna/internal/memory/engine.go:510:        100.0%
github.com/vaayne/anna/internal/memory/engine.go:531:        100.0%
github.com/vaayne/anna/internal/memory/engine.go:54:         100.0%
github.com/vaayne/anna/internal/memory/engine.go:556:        100.0%
github.com/vaayne/anna/internal/memory/engine.go:571:        100.0%
github.com/vaayne/anna/internal/memory/engine.go:594:        100.0%
github.com/vaayne/anna/internal/memory/engine.go:615:        100.0%
github.com/vaayne/anna/internal/memory/engine.go:63:         100.0%
github.com/vaayne/anna/internal/memory/engine.go:650:        100.0%
github.com/vaayne/anna/internal/memory/engine.go:660:        100.0%
github.com/vaayne/anna/internal/memory/engine.go:71:         83.3%
github.com/vaayne/anna/internal/memory/engine.go:85:         100.0%
github.com/vaayne/anna/internal/memory/retrieval.go:133:     92.6%
github.com/vaayne/anna/internal/memory/retrieval.go:14:      100.0%
github.com/vaayne/anna/internal/memory/retrieval.go:188:     100.0%
github.com/vaayne/anna/internal/memory/retrieval.go:197:     100.0%
github.com/vaayne/anna/internal/memory/retrieval.go:211:     100.0%
github.com/vaayne/anna/internal/memory/retrieval.go:27:      0.0%
github.com/vaayne/anna/internal/memory/retrieval.go:37:      86.4%
github.com/vaayne/anna/internal/memory/retrieval.go:94:      87.5%
github.com/vaayne/anna/internal/memory/summarize.go:127:     94.7%
github.com/vaayne/anna/internal/memory/summarize.go:164:     100.0%
github.com/vaayne/anna/internal/memory/summarize.go:193:     100.0%
github.com/vaayne/anna/internal/memory/summarize.go:96:      100.0%
github.com/vaayne/anna/internal/memory/tool/helpers.go:4:    71.4%
github.com/vaayne/anna/internal/memory/tool/memory.go:125:   80.0%
github.com/vaayne/anna/internal/memory/tool/memory.go:143:   81.8%
github.com/vaayne/anna/internal/memory/tool/memory.go:163:   85.7%
github.com/vaayne/anna/internal/memory/tool/memory.go:61:    100.0%
github.com/vaayne/anna/internal/memory/tool/memory.go:65:    100.0%
github.com/vaayne/anna/internal/memory/tool/memory.go:79:    100.0%
github.com/vaayne/anna/internal/memory/tool/memory.go:95:    88.2%
github.com/vaayne/anna/internal/memory/types.go:125:         100.0%
github.com/vaayne/anna/internal/memory/types.go:200:         100.0%
github.com/vaayne/anna/internal/memory/usermemory.go:16:     100.0%
github.com/vaayne/anna/internal/memory/usermemory.go:22:     75.0%
github.com/vaayne/anna/internal/memory/usermemory.go:31:     66.7%
github.com/vaayne/anna/internal/plugin/adapt.go:15:          100.0%
github.com/vaayne/anna/internal/plugin/adapt.go:23:          100.0%
github.com/vaayne/anna/internal/plugin/adapt.go:28:          100.0%
github.com/vaayne/anna/internal/plugin/convert.go:12:        43.8%
github.com/vaayne/anna/internal/plugin/convert.go:46:        85.7%
github.com/vaayne/anna/internal/plugin/convert.go:58:        71.4%
github.com/vaayne/anna/internal/plugin/hostapi.go:105:       92.3%
github.com/vaayne/anna/internal/plugin/hostapi.go:131:       37.5%
github.com/vaayne/anna/internal/plugin/hostapi.go:149:       100.0%
github.com/vaayne/anna/internal/plugin/hostapi.go:154:       50.9%
github.com/vaayne/anna/internal/plugin/hostapi.go:247:       0.0%
github.com/vaayne/anna/internal/plugin/hostapi.go:279:       0.0%
github.com/vaayne/anna/internal/plugin/hostapi.go:35:        55.0%
github.com/vaayne/anna/internal/plugin/manager.go:20:        100.0%
github.com/vaayne/anna/internal/plugin/manager.go:28:        0.0%
github.com/vaayne/anna/internal/plugin/manager.go:34:        83.3%
github.com/vaayne/anna/internal/plugin/manager.go:46:        66.7%
github.com/vaayne/anna/internal/plugin/manager.go:57:        0.0%
github.com/vaayne/anna/internal/plugin/manager.go:67:        100.0%
github.com/vaayne/anna/internal/plugin/manager.go:76:        100.0%
github.com/vaayne/anna/internal/plugin/registry.go:18:       100.0%
github.com/vaayne/anna/internal/plugin/registry.go:31:       100.0%
github.com/vaayne/anna/internal/plugin/registry.go:45:       100.0%
github.com/vaayne/anna/internal/plugin/registry.go:52:       100.0%
github.com/vaayne/anna/internal/plugin/registry.go:72:       100.0%
github.com/vaayne/anna/internal/plugin/runtime.go:207:       85.0%
github.com/vaayne/anna/internal/plugin/runtime.go:245:       100.0%
github.com/vaayne/anna/internal/plugin/runtime.go:24:        100.0%
github.com/vaayne/anna/internal/plugin/runtime.go:26:        100.0%
github.com/vaayne/anna/internal/plugin/runtime.go:40:        100.0%
github.com/vaayne/anna/internal/plugin/runtime.go:46:        84.3%
github.com/vaayne/anna/internal/scheduler/heartbeat.go:113:  75.0%
github.com/vaayne/anna/internal/scheduler/heartbeat.go:129:  80.0%
github.com/vaayne/anna/internal/scheduler/heartbeat.go:146:  80.0%
github.com/vaayne/anna/internal/scheduler/heartbeat.go:155:  90.9%
github.com/vaayne/anna/internal/scheduler/heartbeat.go:175:  71.4%
github.com/vaayne/anna/internal/scheduler/heartbeat.go:190:  100.0%
github.com/vaayne/anna/internal/scheduler/heartbeat.go:209:  100.0%
github.com/vaayne/anna/internal/scheduler/heartbeat.go:36:   100.0%
github.com/vaayne/anna/internal/scheduler/heartbeat.go:45:   0.0%
github.com/vaayne/anna/internal/scheduler/heartbeat.go:64:   83.9%
github.com/vaayne/anna/internal/scheduler/job.go:39:         85.7%
github.com/vaayne/anna/internal/scheduler/persistence.go:118: 71.4%
github.com/vaayne/anna/internal/scheduler/persistence.go:16: 85.7%
github.com/vaayne/anna/internal/scheduler/persistence.go:29: 100.0%
github.com/vaayne/anna/internal/scheduler/persistence.go:51: 100.0%
github.com/vaayne/anna/internal/scheduler/persistence.go:57: 71.9%
github.com/vaayne/anna/internal/scheduler/service.go:103:    100.0%
github.com/vaayne/anna/internal/scheduler/service.go:107:    88.0%
github.com/vaayne/anna/internal/scheduler/service.go:151:    60.0%
github.com/vaayne/anna/internal/scheduler/service.go:162:    0.0%
github.com/vaayne/anna/internal/scheduler/service.go:187:    87.8%
github.com/vaayne/anna/internal/scheduler/service.go:267:    84.6%
github.com/vaayne/anna/internal/scheduler/service.go:294:    100.0%
github.com/vaayne/anna/internal/scheduler/service.go:305:    88.9%
github.com/vaayne/anna/internal/scheduler/service.go:349:    88.9%
github.com/vaayne/anna/internal/scheduler/service.go:52:     75.0%
github.com/vaayne/anna/internal/scheduler/service.go:69:     0.0%
github.com/vaayne/anna/internal/scheduler/service.go:85:     100.0%
github.com/vaayne/anna/internal/scheduler/service.go:90:     100.0%
github.com/vaayne/anna/internal/scheduler/service.go:97:     100.0%
github.com/vaayne/anna/internal/scheduler/tool.go:108:       100.0%
github.com/vaayne/anna/internal/scheduler/tool.go:118:       83.3%
github.com/vaayne/anna/internal/scheduler/tool.go:62:        100.0%
github.com/vaayne/anna/internal/scheduler/tool.go:67:        100.0%
github.com/vaayne/anna/internal/scheduler/tool.go:76:        100.0%
github.com/vaayne/anna/internal/scheduler/tool.go:90:        91.7%
github.com/vaayne/anna/internal/skills/install.go:22:        100.0%
github.com/vaayne/anna/internal/skills/install.go:26:        88.9%
github.com/vaayne/anna/internal/skills/install.go:43:        46.7%
github.com/vaayne/anna/internal/skills/install.go:77:        0.0%
github.com/vaayne/anna/internal/skills/install.go:98:        75.0%
github.com/vaayne/anna/internal/skills/list.go:17:           87.5%
github.com/vaayne/anna/internal/skills/remove.go:14:         66.7%
github.com/vaayne/anna/internal/skills/remove.go:34:         100.0%
github.com/vaayne/anna/internal/skills/tool.go:54:           100.0%
github.com/vaayne/anna/internal/skills/tool.go:59:           100.0%
github.com/vaayne/anna/internal/skills/tool.go:68:           85.7%
github.com/vaayne/anna/internal/skills/tool.go:84:           23.1%

vaayne added 21 commits March 17, 2026 12:55
…ched_)

Group tables by domain for clarity:
- settings_* for config: providers, agents, channels, users, channel_agents
- ctx_* for context/LCM: conversations, messages, message_parts, summaries,
  summary_messages, summary_parents, items, agent_memory
- sched_* for scheduling: jobs

Delete old migrations and generate fresh baseline. Regenerate sqlc and
update all Go references to match new struct names.

Entire-Checkpoint: 1cbf898b240c
- Remove deprecated baseUrl from tsconfig.json, fix collections path
- Fix unbound-method lint warning in start.ts
- Remove volatile structure sections from CLAUDE.md files
- Update docs content and dependencies
- Move Google Fonts @import before Tailwind to fix PostCSS order error
- Pre-include fumadocs/React deps in SSR optimizeDeps to prevent
  runtime dep discovery that resets React's dispatcher state
- Dedupe react/react-dom to ensure single instance
- Fix wrangler compatibility_date to match installed runtime
add session plan/task records for the recent lcm, sqlite-only
persistence, and plugin system work.

move ignores into .agents/.gitignore so local agent binaries and logs
stay untracked while session artifacts are versioned.
- Remove ProviderID from Agent struct; model fields now use
  {provider}/{model} format (e.g. anthropic/claude-sonnet-4-6),
  allowing each tier (model, model_strong, model_fast) to use
  a different provider.
- Add Snapshot.Providers map for per-tier credential resolution,
  ParseModelRef() helper, and ResolveProviderCreds() method.
- Drop provider_id column from settings_agents (Atlas migration).
- Overhaul admin UI to match old onboard.html UX: provider presets
  with default base URLs, structured channel forms (Telegram/QQ/Feishu),
  model autocomplete from fetched models, scheduler schedule-type
  radio toggle, and inline job enable/disable toggles.
Remove `run:` prefix from task names (chat, stream, gateway) and
add onboard task for opening the admin panel.
Provider, Agent, Channel, and User structs were missing JSON tags,
causing Go to serialize fields as PascalCase (e.g. APIKey, BaseURL)
instead of snake_case (api_key, base_url) expected by the admin UI.
- Use x-model for provider fields instead of providerEdits indirection
- Send current (unsaved) credentials with fetch models request
- Track fetching/model state on provider objects for Alpine reactivity
- Add collapsible models list to provider cards after fetching
- Replace static users table with interactive user cards
- Add default agent selector per user with save
- Add expandable per-user agent memory viewer/editor
- Add backend APIs: user update, list/set/delete user memories
- Add ListUserAgentMemoriesByUser sqlc query
- Replace static sessions table with clickable session cards
- Add session detail view with back navigation, metadata badges
- Add chat-style message timeline (user/assistant/tool messages)
- Collapsible thinking blocks and tool call/result panels
- Add GET /api/sessions/{id} and /api/sessions/{id}/messages APIs
- Serialize raw DB rows to preserve real message timestamps
- Add relative time formatting (e.g. "8h ago", "3d ago")
- Add GET /api/sessions/{id}/system-prompt endpoint
- Build full system prompt on the fly via BuildSystemPromptFromDB
- Includes agent identity, user memory, skills, and project context
- Collapsible system prompt panel at top of session detail view
Merge 4 separate memory tools (memory_grep, memory_describe,
memory_expand, user_memory) into a unified `memory` tool with an
`action` parameter, following the same pattern as the scheduler tool.

Actions: grep, describe, expand, user_memory_update.

Also fixes the bug where user_memory was never registered as a tool:
- Add userID/agentID context propagation (memory.WithUserID/WithAgentID)
- Pool.Chat() sets both from session metadata (loaded from DB)
- Pool.ResolveSession/RotateSession/CreateSession accept optional userID
- Telegram channel passes resolved userID to session creation
- CLI auto-creates a "cli" user for local chat sessions
- QQ/Feishu pass through without userID (backward compat)
Add user resolution and agent routing to QQ bot, matching the Telegram
channel pattern:

- Add WithPoolManager/WithStore options to qq.New()
- Add resolvePool: resolve user → agent → pool per message
- Add buildSessionKey: always use agent.BuildSessionKey (no legacy fallback)
- Pass resolved userID to pool.ResolveSession for per-user memory
- Use resolved pool for streaming (not hardcoded b.pool)
- Wire poolManager and store in gateway
resolvePool now returns an error instead of silently falling back to
the default pool. No legacy single-agent mode — resolution must succeed.

Both channels: resolvePool returns (*Pool, int64, error). All callers
handle the error and report it to the user. Telegram buildSessionKey
also drops the legacy channelForChat fallback.
Add user resolution and agent routing to Feishu bot, matching the
Telegram and QQ channel pattern:

- Add WithPoolManager/WithStore options to feishu.New()
- Add resolvePool: resolve user → agent → pool per message, no fallback
- Add buildSessionKey: always use agent.BuildSessionKey
- Pass resolved pool and userID through handler → command → stream chain
- Wire poolManager and store in gateway
The /new, /compact, and /model commands were going through the
Commander/PoolAdapter which doesn't pass userID, causing sessions to
be created with UserID=0 and user memory to never load.

Fix: handleCommand and handleModelCommand now receive pool+userID
directly and bypass the Commander for session operations. Handlers
call resolvePool once and pass both pool and userID through.
switchModelByName and switchModelByIdx were using the Commander which
doesn't pass userID, causing sessions created by model switches to
have UserID=0. Now both use resolvePool directly and pass userID to
pool.RotateSession.

Also removes dead channelForChat function (no longer used).
…ution

Add channel.ResolvedChat struct and channel.Resolve() function that
performs the full user → agent → pool → session key resolution once per
incoming message. All three channels (Telegram, QQ, Feishu) now call
resolve() once and thread the result through handlers, eliminating
duplicated resolvePool/buildSessionKey/resolveSession methods and the
error-prone (pool, userID, sessionKey) parameter threading.
- Remove Commander, PoolAdapter, SessionPool, SessionInfo from channel
  package — all dead code after ResolvedChat was introduced
- Add ResolvedChat.Chat() — resolves session + streams in one call,
  eliminating session ID threading from all channel handlers
- Add shared HandleCommand() for /start, /help, /new, /compact, /whoami
  — each channel delegates to it, only handling /model themselves
- Remove `pool` field from all Bot structs — only poolManager + store
- Simplify Bot constructors: required params instead of WithPoolManager/
  WithStore options
- Remove `cmd` field from all Bot structs — replaced by shared functions
Rewrite README and all docs to reflect the DB-backed config system,
multi-agent support, multi-user routing, admin panel, and 3-layer
system prompt architecture.
@vaayne vaayne merged commit b5d2f4c into main Mar 17, 2026
6 checks passed
@vaayne vaayne deleted the feat/multi-user-agent branch March 17, 2026 12:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant