df71850d4f
feat(M3-001): refactor ProviderService into IProviderAdapter pattern
...
ci/woodpecker/push/ci Pipeline failed
ci/woodpecker/pr/ci Pipeline failed
Introduces the IProviderAdapter interface as the architecture foundation for
multi-provider support. Extracts Ollama logic into OllamaAdapter and makes
ProviderService adapter-aware while preserving the full existing API.
## What changed
### @mosaic/types — new provider adapter types
- IProviderAdapter interface: register(), listModels(), healthCheck(), createCompletion()
- ProviderHealth / ProviderHealthStatus — health check result
- CompletionParams / CompletionMessage / CompletionTool — completion request
- CompletionEvent / CompletionUsage — streamed completion response
### apps/gateway — adapter implementation
- apps/gateway/src/agent/adapters/ollama.adapter.ts — OllamaAdapter (extracted from ProviderService)
- apps/gateway/src/agent/adapters/index.ts — barrel export
- ProviderService.onModuleInit() is now async (awaits registerAll())
- New ProviderService methods: registerAll(), getAdapter(), healthCheckAll()
- PROVIDER_ADAPTERS symbol exported as future DI injection token
- Anthropic/OpenAI/Z.ai remain as direct registry calls (M3-002 to M3-005 scope)
- Updated provider.service.test.ts: all tests now await onModuleInit()
## Pi SDK compatibility findings
Pi SDK uses ModelRegistry as central registry. The adapter pattern is a Mosaic
abstraction layered on top — adapters call registry.registerProvider() during
register(). Pi SDK has no native adapter concept; it does not conflict.
createCompletion() is defined in the interface but not called by the Pi layer.
Pi SDK's AgentSession.prompt() and ModelRegistry.getAvailable() handle all
actual completions. createCompletion() is reserved for future direct-completion
use cases (post-M3 scope). OllamaAdapter throws NotImplementedError for now.
No Pi SDK friction was found for the adapter pattern. The registry integration
point (registerProvider()) is exactly what the existing code already used.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-21 16:15:35 -05:00
eddcca7533
feat(gateway): load conversation history on session resume (M1-004, M1-005) ( #301 )
...
ci/woodpecker/push/ci Pipeline failed
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-21 21:00:13 +00:00
ad06e00f99
feat(conversations): add search endpoint — M1-006 ( #299 )
...
ci/woodpecker/push/ci Pipeline failed
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-21 20:45:50 +00:00
5b089392fd
fix(security): M2-008 Valkey key audit — SCAN over KEYS, restrict /gc to admin ( #298 )
...
ci/woodpecker/push/ci Pipeline failed
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-21 20:45:43 +00:00
1d14ddcfe7
chore: Wave 1 complete — fix merge conflicts, update task status ( #296 )
...
ci/woodpecker/push/ci Pipeline failed
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-21 20:37:27 +00:00
05a805eeca
fix(memory): scope InsightsRepo operations to userId — M2-001/002 ( #290 )
...
ci/woodpecker/push/ci Pipeline failed
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-21 20:34:42 +00:00
ebf99d9ff7
fix(M2-005,M2-006): enforce user ownership at repo level for conversations and agents ( #293 )
...
ci/woodpecker/push/ci Pipeline failed
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-21 20:34:11 +00:00
bb22857fde
fix(security): scope memory tools to session userId — M2-003/004 ( #294 )
...
ci/woodpecker/push/ci Pipeline failed
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-21 20:19:19 +00:00
5261048d67
feat(chat): persist messages to DB via ConversationsRepo (M1-001/002/003) ( #292 )
...
ci/woodpecker/push/ci Pipeline failed
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-21 20:18:05 +00:00
dd108b9ab4
feat(auth): add WorkOS and Keycloak SSO providers (rebased) ( #220 )
...
ci/woodpecker/push/ci Pipeline failed
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-21 12:57:07 +00:00
061edcaa78
Merge pull request 'feat(gateway): add Anthropic, OpenAI, Z.ai LLM providers (P8-002)' ( #212 ) from feat/p8-002-llm-providers into main
...
ci/woodpecker/push/ci Pipeline failed
Reviewed-on: mosaic/mosaic-stack#212
2026-03-21 12:28:50 +00:00
714fee52b9
feat(gateway): add Anthropic, OpenAI, Z.ai LLM providers (P8-002)
2026-03-18 21:34:38 -05:00
3b81bc9f3d
perf: gateway + DB + frontend optimizations (P8-003)
...
- DB client: configure connection pool (max=20, idle_timeout=30s, connect_timeout=5s)
- DB schema: add missing indexes for auth sessions, accounts, conversations, agent_logs
- DB schema: promote preferences(user_id,key) to UNIQUE index for ON CONFLICT upsert
- Drizzle migration: 0003_p8003_perf_indexes.sql
- preferences.service: replace 2-query SELECT+INSERT/UPDATE with single-round-trip upsert
- conversations repo: add ORDER BY + LIMIT to findAll (200) and findMessages (500)
- session-gc.service: make onModuleInit fire-and-forget (removes cold-start TTFB block)
- next.config.ts: enable compress, productionBrowserSourceMaps:false, image avif/webp
- docs/PERFORMANCE.md: full profiling report and change impact notes
2026-03-18 21:26:45 -05:00
cbfd6fb996
fix(web): conversation DELETE — resolve Failed to fetch TypeError ( #204 )
...
ci/woodpecker/push/ci Pipeline failed
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-17 02:43:56 +00:00
3f8553ce07
fix(cli): TUI polish — Ctrl+T, React keys, clipboard, version ( #205 )
...
ci/woodpecker/push/ci Pipeline failed
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-17 02:40:18 +00:00
bf668e18f1
fix(web): admin page role check — stop false redirect to /chat ( #203 )
...
ci/woodpecker/push/ci Pipeline failed
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-17 02:38:25 +00:00
93645295d5
fix(gateway): filter projects by ownership — close data privacy leak ( #202 )
...
ci/woodpecker/push/ci Pipeline failed
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-17 02:35:45 +00:00
7a52652be6
feat(gateway): Discord channel auto-creation on project bootstrap ( #200 )
...
ci/woodpecker/push/ci Pipeline was successful
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-17 02:32:14 +00:00
791c8f505e
feat(gateway): /system override condensation — accumulate + Haiku merge ( #198 )
...
ci/woodpecker/push/ci Pipeline was successful
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-17 02:26:31 +00:00
12653477d6
feat(gateway): project bootstrap — docs structure + default agent ( #190 )
...
ci/woodpecker/push/ci Pipeline was successful
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-17 02:12:24 +00:00
dedfa0d9ac
fix(gateway): system override TTL 5min → 7 days ( #189 )
...
ci/woodpecker/push/ci Pipeline was successful
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-17 02:06:58 +00:00
39ef2ff123
feat: verify Phase 8 platform architecture + integration tests (P8-019) ( #185 )
...
ci/woodpecker/push/ci Pipeline was successful
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-16 03:43:42 +00:00
0821393c1d
feat(gateway): WorkspaceService + ProjectBootstrapService + TeamsService (P8-015)
...
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful
- WorkspaceService: path resolution, git init/clone, directory lifecycle (create/delete/exists), user and team root provisioning
- ProjectBootstrapService: orchestrates DB record creation (via Brain) + workspace directory init in a single call
- TeamsService: isMember, canAccessProject, findAll, findById, listMembers via Drizzle DB queries
- WorkspaceController: POST /api/workspaces — auth-guarded project bootstrap endpoint
- TeamsController: GET /api/teams, /:teamId, /:teamId/members, /:teamId/members/:userId
- WorkspaceModule wired into AppModule
- workspace.service.spec.ts: 5 unit tests for resolvePath (user, team, fallback, env var, default)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-15 22:06:01 -05:00
24f5c0699a
feat(gateway): MosaicPlugin lifecycle + ReloadService + hot reload (P8-013) ( #182 )
...
ci/woodpecker/push/ci Pipeline was successful
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-16 03:00:56 +00:00
96409c40bf
feat(gateway): /agent, /provider, /mission, /prdy, /tools commands (P8-012) ( #181 )
...
ci/woodpecker/push/ci Pipeline was successful
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-16 02:50:18 +00:00
b649b5c987
feat(gateway): SessionGCService three-tier GC + /gc command + cron (P8-014)
...
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful
Implements three-tier garbage collection for agent sessions:
- SessionGCService.collect() for immediate per-session cleanup on destroySession()
- SessionGCService.sweepOrphans() for daily cron sweep of orphaned Valkey keys
- SessionGCService.fullCollect() for cold-start aggressive cleanup via OnModuleInit
- /gc slash command wired into CommandExecutorService + registered in CommandRegistryService
- SESSION_GC_CRON (daily 4am) added to CronService
- GCModule provides Valkey (ioredis via @mosaic/queue) and is imported by AgentModule, LogModule, CommandsModule, AppModule
- 8 Vitest unit tests covering all three GC tiers
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-15 21:38:48 -05:00
85aeebbde2
feat(gateway): PreferencesService + /preferences REST + /system Valkey override (P8-011)
...
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful
- PreferencesService: platform defaults, user overrides, IMMUTABLE_KEYS enforcement
- PreferencesController: GET /api/preferences, POST /api/preferences, DELETE /api/preferences/:key
- PreferencesModule: global module exporting PreferencesService and SystemOverrideService
- SystemOverrideService: Valkey-backed session-scoped system prompt override with 5-min TTL + renew
- CommandRegistryService: register /system command (socket execution)
- CommandExecutorService: handle /system command via SystemOverrideService
- AgentService: inject system override before each prompt turn, renew TTL; store userId in session
- ChatGateway: pass userId when creating agent sessions
- PreferencesService unit tests: 11 tests covering defaults, overrides, enforcement wins, immutable key errors
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-15 21:32:03 -05:00
a4bb563779
feat(gateway): CommandRegistryService + CommandExecutorService (P8-010) ( #178 )
...
ci/woodpecker/push/ci Pipeline was successful
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-16 02:10:31 +00:00
7f6464bbda
feat(gateway): tool path hardening + sandbox escape prevention (P8-016) ( #177 )
...
ci/woodpecker/push/ci Pipeline was successful
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-16 02:02:48 +00:00
4da255bf04
feat(cli): command architecture — agents, missions, gateway-aware prdy ( #158 )
...
ci/woodpecker/push/ci Pipeline failed
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-15 23:10:23 +00:00
82c10a7b33
feat(cli): TUI complete overhaul — components, sidebar, search, branding ( #157 )
...
ci/woodpecker/push/ci Pipeline was successful
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-15 22:17:19 +00:00
a760401407
feat(admin): web admin panel — user CRUD, role assignment, system health ( #150 )
...
ci/woodpecker/push/ci Pipeline was successful
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-15 19:18:47 +00:00
22a5e9791c
feat(coord): DB migration — project-scoped missions, multi-tenant RBAC ( #149 )
...
ci/woodpecker/push/ci Pipeline failed
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-15 19:18:18 +00:00
d1bef49b4e
feat(agent): session cwd sandbox, system prompt config, tool restrictions ( #148 )
...
ci/woodpecker/push/ci Pipeline failed
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-15 19:15:05 +00:00
76abf11eba
fix(cli): remove side-effect from agent:end state updater ( #133 ) ( #147 )
...
ci/woodpecker/push/ci Pipeline failed
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-15 19:09:13 +00:00
3bb401641e
feat(agent): skill invocation — load and execute skills from catalog ( #128 ) ( #143 )
...
ci/woodpecker/push/ci Pipeline was successful
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-15 18:36:58 +00:00
54b821d8bd
feat(web): provider management UI — list, test, model capabilities ( #123 ) ( #142 )
...
ci/woodpecker/push/ci Pipeline was successful
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-15 18:33:55 +00:00
09e649fc7e
feat(gateway): MCP client — connect to external MCP servers as agent tools ( #127 ) ( #141 )
...
ci/woodpecker/push/ci Pipeline was successful
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-15 18:28:31 +00:00
d42cd68ea4
feat(web): conversation management — search, rename, delete, archive ( #121 ) ( #139 )
...
ci/woodpecker/push/ci Pipeline was successful
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-15 18:20:15 +00:00
07647c8382
feat(agent): expand tool registry — file, git, shell, web fetch ( #126 ) ( #138 )
...
ci/woodpecker/push/ci Pipeline was successful
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-15 18:17:17 +00:00
8633823257
feat(gateway): add MCP server endpoint with streamable HTTP transport ( #137 )
...
ci/woodpecker/push/ci Pipeline was successful
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-15 18:11:50 +00:00
ab61a15edc
fix(agent): register Ollama with api: openai-completions ( #117 )
...
ci/woodpecker/push/ci Pipeline was successful
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-15 17:10:32 +00:00
2c60459851
fix(agent): pass dummy apiKey for Ollama provider registration ( #116 )
...
ci/woodpecker/push/ci Pipeline was successful
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-15 17:08:19 +00:00
049bb719e8
fix(auth): add CORS headers to BetterAuth raw HTTP handler ( #112 )
...
ci/woodpecker/push/ci Pipeline failed
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-15 16:47:27 +00:00
72a73c859c
fix(gateway): CORS, memory userId from session, pgvector auto-init ( #110 )
...
ci/woodpecker/push/ci Pipeline was successful
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-15 16:40:28 +00:00
6d2b81f6e4
fix(gateway): add missing @Inject() decorators causing silent startup hang ( #109 )
...
ci/woodpecker/push/ci Pipeline was successful
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-15 01:52:01 +00:00
9d01a0d484
fix(gateway): load .env from monorepo root via dotenv ( #108 )
...
ci/woodpecker/push/ci Pipeline was successful
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-15 01:25:09 +00:00
84e1868028
fix(gateway): resolve two startup bugs blocking E2E testing ( #102 )
...
ci/woodpecker/push/ci Pipeline was successful
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-15 00:45:28 +00:00
1f4d54e474
fix(gateway): wire Telegram plugin into gateway plugin host ( #99 )
...
ci/woodpecker/push/ci Pipeline failed
Co-authored-by: Jason Woltje <jason@diversecanvas.com >
Co-committed-by: Jason Woltje <jason@diversecanvas.com >
2026-03-15 00:05:27 +00:00
1bfdc91f90
Merge pull request 'feat(auth): P5-004 Authentik OIDC adapter via Better Auth genericOAuth' ( #97 ) from feat/p5-sso-authentik into main
ci/woodpecker/push/ci Pipeline failed
2026-03-13 20:15:50 +00:00