@soleri/core 2.10.0 → 2.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agency/agency-manager.d.ts +47 -0
- package/dist/agency/agency-manager.d.ts.map +1 -0
- package/dist/agency/agency-manager.js +281 -0
- package/dist/agency/agency-manager.js.map +1 -0
- package/dist/agency/index.d.ts +3 -0
- package/dist/agency/index.d.ts.map +1 -0
- package/dist/agency/index.js +2 -0
- package/dist/agency/index.js.map +1 -0
- package/dist/agency/types.d.ts +69 -0
- package/dist/agency/types.d.ts.map +1 -0
- package/dist/agency/types.js +5 -0
- package/dist/agency/types.js.map +1 -0
- package/dist/brain/brain.d.ts +0 -1
- package/dist/brain/brain.d.ts.map +1 -1
- package/dist/brain/brain.js +14 -0
- package/dist/brain/brain.js.map +1 -1
- package/dist/brain/intelligence.d.ts +5 -1
- package/dist/brain/intelligence.d.ts.map +1 -1
- package/dist/brain/intelligence.js +83 -0
- package/dist/brain/intelligence.js.map +1 -1
- package/dist/brain/types.d.ts +21 -0
- package/dist/brain/types.d.ts.map +1 -1
- package/dist/chat/agent-loop-types.d.ts +82 -0
- package/dist/chat/agent-loop-types.d.ts.map +1 -0
- package/dist/chat/agent-loop-types.js +8 -0
- package/dist/chat/agent-loop-types.js.map +1 -0
- package/dist/chat/agent-loop.d.ts +19 -0
- package/dist/chat/agent-loop.d.ts.map +1 -0
- package/dist/chat/agent-loop.js +261 -0
- package/dist/chat/agent-loop.js.map +1 -0
- package/dist/chat/auth-manager.d.ts +49 -0
- package/dist/chat/auth-manager.d.ts.map +1 -0
- package/dist/chat/auth-manager.js +152 -0
- package/dist/chat/auth-manager.js.map +1 -0
- package/dist/chat/browser-session.d.ts +86 -0
- package/dist/chat/browser-session.d.ts.map +1 -0
- package/dist/chat/browser-session.js +143 -0
- package/dist/chat/browser-session.js.map +1 -0
- package/dist/chat/cancellation.d.ts +54 -0
- package/dist/chat/cancellation.d.ts.map +1 -0
- package/dist/chat/cancellation.js +80 -0
- package/dist/chat/cancellation.js.map +1 -0
- package/dist/chat/chat-session.d.ts +86 -0
- package/dist/chat/chat-session.d.ts.map +1 -0
- package/dist/chat/chat-session.js +252 -0
- package/dist/chat/chat-session.js.map +1 -0
- package/dist/chat/file-handler.d.ts +63 -0
- package/dist/chat/file-handler.d.ts.map +1 -0
- package/dist/chat/file-handler.js +182 -0
- package/dist/chat/file-handler.js.map +1 -0
- package/dist/chat/fragment-buffer.d.ts +49 -0
- package/dist/chat/fragment-buffer.d.ts.map +1 -0
- package/dist/chat/fragment-buffer.js +130 -0
- package/dist/chat/fragment-buffer.js.map +1 -0
- package/dist/chat/index.d.ts +24 -0
- package/dist/chat/index.d.ts.map +1 -0
- package/dist/chat/index.js +15 -0
- package/dist/chat/index.js.map +1 -0
- package/dist/chat/mcp-bridge.d.ts +60 -0
- package/dist/chat/mcp-bridge.d.ts.map +1 -0
- package/dist/chat/mcp-bridge.js +111 -0
- package/dist/chat/mcp-bridge.js.map +1 -0
- package/dist/chat/notifications.d.ts +82 -0
- package/dist/chat/notifications.d.ts.map +1 -0
- package/dist/chat/notifications.js +119 -0
- package/dist/chat/notifications.js.map +1 -0
- package/dist/chat/output-compressor.d.ts +30 -0
- package/dist/chat/output-compressor.d.ts.map +1 -0
- package/dist/chat/output-compressor.js +95 -0
- package/dist/chat/output-compressor.js.map +1 -0
- package/dist/chat/queue.d.ts +91 -0
- package/dist/chat/queue.d.ts.map +1 -0
- package/dist/chat/queue.js +146 -0
- package/dist/chat/queue.js.map +1 -0
- package/dist/chat/response-chunker.d.ts +29 -0
- package/dist/chat/response-chunker.d.ts.map +1 -0
- package/dist/chat/response-chunker.js +163 -0
- package/dist/chat/response-chunker.js.map +1 -0
- package/dist/chat/self-update.d.ts +62 -0
- package/dist/chat/self-update.d.ts.map +1 -0
- package/dist/chat/self-update.js +90 -0
- package/dist/chat/self-update.js.map +1 -0
- package/dist/chat/types.d.ts +105 -0
- package/dist/chat/types.d.ts.map +1 -0
- package/dist/chat/types.js +8 -0
- package/dist/chat/types.js.map +1 -0
- package/dist/chat/voice.d.ts +39 -0
- package/dist/chat/voice.d.ts.map +1 -0
- package/dist/chat/voice.js +80 -0
- package/dist/chat/voice.js.map +1 -0
- package/dist/claudemd/compose.d.ts +31 -0
- package/dist/claudemd/compose.d.ts.map +1 -0
- package/dist/claudemd/compose.js +105 -0
- package/dist/claudemd/compose.js.map +1 -0
- package/dist/claudemd/index.d.ts +5 -0
- package/dist/claudemd/index.d.ts.map +1 -0
- package/dist/claudemd/index.js +3 -0
- package/dist/claudemd/index.js.map +1 -0
- package/dist/claudemd/inject.d.ts +31 -0
- package/dist/claudemd/inject.d.ts.map +1 -0
- package/dist/claudemd/inject.js +157 -0
- package/dist/claudemd/inject.js.map +1 -0
- package/dist/claudemd/types.d.ts +41 -0
- package/dist/claudemd/types.d.ts.map +1 -0
- package/dist/claudemd/types.js +5 -0
- package/dist/claudemd/types.js.map +1 -0
- package/dist/context/context-engine.d.ts +31 -0
- package/dist/context/context-engine.d.ts.map +1 -0
- package/dist/context/context-engine.js +245 -0
- package/dist/context/context-engine.js.map +1 -0
- package/dist/context/index.d.ts +3 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +2 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/types.d.ts +54 -0
- package/dist/context/types.d.ts.map +1 -0
- package/dist/context/types.js +5 -0
- package/dist/context/types.js.map +1 -0
- package/dist/enforcement/adapters/claude-code.d.ts +18 -0
- package/dist/enforcement/adapters/claude-code.d.ts.map +1 -0
- package/dist/enforcement/adapters/claude-code.js +106 -0
- package/dist/enforcement/adapters/claude-code.js.map +1 -0
- package/dist/enforcement/adapters/index.d.ts +2 -0
- package/dist/enforcement/adapters/index.d.ts.map +1 -0
- package/dist/enforcement/adapters/index.js +2 -0
- package/dist/enforcement/adapters/index.js.map +1 -0
- package/dist/enforcement/index.d.ts +4 -0
- package/dist/enforcement/index.d.ts.map +1 -0
- package/dist/enforcement/index.js +3 -0
- package/dist/enforcement/index.js.map +1 -0
- package/dist/enforcement/registry.d.ts +23 -0
- package/dist/enforcement/registry.d.ts.map +1 -0
- package/dist/enforcement/registry.js +63 -0
- package/dist/enforcement/registry.js.map +1 -0
- package/dist/enforcement/types.d.ts +51 -0
- package/dist/enforcement/types.d.ts.map +1 -0
- package/dist/enforcement/types.js +8 -0
- package/dist/enforcement/types.js.map +1 -0
- package/dist/facades/facade-factory.d.ts +10 -3
- package/dist/facades/facade-factory.d.ts.map +1 -1
- package/dist/facades/facade-factory.js +94 -5
- package/dist/facades/facade-factory.js.map +1 -1
- package/dist/facades/types.d.ts +15 -1
- package/dist/facades/types.d.ts.map +1 -1
- package/dist/facades/types.js +6 -0
- package/dist/facades/types.js.map +1 -1
- package/dist/health/health-registry.d.ts +40 -0
- package/dist/health/health-registry.d.ts.map +1 -0
- package/dist/health/health-registry.js +134 -0
- package/dist/health/health-registry.js.map +1 -0
- package/dist/health/index.d.ts +5 -0
- package/dist/health/index.d.ts.map +1 -0
- package/dist/health/index.js +3 -0
- package/dist/health/index.js.map +1 -0
- package/dist/health/vault-integrity.d.ts +13 -0
- package/dist/health/vault-integrity.d.ts.map +1 -0
- package/dist/health/vault-integrity.js +49 -0
- package/dist/health/vault-integrity.js.map +1 -0
- package/dist/index.d.ts +67 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +51 -3
- package/dist/index.js.map +1 -1
- package/dist/intake/intake-pipeline.d.ts +0 -7
- package/dist/intake/intake-pipeline.d.ts.map +1 -1
- package/dist/intake/intake-pipeline.js +1 -1
- package/dist/intake/intake-pipeline.js.map +1 -1
- package/dist/intelligence/types.d.ts +1 -0
- package/dist/intelligence/types.d.ts.map +1 -1
- package/dist/migrations/index.d.ts +6 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +5 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/migration-runner.d.ts +51 -0
- package/dist/migrations/migration-runner.d.ts.map +1 -0
- package/dist/migrations/migration-runner.js +141 -0
- package/dist/migrations/migration-runner.js.map +1 -0
- package/dist/packs/index.d.ts +10 -0
- package/dist/packs/index.d.ts.map +1 -0
- package/dist/packs/index.js +8 -0
- package/dist/packs/index.js.map +1 -0
- package/dist/packs/lockfile.d.ts +97 -0
- package/dist/packs/lockfile.d.ts.map +1 -0
- package/dist/packs/lockfile.js +129 -0
- package/dist/packs/lockfile.js.map +1 -0
- package/dist/packs/pack-installer.d.ts +41 -0
- package/dist/packs/pack-installer.d.ts.map +1 -0
- package/dist/packs/pack-installer.js +253 -0
- package/dist/packs/pack-installer.js.map +1 -0
- package/dist/packs/resolver.d.ts +51 -0
- package/dist/packs/resolver.d.ts.map +1 -0
- package/dist/packs/resolver.js +195 -0
- package/dist/packs/resolver.js.map +1 -0
- package/dist/packs/types.d.ts +186 -0
- package/dist/packs/types.d.ts.map +1 -0
- package/dist/packs/types.js +69 -0
- package/dist/packs/types.js.map +1 -0
- package/dist/persistence/postgres-provider.d.ts +42 -7
- package/dist/persistence/postgres-provider.d.ts.map +1 -1
- package/dist/persistence/postgres-provider.js +187 -46
- package/dist/persistence/postgres-provider.js.map +1 -1
- package/dist/playbooks/index.d.ts +2 -0
- package/dist/playbooks/index.d.ts.map +1 -1
- package/dist/playbooks/index.js +2 -0
- package/dist/playbooks/index.js.map +1 -1
- package/dist/playbooks/playbook-executor.d.ts +100 -0
- package/dist/playbooks/playbook-executor.d.ts.map +1 -0
- package/dist/playbooks/playbook-executor.js +207 -0
- package/dist/playbooks/playbook-executor.js.map +1 -0
- package/dist/plugins/index.d.ts +7 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +7 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/plugin-loader.d.ts +28 -0
- package/dist/plugins/plugin-loader.d.ts.map +1 -0
- package/dist/plugins/plugin-loader.js +150 -0
- package/dist/plugins/plugin-loader.js.map +1 -0
- package/dist/plugins/plugin-registry.d.ts +58 -0
- package/dist/plugins/plugin-registry.d.ts.map +1 -0
- package/dist/plugins/plugin-registry.js +157 -0
- package/dist/plugins/plugin-registry.js.map +1 -0
- package/dist/plugins/types.d.ts +180 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +48 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/runtime/admin-extra-ops.d.ts.map +1 -1
- package/dist/runtime/admin-extra-ops.js +181 -8
- package/dist/runtime/admin-extra-ops.js.map +1 -1
- package/dist/runtime/capture-ops.d.ts.map +1 -1
- package/dist/runtime/capture-ops.js +106 -7
- package/dist/runtime/capture-ops.js.map +1 -1
- package/dist/runtime/deprecation.d.ts +33 -0
- package/dist/runtime/deprecation.d.ts.map +1 -0
- package/dist/runtime/deprecation.js +41 -0
- package/dist/runtime/deprecation.js.map +1 -0
- package/dist/runtime/facades/admin-facade.d.ts.map +1 -1
- package/dist/runtime/facades/admin-facade.js +12 -1
- package/dist/runtime/facades/admin-facade.js.map +1 -1
- package/dist/runtime/facades/agency-facade.d.ts +7 -0
- package/dist/runtime/facades/agency-facade.d.ts.map +1 -0
- package/dist/runtime/facades/agency-facade.js +103 -0
- package/dist/runtime/facades/agency-facade.js.map +1 -0
- package/dist/runtime/facades/brain-facade.d.ts.map +1 -1
- package/dist/runtime/facades/brain-facade.js +58 -0
- package/dist/runtime/facades/brain-facade.js.map +1 -1
- package/dist/runtime/facades/chat-facade.d.ts +7 -0
- package/dist/runtime/facades/chat-facade.d.ts.map +1 -0
- package/dist/runtime/facades/chat-facade.js +808 -0
- package/dist/runtime/facades/chat-facade.js.map +1 -0
- package/dist/runtime/facades/context-facade.d.ts +7 -0
- package/dist/runtime/facades/context-facade.d.ts.map +1 -0
- package/dist/runtime/facades/context-facade.js +45 -0
- package/dist/runtime/facades/context-facade.js.map +1 -0
- package/dist/runtime/facades/index.d.ts.map +1 -1
- package/dist/runtime/facades/index.js +18 -0
- package/dist/runtime/facades/index.js.map +1 -1
- package/dist/runtime/facades/vault-facade.d.ts.map +1 -1
- package/dist/runtime/facades/vault-facade.js +247 -1
- package/dist/runtime/facades/vault-facade.js.map +1 -1
- package/dist/runtime/feature-flags.d.ts +18 -0
- package/dist/runtime/feature-flags.d.ts.map +1 -0
- package/dist/runtime/feature-flags.js +90 -0
- package/dist/runtime/feature-flags.js.map +1 -0
- package/dist/runtime/pack-ops.d.ts +9 -0
- package/dist/runtime/pack-ops.d.ts.map +1 -0
- package/dist/runtime/pack-ops.js +76 -0
- package/dist/runtime/pack-ops.js.map +1 -0
- package/dist/runtime/playbook-ops.d.ts +3 -7
- package/dist/runtime/playbook-ops.d.ts.map +1 -1
- package/dist/runtime/playbook-ops.js +101 -10
- package/dist/runtime/playbook-ops.js.map +1 -1
- package/dist/runtime/plugin-ops.d.ts +9 -0
- package/dist/runtime/plugin-ops.d.ts.map +1 -0
- package/dist/runtime/plugin-ops.js +235 -0
- package/dist/runtime/plugin-ops.js.map +1 -0
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +72 -5
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/telemetry-ops.d.ts +10 -0
- package/dist/runtime/telemetry-ops.d.ts.map +1 -0
- package/dist/runtime/telemetry-ops.js +53 -0
- package/dist/runtime/telemetry-ops.js.map +1 -0
- package/dist/runtime/types.d.ts +35 -0
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/vault-sharing-ops.d.ts +13 -0
- package/dist/runtime/vault-sharing-ops.d.ts.map +1 -0
- package/dist/runtime/vault-sharing-ops.js +345 -0
- package/dist/runtime/vault-sharing-ops.js.map +1 -0
- package/dist/streams/index.d.ts +1 -1
- package/dist/streams/index.d.ts.map +1 -1
- package/dist/streams/index.js +1 -1
- package/dist/streams/index.js.map +1 -1
- package/dist/streams/replayable-stream.d.ts +13 -1
- package/dist/streams/replayable-stream.d.ts.map +1 -1
- package/dist/streams/replayable-stream.js +27 -3
- package/dist/streams/replayable-stream.js.map +1 -1
- package/dist/text/similarity.d.ts +0 -1
- package/dist/text/similarity.d.ts.map +1 -1
- package/dist/text/similarity.js +1 -1
- package/dist/text/similarity.js.map +1 -1
- package/dist/transport/http-server.d.ts +56 -0
- package/dist/transport/http-server.d.ts.map +1 -0
- package/dist/transport/http-server.js +210 -0
- package/dist/transport/http-server.js.map +1 -0
- package/dist/transport/index.d.ts +11 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +10 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/lsp-server.d.ts +140 -0
- package/dist/transport/lsp-server.d.ts.map +1 -0
- package/dist/transport/lsp-server.js +239 -0
- package/dist/transport/lsp-server.js.map +1 -0
- package/dist/transport/rate-limiter.d.ts +35 -0
- package/dist/transport/rate-limiter.d.ts.map +1 -0
- package/dist/transport/rate-limiter.js +72 -0
- package/dist/transport/rate-limiter.js.map +1 -0
- package/dist/transport/session-manager.d.ts +49 -0
- package/dist/transport/session-manager.d.ts.map +1 -0
- package/dist/transport/session-manager.js +83 -0
- package/dist/transport/session-manager.js.map +1 -0
- package/dist/transport/token-auth.d.ts +29 -0
- package/dist/transport/token-auth.d.ts.map +1 -0
- package/dist/transport/token-auth.js +84 -0
- package/dist/transport/token-auth.js.map +1 -0
- package/dist/transport/types.d.ts +61 -0
- package/dist/transport/types.d.ts.map +1 -0
- package/dist/transport/types.js +5 -0
- package/dist/transport/types.js.map +1 -0
- package/dist/transport/ws-server.d.ts +78 -0
- package/dist/transport/ws-server.d.ts.map +1 -0
- package/dist/transport/ws-server.js +342 -0
- package/dist/transport/ws-server.js.map +1 -0
- package/dist/vault/git-vault-sync.d.ts +107 -0
- package/dist/vault/git-vault-sync.d.ts.map +1 -0
- package/dist/vault/git-vault-sync.js +251 -0
- package/dist/vault/git-vault-sync.js.map +1 -0
- package/dist/vault/knowledge-review.d.ts +67 -0
- package/dist/vault/knowledge-review.d.ts.map +1 -0
- package/dist/vault/knowledge-review.js +133 -0
- package/dist/vault/knowledge-review.js.map +1 -0
- package/dist/vault/obsidian-sync.d.ts +94 -0
- package/dist/vault/obsidian-sync.d.ts.map +1 -0
- package/dist/vault/obsidian-sync.js +247 -0
- package/dist/vault/obsidian-sync.js.map +1 -0
- package/dist/vault/scope-detector.d.ts +31 -0
- package/dist/vault/scope-detector.d.ts.map +1 -0
- package/dist/vault/scope-detector.js +182 -0
- package/dist/vault/scope-detector.js.map +1 -0
- package/dist/vault/vault-branching.d.ts +71 -0
- package/dist/vault/vault-branching.d.ts.map +1 -0
- package/dist/vault/vault-branching.js +180 -0
- package/dist/vault/vault-branching.js.map +1 -0
- package/dist/vault/vault-manager.d.ts +89 -0
- package/dist/vault/vault-manager.d.ts.map +1 -0
- package/dist/vault/vault-manager.js +199 -0
- package/dist/vault/vault-manager.js.map +1 -0
- package/dist/vault/vault-types.d.ts +30 -0
- package/dist/vault/vault-types.d.ts.map +1 -0
- package/dist/vault/vault-types.js +10 -0
- package/dist/vault/vault-types.js.map +1 -0
- package/dist/vault/vault.d.ts +10 -0
- package/dist/vault/vault.d.ts.map +1 -1
- package/dist/vault/vault.js +36 -3
- package/dist/vault/vault.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/admin-extra-ops.test.ts +31 -11
- package/src/__tests__/agency-manager.test.ts +374 -0
- package/src/__tests__/agent-loop.test.ts +256 -0
- package/src/__tests__/capture-ops.test.ts +275 -0
- package/src/__tests__/chat-differentiators.test.ts +251 -0
- package/src/__tests__/chat-enhanced.test.ts +390 -0
- package/src/__tests__/chat-transport.test.ts +665 -0
- package/src/__tests__/claudemd.test.ts +282 -0
- package/src/__tests__/context-engine.test.ts +256 -0
- package/src/__tests__/core-ops.test.ts +97 -5
- package/src/__tests__/deprecation.test.ts +78 -0
- package/src/__tests__/enforcement.test.ts +153 -0
- package/src/__tests__/facade-factory.test.ts +271 -0
- package/src/__tests__/feature-flags.test.ts +138 -0
- package/src/__tests__/git-vault-sync.test.ts +230 -0
- package/src/__tests__/health-registry.test.ts +173 -0
- package/src/__tests__/knowledge-review.test.ts +104 -0
- package/src/__tests__/lsp-transport.test.ts +442 -0
- package/src/__tests__/migration-runner.test.ts +170 -0
- package/src/__tests__/normalize.test.ts +10 -0
- package/src/__tests__/obsidian-sync.test.ts +354 -0
- package/src/__tests__/pack-lockfile.test.ts +261 -0
- package/src/__tests__/pack-ops.test.ts +146 -0
- package/src/__tests__/pack-system.test.ts +423 -0
- package/src/__tests__/playbook-executor.test.ts +249 -0
- package/src/__tests__/playbook-ops-execution.test.ts +189 -0
- package/src/__tests__/plugin-ops.test.ts +411 -0
- package/src/__tests__/plugin-system.test.ts +509 -0
- package/src/__tests__/postgres-provider.test.ts +64 -6
- package/src/__tests__/replayable-stream.test.ts +112 -1
- package/src/__tests__/scope-detector.test.ts +121 -0
- package/src/__tests__/session-lifecycle.test.ts +259 -0
- package/src/__tests__/transport.test.ts +758 -0
- package/src/__tests__/vault-branching.test.ts +274 -0
- package/src/__tests__/vault-connect.test.ts +179 -0
- package/src/__tests__/vault-integrity.test.ts +71 -0
- package/src/__tests__/vault-manager.test.ts +238 -0
- package/src/__tests__/vault-scaling.test.ts +281 -0
- package/src/__tests__/vault-sharing.test.ts +270 -0
- package/src/__tests__/ws-transport.test.ts +479 -0
- package/src/agency/agency-manager.ts +326 -0
- package/src/agency/index.ts +13 -0
- package/src/agency/types.ts +88 -0
- package/src/brain/brain.ts +15 -11
- package/src/brain/intelligence.ts +103 -0
- package/src/brain/types.ts +26 -0
- package/src/chat/agent-loop-types.ts +99 -0
- package/src/chat/agent-loop.ts +357 -0
- package/src/chat/auth-manager.ts +171 -0
- package/src/chat/browser-session.ts +188 -0
- package/src/chat/cancellation.ts +99 -0
- package/src/chat/chat-session.ts +283 -0
- package/src/chat/file-handler.ts +230 -0
- package/src/chat/fragment-buffer.ts +160 -0
- package/src/chat/index.ts +72 -0
- package/src/chat/mcp-bridge.ts +135 -0
- package/src/chat/notifications.ts +164 -0
- package/src/chat/output-compressor.ts +116 -0
- package/src/chat/queue.ts +208 -0
- package/src/chat/response-chunker.ts +200 -0
- package/src/chat/self-update.ts +117 -0
- package/src/chat/types.ts +126 -0
- package/src/chat/voice.ts +134 -0
- package/src/claudemd/compose.ts +142 -0
- package/src/claudemd/index.ts +17 -0
- package/src/claudemd/inject.ts +170 -0
- package/src/claudemd/types.ts +45 -0
- package/src/context/context-engine.ts +302 -0
- package/src/context/index.ts +11 -0
- package/src/context/types.ts +69 -0
- package/src/enforcement/adapters/claude-code.ts +135 -0
- package/src/enforcement/adapters/index.ts +1 -0
- package/src/enforcement/index.ts +10 -0
- package/src/enforcement/registry.ts +82 -0
- package/src/enforcement/types.ts +56 -0
- package/src/facades/facade-factory.ts +138 -5
- package/src/facades/types.ts +21 -0
- package/src/health/health-registry.ts +165 -0
- package/src/health/index.ts +11 -0
- package/src/health/vault-integrity.ts +66 -0
- package/src/index.ts +294 -2
- package/src/intake/intake-pipeline.ts +1 -1
- package/src/intelligence/types.ts +1 -0
- package/src/migrations/index.ts +6 -0
- package/src/migrations/migration-runner.ts +185 -0
- package/src/packs/index.ts +20 -0
- package/src/packs/lockfile.ts +180 -0
- package/src/packs/pack-installer.ts +289 -0
- package/src/packs/resolver.ts +237 -0
- package/src/packs/types.ts +125 -0
- package/src/persistence/postgres-provider.ts +211 -58
- package/src/playbooks/index.ts +11 -0
- package/src/playbooks/playbook-executor.ts +301 -0
- package/src/plugins/index.ts +19 -0
- package/src/plugins/plugin-loader.ts +183 -0
- package/src/plugins/plugin-registry.ts +187 -0
- package/src/plugins/types.ts +119 -0
- package/src/runtime/admin-extra-ops.ts +193 -8
- package/src/runtime/capture-ops.ts +113 -8
- package/src/runtime/deprecation.ts +58 -0
- package/src/runtime/facades/admin-facade.ts +16 -1
- package/src/runtime/facades/agency-facade.ts +111 -0
- package/src/runtime/facades/brain-facade.ts +60 -0
- package/src/runtime/facades/chat-facade.ts +918 -0
- package/src/runtime/facades/context-facade.ts +55 -0
- package/src/runtime/facades/index.ts +22 -1
- package/src/runtime/facades/vault-facade.ts +261 -1
- package/src/runtime/feature-flags.ts +101 -0
- package/src/runtime/pack-ops.ts +85 -0
- package/src/runtime/playbook-ops.ts +113 -9
- package/src/runtime/plugin-ops.ts +258 -0
- package/src/runtime/runtime.ts +84 -5
- package/src/runtime/telemetry-ops.ts +57 -0
- package/src/runtime/types.ts +35 -0
- package/src/runtime/vault-sharing-ops.ts +372 -0
- package/src/streams/index.ts +1 -1
- package/src/streams/replayable-stream.ts +34 -3
- package/src/text/similarity.ts +1 -1
- package/src/transport/http-server.ts +269 -0
- package/src/transport/index.ts +48 -0
- package/src/transport/lsp-server.ts +401 -0
- package/src/transport/rate-limiter.ts +97 -0
- package/src/transport/session-manager.ts +120 -0
- package/src/transport/token-auth.ts +96 -0
- package/src/transport/types.ts +66 -0
- package/src/transport/ws-server.ts +415 -0
- package/src/vault/git-vault-sync.ts +318 -0
- package/src/vault/knowledge-review.ts +221 -0
- package/src/vault/obsidian-sync.ts +346 -0
- package/src/vault/scope-detector.ts +219 -0
- package/src/vault/vault-branching.ts +264 -0
- package/src/vault/vault-manager.ts +237 -0
- package/src/vault/vault-types.ts +50 -0
- package/src/vault/vault.ts +41 -3
- package/src/governance/index.ts +0 -18
|
@@ -0,0 +1,808 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chat facade — session management, response chunking, auth for chat transports.
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { ChatSessionManager } from '../../chat/chat-session.js';
|
|
6
|
+
import { ChatAuthManager } from '../../chat/auth-manager.js';
|
|
7
|
+
import { TaskCancellationManager } from '../../chat/cancellation.js';
|
|
8
|
+
import { SelfUpdateManager } from '../../chat/self-update.js';
|
|
9
|
+
import { NotificationEngine } from '../../chat/notifications.js';
|
|
10
|
+
import { detectFileIntent, buildMultimodalContent, cleanupTempFiles, } from '../../chat/file-handler.js';
|
|
11
|
+
import { transcribeAudio, synthesizeSpeech } from '../../chat/voice.js';
|
|
12
|
+
import { MessageQueue } from '../../chat/queue.js';
|
|
13
|
+
import { BrowserSessionManager } from '../../chat/browser-session.js';
|
|
14
|
+
import { chunkResponse } from '../../chat/response-chunker.js';
|
|
15
|
+
import { McpToolBridge } from '../../chat/mcp-bridge.js';
|
|
16
|
+
import { createOutputCompressor } from '../../chat/output-compressor.js';
|
|
17
|
+
function getOrCreateSessions(state, config) {
|
|
18
|
+
if (!state.sessions) {
|
|
19
|
+
state.sessions = new ChatSessionManager(config);
|
|
20
|
+
state.sessions.startReaper();
|
|
21
|
+
}
|
|
22
|
+
return state.sessions;
|
|
23
|
+
}
|
|
24
|
+
function getOrCreateAuth(state, config) {
|
|
25
|
+
if (!state.auth) {
|
|
26
|
+
state.auth = new ChatAuthManager(config);
|
|
27
|
+
}
|
|
28
|
+
return state.auth;
|
|
29
|
+
}
|
|
30
|
+
export function createChatFacadeOps(_runtime) {
|
|
31
|
+
const state = {
|
|
32
|
+
sessions: null,
|
|
33
|
+
auth: null,
|
|
34
|
+
bridge: null,
|
|
35
|
+
cancellation: null,
|
|
36
|
+
updater: null,
|
|
37
|
+
notifications: null,
|
|
38
|
+
queue: null,
|
|
39
|
+
browser: null,
|
|
40
|
+
};
|
|
41
|
+
return [
|
|
42
|
+
// ─── Session Ops ──────────────────────────────────────────────
|
|
43
|
+
{
|
|
44
|
+
name: 'chat_session_init',
|
|
45
|
+
description: 'Initialize chat session management. Must be called before other session ops. Provide the storage directory path.',
|
|
46
|
+
auth: 'write',
|
|
47
|
+
schema: z.object({
|
|
48
|
+
storageDir: z.string().describe('Directory for session persistence.'),
|
|
49
|
+
ttlMs: z.number().optional().describe('Session TTL in ms. Default: 7200000 (2 hours).'),
|
|
50
|
+
compactionThreshold: z
|
|
51
|
+
.number()
|
|
52
|
+
.optional()
|
|
53
|
+
.describe('Messages before compaction. Default: 100.'),
|
|
54
|
+
compactionKeep: z
|
|
55
|
+
.number()
|
|
56
|
+
.optional()
|
|
57
|
+
.describe('Messages to keep after compaction. Default: 40.'),
|
|
58
|
+
}),
|
|
59
|
+
handler: async (params) => {
|
|
60
|
+
const config = {
|
|
61
|
+
storageDir: params.storageDir,
|
|
62
|
+
ttlMs: params.ttlMs,
|
|
63
|
+
compactionThreshold: params.compactionThreshold,
|
|
64
|
+
compactionKeep: params.compactionKeep,
|
|
65
|
+
};
|
|
66
|
+
const sessions = getOrCreateSessions(state, config);
|
|
67
|
+
return {
|
|
68
|
+
initialized: true,
|
|
69
|
+
activeSessions: sessions.size,
|
|
70
|
+
storageDir: config.storageDir,
|
|
71
|
+
};
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
name: 'chat_session_get',
|
|
76
|
+
description: 'Get or create a chat session by ID. Returns session with message history.',
|
|
77
|
+
auth: 'read',
|
|
78
|
+
schema: z.object({
|
|
79
|
+
sessionId: z.string().describe('Session/chat ID.'),
|
|
80
|
+
storageDir: z.string().describe('Storage directory (auto-initializes if needed).'),
|
|
81
|
+
}),
|
|
82
|
+
handler: async (params) => {
|
|
83
|
+
const sessions = getOrCreateSessions(state, {
|
|
84
|
+
storageDir: params.storageDir,
|
|
85
|
+
});
|
|
86
|
+
const session = sessions.getOrCreate(params.sessionId);
|
|
87
|
+
return {
|
|
88
|
+
id: session.id,
|
|
89
|
+
messageCount: session.messages.length,
|
|
90
|
+
createdAt: session.createdAt,
|
|
91
|
+
lastActiveAt: session.lastActiveAt,
|
|
92
|
+
meta: session.meta,
|
|
93
|
+
};
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
name: 'chat_session_append',
|
|
98
|
+
description: 'Append a message to a chat session.',
|
|
99
|
+
auth: 'write',
|
|
100
|
+
schema: z.object({
|
|
101
|
+
sessionId: z.string().describe('Session/chat ID.'),
|
|
102
|
+
storageDir: z.string().describe('Storage directory.'),
|
|
103
|
+
role: z.enum(['user', 'assistant', 'system', 'tool']).describe('Message role.'),
|
|
104
|
+
content: z.string().describe('Message content.'),
|
|
105
|
+
}),
|
|
106
|
+
handler: async (params) => {
|
|
107
|
+
const sessions = getOrCreateSessions(state, {
|
|
108
|
+
storageDir: params.storageDir,
|
|
109
|
+
});
|
|
110
|
+
sessions.appendMessage(params.sessionId, {
|
|
111
|
+
role: params.role,
|
|
112
|
+
content: params.content,
|
|
113
|
+
timestamp: Date.now(),
|
|
114
|
+
});
|
|
115
|
+
return {
|
|
116
|
+
sessionId: params.sessionId,
|
|
117
|
+
messageCount: sessions.messageCount(params.sessionId),
|
|
118
|
+
};
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
name: 'chat_session_clear',
|
|
123
|
+
description: 'Clear message history for a session (keeps session alive).',
|
|
124
|
+
auth: 'write',
|
|
125
|
+
schema: z.object({
|
|
126
|
+
sessionId: z.string().describe('Session/chat ID.'),
|
|
127
|
+
storageDir: z.string().describe('Storage directory.'),
|
|
128
|
+
}),
|
|
129
|
+
handler: async (params) => {
|
|
130
|
+
const sessions = getOrCreateSessions(state, {
|
|
131
|
+
storageDir: params.storageDir,
|
|
132
|
+
});
|
|
133
|
+
sessions.clear(params.sessionId);
|
|
134
|
+
return { cleared: true, sessionId: params.sessionId };
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
name: 'chat_session_delete',
|
|
139
|
+
description: 'Delete a session entirely (memory + disk).',
|
|
140
|
+
auth: 'write',
|
|
141
|
+
schema: z.object({
|
|
142
|
+
sessionId: z.string().describe('Session/chat ID.'),
|
|
143
|
+
storageDir: z.string().describe('Storage directory.'),
|
|
144
|
+
}),
|
|
145
|
+
handler: async (params) => {
|
|
146
|
+
const sessions = getOrCreateSessions(state, {
|
|
147
|
+
storageDir: params.storageDir,
|
|
148
|
+
});
|
|
149
|
+
sessions.delete(params.sessionId);
|
|
150
|
+
return { deleted: true, sessionId: params.sessionId };
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
name: 'chat_session_list',
|
|
155
|
+
description: 'List all session IDs (active + persisted).',
|
|
156
|
+
auth: 'read',
|
|
157
|
+
schema: z.object({
|
|
158
|
+
storageDir: z.string().describe('Storage directory.'),
|
|
159
|
+
}),
|
|
160
|
+
handler: async (params) => {
|
|
161
|
+
const sessions = getOrCreateSessions(state, {
|
|
162
|
+
storageDir: params.storageDir,
|
|
163
|
+
});
|
|
164
|
+
const ids = sessions.listAll();
|
|
165
|
+
return { sessions: ids, count: ids.length, active: sessions.size };
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
// ─── Response Chunking ────────────────────────────────────────
|
|
169
|
+
{
|
|
170
|
+
name: 'chat_chunk_response',
|
|
171
|
+
description: 'Split a long response into chunks for chat platforms. Converts Markdown to HTML by default.',
|
|
172
|
+
auth: 'read',
|
|
173
|
+
schema: z.object({
|
|
174
|
+
text: z.string().describe('The response text to chunk.'),
|
|
175
|
+
maxChunkSize: z.number().optional().describe('Max characters per chunk. Default: 4000.'),
|
|
176
|
+
format: z
|
|
177
|
+
.enum(['html', 'markdown', 'plain'])
|
|
178
|
+
.optional()
|
|
179
|
+
.describe('Output format. Default: html.'),
|
|
180
|
+
}),
|
|
181
|
+
handler: async (params) => {
|
|
182
|
+
const config = {
|
|
183
|
+
maxChunkSize: params.maxChunkSize,
|
|
184
|
+
format: params.format,
|
|
185
|
+
};
|
|
186
|
+
const chunks = chunkResponse(params.text, config);
|
|
187
|
+
return { chunks, count: chunks.length };
|
|
188
|
+
},
|
|
189
|
+
},
|
|
190
|
+
// ─── Authentication ───────────────────────────────────────────
|
|
191
|
+
{
|
|
192
|
+
name: 'chat_auth_init',
|
|
193
|
+
description: 'Initialize chat authentication. Provide passphrase and optional allowlist.',
|
|
194
|
+
auth: 'write',
|
|
195
|
+
schema: z.object({
|
|
196
|
+
storagePath: z.string().describe('Path to auth persistence file.'),
|
|
197
|
+
passphrase: z.string().optional().describe('Auth passphrase. If unset, auth is disabled.'),
|
|
198
|
+
allowedUsers: z
|
|
199
|
+
.array(z.union([z.string(), z.number()]))
|
|
200
|
+
.optional()
|
|
201
|
+
.describe('Allowed user IDs. Empty = any user.'),
|
|
202
|
+
}),
|
|
203
|
+
handler: async (params) => {
|
|
204
|
+
const config = {
|
|
205
|
+
storagePath: params.storagePath,
|
|
206
|
+
passphrase: params.passphrase,
|
|
207
|
+
allowedUsers: params.allowedUsers,
|
|
208
|
+
};
|
|
209
|
+
const auth = getOrCreateAuth(state, config);
|
|
210
|
+
return {
|
|
211
|
+
initialized: true,
|
|
212
|
+
enabled: auth.enabled,
|
|
213
|
+
authenticatedCount: auth.authenticatedCount,
|
|
214
|
+
};
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
name: 'chat_auth_check',
|
|
219
|
+
description: 'Check if a user is authenticated.',
|
|
220
|
+
auth: 'read',
|
|
221
|
+
schema: z.object({
|
|
222
|
+
userId: z.union([z.string(), z.number()]).describe('User ID to check.'),
|
|
223
|
+
storagePath: z.string().describe('Auth storage path (auto-initializes if needed).'),
|
|
224
|
+
}),
|
|
225
|
+
handler: async (params) => {
|
|
226
|
+
const auth = getOrCreateAuth(state, {
|
|
227
|
+
storagePath: params.storagePath,
|
|
228
|
+
});
|
|
229
|
+
const userId = params.userId;
|
|
230
|
+
return {
|
|
231
|
+
userId,
|
|
232
|
+
authenticated: auth.isAuthenticated(userId),
|
|
233
|
+
lockedOut: auth.isLockedOut(userId),
|
|
234
|
+
};
|
|
235
|
+
},
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
name: 'chat_auth_authenticate',
|
|
239
|
+
description: 'Attempt to authenticate a user with a passphrase.',
|
|
240
|
+
auth: 'write',
|
|
241
|
+
schema: z.object({
|
|
242
|
+
userId: z.union([z.string(), z.number()]).describe('User ID.'),
|
|
243
|
+
passphrase: z.string().describe('Passphrase to verify.'),
|
|
244
|
+
storagePath: z.string().describe('Auth storage path.'),
|
|
245
|
+
}),
|
|
246
|
+
handler: async (params) => {
|
|
247
|
+
const auth = getOrCreateAuth(state, {
|
|
248
|
+
storagePath: params.storagePath,
|
|
249
|
+
});
|
|
250
|
+
const success = auth.authenticate(params.userId, params.passphrase);
|
|
251
|
+
return {
|
|
252
|
+
userId: params.userId,
|
|
253
|
+
success,
|
|
254
|
+
lockedOut: auth.isLockedOut(params.userId),
|
|
255
|
+
};
|
|
256
|
+
},
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
name: 'chat_auth_revoke',
|
|
260
|
+
description: 'Revoke authentication for a user.',
|
|
261
|
+
auth: 'write',
|
|
262
|
+
schema: z.object({
|
|
263
|
+
userId: z.union([z.string(), z.number()]).describe('User ID to revoke.'),
|
|
264
|
+
storagePath: z.string().describe('Auth storage path.'),
|
|
265
|
+
}),
|
|
266
|
+
handler: async (params) => {
|
|
267
|
+
const auth = getOrCreateAuth(state, {
|
|
268
|
+
storagePath: params.storagePath,
|
|
269
|
+
});
|
|
270
|
+
auth.revoke(params.userId);
|
|
271
|
+
return { revoked: true, userId: params.userId };
|
|
272
|
+
},
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
name: 'chat_auth_status',
|
|
276
|
+
description: 'Get authentication status — enabled, user count, list.',
|
|
277
|
+
auth: 'read',
|
|
278
|
+
schema: z.object({
|
|
279
|
+
storagePath: z.string().describe('Auth storage path.'),
|
|
280
|
+
}),
|
|
281
|
+
handler: async (params) => {
|
|
282
|
+
const auth = getOrCreateAuth(state, {
|
|
283
|
+
storagePath: params.storagePath,
|
|
284
|
+
});
|
|
285
|
+
return {
|
|
286
|
+
enabled: auth.enabled,
|
|
287
|
+
authenticatedCount: auth.authenticatedCount,
|
|
288
|
+
authenticatedUsers: auth.listAuthenticated(),
|
|
289
|
+
};
|
|
290
|
+
},
|
|
291
|
+
},
|
|
292
|
+
// ─── MCP Bridge Ops ─────────────────────────────────────────────
|
|
293
|
+
{
|
|
294
|
+
name: 'chat_bridge_init',
|
|
295
|
+
description: 'Initialize the MCP tool bridge for local tool execution. Optional allowlist filters which tools are registered.',
|
|
296
|
+
auth: 'write',
|
|
297
|
+
schema: z.object({
|
|
298
|
+
allowlist: z
|
|
299
|
+
.array(z.string())
|
|
300
|
+
.optional()
|
|
301
|
+
.describe('Tool name allowlist. If unset, all tools are allowed.'),
|
|
302
|
+
maxOutput: z
|
|
303
|
+
.number()
|
|
304
|
+
.optional()
|
|
305
|
+
.describe('Max output length per tool call. Default: 10000.'),
|
|
306
|
+
}),
|
|
307
|
+
handler: async (params) => {
|
|
308
|
+
state.bridge = new McpToolBridge({
|
|
309
|
+
allowlist: params.allowlist,
|
|
310
|
+
compressor: createOutputCompressor(),
|
|
311
|
+
maxOutput: params.maxOutput,
|
|
312
|
+
});
|
|
313
|
+
return { initialized: true, toolCount: 0 };
|
|
314
|
+
},
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
name: 'chat_bridge_register',
|
|
318
|
+
description: 'Register a tool with the MCP bridge.',
|
|
319
|
+
auth: 'write',
|
|
320
|
+
schema: z.object({
|
|
321
|
+
name: z.string().describe('Tool name.'),
|
|
322
|
+
description: z.string().describe('Tool description.'),
|
|
323
|
+
inputSchema: z.record(z.unknown()).describe('JSON Schema for tool input.'),
|
|
324
|
+
}),
|
|
325
|
+
handler: async (params) => {
|
|
326
|
+
if (!state.bridge) {
|
|
327
|
+
state.bridge = new McpToolBridge({ compressor: createOutputCompressor() });
|
|
328
|
+
}
|
|
329
|
+
// Handler is a no-op since we can't pass functions through JSON
|
|
330
|
+
// Real handler registration happens in code, not via ops
|
|
331
|
+
state.bridge.register({
|
|
332
|
+
name: params.name,
|
|
333
|
+
description: params.description,
|
|
334
|
+
inputSchema: params.inputSchema,
|
|
335
|
+
handler: async () => ({ message: 'Registered via op — handler is a placeholder' }),
|
|
336
|
+
});
|
|
337
|
+
return { registered: true, name: params.name, totalTools: state.bridge.size };
|
|
338
|
+
},
|
|
339
|
+
},
|
|
340
|
+
{
|
|
341
|
+
name: 'chat_bridge_list',
|
|
342
|
+
description: 'List all tools registered with the MCP bridge.',
|
|
343
|
+
auth: 'read',
|
|
344
|
+
handler: async () => {
|
|
345
|
+
if (!state.bridge)
|
|
346
|
+
return { tools: [], count: 0 };
|
|
347
|
+
const tools = state.bridge.listTools();
|
|
348
|
+
return { tools, count: tools.length };
|
|
349
|
+
},
|
|
350
|
+
},
|
|
351
|
+
{
|
|
352
|
+
name: 'chat_bridge_execute',
|
|
353
|
+
description: 'Execute a registered tool via the MCP bridge.',
|
|
354
|
+
auth: 'write',
|
|
355
|
+
schema: z.object({
|
|
356
|
+
name: z.string().describe('Tool name to execute.'),
|
|
357
|
+
input: z.record(z.unknown()).optional().describe('Tool input parameters.'),
|
|
358
|
+
}),
|
|
359
|
+
handler: async (params) => {
|
|
360
|
+
if (!state.bridge)
|
|
361
|
+
return { output: 'Bridge not initialized', isError: true };
|
|
362
|
+
const result = await state.bridge.execute(params.name, params.input ?? {});
|
|
363
|
+
return result;
|
|
364
|
+
},
|
|
365
|
+
},
|
|
366
|
+
{
|
|
367
|
+
name: 'chat_compress_output',
|
|
368
|
+
description: 'Compress verbose tool output for chat display. Uses JSON-aware truncation.',
|
|
369
|
+
auth: 'read',
|
|
370
|
+
schema: z.object({
|
|
371
|
+
toolName: z.string().describe('Tool name (for compressor lookup).'),
|
|
372
|
+
output: z.string().describe('Raw tool output to compress.'),
|
|
373
|
+
maxLength: z.number().optional().describe('Max output length. Default: 4000.'),
|
|
374
|
+
}),
|
|
375
|
+
handler: async (params) => {
|
|
376
|
+
const compressor = createOutputCompressor();
|
|
377
|
+
const compressed = compressor(params.toolName, params.output, params.maxLength);
|
|
378
|
+
return {
|
|
379
|
+
compressed,
|
|
380
|
+
originalLength: params.output.length,
|
|
381
|
+
compressedLength: compressed.length,
|
|
382
|
+
};
|
|
383
|
+
},
|
|
384
|
+
},
|
|
385
|
+
// ─── Task Cancellation Ops ─────────────────────────────────────
|
|
386
|
+
{
|
|
387
|
+
name: 'chat_cancel_create',
|
|
388
|
+
description: 'Create an AbortSignal for a chat task. If a task is already running for this chat, it is cancelled first. Returns signal status.',
|
|
389
|
+
auth: 'write',
|
|
390
|
+
schema: z.object({
|
|
391
|
+
chatId: z.string().describe('Chat/session ID.'),
|
|
392
|
+
description: z.string().optional().describe('Description of what is running.'),
|
|
393
|
+
}),
|
|
394
|
+
handler: async (params) => {
|
|
395
|
+
if (!state.cancellation) {
|
|
396
|
+
state.cancellation = new TaskCancellationManager();
|
|
397
|
+
}
|
|
398
|
+
const signal = state.cancellation.create(params.chatId, params.description);
|
|
399
|
+
return {
|
|
400
|
+
chatId: params.chatId,
|
|
401
|
+
created: true,
|
|
402
|
+
aborted: signal.aborted,
|
|
403
|
+
activeTasks: state.cancellation.size,
|
|
404
|
+
};
|
|
405
|
+
},
|
|
406
|
+
},
|
|
407
|
+
{
|
|
408
|
+
name: 'chat_cancel_stop',
|
|
409
|
+
description: 'Cancel the running task for a chat. Aborts the associated AbortController.',
|
|
410
|
+
auth: 'write',
|
|
411
|
+
schema: z.object({
|
|
412
|
+
chatId: z.string().describe('Chat/session ID to cancel.'),
|
|
413
|
+
}),
|
|
414
|
+
handler: async (params) => {
|
|
415
|
+
if (!state.cancellation) {
|
|
416
|
+
return { cancelled: false, reason: 'No cancellation manager initialized.' };
|
|
417
|
+
}
|
|
418
|
+
const info = state.cancellation.cancel(params.chatId);
|
|
419
|
+
if (!info) {
|
|
420
|
+
return { cancelled: false, reason: 'No running task for this chat.' };
|
|
421
|
+
}
|
|
422
|
+
return {
|
|
423
|
+
cancelled: true,
|
|
424
|
+
chatId: params.chatId,
|
|
425
|
+
description: info.description ?? null,
|
|
426
|
+
ranForMs: Date.now() - info.startedAt,
|
|
427
|
+
activeTasks: state.cancellation.size,
|
|
428
|
+
};
|
|
429
|
+
},
|
|
430
|
+
},
|
|
431
|
+
{
|
|
432
|
+
name: 'chat_cancel_status',
|
|
433
|
+
description: 'Get cancellation status — running tasks, per-chat info.',
|
|
434
|
+
auth: 'read',
|
|
435
|
+
schema: z.object({
|
|
436
|
+
chatId: z.string().optional().describe('Specific chat to check. Omit for all.'),
|
|
437
|
+
}),
|
|
438
|
+
handler: async (params) => {
|
|
439
|
+
if (!state.cancellation) {
|
|
440
|
+
return { activeTasks: 0, running: [] };
|
|
441
|
+
}
|
|
442
|
+
if (params.chatId) {
|
|
443
|
+
const info = state.cancellation.getInfo(params.chatId);
|
|
444
|
+
return {
|
|
445
|
+
chatId: params.chatId,
|
|
446
|
+
running: !!info,
|
|
447
|
+
description: info?.description ?? null,
|
|
448
|
+
startedAt: info?.startedAt ?? null,
|
|
449
|
+
ranForMs: info ? Date.now() - info.startedAt : null,
|
|
450
|
+
};
|
|
451
|
+
}
|
|
452
|
+
const running = state.cancellation.listRunning();
|
|
453
|
+
return {
|
|
454
|
+
activeTasks: state.cancellation.size,
|
|
455
|
+
running: running.map((id) => {
|
|
456
|
+
const info = state.cancellation.getInfo(id);
|
|
457
|
+
return {
|
|
458
|
+
chatId: id,
|
|
459
|
+
description: info?.description ?? null,
|
|
460
|
+
startedAt: info?.startedAt ?? null,
|
|
461
|
+
};
|
|
462
|
+
}),
|
|
463
|
+
};
|
|
464
|
+
},
|
|
465
|
+
},
|
|
466
|
+
// ─── Self-Update Ops ───────────────────────────────────────────
|
|
467
|
+
{
|
|
468
|
+
name: 'chat_update_init',
|
|
469
|
+
description: 'Initialize self-update manager. Provide path for restart context persistence.',
|
|
470
|
+
auth: 'write',
|
|
471
|
+
schema: z.object({
|
|
472
|
+
contextPath: z.string().describe('Path for restart context JSON file.'),
|
|
473
|
+
}),
|
|
474
|
+
handler: async (params) => {
|
|
475
|
+
state.updater = new SelfUpdateManager(params.contextPath);
|
|
476
|
+
const pending = state.updater.loadContext();
|
|
477
|
+
return {
|
|
478
|
+
initialized: true,
|
|
479
|
+
hasPendingRestart: !!pending,
|
|
480
|
+
pendingContext: pending,
|
|
481
|
+
};
|
|
482
|
+
},
|
|
483
|
+
},
|
|
484
|
+
{
|
|
485
|
+
name: 'chat_update_request',
|
|
486
|
+
description: 'Request a restart. Saves context for post-restart confirmation.',
|
|
487
|
+
auth: 'write',
|
|
488
|
+
schema: z.object({
|
|
489
|
+
chatId: z.string().describe('Chat ID for post-restart confirmation.'),
|
|
490
|
+
reason: z
|
|
491
|
+
.enum(['self-update', 'rebuild', 'manual'])
|
|
492
|
+
.optional()
|
|
493
|
+
.describe('Restart reason. Default: manual.'),
|
|
494
|
+
commitSha: z.string().optional().describe('Git commit SHA if self-update.'),
|
|
495
|
+
contextPath: z.string().describe('Path for restart context.'),
|
|
496
|
+
}),
|
|
497
|
+
handler: async (params) => {
|
|
498
|
+
if (!state.updater) {
|
|
499
|
+
state.updater = new SelfUpdateManager(params.contextPath);
|
|
500
|
+
}
|
|
501
|
+
return state.updater.requestRestart(params.chatId, params.reason ?? 'manual', params.commitSha);
|
|
502
|
+
},
|
|
503
|
+
},
|
|
504
|
+
{
|
|
505
|
+
name: 'chat_update_confirm',
|
|
506
|
+
description: 'Clear restart context after successful startup.',
|
|
507
|
+
auth: 'write',
|
|
508
|
+
schema: z.object({
|
|
509
|
+
contextPath: z.string().describe('Path for restart context.'),
|
|
510
|
+
}),
|
|
511
|
+
handler: async (params) => {
|
|
512
|
+
if (!state.updater) {
|
|
513
|
+
state.updater = new SelfUpdateManager(params.contextPath);
|
|
514
|
+
}
|
|
515
|
+
const context = state.updater.loadContext();
|
|
516
|
+
state.updater.clearContext();
|
|
517
|
+
return { confirmed: true, previousContext: context };
|
|
518
|
+
},
|
|
519
|
+
},
|
|
520
|
+
// ─── File Handling Ops ─────────────────────────────────────────
|
|
521
|
+
{
|
|
522
|
+
name: 'chat_file_detect_intent',
|
|
523
|
+
description: 'Detect user intent for a file — vision, text, or intake.',
|
|
524
|
+
auth: 'read',
|
|
525
|
+
schema: z.object({
|
|
526
|
+
filename: z.string().describe('Original filename.'),
|
|
527
|
+
mimeType: z.string().describe('MIME type.'),
|
|
528
|
+
userText: z.string().optional().describe('Accompanying user message text.'),
|
|
529
|
+
}),
|
|
530
|
+
handler: async (params) => {
|
|
531
|
+
const intent = detectFileIntent(params.filename, params.mimeType, params.userText);
|
|
532
|
+
return { filename: params.filename, mimeType: params.mimeType, intent };
|
|
533
|
+
},
|
|
534
|
+
},
|
|
535
|
+
{
|
|
536
|
+
name: 'chat_file_build_content',
|
|
537
|
+
description: 'Build multimodal content from a file for the Anthropic API.',
|
|
538
|
+
auth: 'read',
|
|
539
|
+
schema: z.object({
|
|
540
|
+
filename: z.string().describe('Original filename.'),
|
|
541
|
+
mimeType: z.string().describe('MIME type.'),
|
|
542
|
+
dataBase64: z.string().describe('File content as base64.'),
|
|
543
|
+
intent: z.enum(['vision', 'text', 'intake']).describe('Detected intent.'),
|
|
544
|
+
}),
|
|
545
|
+
handler: async (params) => {
|
|
546
|
+
const file = {
|
|
547
|
+
name: params.filename,
|
|
548
|
+
mimeType: params.mimeType,
|
|
549
|
+
size: Buffer.byteLength(params.dataBase64, 'base64'),
|
|
550
|
+
data: Buffer.from(params.dataBase64, 'base64'),
|
|
551
|
+
};
|
|
552
|
+
return buildMultimodalContent(file, params.intent);
|
|
553
|
+
},
|
|
554
|
+
},
|
|
555
|
+
{
|
|
556
|
+
name: 'chat_file_cleanup',
|
|
557
|
+
description: 'Clean up temp files older than maxAgeMs.',
|
|
558
|
+
auth: 'write',
|
|
559
|
+
schema: z.object({
|
|
560
|
+
uploadDir: z.string().describe('Temp upload directory.'),
|
|
561
|
+
maxAgeMs: z.number().optional().describe('Max age in ms. Default: 1 hour.'),
|
|
562
|
+
}),
|
|
563
|
+
handler: async (params) => {
|
|
564
|
+
const removed = cleanupTempFiles(params.uploadDir, params.maxAgeMs);
|
|
565
|
+
return { removed, uploadDir: params.uploadDir };
|
|
566
|
+
},
|
|
567
|
+
},
|
|
568
|
+
// ─── Notification Ops ──────────────────────────────────────────
|
|
569
|
+
{
|
|
570
|
+
name: 'chat_notify_init',
|
|
571
|
+
description: 'Initialize the notification engine. Notifications are delivered via the provided callback pattern.',
|
|
572
|
+
auth: 'write',
|
|
573
|
+
schema: z.object({
|
|
574
|
+
intervalMs: z.number().optional().describe('Polling interval in ms. Default: 30 minutes.'),
|
|
575
|
+
defaultCooldownMs: z
|
|
576
|
+
.number()
|
|
577
|
+
.optional()
|
|
578
|
+
.describe('Default cooldown between notifications. Default: 4 hours.'),
|
|
579
|
+
}),
|
|
580
|
+
handler: async (params) => {
|
|
581
|
+
// The onNotify callback can't be passed via JSON — it's set up in code.
|
|
582
|
+
// This op initializes with a no-op that logs to console.
|
|
583
|
+
state.notifications = new NotificationEngine({
|
|
584
|
+
intervalMs: params.intervalMs,
|
|
585
|
+
defaultCooldownMs: params.defaultCooldownMs,
|
|
586
|
+
onNotify: async (checkId, message) => {
|
|
587
|
+
console.log(`[notification] ${checkId}: ${message}`);
|
|
588
|
+
},
|
|
589
|
+
});
|
|
590
|
+
return { initialized: true };
|
|
591
|
+
},
|
|
592
|
+
},
|
|
593
|
+
{
|
|
594
|
+
name: 'chat_notify_start',
|
|
595
|
+
description: 'Start the notification polling loop.',
|
|
596
|
+
auth: 'write',
|
|
597
|
+
handler: async () => {
|
|
598
|
+
if (!state.notifications) {
|
|
599
|
+
return { started: false, reason: 'Notification engine not initialized.' };
|
|
600
|
+
}
|
|
601
|
+
state.notifications.start();
|
|
602
|
+
return { started: true, ...state.notifications.stats() };
|
|
603
|
+
},
|
|
604
|
+
},
|
|
605
|
+
{
|
|
606
|
+
name: 'chat_notify_stop',
|
|
607
|
+
description: 'Stop the notification polling loop.',
|
|
608
|
+
auth: 'write',
|
|
609
|
+
handler: async () => {
|
|
610
|
+
if (!state.notifications) {
|
|
611
|
+
return { stopped: false, reason: 'Notification engine not initialized.' };
|
|
612
|
+
}
|
|
613
|
+
state.notifications.stop();
|
|
614
|
+
return { stopped: true, ...state.notifications.stats() };
|
|
615
|
+
},
|
|
616
|
+
},
|
|
617
|
+
{
|
|
618
|
+
name: 'chat_notify_poll',
|
|
619
|
+
description: 'Run all notification checks once (manual trigger).',
|
|
620
|
+
auth: 'write',
|
|
621
|
+
handler: async () => {
|
|
622
|
+
if (!state.notifications) {
|
|
623
|
+
return { polled: false, reason: 'Notification engine not initialized.' };
|
|
624
|
+
}
|
|
625
|
+
const notified = await state.notifications.poll();
|
|
626
|
+
return { polled: true, notified, ...state.notifications.stats() };
|
|
627
|
+
},
|
|
628
|
+
},
|
|
629
|
+
{
|
|
630
|
+
name: 'chat_notify_status',
|
|
631
|
+
description: 'Get notification engine status.',
|
|
632
|
+
auth: 'read',
|
|
633
|
+
handler: async () => {
|
|
634
|
+
if (!state.notifications) {
|
|
635
|
+
return { initialized: false, checks: 0, running: false, sent: 0, lastPollAt: null };
|
|
636
|
+
}
|
|
637
|
+
return { initialized: true, ...state.notifications.stats() };
|
|
638
|
+
},
|
|
639
|
+
},
|
|
640
|
+
// ─── Voice Ops ─────────────────────────────────────────────────
|
|
641
|
+
{
|
|
642
|
+
name: 'chat_voice_transcribe',
|
|
643
|
+
description: 'Transcribe audio using OpenAI Whisper. Provide base64-encoded audio.',
|
|
644
|
+
auth: 'write',
|
|
645
|
+
schema: z.object({
|
|
646
|
+
audioBase64: z.string().describe('Base64-encoded audio data.'),
|
|
647
|
+
openaiApiKey: z.string().describe('OpenAI API key.'),
|
|
648
|
+
filename: z.string().optional().describe('Audio filename. Default: audio.ogg.'),
|
|
649
|
+
}),
|
|
650
|
+
handler: async (params) => {
|
|
651
|
+
const buffer = Buffer.from(params.audioBase64, 'base64');
|
|
652
|
+
return transcribeAudio(buffer, {
|
|
653
|
+
openaiApiKey: params.openaiApiKey,
|
|
654
|
+
}, params.filename);
|
|
655
|
+
},
|
|
656
|
+
},
|
|
657
|
+
{
|
|
658
|
+
name: 'chat_voice_synthesize',
|
|
659
|
+
description: 'Synthesize speech from text using OpenAI TTS. Returns base64 MP3.',
|
|
660
|
+
auth: 'write',
|
|
661
|
+
schema: z.object({
|
|
662
|
+
text: z.string().describe('Text to synthesize.'),
|
|
663
|
+
openaiApiKey: z.string().describe('OpenAI API key.'),
|
|
664
|
+
voice: z.string().optional().describe('Voice ID. Default: onyx.'),
|
|
665
|
+
}),
|
|
666
|
+
handler: async (params) => {
|
|
667
|
+
const result = await synthesizeSpeech(params.text, {
|
|
668
|
+
openaiApiKey: params.openaiApiKey,
|
|
669
|
+
ttsVoice: params.voice,
|
|
670
|
+
});
|
|
671
|
+
if (!result)
|
|
672
|
+
return { success: false, reason: 'No API key.' };
|
|
673
|
+
return {
|
|
674
|
+
success: result.success,
|
|
675
|
+
audioBase64: result.audio.toString('base64'),
|
|
676
|
+
audioSize: result.audio.length,
|
|
677
|
+
};
|
|
678
|
+
},
|
|
679
|
+
},
|
|
680
|
+
// ─── Queue Ops ─────────────────────────────────────────────────
|
|
681
|
+
{
|
|
682
|
+
name: 'chat_queue_init',
|
|
683
|
+
description: 'Initialize the message queue for disk-based chat relay.',
|
|
684
|
+
auth: 'write',
|
|
685
|
+
schema: z.object({
|
|
686
|
+
queueDir: z.string().describe('Base directory for inbox/outbox.'),
|
|
687
|
+
}),
|
|
688
|
+
handler: async (params) => {
|
|
689
|
+
state.queue = new MessageQueue({ queueDir: params.queueDir });
|
|
690
|
+
return {
|
|
691
|
+
initialized: true,
|
|
692
|
+
inbox: state.queue.inboxCount(),
|
|
693
|
+
outbox: state.queue.outboxCount(),
|
|
694
|
+
};
|
|
695
|
+
},
|
|
696
|
+
},
|
|
697
|
+
{
|
|
698
|
+
name: 'chat_queue_inbox',
|
|
699
|
+
description: 'Read pending messages from the queue inbox.',
|
|
700
|
+
auth: 'read',
|
|
701
|
+
schema: z.object({
|
|
702
|
+
queueDir: z.string().describe('Queue directory (auto-initializes).'),
|
|
703
|
+
}),
|
|
704
|
+
handler: async (params) => {
|
|
705
|
+
if (!state.queue) {
|
|
706
|
+
state.queue = new MessageQueue({ queueDir: params.queueDir });
|
|
707
|
+
}
|
|
708
|
+
const messages = state.queue.readInbox();
|
|
709
|
+
return { messages, count: messages.length, formatted: state.queue.formatInbox() };
|
|
710
|
+
},
|
|
711
|
+
},
|
|
712
|
+
{
|
|
713
|
+
name: 'chat_queue_reply',
|
|
714
|
+
description: 'Send a reply to a queued message. Removes from inbox, writes to outbox.',
|
|
715
|
+
auth: 'write',
|
|
716
|
+
schema: z.object({
|
|
717
|
+
messageId: z.string().describe('Original message ID.'),
|
|
718
|
+
chatId: z.string().describe('Target chat ID.'),
|
|
719
|
+
text: z.string().describe('Response text.'),
|
|
720
|
+
queueDir: z.string().describe('Queue directory.'),
|
|
721
|
+
}),
|
|
722
|
+
handler: async (params) => {
|
|
723
|
+
if (!state.queue) {
|
|
724
|
+
state.queue = new MessageQueue({ queueDir: params.queueDir });
|
|
725
|
+
}
|
|
726
|
+
const response = state.queue.sendResponse(params.messageId, params.chatId, params.text);
|
|
727
|
+
return { sent: true, response };
|
|
728
|
+
},
|
|
729
|
+
},
|
|
730
|
+
{
|
|
731
|
+
name: 'chat_queue_drain',
|
|
732
|
+
description: 'Drain outbox — read and remove all pending responses.',
|
|
733
|
+
auth: 'write',
|
|
734
|
+
schema: z.object({
|
|
735
|
+
queueDir: z.string().describe('Queue directory.'),
|
|
736
|
+
}),
|
|
737
|
+
handler: async (params) => {
|
|
738
|
+
if (!state.queue) {
|
|
739
|
+
state.queue = new MessageQueue({ queueDir: params.queueDir });
|
|
740
|
+
}
|
|
741
|
+
const responses = state.queue.drainOutbox();
|
|
742
|
+
return { responses, count: responses.length };
|
|
743
|
+
},
|
|
744
|
+
},
|
|
745
|
+
// ─── Browser Session Ops ───────────────────────────────────────
|
|
746
|
+
{
|
|
747
|
+
name: 'chat_browser_init',
|
|
748
|
+
description: 'Initialize the browser session manager for per-chat Playwright isolation.',
|
|
749
|
+
auth: 'write',
|
|
750
|
+
schema: z.object({
|
|
751
|
+
maxSessions: z.number().optional().describe('Max concurrent sessions. Default: 3.'),
|
|
752
|
+
idleTimeoutMs: z.number().optional().describe('Idle timeout in ms. Default: 5 minutes.'),
|
|
753
|
+
}),
|
|
754
|
+
handler: async (params) => {
|
|
755
|
+
state.browser = new BrowserSessionManager({
|
|
756
|
+
maxSessions: params.maxSessions,
|
|
757
|
+
idleTimeoutMs: params.idleTimeoutMs,
|
|
758
|
+
});
|
|
759
|
+
return { initialized: true, maxSessions: params.maxSessions ?? 3 };
|
|
760
|
+
},
|
|
761
|
+
},
|
|
762
|
+
{
|
|
763
|
+
name: 'chat_browser_acquire',
|
|
764
|
+
description: 'Get or create a browser session for a chat. Spawns Playwright if needed.',
|
|
765
|
+
auth: 'write',
|
|
766
|
+
schema: z.object({
|
|
767
|
+
chatId: z.string().describe('Chat ID for isolation.'),
|
|
768
|
+
}),
|
|
769
|
+
handler: async (params) => {
|
|
770
|
+
if (!state.browser) {
|
|
771
|
+
state.browser = new BrowserSessionManager();
|
|
772
|
+
}
|
|
773
|
+
const session = state.browser.acquire(params.chatId);
|
|
774
|
+
return {
|
|
775
|
+
chatId: params.chatId,
|
|
776
|
+
pid: session.process.pid ?? null,
|
|
777
|
+
activeSessions: state.browser.size,
|
|
778
|
+
};
|
|
779
|
+
},
|
|
780
|
+
},
|
|
781
|
+
{
|
|
782
|
+
name: 'chat_browser_release',
|
|
783
|
+
description: 'Release a browser session for a chat.',
|
|
784
|
+
auth: 'write',
|
|
785
|
+
schema: z.object({
|
|
786
|
+
chatId: z.string().describe('Chat ID to release.'),
|
|
787
|
+
}),
|
|
788
|
+
handler: async (params) => {
|
|
789
|
+
if (!state.browser)
|
|
790
|
+
return { released: false, reason: 'No browser manager.' };
|
|
791
|
+
const released = state.browser.release(params.chatId);
|
|
792
|
+
return { released, activeSessions: state.browser.size };
|
|
793
|
+
},
|
|
794
|
+
},
|
|
795
|
+
{
|
|
796
|
+
name: 'chat_browser_status',
|
|
797
|
+
description: 'Get browser session status — active sessions, per-chat info.',
|
|
798
|
+
auth: 'read',
|
|
799
|
+
handler: async () => {
|
|
800
|
+
if (!state.browser)
|
|
801
|
+
return { initialized: false, activeSessions: 0, sessions: [] };
|
|
802
|
+
const sessions = state.browser.listSessions().map((id) => (Object.assign({ chatId: id }, state.browser.getInfo(id))));
|
|
803
|
+
return { initialized: true, activeSessions: state.browser.size, sessions };
|
|
804
|
+
},
|
|
805
|
+
},
|
|
806
|
+
];
|
|
807
|
+
}
|
|
808
|
+
//# sourceMappingURL=chat-facade.js.map
|