- Add SSE endpoints for real-time session sync:
- GET /events - global event stream for all sessions
- GET /session/:id/events - per-session event stream
- Events: session.created/updated/deleted, message.updated, todo.updated, status changes
- 30-second keepalive heartbeat
- Add session handoff API:
- POST /session/:id/handoff - prepare session for transfer to another platform
- Returns session context, last message, todos, and deep link URL
- Supports: mobile, web, cli, telegram, whatsapp targets
- Add unified notification endpoint:
- POST /notify - send notifications across platforms
- Supports Telegram and WhatsApp broadcast
- Includes deep linking to sessions
- Add docs/CROSS-PLATFORM.md with:
- Architecture overview
- API documentation
- Integration patterns for mobile/web
- Deep linking scheme (agentcore://)
- Offline support guidance
- Update ROADMAP.md marking Phase 6.2 as complete
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add Branches section to sidebar showing parent/siblings/children
- Clickable branch items to navigate between related sessions
- Add breadcrumb trail in header showing session ancestry
- Clickable ancestors to jump up the session tree
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add `theme` field to agent schema for per-persona themes
- Auto-switch theme when changing agents
- Configure persona themes: Zee (cobalt2), Stanley (matrix), Johny (rosepine)
- Add "Delegate to persona" command (<leader>d) to prepend @persona to prompt
- Create DialogDelegation component for persona selection
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Shows ✗ for expired and △ for expiring tokens next to provider names
in favorites, recent, and all providers sections.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add VoyageEmbeddingProvider for Voyage AI embeddings
- Add MemoryStore with high-level store/search/list API
- Configure Nebius cloud API for Qwen3-Embedding-8B (#1 on MTEB)
- Fix LocalEmbeddingProvider to support both /v1/embeddings and /embeddings
- Fix QdrantVectorStorage to set collection on existing collections
Model: Qwen3-Embedding-8B (70.58 MTEB score, 99% zero-shot, 4096 dims)
Provider: Nebius API (https://api.tokenfactory.nebius.com/v1)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Change serve command output from "agent-core server listening" to
"opencode server listening" for compatibility with @opencode-ai/sdk.
The SDK parses stdout looking for "opencode server listening" to
determine when the server is ready.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Document the shared configuration architecture between agent-core and zee:
- Shared primitives in src/config/shared.ts
- Architecture overview showing ownership patterns
- Key patterns for config, browser, memory, and sessions
- Migration path for zee to import shared types
- Current status and future work
This serves as a reference for the consolidation work and guides
future development on the shared configuration layer.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Create shared.ts with common configuration types that can be used
across agent-core and zee gateway:
- Session primitives: SessionScope, ReplyMode, TypingMode, ReplyToMode
- Policy types: DmPolicy, GroupPolicy
- Logging: LogLevel, ConsoleStyle, LoggingConfig
- Network: RetryConfig, BindMode
- Model/Provider: ModelApi, ModelDefinition, ProviderDefinition
- Processing: ThinkingLevel, QueueMode, QueueDropPolicy
Update types.ts to use shared primitives:
- GeneralSettings.logLevel now uses shared LogLevel
- WhatsAppConfig extended with dmPolicy, groupPolicy, allowFrom, retry
- TelegramConfig extended with dmPolicy, groupPolicy, allowFrom, retry
This is the first step toward config consolidation between agent-core
and zee gateway, enabling type-safe sharing of common configuration.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- bun run works more reliably for spawning child processes
- npx tsx has PATH issues when spawned as subprocess
- Enable all persona MCP servers by default
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Implements three MCP servers that expose persona capabilities to external
tools via the Model Context Protocol:
- personas-memory: Qdrant-backed semantic memory (store, search, list, delete, stats)
- personas-calendar: Google Calendar integration (events, create, update, delete, free slots, quick add)
- personas-portfolio: Financial tools bridging to Stanley CLI (portfolio, market data, SEC filings, research, backtest)
Each server uses @modelcontextprotocol/sdk with Zod schemas for type-safe
tool definitions and stdio transport for local process communication.
Config entries added (disabled by default):
- "personas-memory": npx tsx src/mcp/servers/memory.ts
- "personas-calendar": npx tsx src/mcp/servers/calendar.ts
- "personas-portfolio": npx tsx src/mcp/servers/portfolio.ts
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Mark existing TUI improvements as complete:
- Favorites system in model selector
- Recently used models tracking
- Cost display (Free badge)
- Persistent agent state via ContinuityManager
- Better compaction summaries via continuity.ts
Remaining Phase 4 items:
- Provider status indicators
- Agent-specific themes/colors
- Agent handoff
- Conversation branching/export
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Mark Phase 3.1 Memory System as COMPLETE:
- Qdrant vector storage with full CRUD
- MemoryStore high-level API
- BGE-M3 embeddings via vLLM
- ContinuityManager for session persistence
- Cross-persona memory sharing with namespaces
Mark Phase 3.2 Orchestration as COMPLETE:
- Orchestrator with full worker lifecycle
- WezTerm pane management
- Tiara/SPARC integration
- DroneWaiter for async completion
- Fact extraction hooks
Remaining: MCP servers for external tool exposure
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add Auth.refreshToken() to refresh a specific provider's token
- Add Auth.refreshAllExpiring() to refresh all tokens expiring within 10 min
- Add Auth.status() to get token validity info for all providers
- Add Auth.isExpiringSoon() and Auth.isExpired() helpers
- Call refreshAllExpiring() during provider initialization
Supported providers: anthropic, openai
Note: google/antigravity uses plugin-handled custom flow
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Disable google-vertex and google-vertex-anthropic (redundant with Antigravity)
- Remove non-working antigravity provider config
- Use built-in antigravity-* models from provider.ts
- Add zee, stanley, johny agent definitions
- Update compaction to use google/antigravity-gemini-3-flash
- Update johny.md to use google/antigravity-claude-opus-4-5-thinking
- Remove top_p from agent files (handled by ProviderTransform)
- Add docs/PROVIDERS.md with provider setup documentation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add topP: 0.95 to antigravity Claude thinking model definitions
- Add topP check in transform.ts for claude+thinking models
- Wrap plugin fetch to remove x-goog-api-key header (conflicts with OAuth)
- Add createEffect to properly initialize agent selection on load
- Update CLAUDE.md with binary update process documentation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add favorite property to model store and favorite() method required
by dialog-model.tsx after upstream merge.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Each Telegram bot is tied to a specific persona (Stanley or Johny)
- Remove persona detection patterns - each bot only responds as its persona
- Support separate bot tokens via --telegram-stanley-token and --telegram-johny-token
- Update namespace to manage multiple bot instances
- Add persona-specific welcome messages and descriptions
Bots:
- @triad_stanley_bot - Investing & Trading Assistant
- @triad_johny_bot - Learning & Study Assistant
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The google-antigravity provider was redundant - the opencode-antigravity-auth
plugin already handles OAuth, request transformation, and API calls through
the standard 'google' provider.
Testing confirmed google/gemini-2.5-flash works via the plugin:
bun run ./src/index.ts run --model google/gemini-2.5-flash "Say hello"
Changes:
- Remove google-antigravity custom loader and provider definition
- Remove antigravity.ts token refresh helper (unused)
- Keep auth OAuth passthrough for extra fields like projectId, email
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix API message format: use `parts` array instead of `content`
- Add `agent` parameter to route messages to correct persona
- Add `x-opencode-directory` header for proper session handling
- Same fixes as WhatsApp gateway
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix model selection not persisting across restarts by saving/loading
the model field in model.json (was only saving recent and variant)
- Call save() on every model change, not just when adding to recents
- Add google-antigravity provider for free Gemini access via OAuth
- Create antigravity.ts helper for token refresh via antigravity proxy
- Provider inherits all Google models but marks them as free (cost: 0)
- Auto-refresh tokens with 5-minute buffer before expiry
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- WhatsApp is exclusively Zee's channel using GLM 4.7 via Z.ai (cerebras)
- Remove persona detection patterns (Stanley/Johny use Telegram instead)
- Fix API message format: use `parts` array instead of `content`
- Add `agent` parameter to route messages to correct persona
- Add `x-opencode-directory` header for proper session handling
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Terminal QR codes can be distorted by font size/line height. Save QR as
PNG file that can be opened with an image viewer for reliable scanning.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Update CLI to use agent-core naming consistently so it can be installed
and run globally without confusion with upstream opencode project.
- Update yargs scriptName to agent-core
- Add AGENT_CORE env var (keep OPENCODE for backwards compat)
- Update build to output agent-core binary
- Update bin shim to find both agent-core-* and opencode-* packages
- Update all command descriptions to use agent-core
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The web package still referenced the old "opencode" workspace name,
causing bun install to fail with "Workspace dependency not found".
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Users must be able to run both agent-core and OpenCode without
confusion. All new code, docs, and user-facing text should use
'agent-core' naming instead of 'opencode'.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- New WhatsApp gateway using whatsapp-web.js
- QR code authentication on first run
- Session persistence across restarts
- Intent-based persona routing (same as Telegram)
- Phone number allowlist support
- Integrated into daemon with --whatsapp flag
Usage:
opencode daemon --whatsapp --port 4567
Note: Requires whatsapp-web.js and qrcode-terminal packages.
Dynamic imports allow graceful failure if not installed.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
sync.data.todo is only populated when sessions are opened, so the
startup check was always finding zero todos. Now uses Todo.get()
to read directly from storage for each session.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Phase 0.3 completion:
- Show toast on TUI startup if any sessions have incomplete todos
- Display count: "◐ N pending todos in M sessions"
- Update roadmap: mark Phase 0 as Complete
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Filter out cancelled todos (consistency with other implementations)
- Update display to use ◐ symbol: "◐ N pending · task..."
- Mark Phase 0.2 TUI Integration as complete in roadmap
The prompt hint was already implemented, this commit improves it
for consistency with the session list indicator.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The todo continuation reminder was already implemented in prompt.ts
at insertReminders() (lines 1180-1219). Updates roadmap to reflect this.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
When switching between sessions in the TUI:
- Shows toast warning with count of incomplete todos
- Session list displays ◐{count} indicator for sessions with pending work
This helps users track unfinished tasks across sessions.
Updates roadmap Phase 0.2 TUI Integration status.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>