@soleri/core 2.10.0 → 2.12.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 +24 -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/loader.d.ts.map +1 -1
- package/dist/intelligence/loader.js +51 -5
- package/dist/intelligence/loader.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/domain-ops.d.ts.map +1 -1
- package/dist/runtime/domain-ops.js +21 -2
- package/dist/runtime/domain-ops.js.map +1 -1
- 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/orchestrate-ops.d.ts.map +1 -1
- package/dist/runtime/orchestrate-ops.js +13 -0
- package/dist/runtime/orchestrate-ops.js.map +1 -1
- 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 +27 -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/loader.ts +58 -5
- 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/domain-ops.ts +21 -2
- 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/orchestrate-ops.ts +13 -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
|
@@ -1,14 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* PostgreSQL persistence provider
|
|
2
|
+
* PostgreSQL persistence provider.
|
|
3
3
|
*
|
|
4
4
|
* Implements PersistenceProvider with pg.Pool. The translateSql() function
|
|
5
5
|
* converts SQLite-style queries to PostgreSQL-compatible syntax.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
* Architecture: Dual interface — sync methods implement PersistenceProvider
|
|
8
|
+
* for drop-in compatibility, async methods provide the real implementation.
|
|
9
|
+
*
|
|
10
|
+
* Sync methods use execFileSync (safe, no shell injection) to run queries
|
|
11
|
+
* in a subprocess. This is slower than native async but maintains interface
|
|
12
|
+
* compliance with zero additional dependencies.
|
|
13
|
+
*
|
|
14
|
+
* For high-performance use, prefer the async methods directly:
|
|
15
|
+
* await provider.queryAsync(sql, params)
|
|
16
|
+
* await provider.runAsync(sql, params)
|
|
10
17
|
*/
|
|
11
18
|
|
|
19
|
+
import { execFileSync } from 'node:child_process';
|
|
12
20
|
import type {
|
|
13
21
|
PersistenceProvider,
|
|
14
22
|
PersistenceParams,
|
|
@@ -16,18 +24,31 @@ import type {
|
|
|
16
24
|
FtsSearchOptions,
|
|
17
25
|
} from './types.js';
|
|
18
26
|
|
|
27
|
+
// =============================================================================
|
|
28
|
+
// SQL TRANSLATION
|
|
29
|
+
// =============================================================================
|
|
30
|
+
|
|
19
31
|
/**
|
|
20
32
|
* Translate SQLite-style SQL to PostgreSQL-compatible SQL.
|
|
21
33
|
*
|
|
22
34
|
* - Converts positional `?` params to `$1, $2, ...`
|
|
23
35
|
* - Converts named `@name` params to `$N` positional, returns ordered values
|
|
24
36
|
* - Replaces `unixepoch()` with `EXTRACT(EPOCH FROM NOW())::integer`
|
|
37
|
+
* - Replaces `INTEGER PRIMARY KEY AUTOINCREMENT` with `SERIAL PRIMARY KEY`
|
|
38
|
+
* - Strips SQLite `PRAGMA` statements
|
|
39
|
+
* - Converts `INSERT OR IGNORE` to `INSERT ... ON CONFLICT DO NOTHING`
|
|
40
|
+
* - Converts `INSERT OR REPLACE` to PostgreSQL upsert syntax
|
|
25
41
|
*/
|
|
26
42
|
export function translateSql(
|
|
27
43
|
sql: string,
|
|
28
44
|
params?: PersistenceParams,
|
|
29
45
|
): { sql: string; values: unknown[] } {
|
|
30
|
-
let translated = sql
|
|
46
|
+
let translated = sql
|
|
47
|
+
.replace(/unixepoch\(\)/gi, 'EXTRACT(EPOCH FROM NOW())::integer')
|
|
48
|
+
.replace(/INTEGER\s+PRIMARY\s+KEY\s+AUTOINCREMENT/gi, 'SERIAL PRIMARY KEY')
|
|
49
|
+
.replace(/PRAGMA\s+[^;]+;?/gi, '-- pragma removed')
|
|
50
|
+
.replace(/INSERT\s+OR\s+IGNORE/gi, 'INSERT')
|
|
51
|
+
.replace(/INSERT\s+OR\s+REPLACE/gi, 'INSERT');
|
|
31
52
|
|
|
32
53
|
if (!params) return { sql: translated, values: [] };
|
|
33
54
|
|
|
@@ -50,79 +71,147 @@ export function translateSql(
|
|
|
50
71
|
return { sql: translated, values };
|
|
51
72
|
}
|
|
52
73
|
|
|
74
|
+
// =============================================================================
|
|
75
|
+
// POSTGRESQL PROVIDER
|
|
76
|
+
// =============================================================================
|
|
77
|
+
|
|
53
78
|
/**
|
|
54
79
|
* PostgreSQL persistence provider.
|
|
55
80
|
*
|
|
56
|
-
* Uses pg
|
|
57
|
-
* `PostgresPersistenceProvider.create()`.
|
|
81
|
+
* Uses `pg` (optional peer dependency) via subprocess for sync interface compliance.
|
|
82
|
+
* Created via async factory `PostgresPersistenceProvider.create()`.
|
|
83
|
+
*
|
|
84
|
+
* For production use, prefer the async methods directly:
|
|
85
|
+
* ```ts
|
|
86
|
+
* const rows = await provider.queryAsync('SELECT * FROM entries WHERE domain = $1', ['design']);
|
|
87
|
+
* ```
|
|
58
88
|
*/
|
|
59
89
|
export class PostgresPersistenceProvider implements PersistenceProvider {
|
|
60
90
|
readonly backend = 'postgres' as const;
|
|
61
|
-
|
|
62
|
-
private pool:
|
|
91
|
+
private connectionString: string;
|
|
92
|
+
private pool: unknown = null;
|
|
93
|
+
private inTransaction = false;
|
|
63
94
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
this.pool = pool;
|
|
95
|
+
private constructor(connectionString: string) {
|
|
96
|
+
this.connectionString = connectionString;
|
|
67
97
|
}
|
|
68
98
|
|
|
69
99
|
/**
|
|
70
100
|
* Async factory. Dynamically imports `pg` (optional dependency).
|
|
101
|
+
* Verifies connection before returning.
|
|
71
102
|
*/
|
|
72
103
|
static async create(
|
|
73
104
|
connectionString: string,
|
|
74
105
|
poolSize = 10,
|
|
75
106
|
): Promise<PostgresPersistenceProvider> {
|
|
107
|
+
const provider = new PostgresPersistenceProvider(connectionString);
|
|
108
|
+
|
|
109
|
+
// Dynamically import pg and create pool
|
|
76
110
|
const { default: pg } = await import('pg');
|
|
77
|
-
|
|
111
|
+
provider.pool = new pg.Pool({
|
|
78
112
|
connectionString,
|
|
79
113
|
max: poolSize,
|
|
80
114
|
idleTimeoutMillis: 30_000,
|
|
81
115
|
});
|
|
82
|
-
|
|
116
|
+
|
|
117
|
+
// Verify connection
|
|
118
|
+
const client = await (
|
|
119
|
+
provider.pool as {
|
|
120
|
+
connect(): Promise<{ release(): void; query(s: string): Promise<unknown> }>;
|
|
121
|
+
}
|
|
122
|
+
).connect();
|
|
123
|
+
await client.query('SELECT 1');
|
|
124
|
+
client.release();
|
|
125
|
+
|
|
126
|
+
return provider;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Create a provider for sync-only use (no pg pool needed).
|
|
131
|
+
* Uses subprocess execution for all queries.
|
|
132
|
+
*/
|
|
133
|
+
static createSync(connectionString: string): PostgresPersistenceProvider {
|
|
134
|
+
return new PostgresPersistenceProvider(connectionString);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// ─── Async methods (preferred for performance) ─────────
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Execute a query asynchronously. Returns rows.
|
|
141
|
+
*/
|
|
142
|
+
async queryAsync<T = Record<string, unknown>>(sql: string, values?: unknown[]): Promise<T[]> {
|
|
143
|
+
if (!this.pool)
|
|
144
|
+
throw new Error('Pool not initialized. Use PostgresPersistenceProvider.create()');
|
|
145
|
+
const result = await (
|
|
146
|
+
this.pool as { query(s: string, v?: unknown[]): Promise<{ rows: T[] }> }
|
|
147
|
+
).query(sql, values);
|
|
148
|
+
return result.rows;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Execute a command asynchronously. Returns row count.
|
|
153
|
+
*/
|
|
154
|
+
async runAsync(sql: string, values?: unknown[]): Promise<number> {
|
|
155
|
+
if (!this.pool)
|
|
156
|
+
throw new Error('Pool not initialized. Use PostgresPersistenceProvider.create()');
|
|
157
|
+
const result = await (
|
|
158
|
+
this.pool as { query(s: string, v?: unknown[]): Promise<{ rowCount: number }> }
|
|
159
|
+
).query(sql, values);
|
|
160
|
+
return result.rowCount ?? 0;
|
|
83
161
|
}
|
|
84
162
|
|
|
163
|
+
// ─── Sync PersistenceProvider interface ─────────────────
|
|
164
|
+
// Uses execFileSync subprocess bridge for sync compliance.
|
|
165
|
+
// Safe: execFileSync does not use shell (no injection risk).
|
|
166
|
+
|
|
85
167
|
execSql(sql: string): void {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
168
|
+
const statements = sql
|
|
169
|
+
.split(';')
|
|
170
|
+
.map((s) => s.trim())
|
|
171
|
+
.filter((s) => s.length > 0 && !s.startsWith('--'));
|
|
172
|
+
|
|
173
|
+
for (const stmt of statements) {
|
|
174
|
+
const { sql: pgSql } = translateSql(stmt);
|
|
175
|
+
if (pgSql.includes('CREATE VIRTUAL TABLE') || pgSql.includes('CREATE TRIGGER')) continue;
|
|
176
|
+
if (pgSql.trim().startsWith('--')) continue;
|
|
177
|
+
this.execSyncQuery(pgSql);
|
|
178
|
+
}
|
|
94
179
|
}
|
|
95
180
|
|
|
96
181
|
run(sql: string, params?: PersistenceParams): RunResult {
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
182
|
+
const { sql: pgSql, values } = translateSql(sql, params);
|
|
183
|
+
const result = this.execSyncQuery(pgSql, values);
|
|
184
|
+
return {
|
|
185
|
+
changes: result.rowCount ?? 0,
|
|
186
|
+
lastInsertRowid: 0,
|
|
187
|
+
};
|
|
102
188
|
}
|
|
103
189
|
|
|
104
190
|
get<T = Record<string, unknown>>(sql: string, params?: PersistenceParams): T | undefined {
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
'Full PostgreSQL support requires async PersistenceProvider (v7.0).',
|
|
109
|
-
);
|
|
191
|
+
const { sql: pgSql, values } = translateSql(sql, params);
|
|
192
|
+
const result = this.execSyncQuery(pgSql, values);
|
|
193
|
+
return result.rows?.[0] as T | undefined;
|
|
110
194
|
}
|
|
111
195
|
|
|
112
196
|
all<T = Record<string, unknown>>(sql: string, params?: PersistenceParams): T[] {
|
|
113
|
-
const
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
'Full PostgreSQL support requires async PersistenceProvider (v7.0).',
|
|
117
|
-
);
|
|
197
|
+
const { sql: pgSql, values } = translateSql(sql, params);
|
|
198
|
+
const result = this.execSyncQuery(pgSql, values);
|
|
199
|
+
return (result.rows ?? []) as T[];
|
|
118
200
|
}
|
|
119
201
|
|
|
120
202
|
transaction<T>(fn: () => T): T {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
203
|
+
this.execSyncQuery('BEGIN');
|
|
204
|
+
this.inTransaction = true;
|
|
205
|
+
try {
|
|
206
|
+
const result = fn();
|
|
207
|
+
this.execSyncQuery('COMMIT');
|
|
208
|
+
this.inTransaction = false;
|
|
209
|
+
return result;
|
|
210
|
+
} catch (err) {
|
|
211
|
+
this.execSyncQuery('ROLLBACK');
|
|
212
|
+
this.inTransaction = false;
|
|
213
|
+
throw err;
|
|
214
|
+
}
|
|
126
215
|
}
|
|
127
216
|
|
|
128
217
|
ftsSearch<T = Record<string, unknown>>(
|
|
@@ -130,28 +219,92 @@ export class PostgresPersistenceProvider implements PersistenceProvider {
|
|
|
130
219
|
query: string,
|
|
131
220
|
options?: FtsSearchOptions,
|
|
132
221
|
): T[] {
|
|
133
|
-
const
|
|
134
|
-
const
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
222
|
+
const limit = options?.limit ?? 50;
|
|
223
|
+
const offset = options?.offset ?? 0;
|
|
224
|
+
const filters = options?.filters ?? {};
|
|
225
|
+
const values: unknown[] = [query];
|
|
226
|
+
let paramIdx = 2;
|
|
227
|
+
|
|
228
|
+
const filterClauses: string[] = [];
|
|
229
|
+
for (const [key, value] of Object.entries(filters)) {
|
|
230
|
+
filterClauses.push(`${key} = $${paramIdx}`);
|
|
231
|
+
values.push(value);
|
|
232
|
+
paramIdx++;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
const whereExtra = filterClauses.length > 0 ? `AND ${filterClauses.join(' AND ')}` : '';
|
|
236
|
+
const orderClause =
|
|
237
|
+
options?.orderByRank !== false
|
|
238
|
+
? "ORDER BY ts_rank(to_tsvector('english', COALESCE(title,'') || ' ' || COALESCE(description,'')), plainto_tsquery('english', $1)) DESC"
|
|
239
|
+
: '';
|
|
240
|
+
|
|
241
|
+
const sql = `SELECT * FROM ${table} WHERE to_tsvector('english', COALESCE(title,'') || ' ' || COALESCE(description,'')) @@ plainto_tsquery('english', $1) ${whereExtra} ${orderClause} LIMIT $${paramIdx} OFFSET $${paramIdx + 1}`;
|
|
242
|
+
values.push(limit, offset);
|
|
243
|
+
|
|
244
|
+
const result = this.execSyncQuery(sql, values);
|
|
245
|
+
return (result.rows ?? []) as T[];
|
|
144
246
|
}
|
|
145
247
|
|
|
146
|
-
ftsRebuild(
|
|
147
|
-
//
|
|
148
|
-
void table;
|
|
248
|
+
ftsRebuild(_table: string): void {
|
|
249
|
+
// PostgreSQL GIN indexes are maintained automatically
|
|
149
250
|
}
|
|
150
251
|
|
|
151
252
|
close(): void {
|
|
152
253
|
if (this.pool) {
|
|
153
|
-
|
|
154
|
-
|
|
254
|
+
void (this.pool as { end(): Promise<void> }).end();
|
|
255
|
+
this.pool = null;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/** Get the connection string (for diagnostics). */
|
|
260
|
+
getConnectionString(): string {
|
|
261
|
+
return this.connectionString;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// ─── Sync subprocess bridge ────────────────────────────
|
|
265
|
+
// Uses execFileSync (no shell, safe from injection).
|
|
266
|
+
// SQL and values are passed via environment variables, not shell arguments.
|
|
267
|
+
|
|
268
|
+
private execSyncQuery(sql: string, values?: unknown[]): { rows: unknown[]; rowCount: number } {
|
|
269
|
+
// Build a Node.js script that connects, queries, and outputs JSON
|
|
270
|
+
const script = [
|
|
271
|
+
"const pg = require('pg');",
|
|
272
|
+
'const client = new pg.Client({ connectionString: process.env.PG_CONN });',
|
|
273
|
+
'(async () => {',
|
|
274
|
+
' await client.connect();',
|
|
275
|
+
' try {',
|
|
276
|
+
' const result = await client.query(',
|
|
277
|
+
` ${JSON.stringify(sql)},`,
|
|
278
|
+
" JSON.parse(process.env.PG_VALUES || '[]')",
|
|
279
|
+
' );',
|
|
280
|
+
' process.stdout.write(JSON.stringify({',
|
|
281
|
+
' rows: result.rows || [],',
|
|
282
|
+
' rowCount: result.rowCount || 0',
|
|
283
|
+
' }));',
|
|
284
|
+
' } finally {',
|
|
285
|
+
' await client.end();',
|
|
286
|
+
' }',
|
|
287
|
+
'})().catch(err => {',
|
|
288
|
+
' process.stderr.write(err.message);',
|
|
289
|
+
' process.exit(1);',
|
|
290
|
+
'});',
|
|
291
|
+
].join('\n');
|
|
292
|
+
|
|
293
|
+
try {
|
|
294
|
+
// execFileSync with array args — no shell, safe from injection
|
|
295
|
+
const output = execFileSync('node', ['-e', script], {
|
|
296
|
+
encoding: 'utf-8',
|
|
297
|
+
timeout: 30_000,
|
|
298
|
+
env: {
|
|
299
|
+
...process.env,
|
|
300
|
+
PG_CONN: this.connectionString,
|
|
301
|
+
PG_VALUES: JSON.stringify(values ?? []),
|
|
302
|
+
},
|
|
303
|
+
});
|
|
304
|
+
return JSON.parse(output || '{"rows":[],"rowCount":0}');
|
|
305
|
+
} catch (err) {
|
|
306
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
307
|
+
throw new Error(`PostgreSQL query failed: ${msg}`, { cause: err });
|
|
155
308
|
}
|
|
156
309
|
}
|
|
157
310
|
}
|
package/src/playbooks/index.ts
CHANGED
|
@@ -25,3 +25,14 @@ export {
|
|
|
25
25
|
entryToPlaybookDefinition,
|
|
26
26
|
seedDefaultPlaybooks,
|
|
27
27
|
} from './playbook-seeder.js';
|
|
28
|
+
|
|
29
|
+
// ─── Playbook Executor ─────────────────────────────────────────────
|
|
30
|
+
export { PlaybookExecutor } from './playbook-executor.js';
|
|
31
|
+
export type {
|
|
32
|
+
PlaybookSession,
|
|
33
|
+
PlaybookStepState,
|
|
34
|
+
PlaybookStepStatus,
|
|
35
|
+
StartResult,
|
|
36
|
+
StepResult,
|
|
37
|
+
CompleteResult,
|
|
38
|
+
} from './playbook-executor.js';
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Playbook Executor — in-memory runtime for step-by-step playbook execution.
|
|
3
|
+
*
|
|
4
|
+
* Lifecycle: start → step (repeat) → complete
|
|
5
|
+
*
|
|
6
|
+
* Sessions are ephemeral (in-memory, not persisted). For persistent workflows,
|
|
7
|
+
* use the planning system instead.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type {
|
|
11
|
+
PlaybookDefinition,
|
|
12
|
+
MergedPlaybook,
|
|
13
|
+
PlaybookGate,
|
|
14
|
+
PlaybookTaskTemplate,
|
|
15
|
+
} from './playbook-types.js';
|
|
16
|
+
|
|
17
|
+
// =============================================================================
|
|
18
|
+
// TYPES
|
|
19
|
+
// =============================================================================
|
|
20
|
+
|
|
21
|
+
export type PlaybookStepStatus = 'pending' | 'active' | 'done' | 'skipped';
|
|
22
|
+
|
|
23
|
+
export interface PlaybookStepState {
|
|
24
|
+
index: number;
|
|
25
|
+
title: string;
|
|
26
|
+
description: string;
|
|
27
|
+
status: PlaybookStepStatus;
|
|
28
|
+
output?: string;
|
|
29
|
+
startedAt?: number;
|
|
30
|
+
completedAt?: number;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface PlaybookSession {
|
|
34
|
+
id: string;
|
|
35
|
+
playbookId: string;
|
|
36
|
+
label: string;
|
|
37
|
+
steps: PlaybookStepState[];
|
|
38
|
+
gates: PlaybookGate[];
|
|
39
|
+
taskTemplates: PlaybookTaskTemplate[];
|
|
40
|
+
tools: string[];
|
|
41
|
+
verificationCriteria: string[];
|
|
42
|
+
currentStepIndex: number;
|
|
43
|
+
status: 'active' | 'completed' | 'aborted';
|
|
44
|
+
startedAt: number;
|
|
45
|
+
completedAt?: number;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export interface StartResult {
|
|
49
|
+
sessionId: string;
|
|
50
|
+
label: string;
|
|
51
|
+
totalSteps: number;
|
|
52
|
+
currentStep: PlaybookStepState;
|
|
53
|
+
tools: string[];
|
|
54
|
+
gates: PlaybookGate[];
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface StepResult {
|
|
58
|
+
sessionId: string;
|
|
59
|
+
completedStep: PlaybookStepState;
|
|
60
|
+
nextStep: PlaybookStepState | null;
|
|
61
|
+
progress: { done: number; total: number };
|
|
62
|
+
isComplete: boolean;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export interface CompleteResult {
|
|
66
|
+
sessionId: string;
|
|
67
|
+
label: string;
|
|
68
|
+
status: 'completed' | 'aborted';
|
|
69
|
+
steps: PlaybookStepState[];
|
|
70
|
+
gatesPassed: boolean;
|
|
71
|
+
unsatisfiedGates: string[];
|
|
72
|
+
duration: number;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// =============================================================================
|
|
76
|
+
// STEP PARSER
|
|
77
|
+
// =============================================================================
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Parse step strings from a playbook's `steps` field into structured steps.
|
|
81
|
+
* Expects numbered steps like "1. Title\n - detail\n - detail"
|
|
82
|
+
*/
|
|
83
|
+
function parseSteps(stepsText: string): Array<{ title: string; description: string }> {
|
|
84
|
+
const lines = stepsText.split('\n');
|
|
85
|
+
const steps: Array<{ title: string; description: string }> = [];
|
|
86
|
+
let current: { title: string; lines: string[] } | null = null;
|
|
87
|
+
|
|
88
|
+
for (const line of lines) {
|
|
89
|
+
const stepMatch = line.match(/^\s*(\d+)\.\s+(.+)/);
|
|
90
|
+
if (stepMatch) {
|
|
91
|
+
if (current) {
|
|
92
|
+
steps.push({ title: current.title, description: current.lines.join('\n').trim() });
|
|
93
|
+
}
|
|
94
|
+
current = { title: stepMatch[2].trim(), lines: [] };
|
|
95
|
+
} else if (current && line.trim()) {
|
|
96
|
+
current.lines.push(line);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (current) {
|
|
100
|
+
steps.push({ title: current.title, description: current.lines.join('\n').trim() });
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return steps;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// =============================================================================
|
|
107
|
+
// EXECUTOR
|
|
108
|
+
// =============================================================================
|
|
109
|
+
|
|
110
|
+
export class PlaybookExecutor {
|
|
111
|
+
private sessions = new Map<string, PlaybookSession>();
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Start a playbook execution session.
|
|
115
|
+
* Accepts either a PlaybookDefinition or MergedPlaybook.
|
|
116
|
+
*/
|
|
117
|
+
start(playbook: PlaybookDefinition | MergedPlaybook): StartResult {
|
|
118
|
+
const sessionId = `pbk-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
119
|
+
|
|
120
|
+
let label: string;
|
|
121
|
+
let playbookId: string;
|
|
122
|
+
let stepsText: string;
|
|
123
|
+
let gates: PlaybookGate[];
|
|
124
|
+
let taskTemplates: PlaybookTaskTemplate[];
|
|
125
|
+
let tools: string[];
|
|
126
|
+
let verificationCriteria: string[];
|
|
127
|
+
|
|
128
|
+
if ('mergedGates' in playbook) {
|
|
129
|
+
// MergedPlaybook
|
|
130
|
+
label = playbook.label;
|
|
131
|
+
playbookId = playbook.generic?.id ?? playbook.domain?.id ?? 'unknown';
|
|
132
|
+
stepsText = playbook.generic?.steps ?? playbook.domain?.steps ?? '';
|
|
133
|
+
gates = playbook.mergedGates;
|
|
134
|
+
taskTemplates = playbook.mergedTasks;
|
|
135
|
+
tools = playbook.mergedTools;
|
|
136
|
+
verificationCriteria = playbook.mergedVerification;
|
|
137
|
+
} else {
|
|
138
|
+
// PlaybookDefinition
|
|
139
|
+
label = playbook.title;
|
|
140
|
+
playbookId = playbook.id;
|
|
141
|
+
stepsText = playbook.steps;
|
|
142
|
+
gates = playbook.gates;
|
|
143
|
+
taskTemplates = playbook.taskTemplates;
|
|
144
|
+
tools = playbook.toolInjections;
|
|
145
|
+
verificationCriteria = playbook.verificationCriteria;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const parsed = parseSteps(stepsText);
|
|
149
|
+
if (parsed.length === 0) {
|
|
150
|
+
parsed.push({ title: label, description: 'Execute the playbook.' });
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
const steps: PlaybookStepState[] = parsed.map((s, i) => ({
|
|
154
|
+
index: i,
|
|
155
|
+
title: s.title,
|
|
156
|
+
description: s.description,
|
|
157
|
+
status: i === 0 ? 'active' : 'pending',
|
|
158
|
+
}));
|
|
159
|
+
|
|
160
|
+
const session: PlaybookSession = {
|
|
161
|
+
id: sessionId,
|
|
162
|
+
playbookId,
|
|
163
|
+
label,
|
|
164
|
+
steps,
|
|
165
|
+
gates,
|
|
166
|
+
taskTemplates,
|
|
167
|
+
tools,
|
|
168
|
+
verificationCriteria,
|
|
169
|
+
currentStepIndex: 0,
|
|
170
|
+
status: 'active',
|
|
171
|
+
startedAt: Date.now(),
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
steps[0].startedAt = Date.now();
|
|
175
|
+
this.sessions.set(sessionId, session);
|
|
176
|
+
|
|
177
|
+
return {
|
|
178
|
+
sessionId,
|
|
179
|
+
label,
|
|
180
|
+
totalSteps: steps.length,
|
|
181
|
+
currentStep: steps[0],
|
|
182
|
+
tools,
|
|
183
|
+
gates,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Advance to the next step. Marks the current step as done (or skipped).
|
|
189
|
+
*/
|
|
190
|
+
step(
|
|
191
|
+
sessionId: string,
|
|
192
|
+
options?: { output?: string; skip?: boolean },
|
|
193
|
+
): StepResult | { error: string } {
|
|
194
|
+
const session = this.sessions.get(sessionId);
|
|
195
|
+
if (!session) return { error: `Session not found: ${sessionId}` };
|
|
196
|
+
if (session.status !== 'active') return { error: `Session is ${session.status}, not active` };
|
|
197
|
+
|
|
198
|
+
const current = session.steps[session.currentStepIndex];
|
|
199
|
+
current.status = options?.skip ? 'skipped' : 'done';
|
|
200
|
+
current.output = options?.output;
|
|
201
|
+
current.completedAt = Date.now();
|
|
202
|
+
|
|
203
|
+
const nextIndex = session.currentStepIndex + 1;
|
|
204
|
+
const isComplete = nextIndex >= session.steps.length;
|
|
205
|
+
|
|
206
|
+
let nextStep: PlaybookStepState | null = null;
|
|
207
|
+
if (!isComplete) {
|
|
208
|
+
session.currentStepIndex = nextIndex;
|
|
209
|
+
session.steps[nextIndex].status = 'active';
|
|
210
|
+
session.steps[nextIndex].startedAt = Date.now();
|
|
211
|
+
nextStep = session.steps[nextIndex];
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
const done = session.steps.filter((s) => s.status === 'done' || s.status === 'skipped').length;
|
|
215
|
+
|
|
216
|
+
return {
|
|
217
|
+
sessionId,
|
|
218
|
+
completedStep: current,
|
|
219
|
+
nextStep,
|
|
220
|
+
progress: { done, total: session.steps.length },
|
|
221
|
+
isComplete,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Complete a playbook session. Validates gates and returns summary.
|
|
227
|
+
*/
|
|
228
|
+
complete(
|
|
229
|
+
sessionId: string,
|
|
230
|
+
options?: { abort?: boolean; gateResults?: Record<string, boolean> },
|
|
231
|
+
): CompleteResult | { error: string } {
|
|
232
|
+
const session = this.sessions.get(sessionId);
|
|
233
|
+
if (!session) return { error: `Session not found: ${sessionId}` };
|
|
234
|
+
if (session.status !== 'active') return { error: `Session is already ${session.status}` };
|
|
235
|
+
|
|
236
|
+
const abort = options?.abort ?? false;
|
|
237
|
+
const gateResults = options?.gateResults ?? {};
|
|
238
|
+
|
|
239
|
+
// Mark any remaining active/pending steps
|
|
240
|
+
for (const step of session.steps) {
|
|
241
|
+
if (step.status === 'active' || step.status === 'pending') {
|
|
242
|
+
step.status = abort ? 'skipped' : step.status;
|
|
243
|
+
if (step.status === 'active') {
|
|
244
|
+
step.status = 'done';
|
|
245
|
+
step.completedAt = Date.now();
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// Validate gates
|
|
251
|
+
const completionGates = session.gates.filter((g) => g.phase === 'completion');
|
|
252
|
+
const unsatisfiedGates: string[] = [];
|
|
253
|
+
for (const gate of completionGates) {
|
|
254
|
+
if (!gateResults[gate.checkType]) {
|
|
255
|
+
unsatisfiedGates.push(`${gate.checkType}: ${gate.requirement}`);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
session.status = abort ? 'aborted' : 'completed';
|
|
260
|
+
session.completedAt = Date.now();
|
|
261
|
+
|
|
262
|
+
const result: CompleteResult = {
|
|
263
|
+
sessionId,
|
|
264
|
+
label: session.label,
|
|
265
|
+
status: session.status,
|
|
266
|
+
steps: session.steps,
|
|
267
|
+
gatesPassed: unsatisfiedGates.length === 0,
|
|
268
|
+
unsatisfiedGates,
|
|
269
|
+
duration: session.completedAt - session.startedAt,
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
// Clean up after completion
|
|
273
|
+
this.sessions.delete(sessionId);
|
|
274
|
+
|
|
275
|
+
return result;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* Get the current state of a session.
|
|
280
|
+
*/
|
|
281
|
+
getSession(sessionId: string): PlaybookSession | undefined {
|
|
282
|
+
return this.sessions.get(sessionId);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* List all active sessions.
|
|
287
|
+
*/
|
|
288
|
+
listSessions(): Array<{ id: string; label: string; progress: string; startedAt: number }> {
|
|
289
|
+
return Array.from(this.sessions.values())
|
|
290
|
+
.filter((s) => s.status === 'active')
|
|
291
|
+
.map((s) => {
|
|
292
|
+
const done = s.steps.filter((st) => st.status === 'done' || st.status === 'skipped').length;
|
|
293
|
+
return {
|
|
294
|
+
id: s.id,
|
|
295
|
+
label: s.label,
|
|
296
|
+
progress: `${done}/${s.steps.length}`,
|
|
297
|
+
startedAt: s.startedAt,
|
|
298
|
+
};
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin System — Barrel Exports
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export {
|
|
6
|
+
pluginManifestSchema,
|
|
7
|
+
type PluginManifest,
|
|
8
|
+
type PluginStatus,
|
|
9
|
+
type PluginProvenance,
|
|
10
|
+
type LoadedPlugin,
|
|
11
|
+
type RegisteredPlugin,
|
|
12
|
+
type PluginFacadeBuilder,
|
|
13
|
+
type PluginContext,
|
|
14
|
+
type LoadResult,
|
|
15
|
+
} from './types.js';
|
|
16
|
+
|
|
17
|
+
export { loadPlugins, validateDependencies, sortByDependencies } from './plugin-loader.js';
|
|
18
|
+
|
|
19
|
+
export { PluginRegistry } from './plugin-registry.js';
|