@soleri/core 2.9.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/planning/gap-analysis.d.ts.map +1 -1
- package/dist/planning/gap-analysis.js +3 -1
- package/dist/planning/gap-analysis.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/planning/gap-analysis.ts +52 -7
- 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,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token Authentication — bearer token generation, validation, and persistence.
|
|
3
|
+
*
|
|
4
|
+
* Uses constant-time comparison (crypto.timingSafeEqual) to prevent timing attacks.
|
|
5
|
+
* Token priority: {AGENT_ID}_HTTP_TOKEN env > ~/.{agentId}/http-token file.
|
|
6
|
+
*/
|
|
7
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
8
|
+
/** Generate a 32-byte hex token (64 characters). */
|
|
9
|
+
export declare function generateToken(): string;
|
|
10
|
+
/**
|
|
11
|
+
* Load token with priority: env var > file.
|
|
12
|
+
* The env var name is derived from the agentId: MY_AGENT_HTTP_TOKEN.
|
|
13
|
+
*/
|
|
14
|
+
export declare function loadToken(agentId: string): string | undefined;
|
|
15
|
+
/** Save token to ~/.{agentId}/http-token with 0600 permissions. */
|
|
16
|
+
export declare function saveToken(agentId: string, token: string): void;
|
|
17
|
+
/** Load existing token or generate and save a new one. */
|
|
18
|
+
export declare function getOrGenerateToken(agentId: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Constant-time bearer token validation.
|
|
21
|
+
* Returns true if the Authorization header contains a valid Bearer token.
|
|
22
|
+
*/
|
|
23
|
+
export declare function validateBearerToken(authHeader: string | undefined, expected: string): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Validate an incoming HTTP request's bearer token.
|
|
26
|
+
* Returns true if valid, sends 401 and returns false if not.
|
|
27
|
+
*/
|
|
28
|
+
export declare function authenticateRequest(req: IncomingMessage, res: ServerResponse, expectedToken: string): boolean;
|
|
29
|
+
//# sourceMappingURL=token-auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-auth.d.ts","sourceRoot":"","sources":["../../src/transport/token-auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,oDAAoD;AACpD,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAoB7D;AAED,mEAAmE;AACnE,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAI9D;AAED,0DAA0D;AAC1D,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAM1D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAc7F;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,aAAa,EAAE,MAAM,GACpB,OAAO,CAOT"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token Authentication — bearer token generation, validation, and persistence.
|
|
3
|
+
*
|
|
4
|
+
* Uses constant-time comparison (crypto.timingSafeEqual) to prevent timing attacks.
|
|
5
|
+
* Token priority: {AGENT_ID}_HTTP_TOKEN env > ~/.{agentId}/http-token file.
|
|
6
|
+
*/
|
|
7
|
+
import { randomBytes, timingSafeEqual } from 'node:crypto';
|
|
8
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { homedir } from 'node:os';
|
|
11
|
+
/** Generate a 32-byte hex token (64 characters). */
|
|
12
|
+
export function generateToken() {
|
|
13
|
+
return randomBytes(32).toString('hex');
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Load token with priority: env var > file.
|
|
17
|
+
* The env var name is derived from the agentId: MY_AGENT_HTTP_TOKEN.
|
|
18
|
+
*/
|
|
19
|
+
export function loadToken(agentId) {
|
|
20
|
+
// Environment variable takes priority
|
|
21
|
+
const envKey = `${agentId.replace(/-/g, '_').toUpperCase()}_HTTP_TOKEN`;
|
|
22
|
+
const envToken = process.env[envKey];
|
|
23
|
+
if (envToken && envToken.trim().length > 0) {
|
|
24
|
+
return envToken.trim();
|
|
25
|
+
}
|
|
26
|
+
// Fall back to file
|
|
27
|
+
const tokenFile = join(homedir(), `.${agentId}`, 'http-token');
|
|
28
|
+
try {
|
|
29
|
+
if (existsSync(tokenFile)) {
|
|
30
|
+
const fileToken = readFileSync(tokenFile, 'utf-8').trim();
|
|
31
|
+
if (fileToken.length > 0)
|
|
32
|
+
return fileToken;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// File read failed
|
|
37
|
+
}
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
/** Save token to ~/.{agentId}/http-token with 0600 permissions. */
|
|
41
|
+
export function saveToken(agentId, token) {
|
|
42
|
+
const dir = join(homedir(), `.${agentId}`);
|
|
43
|
+
mkdirSync(dir, { recursive: true });
|
|
44
|
+
writeFileSync(join(dir, 'http-token'), token, { mode: 0o600 });
|
|
45
|
+
}
|
|
46
|
+
/** Load existing token or generate and save a new one. */
|
|
47
|
+
export function getOrGenerateToken(agentId) {
|
|
48
|
+
const existing = loadToken(agentId);
|
|
49
|
+
if (existing)
|
|
50
|
+
return existing;
|
|
51
|
+
const token = generateToken();
|
|
52
|
+
saveToken(agentId, token);
|
|
53
|
+
return token;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Constant-time bearer token validation.
|
|
57
|
+
* Returns true if the Authorization header contains a valid Bearer token.
|
|
58
|
+
*/
|
|
59
|
+
export function validateBearerToken(authHeader, expected) {
|
|
60
|
+
if (!authHeader || !authHeader.startsWith('Bearer '))
|
|
61
|
+
return false;
|
|
62
|
+
const provided = authHeader.slice(7);
|
|
63
|
+
const expectedBuf = Buffer.from(expected, 'utf-8');
|
|
64
|
+
const providedBuf = Buffer.from(provided, 'utf-8');
|
|
65
|
+
if (expectedBuf.length !== providedBuf.length) {
|
|
66
|
+
// Compare against self to avoid timing leak on length mismatch
|
|
67
|
+
timingSafeEqual(expectedBuf, expectedBuf);
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
return timingSafeEqual(providedBuf, expectedBuf);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Validate an incoming HTTP request's bearer token.
|
|
74
|
+
* Returns true if valid, sends 401 and returns false if not.
|
|
75
|
+
*/
|
|
76
|
+
export function authenticateRequest(req, res, expectedToken) {
|
|
77
|
+
const authHeader = req.headers.authorization;
|
|
78
|
+
if (validateBearerToken(authHeader, expectedToken))
|
|
79
|
+
return true;
|
|
80
|
+
res.writeHead(401, { 'Content-Type': 'application/json' });
|
|
81
|
+
res.end(JSON.stringify({ error: 'Unauthorized' }));
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=token-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-auth.js","sourceRoot":"","sources":["../../src/transport/token-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transport Types — configuration for HTTP/SSE transport layer.
|
|
3
|
+
*/
|
|
4
|
+
/** Supported transport modes */
|
|
5
|
+
export type TransportMode = 'stdio' | 'http' | 'ws' | 'lsp';
|
|
6
|
+
/** HTTP transport configuration */
|
|
7
|
+
export interface HttpTransportConfig {
|
|
8
|
+
/** Port to listen on (default: 3100) */
|
|
9
|
+
port: number;
|
|
10
|
+
/** Host to bind to (default: 127.0.0.1) */
|
|
11
|
+
host: string;
|
|
12
|
+
/** CORS allowed origins (empty = no CORS headers) */
|
|
13
|
+
corsOrigins: string[];
|
|
14
|
+
/** Bearer token for authentication */
|
|
15
|
+
authToken: string;
|
|
16
|
+
/** Session TTL in milliseconds (default: 3600000 = 1 hour). 0 to disable. */
|
|
17
|
+
sessionTTL?: number;
|
|
18
|
+
/** Session reaper interval in milliseconds (default: 60000 = 1 minute) */
|
|
19
|
+
reaperInterval?: number;
|
|
20
|
+
/** Rate limit: max requests per window (default: 100) */
|
|
21
|
+
rateLimit?: number;
|
|
22
|
+
/** Rate limit window in milliseconds (default: 60000 = 1 minute) */
|
|
23
|
+
rateLimitWindow?: number;
|
|
24
|
+
}
|
|
25
|
+
/** WebSocket transport configuration */
|
|
26
|
+
export interface WsTransportConfig {
|
|
27
|
+
/** Bearer token for authentication (validated on upgrade) */
|
|
28
|
+
authToken: string;
|
|
29
|
+
/** Heartbeat interval in ms (default: 30000). 0 to disable. */
|
|
30
|
+
heartbeatInterval?: number;
|
|
31
|
+
/** Max message size in bytes (default: 1MB) */
|
|
32
|
+
maxMessageSize?: number;
|
|
33
|
+
/** Session TTL in milliseconds (default: 3600000 = 1 hour). 0 to disable. */
|
|
34
|
+
sessionTTL?: number;
|
|
35
|
+
/** Session reaper interval in milliseconds (default: 60000 = 1 minute) */
|
|
36
|
+
reaperInterval?: number;
|
|
37
|
+
}
|
|
38
|
+
/** LSP transport configuration */
|
|
39
|
+
export interface LspTransportConfig {
|
|
40
|
+
/** Agent capabilities to expose as LSP features */
|
|
41
|
+
capabilities?: LspCapabilities;
|
|
42
|
+
}
|
|
43
|
+
/** Which agent features to expose via LSP */
|
|
44
|
+
export interface LspCapabilities {
|
|
45
|
+
/** Expose vault search as completions (default: true) */
|
|
46
|
+
completions?: boolean;
|
|
47
|
+
/** Expose quality gate violations as diagnostics (default: true) */
|
|
48
|
+
diagnostics?: boolean;
|
|
49
|
+
/** Expose pattern documentation as hover (default: true) */
|
|
50
|
+
hover?: boolean;
|
|
51
|
+
/** Expose agent ops as code actions (default: false) */
|
|
52
|
+
codeActions?: boolean;
|
|
53
|
+
}
|
|
54
|
+
/** Combined transport configuration */
|
|
55
|
+
export interface TransportConfig {
|
|
56
|
+
mode: TransportMode;
|
|
57
|
+
http?: HttpTransportConfig;
|
|
58
|
+
ws?: WsTransportConfig;
|
|
59
|
+
lsp?: LspTransportConfig;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/transport/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,gCAAgC;AAChC,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,KAAK,CAAC;AAE5D,mCAAmC;AACnC,MAAM,WAAW,mBAAmB;IAClC,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wCAAwC;AACxC,MAAM,WAAW,iBAAiB;IAChC,6DAA6D;IAC7D,SAAS,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,kCAAkC;AAClC,MAAM,WAAW,kBAAkB;IACjC,mDAAmD;IACnD,YAAY,CAAC,EAAE,eAAe,CAAC;CAChC;AAED,6CAA6C;AAC7C,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,oEAAoE;IACpE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wDAAwD;IACxD,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,uCAAuC;AACvC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,CAAC,EAAE,mBAAmB,CAAC;IAC3B,EAAE,CAAC,EAAE,iBAAiB,CAAC;IACvB,GAAG,CAAC,EAAE,kBAAkB,CAAC;CAC1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/transport/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket MCP Server — RFC 6455 implementation using only node:http + node:crypto.
|
|
3
|
+
*
|
|
4
|
+
* Provides bidirectional JSON-RPC 2.0 communication over WebSocket.
|
|
5
|
+
* Can run standalone or share an HTTP server with HttpMcpServer via upgrade handler.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - RFC 6455 handshake (Sec-WebSocket-Key / Accept)
|
|
9
|
+
* - Text frame encode/decode (opcode 0x1) with masking support
|
|
10
|
+
* - Ping/pong heartbeat (configurable interval, default 30s)
|
|
11
|
+
* - Bearer token auth on upgrade request
|
|
12
|
+
* - Session management via shared SessionManager
|
|
13
|
+
* - Max message size enforcement (default 1MB)
|
|
14
|
+
* - Clean close handshake (opcode 0x8)
|
|
15
|
+
*/
|
|
16
|
+
import { type Server } from 'node:http';
|
|
17
|
+
import type { Duplex } from 'node:stream';
|
|
18
|
+
import type { WsTransportConfig } from './types.js';
|
|
19
|
+
import { SessionManager, type Session } from './session-manager.js';
|
|
20
|
+
export interface WsConnection {
|
|
21
|
+
/** Session associated with this connection */
|
|
22
|
+
session: Session;
|
|
23
|
+
/** The underlying TCP socket */
|
|
24
|
+
socket: Duplex;
|
|
25
|
+
/** Whether the connection is alive (for heartbeat) */
|
|
26
|
+
alive: boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface WsServerCallbacks {
|
|
29
|
+
/** Called when a new WebSocket connection is established. Must create session. */
|
|
30
|
+
onConnect: (conn: WsConnection) => Promise<void>;
|
|
31
|
+
/** Called when a text message is received. */
|
|
32
|
+
onMessage: (conn: WsConnection, data: unknown) => Promise<void>;
|
|
33
|
+
/** Called when a connection is closed. */
|
|
34
|
+
onClose: (conn: WsConnection) => void;
|
|
35
|
+
/** Optional: called on errors. */
|
|
36
|
+
onError?: (conn: WsConnection, error: Error) => void;
|
|
37
|
+
}
|
|
38
|
+
export interface WsServerStats {
|
|
39
|
+
connections: number;
|
|
40
|
+
uptime: number;
|
|
41
|
+
}
|
|
42
|
+
export declare class WsMcpServer {
|
|
43
|
+
private server;
|
|
44
|
+
private ownServer;
|
|
45
|
+
private sessions;
|
|
46
|
+
private config;
|
|
47
|
+
private callbacks;
|
|
48
|
+
private connections;
|
|
49
|
+
private heartbeatTimer;
|
|
50
|
+
private startedAt;
|
|
51
|
+
constructor(config: WsTransportConfig, callbacks: WsServerCallbacks);
|
|
52
|
+
/** Get the session manager. */
|
|
53
|
+
get sessionManager(): SessionManager;
|
|
54
|
+
/**
|
|
55
|
+
* Attach to an existing HTTP server as an upgrade handler.
|
|
56
|
+
* Call this instead of start() when sharing a server with HttpMcpServer.
|
|
57
|
+
*/
|
|
58
|
+
attachTo(server: Server): void;
|
|
59
|
+
/** Start a standalone WebSocket server. */
|
|
60
|
+
start(port: number, host?: string): Promise<void>;
|
|
61
|
+
/** Stop the server and close all connections. */
|
|
62
|
+
stop(): Promise<void>;
|
|
63
|
+
/** Get server stats. */
|
|
64
|
+
getStats(): WsServerStats;
|
|
65
|
+
/** Send a text message to a specific connection. */
|
|
66
|
+
send(sessionId: string, data: unknown): boolean;
|
|
67
|
+
/** Broadcast a text message to all connections. */
|
|
68
|
+
broadcast(data: unknown): number;
|
|
69
|
+
private handleUpgrade;
|
|
70
|
+
private parseFrame;
|
|
71
|
+
private encodeFrame;
|
|
72
|
+
private sendText;
|
|
73
|
+
private sendPong;
|
|
74
|
+
private sendClose;
|
|
75
|
+
private startHeartbeat;
|
|
76
|
+
private stopHeartbeat;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=ws-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws-server.d.ts","sourceRoot":"","sources":["../../src/transport/ws-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAgB,KAAK,MAAM,EAAwB,MAAM,WAAW,CAAC;AAC5E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAsBpE,MAAM,WAAW,YAAY;IAC3B,8CAA8C;IAC9C,OAAO,EAAE,OAAO,CAAC;IACjB,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,kFAAkF;IAClF,SAAS,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,8CAA8C;IAC9C,SAAS,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,0CAA0C;IAC1C,OAAO,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IACtC,kCAAkC;IAClC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACtD;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,cAAc,CAA6C;IACnE,OAAO,CAAC,SAAS,CAAK;gBAEV,MAAM,EAAE,iBAAiB,EAAE,SAAS,EAAE,iBAAiB;IASnE,+BAA+B;IAC/B,IAAI,cAAc,IAAI,cAAc,CAEnC;IAED;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAW9B,2CAA2C;IACrC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,SAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB5D,iDAAiD;IAC3C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB3B,wBAAwB;IACxB,QAAQ,IAAI,aAAa;IAOzB,oDAAoD;IACpD,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO;IAO/C,mDAAmD;IACnD,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM;IAYhC,OAAO,CAAC,aAAa;IAiHrB,OAAO,CAAC,UAAU;IAuClB,OAAO,CAAC,WAAW;IAuBnB,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,cAAc;IA8BtB,OAAO,CAAC,aAAa;CAMtB"}
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket MCP Server — RFC 6455 implementation using only node:http + node:crypto.
|
|
3
|
+
*
|
|
4
|
+
* Provides bidirectional JSON-RPC 2.0 communication over WebSocket.
|
|
5
|
+
* Can run standalone or share an HTTP server with HttpMcpServer via upgrade handler.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - RFC 6455 handshake (Sec-WebSocket-Key / Accept)
|
|
9
|
+
* - Text frame encode/decode (opcode 0x1) with masking support
|
|
10
|
+
* - Ping/pong heartbeat (configurable interval, default 30s)
|
|
11
|
+
* - Bearer token auth on upgrade request
|
|
12
|
+
* - Session management via shared SessionManager
|
|
13
|
+
* - Max message size enforcement (default 1MB)
|
|
14
|
+
* - Clean close handshake (opcode 0x8)
|
|
15
|
+
*/
|
|
16
|
+
import { createHash } from 'node:crypto';
|
|
17
|
+
import { createServer } from 'node:http';
|
|
18
|
+
import { validateBearerToken } from './token-auth.js';
|
|
19
|
+
import { SessionManager } from './session-manager.js';
|
|
20
|
+
// =============================================================================
|
|
21
|
+
// CONSTANTS
|
|
22
|
+
// =============================================================================
|
|
23
|
+
/** RFC 6455 magic GUID for Sec-WebSocket-Accept */
|
|
24
|
+
const WS_MAGIC = '258EAFA5-E914-47DA-95CA-5AB5A4085CE3';
|
|
25
|
+
const DEFAULT_HEARTBEAT_MS = 30_000;
|
|
26
|
+
const DEFAULT_MAX_MESSAGE_SIZE = 1_048_576; // 1 MB
|
|
27
|
+
// Frame opcodes
|
|
28
|
+
const OPCODE_TEXT = 0x01;
|
|
29
|
+
const OPCODE_CLOSE = 0x08;
|
|
30
|
+
const OPCODE_PING = 0x09;
|
|
31
|
+
const OPCODE_PONG = 0x0a;
|
|
32
|
+
// =============================================================================
|
|
33
|
+
// WEBSOCKET SERVER
|
|
34
|
+
// =============================================================================
|
|
35
|
+
export class WsMcpServer {
|
|
36
|
+
server;
|
|
37
|
+
ownServer = false; // true if we created the server ourselves
|
|
38
|
+
sessions;
|
|
39
|
+
config;
|
|
40
|
+
callbacks;
|
|
41
|
+
connections = new Map();
|
|
42
|
+
heartbeatTimer;
|
|
43
|
+
startedAt = 0;
|
|
44
|
+
constructor(config, callbacks) {
|
|
45
|
+
this.config = config;
|
|
46
|
+
this.callbacks = callbacks;
|
|
47
|
+
this.sessions = new SessionManager({
|
|
48
|
+
ttl: config.sessionTTL,
|
|
49
|
+
reaperInterval: config.reaperInterval,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/** Get the session manager. */
|
|
53
|
+
get sessionManager() {
|
|
54
|
+
return this.sessions;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Attach to an existing HTTP server as an upgrade handler.
|
|
58
|
+
* Call this instead of start() when sharing a server with HttpMcpServer.
|
|
59
|
+
*/
|
|
60
|
+
attachTo(server) {
|
|
61
|
+
this.startedAt = Date.now();
|
|
62
|
+
this.server = server;
|
|
63
|
+
this.ownServer = false;
|
|
64
|
+
server.on('upgrade', (req, socket, head) => {
|
|
65
|
+
this.handleUpgrade(req, socket, head);
|
|
66
|
+
});
|
|
67
|
+
this.sessions.startReaper();
|
|
68
|
+
this.startHeartbeat();
|
|
69
|
+
}
|
|
70
|
+
/** Start a standalone WebSocket server. */
|
|
71
|
+
async start(port, host = '127.0.0.1') {
|
|
72
|
+
this.startedAt = Date.now();
|
|
73
|
+
this.server = createServer((_req, res) => {
|
|
74
|
+
res.writeHead(426, { 'Content-Type': 'text/plain' });
|
|
75
|
+
res.end('Upgrade Required');
|
|
76
|
+
});
|
|
77
|
+
this.ownServer = true;
|
|
78
|
+
this.server.on('upgrade', (req, socket, head) => {
|
|
79
|
+
this.handleUpgrade(req, socket, head);
|
|
80
|
+
});
|
|
81
|
+
await new Promise((resolve) => {
|
|
82
|
+
this.server.listen(port, host, () => resolve());
|
|
83
|
+
});
|
|
84
|
+
this.sessions.startReaper();
|
|
85
|
+
this.startHeartbeat();
|
|
86
|
+
}
|
|
87
|
+
/** Stop the server and close all connections. */
|
|
88
|
+
async stop() {
|
|
89
|
+
this.stopHeartbeat();
|
|
90
|
+
this.sessions.close();
|
|
91
|
+
// Close all WebSocket connections
|
|
92
|
+
for (const conn of this.connections.values()) {
|
|
93
|
+
this.sendClose(conn.socket, 1001, 'Server shutting down');
|
|
94
|
+
conn.socket.destroy();
|
|
95
|
+
}
|
|
96
|
+
this.connections.clear();
|
|
97
|
+
if (this.ownServer && this.server) {
|
|
98
|
+
await new Promise((resolve, reject) => {
|
|
99
|
+
this.server.close((err) => (err ? reject(err) : resolve()));
|
|
100
|
+
});
|
|
101
|
+
this.server = undefined;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/** Get server stats. */
|
|
105
|
+
getStats() {
|
|
106
|
+
return {
|
|
107
|
+
connections: this.connections.size,
|
|
108
|
+
uptime: this.startedAt > 0 ? Date.now() - this.startedAt : 0,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/** Send a text message to a specific connection. */
|
|
112
|
+
send(sessionId, data) {
|
|
113
|
+
const conn = this.connections.get(sessionId);
|
|
114
|
+
if (!conn)
|
|
115
|
+
return false;
|
|
116
|
+
this.sendText(conn.socket, JSON.stringify(data));
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
/** Broadcast a text message to all connections. */
|
|
120
|
+
broadcast(data) {
|
|
121
|
+
const text = JSON.stringify(data);
|
|
122
|
+
let count = 0;
|
|
123
|
+
for (const conn of this.connections.values()) {
|
|
124
|
+
this.sendText(conn.socket, text);
|
|
125
|
+
count++;
|
|
126
|
+
}
|
|
127
|
+
return count;
|
|
128
|
+
}
|
|
129
|
+
// ─── Upgrade Handling ──────────────────────────────────────────────
|
|
130
|
+
handleUpgrade(req, socket, _head) {
|
|
131
|
+
// Validate WebSocket upgrade headers
|
|
132
|
+
const upgradeHeader = req.headers.upgrade;
|
|
133
|
+
if (!upgradeHeader || upgradeHeader.toLowerCase() !== 'websocket') {
|
|
134
|
+
socket.destroy();
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const wsKey = req.headers['sec-websocket-key'];
|
|
138
|
+
if (!wsKey) {
|
|
139
|
+
socket.destroy();
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
// Auth: extract token from query string or Authorization header
|
|
143
|
+
const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);
|
|
144
|
+
const queryToken = url.searchParams.get('token');
|
|
145
|
+
const authHeader = req.headers.authorization;
|
|
146
|
+
const tokenValid = queryToken
|
|
147
|
+
? queryToken === this.config.authToken
|
|
148
|
+
: validateBearerToken(authHeader, this.config.authToken);
|
|
149
|
+
if (!tokenValid) {
|
|
150
|
+
socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n');
|
|
151
|
+
socket.destroy();
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
// Complete WebSocket handshake
|
|
155
|
+
const acceptKey = createHash('sha1')
|
|
156
|
+
.update(wsKey + WS_MAGIC)
|
|
157
|
+
.digest('base64');
|
|
158
|
+
const sessionId = this.sessions.generateId();
|
|
159
|
+
socket.write('HTTP/1.1 101 Switching Protocols\r\n' +
|
|
160
|
+
'Upgrade: websocket\r\n' +
|
|
161
|
+
'Connection: Upgrade\r\n' +
|
|
162
|
+
`Sec-WebSocket-Accept: ${acceptKey}\r\n` +
|
|
163
|
+
`mcp-session-id: ${sessionId}\r\n` +
|
|
164
|
+
'\r\n');
|
|
165
|
+
// Create session and connection
|
|
166
|
+
const session = this.sessions.add(sessionId, socket, null);
|
|
167
|
+
const conn = { session, socket, alive: true };
|
|
168
|
+
this.connections.set(sessionId, conn);
|
|
169
|
+
// Set up frame reader
|
|
170
|
+
const maxSize = this.config.maxMessageSize ?? DEFAULT_MAX_MESSAGE_SIZE;
|
|
171
|
+
let buffer = Buffer.alloc(0);
|
|
172
|
+
socket.on('data', (chunk) => {
|
|
173
|
+
buffer = Buffer.concat([buffer, chunk]);
|
|
174
|
+
// Process all complete frames in the buffer
|
|
175
|
+
while (buffer.length >= 2) {
|
|
176
|
+
const frame = this.parseFrame(buffer);
|
|
177
|
+
if (!frame)
|
|
178
|
+
break; // incomplete frame
|
|
179
|
+
buffer = buffer.subarray(frame.totalLength);
|
|
180
|
+
if (frame.opcode === OPCODE_TEXT) {
|
|
181
|
+
if (frame.payload.length > maxSize) {
|
|
182
|
+
this.sendClose(socket, 1009, 'Message too large');
|
|
183
|
+
socket.destroy();
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const text = frame.payload.toString('utf-8');
|
|
187
|
+
try {
|
|
188
|
+
const parsed = JSON.parse(text);
|
|
189
|
+
this.callbacks.onMessage(conn, parsed).catch((err) => {
|
|
190
|
+
this.callbacks.onError?.(conn, err instanceof Error ? err : new Error(String(err)));
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
// Invalid JSON — ignore or notify
|
|
195
|
+
this.callbacks.onError?.(conn, new Error('Invalid JSON received'));
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
else if (frame.opcode === OPCODE_PING) {
|
|
199
|
+
this.sendPong(socket, frame.payload);
|
|
200
|
+
}
|
|
201
|
+
else if (frame.opcode === OPCODE_PONG) {
|
|
202
|
+
conn.alive = true;
|
|
203
|
+
}
|
|
204
|
+
else if (frame.opcode === OPCODE_CLOSE) {
|
|
205
|
+
this.sendClose(socket, 1000, '');
|
|
206
|
+
socket.destroy();
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
// Cleanup on disconnect — guard against double-fire from close+end+error
|
|
211
|
+
let cleaned = false;
|
|
212
|
+
const cleanup = (err) => {
|
|
213
|
+
if (cleaned)
|
|
214
|
+
return;
|
|
215
|
+
cleaned = true;
|
|
216
|
+
this.connections.delete(sessionId);
|
|
217
|
+
this.sessions.remove(sessionId);
|
|
218
|
+
if (err)
|
|
219
|
+
this.callbacks.onError?.(conn, err);
|
|
220
|
+
this.callbacks.onClose(conn);
|
|
221
|
+
};
|
|
222
|
+
socket.on('close', () => cleanup());
|
|
223
|
+
socket.on('end', () => cleanup());
|
|
224
|
+
socket.on('error', (err) => cleanup(err));
|
|
225
|
+
// Notify callback
|
|
226
|
+
this.callbacks.onConnect(conn).catch((err) => {
|
|
227
|
+
this.callbacks.onError?.(conn, err instanceof Error ? err : new Error(String(err)));
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
// ─── Frame Parsing (RFC 6455) ──────────────────────────────────────
|
|
231
|
+
parseFrame(buf) {
|
|
232
|
+
if (buf.length < 2)
|
|
233
|
+
return null;
|
|
234
|
+
const opcode = buf[0] & 0x0f;
|
|
235
|
+
const masked = (buf[1] & 0x80) !== 0;
|
|
236
|
+
let payloadLength = buf[1] & 0x7f;
|
|
237
|
+
let offset = 2;
|
|
238
|
+
if (payloadLength === 126) {
|
|
239
|
+
if (buf.length < 4)
|
|
240
|
+
return null;
|
|
241
|
+
payloadLength = buf.readUInt16BE(2);
|
|
242
|
+
offset = 4;
|
|
243
|
+
}
|
|
244
|
+
else if (payloadLength === 127) {
|
|
245
|
+
if (buf.length < 10)
|
|
246
|
+
return null;
|
|
247
|
+
// Read as 64-bit, but JS numbers are limited to 2^53
|
|
248
|
+
payloadLength = Number(buf.readBigUInt64BE(2));
|
|
249
|
+
offset = 10;
|
|
250
|
+
}
|
|
251
|
+
const maskSize = masked ? 4 : 0;
|
|
252
|
+
const totalLength = offset + maskSize + payloadLength;
|
|
253
|
+
if (buf.length < totalLength)
|
|
254
|
+
return null;
|
|
255
|
+
let payload;
|
|
256
|
+
if (masked) {
|
|
257
|
+
const mask = buf.subarray(offset, offset + 4);
|
|
258
|
+
payload = Buffer.alloc(payloadLength);
|
|
259
|
+
for (let i = 0; i < payloadLength; i++) {
|
|
260
|
+
payload[i] = buf[offset + 4 + i] ^ mask[i & 3];
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
payload = buf.subarray(offset, offset + payloadLength);
|
|
265
|
+
}
|
|
266
|
+
return { opcode, payload, totalLength };
|
|
267
|
+
}
|
|
268
|
+
// ─── Frame Encoding ────────────────────────────────────────────────
|
|
269
|
+
encodeFrame(opcode, payload) {
|
|
270
|
+
const len = payload.length;
|
|
271
|
+
let header;
|
|
272
|
+
if (len < 126) {
|
|
273
|
+
header = Buffer.alloc(2);
|
|
274
|
+
header[0] = 0x80 | opcode; // FIN + opcode
|
|
275
|
+
header[1] = len;
|
|
276
|
+
}
|
|
277
|
+
else if (len < 65536) {
|
|
278
|
+
header = Buffer.alloc(4);
|
|
279
|
+
header[0] = 0x80 | opcode;
|
|
280
|
+
header[1] = 126;
|
|
281
|
+
header.writeUInt16BE(len, 2);
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
header = Buffer.alloc(10);
|
|
285
|
+
header[0] = 0x80 | opcode;
|
|
286
|
+
header[1] = 127;
|
|
287
|
+
header.writeBigUInt64BE(BigInt(len), 2);
|
|
288
|
+
}
|
|
289
|
+
return Buffer.concat([header, payload]);
|
|
290
|
+
}
|
|
291
|
+
sendText(socket, text) {
|
|
292
|
+
const payload = Buffer.from(text, 'utf-8');
|
|
293
|
+
const frame = this.encodeFrame(OPCODE_TEXT, payload);
|
|
294
|
+
socket.write(frame);
|
|
295
|
+
}
|
|
296
|
+
sendPong(socket, payload) {
|
|
297
|
+
const frame = this.encodeFrame(OPCODE_PONG, payload);
|
|
298
|
+
socket.write(frame);
|
|
299
|
+
}
|
|
300
|
+
sendClose(socket, code, reason) {
|
|
301
|
+
const reasonBuf = Buffer.from(reason, 'utf-8');
|
|
302
|
+
const payload = Buffer.alloc(2 + reasonBuf.length);
|
|
303
|
+
payload.writeUInt16BE(code, 0);
|
|
304
|
+
reasonBuf.copy(payload, 2);
|
|
305
|
+
const frame = this.encodeFrame(OPCODE_CLOSE, payload);
|
|
306
|
+
socket.write(frame);
|
|
307
|
+
}
|
|
308
|
+
// ─── Heartbeat ─────────────────────────────────────────────────────
|
|
309
|
+
startHeartbeat() {
|
|
310
|
+
const interval = this.config.heartbeatInterval ?? DEFAULT_HEARTBEAT_MS;
|
|
311
|
+
if (interval <= 0)
|
|
312
|
+
return;
|
|
313
|
+
this.heartbeatTimer = setInterval(() => {
|
|
314
|
+
for (const [id, conn] of this.connections) {
|
|
315
|
+
if (!conn.alive) {
|
|
316
|
+
// No pong received since last ping — dead connection
|
|
317
|
+
this.sendClose(conn.socket, 1001, 'Heartbeat timeout');
|
|
318
|
+
conn.socket.destroy();
|
|
319
|
+
this.connections.delete(id);
|
|
320
|
+
this.sessions.remove(id);
|
|
321
|
+
this.callbacks.onClose(conn);
|
|
322
|
+
continue;
|
|
323
|
+
}
|
|
324
|
+
conn.alive = false;
|
|
325
|
+
const ping = this.encodeFrame(OPCODE_PING, Buffer.alloc(0));
|
|
326
|
+
conn.socket.write(ping);
|
|
327
|
+
}
|
|
328
|
+
}, interval);
|
|
329
|
+
if (this.heartbeatTimer &&
|
|
330
|
+
typeof this.heartbeatTimer === 'object' &&
|
|
331
|
+
'unref' in this.heartbeatTimer) {
|
|
332
|
+
this.heartbeatTimer.unref();
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
stopHeartbeat() {
|
|
336
|
+
if (this.heartbeatTimer) {
|
|
337
|
+
clearInterval(this.heartbeatTimer);
|
|
338
|
+
this.heartbeatTimer = undefined;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=ws-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws-server.js","sourceRoot":"","sources":["../../src/transport/ws-server.ts"],"names":[],"mappings":"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"}
|