@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,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output Compressor — compress verbose tool outputs for chat contexts.
|
|
3
|
+
*
|
|
4
|
+
* Unlike Salvador's 30+ domain-specific compressors, this provides:
|
|
5
|
+
* 1. A generic JSON compressor (extracts key fields, truncates arrays)
|
|
6
|
+
* 2. A registry for domain-specific compressors (pluggable)
|
|
7
|
+
*
|
|
8
|
+
* Domain packs can register their own compressors for their tools.
|
|
9
|
+
*/
|
|
10
|
+
const DEFAULT_MAX_LENGTH = 4000;
|
|
11
|
+
const DEFAULT_MAX_ARRAY_ITEMS = 5;
|
|
12
|
+
const DEFAULT_MAX_STRING_LENGTH = 500;
|
|
13
|
+
const compressorRegistry = new Map();
|
|
14
|
+
/**
|
|
15
|
+
* Register a compressor for a specific tool name (or prefix).
|
|
16
|
+
*/
|
|
17
|
+
export function registerCompressor(toolNameOrPrefix, compressor) {
|
|
18
|
+
compressorRegistry.set(toolNameOrPrefix, compressor);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Clear all registered compressors.
|
|
22
|
+
*/
|
|
23
|
+
export function clearCompressors() {
|
|
24
|
+
compressorRegistry.clear();
|
|
25
|
+
}
|
|
26
|
+
// ─── Generic Compressor ─────────────────────────────────────────────
|
|
27
|
+
/**
|
|
28
|
+
* Create a generic output compressor. Uses registered compressors for known tools,
|
|
29
|
+
* falls back to JSON-aware truncation.
|
|
30
|
+
*/
|
|
31
|
+
export function createOutputCompressor(options) {
|
|
32
|
+
const maxLength = options?.maxLength ?? DEFAULT_MAX_LENGTH;
|
|
33
|
+
const maxArrayItems = options?.maxArrayItems ?? DEFAULT_MAX_ARRAY_ITEMS;
|
|
34
|
+
const maxStringLength = options?.maxStringLength ?? DEFAULT_MAX_STRING_LENGTH;
|
|
35
|
+
return (toolName, output, overrideMax) => {
|
|
36
|
+
const limit = overrideMax ?? maxLength;
|
|
37
|
+
// Check registered compressors (exact match, then prefix match)
|
|
38
|
+
const exact = compressorRegistry.get(toolName);
|
|
39
|
+
if (exact)
|
|
40
|
+
return exact(output, limit);
|
|
41
|
+
for (const [prefix, compressor] of compressorRegistry) {
|
|
42
|
+
if (toolName.startsWith(prefix)) {
|
|
43
|
+
return compressor(output, limit);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Already short enough
|
|
47
|
+
if (output.length <= limit)
|
|
48
|
+
return output;
|
|
49
|
+
// Try JSON-aware compression
|
|
50
|
+
try {
|
|
51
|
+
const parsed = JSON.parse(output);
|
|
52
|
+
const compressed = compressValue(parsed, maxArrayItems, maxStringLength);
|
|
53
|
+
const result = JSON.stringify(compressed, null, 2);
|
|
54
|
+
if (result.length <= limit)
|
|
55
|
+
return result;
|
|
56
|
+
return result.slice(0, limit) + '\n... (compressed, truncated)';
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// Not JSON — plain text truncation
|
|
60
|
+
return output.slice(0, limit) + '\n... (truncated)';
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
// ─── JSON Compression ───────────────────────────────────────────────
|
|
65
|
+
function compressValue(value, maxArrayItems, maxStringLength) {
|
|
66
|
+
if (value === null || value === undefined)
|
|
67
|
+
return value;
|
|
68
|
+
if (typeof value === 'string') {
|
|
69
|
+
if (value.length > maxStringLength) {
|
|
70
|
+
return value.slice(0, maxStringLength) + `... (+${value.length - maxStringLength} chars)`;
|
|
71
|
+
}
|
|
72
|
+
return value;
|
|
73
|
+
}
|
|
74
|
+
if (typeof value === 'number' || typeof value === 'boolean')
|
|
75
|
+
return value;
|
|
76
|
+
if (Array.isArray(value)) {
|
|
77
|
+
const truncated = value
|
|
78
|
+
.slice(0, maxArrayItems)
|
|
79
|
+
.map((item) => compressValue(item, maxArrayItems, maxStringLength));
|
|
80
|
+
if (value.length > maxArrayItems) {
|
|
81
|
+
truncated.push(`... +${value.length - maxArrayItems} more`);
|
|
82
|
+
}
|
|
83
|
+
return truncated;
|
|
84
|
+
}
|
|
85
|
+
if (typeof value === 'object') {
|
|
86
|
+
const obj = value;
|
|
87
|
+
const result = {};
|
|
88
|
+
for (const [key, val] of Object.entries(obj)) {
|
|
89
|
+
result[key] = compressValue(val, maxArrayItems, maxStringLength);
|
|
90
|
+
}
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
return value;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=output-compressor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-compressor.js","sourceRoot":"","sources":["../../src/chat/output-compressor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message Queue — disk-based message passing for zero-cost chat relay.
|
|
3
|
+
*
|
|
4
|
+
* The queue bot writes incoming messages to inbox/. Claude Code (or any
|
|
5
|
+
* processor) reads them, generates responses, and writes to outbox/.
|
|
6
|
+
* The outbox poller sends replies back through the chat transport.
|
|
7
|
+
*
|
|
8
|
+
* Directory structure:
|
|
9
|
+
* ~/.{agentId}/queue/
|
|
10
|
+
* inbox/ ← bot writes, processor reads
|
|
11
|
+
* outbox/ ← processor writes, bot reads and sends
|
|
12
|
+
*/
|
|
13
|
+
export interface QueuedMessage {
|
|
14
|
+
/** Unique message ID: `{chatId}-{timestamp}`. */
|
|
15
|
+
id: string;
|
|
16
|
+
/** Chat/channel ID. */
|
|
17
|
+
chatId: string;
|
|
18
|
+
/** Sender user ID. */
|
|
19
|
+
userId: string;
|
|
20
|
+
/** Sender username (if available). */
|
|
21
|
+
username?: string;
|
|
22
|
+
/** Message type. */
|
|
23
|
+
type: 'text' | 'voice' | 'photo';
|
|
24
|
+
/** Text content (for text messages or transcribed voice). */
|
|
25
|
+
text?: string;
|
|
26
|
+
/** Voice metadata. */
|
|
27
|
+
voice?: {
|
|
28
|
+
fileId: string;
|
|
29
|
+
duration: number;
|
|
30
|
+
};
|
|
31
|
+
/** Photo metadata. */
|
|
32
|
+
photo?: {
|
|
33
|
+
fileId: string;
|
|
34
|
+
caption?: string;
|
|
35
|
+
};
|
|
36
|
+
/** ISO timestamp. */
|
|
37
|
+
timestamp: string;
|
|
38
|
+
}
|
|
39
|
+
export interface QueuedResponse {
|
|
40
|
+
/** Original message ID this responds to. */
|
|
41
|
+
messageId: string;
|
|
42
|
+
/** Target chat ID. */
|
|
43
|
+
chatId: string;
|
|
44
|
+
/** Response text. */
|
|
45
|
+
text: string;
|
|
46
|
+
/** ISO timestamp. */
|
|
47
|
+
timestamp: string;
|
|
48
|
+
}
|
|
49
|
+
export interface QueueConfig {
|
|
50
|
+
/** Base directory for queue (e.g., ~/.{agentId}/queue). */
|
|
51
|
+
queueDir: string;
|
|
52
|
+
}
|
|
53
|
+
export declare class MessageQueue {
|
|
54
|
+
private readonly inboxDir;
|
|
55
|
+
private readonly outboxDir;
|
|
56
|
+
constructor(config: QueueConfig);
|
|
57
|
+
/**
|
|
58
|
+
* Enqueue an incoming message to inbox.
|
|
59
|
+
*/
|
|
60
|
+
enqueue(msg: Omit<QueuedMessage, 'id' | 'timestamp'>): QueuedMessage;
|
|
61
|
+
/**
|
|
62
|
+
* Read all pending inbox messages, sorted by timestamp.
|
|
63
|
+
*/
|
|
64
|
+
readInbox(): QueuedMessage[];
|
|
65
|
+
/**
|
|
66
|
+
* Get the number of pending inbox messages.
|
|
67
|
+
*/
|
|
68
|
+
inboxCount(): number;
|
|
69
|
+
/**
|
|
70
|
+
* Remove a message from inbox (after processing).
|
|
71
|
+
*/
|
|
72
|
+
removeFromInbox(messageId: string): boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Write a response to outbox.
|
|
75
|
+
*/
|
|
76
|
+
sendResponse(messageId: string, chatId: string, text: string): QueuedResponse;
|
|
77
|
+
/**
|
|
78
|
+
* Read and remove all pending outbox responses.
|
|
79
|
+
*/
|
|
80
|
+
drainOutbox(): QueuedResponse[];
|
|
81
|
+
/**
|
|
82
|
+
* Get outbox count.
|
|
83
|
+
*/
|
|
84
|
+
outboxCount(): number;
|
|
85
|
+
/**
|
|
86
|
+
* Format inbox as readable text (for MCP tool output).
|
|
87
|
+
*/
|
|
88
|
+
formatInbox(): string;
|
|
89
|
+
private listJsonFiles;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/chat/queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAcH,MAAM,WAAW,aAAa;IAC5B,iDAAiD;IACjD,EAAE,EAAE,MAAM,CAAC;IACX,uBAAuB;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oBAAoB;IACpB,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IACjC,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,KAAK,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,sBAAsB;IACtB,KAAK,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,qBAAqB;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,MAAM,EAAE,WAAW;IAO/B;;OAEG;IACH,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,aAAa;IASpE;;OAEG;IACH,SAAS,IAAI,aAAa,EAAE;IAkB5B;;OAEG;IACH,UAAU,IAAI,MAAM;IAIpB;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAY3C;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc;IAc7E;;OAEG;IACH,WAAW,IAAI,cAAc,EAAE;IAoB/B;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACH,WAAW,IAAI,MAAM;IAkBrB,OAAO,CAAC,aAAa;CAStB"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message Queue — disk-based message passing for zero-cost chat relay.
|
|
3
|
+
*
|
|
4
|
+
* The queue bot writes incoming messages to inbox/. Claude Code (or any
|
|
5
|
+
* processor) reads them, generates responses, and writes to outbox/.
|
|
6
|
+
* The outbox poller sends replies back through the chat transport.
|
|
7
|
+
*
|
|
8
|
+
* Directory structure:
|
|
9
|
+
* ~/.{agentId}/queue/
|
|
10
|
+
* inbox/ ← bot writes, processor reads
|
|
11
|
+
* outbox/ ← processor writes, bot reads and sends
|
|
12
|
+
*/
|
|
13
|
+
import { mkdirSync, writeFileSync, readFileSync, readdirSync, unlinkSync, existsSync, } from 'node:fs';
|
|
14
|
+
import { join } from 'node:path';
|
|
15
|
+
// ─── Queue Manager ───────────────────────────────────────────────────
|
|
16
|
+
export class MessageQueue {
|
|
17
|
+
inboxDir;
|
|
18
|
+
outboxDir;
|
|
19
|
+
constructor(config) {
|
|
20
|
+
this.inboxDir = join(config.queueDir, 'inbox');
|
|
21
|
+
this.outboxDir = join(config.queueDir, 'outbox');
|
|
22
|
+
mkdirSync(this.inboxDir, { recursive: true });
|
|
23
|
+
mkdirSync(this.outboxDir, { recursive: true });
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Enqueue an incoming message to inbox.
|
|
27
|
+
*/
|
|
28
|
+
enqueue(msg) {
|
|
29
|
+
const timestamp = new Date().toISOString();
|
|
30
|
+
const id = `${msg.chatId}-${Date.now()}`;
|
|
31
|
+
const queued = { ...msg, id, timestamp };
|
|
32
|
+
const filename = `${id}.json`;
|
|
33
|
+
writeFileSync(join(this.inboxDir, filename), JSON.stringify(queued, null, 2), 'utf-8');
|
|
34
|
+
return queued;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Read all pending inbox messages, sorted by timestamp.
|
|
38
|
+
*/
|
|
39
|
+
readInbox() {
|
|
40
|
+
const files = this.listJsonFiles(this.inboxDir);
|
|
41
|
+
const messages = [];
|
|
42
|
+
for (const file of files) {
|
|
43
|
+
try {
|
|
44
|
+
const raw = readFileSync(join(this.inboxDir, file), 'utf-8');
|
|
45
|
+
messages.push(JSON.parse(raw));
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Skip corrupt files
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return messages.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get the number of pending inbox messages.
|
|
55
|
+
*/
|
|
56
|
+
inboxCount() {
|
|
57
|
+
return this.listJsonFiles(this.inboxDir).length;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Remove a message from inbox (after processing).
|
|
61
|
+
*/
|
|
62
|
+
removeFromInbox(messageId) {
|
|
63
|
+
const filename = `${messageId}.json`;
|
|
64
|
+
const filepath = join(this.inboxDir, filename);
|
|
65
|
+
if (!existsSync(filepath))
|
|
66
|
+
return false;
|
|
67
|
+
try {
|
|
68
|
+
unlinkSync(filepath);
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Write a response to outbox.
|
|
77
|
+
*/
|
|
78
|
+
sendResponse(messageId, chatId, text) {
|
|
79
|
+
const response = {
|
|
80
|
+
messageId,
|
|
81
|
+
chatId,
|
|
82
|
+
text,
|
|
83
|
+
timestamp: new Date().toISOString(),
|
|
84
|
+
};
|
|
85
|
+
const filename = `${chatId}-${Date.now()}.json`;
|
|
86
|
+
writeFileSync(join(this.outboxDir, filename), JSON.stringify(response, null, 2), 'utf-8');
|
|
87
|
+
// Remove from inbox
|
|
88
|
+
this.removeFromInbox(messageId);
|
|
89
|
+
return response;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Read and remove all pending outbox responses.
|
|
93
|
+
*/
|
|
94
|
+
drainOutbox() {
|
|
95
|
+
const files = this.listJsonFiles(this.outboxDir);
|
|
96
|
+
const responses = [];
|
|
97
|
+
for (const file of files) {
|
|
98
|
+
const filepath = join(this.outboxDir, file);
|
|
99
|
+
try {
|
|
100
|
+
const raw = readFileSync(filepath, 'utf-8');
|
|
101
|
+
responses.push(JSON.parse(raw));
|
|
102
|
+
unlinkSync(filepath);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// Skip corrupt files
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return responses.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Get outbox count.
|
|
112
|
+
*/
|
|
113
|
+
outboxCount() {
|
|
114
|
+
return this.listJsonFiles(this.outboxDir).length;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Format inbox as readable text (for MCP tool output).
|
|
118
|
+
*/
|
|
119
|
+
formatInbox() {
|
|
120
|
+
const messages = this.readInbox();
|
|
121
|
+
if (messages.length === 0)
|
|
122
|
+
return 'No pending messages.';
|
|
123
|
+
return messages
|
|
124
|
+
.map((m) => {
|
|
125
|
+
const age = Math.round((Date.now() - new Date(m.timestamp).getTime()) / 1000);
|
|
126
|
+
const content = m.type === 'text'
|
|
127
|
+
? m.text
|
|
128
|
+
: m.type === 'voice'
|
|
129
|
+
? `[Voice: ${m.voice?.duration}s]`
|
|
130
|
+
: `[Photo: ${m.photo?.caption ?? 'no caption'}]`;
|
|
131
|
+
return `[${m.id}] ${m.username ?? m.userId} (${age}s ago): ${content}`;
|
|
132
|
+
})
|
|
133
|
+
.join('\n');
|
|
134
|
+
}
|
|
135
|
+
listJsonFiles(dir) {
|
|
136
|
+
try {
|
|
137
|
+
return readdirSync(dir)
|
|
138
|
+
.filter((f) => f.endsWith('.json'))
|
|
139
|
+
.sort();
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return [];
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/chat/queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Response Chunker — splits long agent responses for chat platforms.
|
|
3
|
+
*
|
|
4
|
+
* Two capabilities:
|
|
5
|
+
* 1. Markdown → HTML conversion (for Telegram-style HTML parse mode)
|
|
6
|
+
* 2. Smart chunking at natural boundaries (paragraphs, sentences, words)
|
|
7
|
+
*
|
|
8
|
+
* Ported from Salvador's response-chunker.ts with improvements:
|
|
9
|
+
* - Cleaner code block protection (no sentinel characters)
|
|
10
|
+
* - Supports multiple output formats (HTML, Markdown passthrough, plain)
|
|
11
|
+
* - Better heading handling
|
|
12
|
+
*/
|
|
13
|
+
import type { ChunkConfig, MarkupFormat } from './types.js';
|
|
14
|
+
/**
|
|
15
|
+
* Convert Markdown to the target format and split into chunks.
|
|
16
|
+
*/
|
|
17
|
+
export declare function chunkResponse(text: string, config?: ChunkConfig): string[];
|
|
18
|
+
/**
|
|
19
|
+
* Convert Markdown to the target markup format.
|
|
20
|
+
*/
|
|
21
|
+
export declare function convertMarkup(text: string, format: MarkupFormat): string;
|
|
22
|
+
/**
|
|
23
|
+
* Convert Markdown to Telegram-compatible HTML.
|
|
24
|
+
*
|
|
25
|
+
* Handles: headings, bold, italic, strikethrough, code, links,
|
|
26
|
+
* blockquotes, lists, and fenced code blocks.
|
|
27
|
+
*/
|
|
28
|
+
export declare function markdownToHtml(text: string): string;
|
|
29
|
+
//# sourceMappingURL=response-chunker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-chunker.d.ts","sourceRoot":"","sources":["../../src/chat/response-chunker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAM5D;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,MAAM,EAAE,CAS1E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAUxE;AAID;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA6CnD"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Response Chunker — splits long agent responses for chat platforms.
|
|
3
|
+
*
|
|
4
|
+
* Two capabilities:
|
|
5
|
+
* 1. Markdown → HTML conversion (for Telegram-style HTML parse mode)
|
|
6
|
+
* 2. Smart chunking at natural boundaries (paragraphs, sentences, words)
|
|
7
|
+
*
|
|
8
|
+
* Ported from Salvador's response-chunker.ts with improvements:
|
|
9
|
+
* - Cleaner code block protection (no sentinel characters)
|
|
10
|
+
* - Supports multiple output formats (HTML, Markdown passthrough, plain)
|
|
11
|
+
* - Better heading handling
|
|
12
|
+
*/
|
|
13
|
+
const DEFAULT_MAX_CHUNK_SIZE = 4000;
|
|
14
|
+
// ─── Public API ──────────────────────────────────────────────────────
|
|
15
|
+
/**
|
|
16
|
+
* Convert Markdown to the target format and split into chunks.
|
|
17
|
+
*/
|
|
18
|
+
export function chunkResponse(text, config) {
|
|
19
|
+
const maxSize = config?.maxChunkSize ?? DEFAULT_MAX_CHUNK_SIZE;
|
|
20
|
+
const format = config?.format ?? 'html';
|
|
21
|
+
const converted = convertMarkup(text, format);
|
|
22
|
+
if (converted.length <= maxSize)
|
|
23
|
+
return [converted];
|
|
24
|
+
return splitAtBoundaries(converted, maxSize);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Convert Markdown to the target markup format.
|
|
28
|
+
*/
|
|
29
|
+
export function convertMarkup(text, format) {
|
|
30
|
+
switch (format) {
|
|
31
|
+
case 'html':
|
|
32
|
+
return markdownToHtml(text);
|
|
33
|
+
case 'plain':
|
|
34
|
+
return markdownToPlain(text);
|
|
35
|
+
case 'markdown':
|
|
36
|
+
default:
|
|
37
|
+
return text;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// ─── Markdown → HTML ────────────────────────────────────────────────
|
|
41
|
+
/**
|
|
42
|
+
* Convert Markdown to Telegram-compatible HTML.
|
|
43
|
+
*
|
|
44
|
+
* Handles: headings, bold, italic, strikethrough, code, links,
|
|
45
|
+
* blockquotes, lists, and fenced code blocks.
|
|
46
|
+
*/
|
|
47
|
+
export function markdownToHtml(text) {
|
|
48
|
+
// Protect fenced code blocks first
|
|
49
|
+
const codeBlocks = [];
|
|
50
|
+
let processed = text.replace(/```(\w*)\n([\s\S]*?)```/g, (_match, lang, code) => {
|
|
51
|
+
const escaped = escapeHtml(code.trimEnd());
|
|
52
|
+
const langAttr = lang ? ` class="language-${escapeHtml(lang)}"` : '';
|
|
53
|
+
codeBlocks.push(`<pre><code${langAttr}>${escaped}</code></pre>`);
|
|
54
|
+
return `<<CODEBLOCK_${codeBlocks.length - 1}>>`;
|
|
55
|
+
});
|
|
56
|
+
// Inline code
|
|
57
|
+
processed = processed.replace(/`([^`]+)`/g, (_m, code) => `<code>${escapeHtml(code)}</code>`);
|
|
58
|
+
// Headings → bold
|
|
59
|
+
processed = processed.replace(/^#{1,6}\s+(.+)$/gm, '<b>$1</b>');
|
|
60
|
+
// Bold + italic
|
|
61
|
+
processed = processed.replace(/\*\*\*(.+?)\*\*\*/g, '<b><i>$1</i></b>');
|
|
62
|
+
// Bold
|
|
63
|
+
processed = processed.replace(/\*\*(.+?)\*\*/g, '<b>$1</b>');
|
|
64
|
+
// Italic
|
|
65
|
+
processed = processed.replace(/(?<!\*)\*([^*]+?)\*(?!\*)/g, '<i>$1</i>');
|
|
66
|
+
// Strikethrough
|
|
67
|
+
processed = processed.replace(/~~(.+?)~~/g, '<s>$1</s>');
|
|
68
|
+
// Links
|
|
69
|
+
processed = processed.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2">$1</a>');
|
|
70
|
+
// Blockquotes
|
|
71
|
+
processed = processed.replace(/^>\s?(.*)$/gm, '<blockquote>$1</blockquote>');
|
|
72
|
+
// Merge consecutive blockquotes
|
|
73
|
+
processed = processed.replace(/<\/blockquote>\n<blockquote>/g, '\n');
|
|
74
|
+
// Unordered lists
|
|
75
|
+
processed = processed.replace(/^[-*]\s+(.+)$/gm, '• $1');
|
|
76
|
+
// Ordered lists
|
|
77
|
+
processed = processed.replace(/^\d+\.\s+(.+)$/gm, '• $1');
|
|
78
|
+
// Horizontal rules
|
|
79
|
+
processed = processed.replace(/^---+$/gm, '─'.repeat(20));
|
|
80
|
+
// Restore code blocks
|
|
81
|
+
processed = processed.replace(/<<CODEBLOCK_(\d+)>>/g, (_m, i) => codeBlocks[Number(i)]);
|
|
82
|
+
return processed.trim();
|
|
83
|
+
}
|
|
84
|
+
// ─── Markdown → Plain ───────────────────────────────────────────────
|
|
85
|
+
function markdownToPlain(text) {
|
|
86
|
+
let plain = text;
|
|
87
|
+
// Remove fenced code block markers (keep content)
|
|
88
|
+
plain = plain.replace(/```\w*\n?/g, '');
|
|
89
|
+
// Remove inline formatting
|
|
90
|
+
plain = plain.replace(/\*\*\*(.+?)\*\*\*/g, '$1');
|
|
91
|
+
plain = plain.replace(/\*\*(.+?)\*\*/g, '$1');
|
|
92
|
+
plain = plain.replace(/(?<!\*)\*([^*]+?)\*(?!\*)/g, '$1');
|
|
93
|
+
plain = plain.replace(/~~(.+?)~~/g, '$1');
|
|
94
|
+
plain = plain.replace(/`([^`]+)`/g, '$1');
|
|
95
|
+
// Headings → plain text
|
|
96
|
+
plain = plain.replace(/^#{1,6}\s+/gm, '');
|
|
97
|
+
// Links → text (URL)
|
|
98
|
+
plain = plain.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '$1 ($2)');
|
|
99
|
+
// Blockquotes
|
|
100
|
+
plain = plain.replace(/^>\s?/gm, '');
|
|
101
|
+
// Lists
|
|
102
|
+
plain = plain.replace(/^[-*]\s+/gm, '• ');
|
|
103
|
+
return plain.trim();
|
|
104
|
+
}
|
|
105
|
+
// ─── Chunking ───────────────────────────────────────────────────────
|
|
106
|
+
function splitAtBoundaries(text, maxSize) {
|
|
107
|
+
const chunks = [];
|
|
108
|
+
let remaining = text;
|
|
109
|
+
while (remaining.length > maxSize) {
|
|
110
|
+
const cutPoint = findCutPoint(remaining, maxSize);
|
|
111
|
+
chunks.push(remaining.slice(0, cutPoint).trimEnd());
|
|
112
|
+
remaining = remaining.slice(cutPoint).trimStart();
|
|
113
|
+
}
|
|
114
|
+
if (remaining.length > 0) {
|
|
115
|
+
chunks.push(remaining.trimEnd());
|
|
116
|
+
}
|
|
117
|
+
return chunks;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Find the best cut point, prioritizing natural boundaries:
|
|
121
|
+
* 1. Paragraph break (double newline)
|
|
122
|
+
* 2. Line break
|
|
123
|
+
* 3. Sentence boundary (. ! ?)
|
|
124
|
+
* 4. Word boundary (space)
|
|
125
|
+
* 5. Hard cut at maxSize
|
|
126
|
+
*/
|
|
127
|
+
function findCutPoint(text, maxSize) {
|
|
128
|
+
const window = text.slice(0, maxSize);
|
|
129
|
+
// Try paragraph break (must be at least 30% into the chunk to be useful)
|
|
130
|
+
const minUseful = Math.floor(maxSize * 0.3);
|
|
131
|
+
const paragraphBreak = window.lastIndexOf('\n\n');
|
|
132
|
+
if (paragraphBreak >= minUseful)
|
|
133
|
+
return paragraphBreak + 2;
|
|
134
|
+
// Try line break
|
|
135
|
+
const lineBreak = window.lastIndexOf('\n');
|
|
136
|
+
if (lineBreak >= minUseful)
|
|
137
|
+
return lineBreak + 1;
|
|
138
|
+
// Try sentence boundary
|
|
139
|
+
const sentenceEnd = findLastSentenceEnd(window, minUseful);
|
|
140
|
+
if (sentenceEnd > 0)
|
|
141
|
+
return sentenceEnd;
|
|
142
|
+
// Try word boundary
|
|
143
|
+
const spaceBreak = window.lastIndexOf(' ');
|
|
144
|
+
if (spaceBreak >= minUseful)
|
|
145
|
+
return spaceBreak + 1;
|
|
146
|
+
// Hard cut
|
|
147
|
+
return maxSize;
|
|
148
|
+
}
|
|
149
|
+
function findLastSentenceEnd(text, minPos) {
|
|
150
|
+
// Look for ". " or "! " or "? " from the end
|
|
151
|
+
for (let i = text.length - 1; i >= minPos; i--) {
|
|
152
|
+
const ch = text[i];
|
|
153
|
+
if ((ch === '.' || ch === '!' || ch === '?') && i + 1 < text.length && text[i + 1] === ' ') {
|
|
154
|
+
return i + 2;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return -1;
|
|
158
|
+
}
|
|
159
|
+
// ─── Helpers ────────────────────────────────────────────────────────
|
|
160
|
+
function escapeHtml(text) {
|
|
161
|
+
return text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=response-chunker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-chunker.js","sourceRoot":"","sources":["../../src/chat/response-chunker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Self-Update Manager — restart context persistence for chat-driven updates.
|
|
3
|
+
*
|
|
4
|
+
* Manages the restart lifecycle: save context before exit, load on startup,
|
|
5
|
+
* confirm success or trigger rollback. The actual process exit and rebuild
|
|
6
|
+
* are handled by the supervisor — this module only manages the context.
|
|
7
|
+
*
|
|
8
|
+
* Exit code 75 signals the supervisor to rebuild before restarting.
|
|
9
|
+
*/
|
|
10
|
+
/** Exit code that tells the supervisor to rebuild before restart. */
|
|
11
|
+
export declare const RESTART_EXIT_CODE = 75;
|
|
12
|
+
export interface RestartContext {
|
|
13
|
+
/** Why the restart was requested. */
|
|
14
|
+
reason: 'self-update' | 'rebuild' | 'manual';
|
|
15
|
+
/** Chat ID to send confirmation to after restart. */
|
|
16
|
+
chatId: string;
|
|
17
|
+
/** Git commit SHA that triggered the update (if applicable). */
|
|
18
|
+
commitSha?: string;
|
|
19
|
+
/** Unix timestamp ms when restart was requested. */
|
|
20
|
+
requestedAt: number;
|
|
21
|
+
}
|
|
22
|
+
export interface RestartResult {
|
|
23
|
+
/** Whether the restart was initiated. */
|
|
24
|
+
initiated: boolean;
|
|
25
|
+
/** The saved context. */
|
|
26
|
+
context?: RestartContext;
|
|
27
|
+
/** Error message if failed. */
|
|
28
|
+
error?: string;
|
|
29
|
+
}
|
|
30
|
+
export declare class SelfUpdateManager {
|
|
31
|
+
private readonly contextPath;
|
|
32
|
+
constructor(contextPath: string);
|
|
33
|
+
/**
|
|
34
|
+
* Save restart context and exit with code 75.
|
|
35
|
+
* The supervisor handles rebuild + restart.
|
|
36
|
+
* Returns the context (useful for testing — in production, process.exit fires).
|
|
37
|
+
*/
|
|
38
|
+
requestRestart(chatId: string, reason?: RestartContext['reason'], commitSha?: string): RestartResult;
|
|
39
|
+
/**
|
|
40
|
+
* Save restart context to disk.
|
|
41
|
+
*/
|
|
42
|
+
saveContext(context: RestartContext): void;
|
|
43
|
+
/**
|
|
44
|
+
* Load restart context from disk (if any).
|
|
45
|
+
* Returns null if no pending restart context exists.
|
|
46
|
+
*/
|
|
47
|
+
loadContext(): RestartContext | null;
|
|
48
|
+
/**
|
|
49
|
+
* Clear restart context (call after successful startup confirmation).
|
|
50
|
+
*/
|
|
51
|
+
clearContext(): void;
|
|
52
|
+
/**
|
|
53
|
+
* Check if there's a pending restart context.
|
|
54
|
+
*/
|
|
55
|
+
hasPendingRestart(): boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Sanitize a commit message for safe shell usage.
|
|
58
|
+
* Allows alphanumeric, spaces, basic punctuation. Max 120 chars.
|
|
59
|
+
*/
|
|
60
|
+
static sanitizeCommitMessage(msg: string): string;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=self-update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"self-update.d.ts","sourceRoot":"","sources":["../../src/chat/self-update.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,qEAAqE;AACrE,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,MAAM,EAAE,aAAa,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC7C,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,yCAAyC;IACzC,SAAS,EAAE,OAAO,CAAC;IACnB,yBAAyB;IACzB,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAAX,WAAW,EAAE,MAAM;IAEhD;;;;OAIG;IACH,cAAc,CACZ,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,cAAc,CAAC,QAAQ,CAAY,EAC3C,SAAS,CAAC,EAAE,MAAM,GACjB,aAAa;IAmBhB;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAK1C;;;OAGG;IACH,WAAW,IAAI,cAAc,GAAG,IAAI;IASpC;;OAEG;IACH,YAAY,IAAI,IAAI;IAQpB;;OAEG;IACH,iBAAiB,IAAI,OAAO;IAI5B;;;OAGG;IACH,MAAM,CAAC,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAMlD"}
|