@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
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema Migration Runner — versioned migration scripts for engine upgrades.
|
|
3
|
+
*
|
|
4
|
+
* Migrations run in version order, track state in `_soleri_migrations` table,
|
|
5
|
+
* and support verify + rollback.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { Database } from 'better-sqlite3';
|
|
9
|
+
|
|
10
|
+
// ─── Types ────────────────────────────────────────────────────────────
|
|
11
|
+
|
|
12
|
+
export interface Migration {
|
|
13
|
+
/** Semver version this migration applies to */
|
|
14
|
+
version: string;
|
|
15
|
+
/** Human-readable description */
|
|
16
|
+
description: string;
|
|
17
|
+
/** Apply the migration */
|
|
18
|
+
up: (db: Database) => void;
|
|
19
|
+
/** Verify the migration was applied correctly */
|
|
20
|
+
verify?: (db: Database) => boolean;
|
|
21
|
+
/** Rollback (optional) */
|
|
22
|
+
down?: (db: Database) => void;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface MigrationResult {
|
|
26
|
+
version: string;
|
|
27
|
+
description: string;
|
|
28
|
+
status: 'applied' | 'skipped' | 'failed' | 'rolled-back';
|
|
29
|
+
error?: string;
|
|
30
|
+
durationMs: number;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface MigrationState {
|
|
34
|
+
version: string;
|
|
35
|
+
appliedAt: string;
|
|
36
|
+
description: string;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// ─── Runner ───────────────────────────────────────────────────────────
|
|
40
|
+
|
|
41
|
+
export class MigrationRunner {
|
|
42
|
+
constructor(private db: Database) {
|
|
43
|
+
this.ensureTable();
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Run all pending migrations in version order.
|
|
48
|
+
*/
|
|
49
|
+
run(migrations: Migration[]): MigrationResult[] {
|
|
50
|
+
const applied = this.getApplied();
|
|
51
|
+
const sorted = [...migrations].sort((a, b) => compareVersions(a.version, b.version));
|
|
52
|
+
const results: MigrationResult[] = [];
|
|
53
|
+
|
|
54
|
+
for (const migration of sorted) {
|
|
55
|
+
if (applied.has(migration.version)) {
|
|
56
|
+
results.push({
|
|
57
|
+
version: migration.version,
|
|
58
|
+
description: migration.description,
|
|
59
|
+
status: 'skipped',
|
|
60
|
+
durationMs: 0,
|
|
61
|
+
});
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const start = Date.now();
|
|
66
|
+
try {
|
|
67
|
+
migration.up(this.db);
|
|
68
|
+
|
|
69
|
+
// Verify if verifier provided
|
|
70
|
+
if (migration.verify && !migration.verify(this.db)) {
|
|
71
|
+
// Rollback if possible
|
|
72
|
+
if (migration.down) {
|
|
73
|
+
migration.down(this.db);
|
|
74
|
+
results.push({
|
|
75
|
+
version: migration.version,
|
|
76
|
+
description: migration.description,
|
|
77
|
+
status: 'rolled-back',
|
|
78
|
+
error: 'Verification failed after apply',
|
|
79
|
+
durationMs: Date.now() - start,
|
|
80
|
+
});
|
|
81
|
+
} else {
|
|
82
|
+
results.push({
|
|
83
|
+
version: migration.version,
|
|
84
|
+
description: migration.description,
|
|
85
|
+
status: 'failed',
|
|
86
|
+
error: 'Verification failed, no rollback available',
|
|
87
|
+
durationMs: Date.now() - start,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Record as applied
|
|
94
|
+
this.recordApplied(migration);
|
|
95
|
+
results.push({
|
|
96
|
+
version: migration.version,
|
|
97
|
+
description: migration.description,
|
|
98
|
+
status: 'applied',
|
|
99
|
+
durationMs: Date.now() - start,
|
|
100
|
+
});
|
|
101
|
+
} catch (err) {
|
|
102
|
+
// Attempt rollback
|
|
103
|
+
if (migration.down) {
|
|
104
|
+
try {
|
|
105
|
+
migration.down(this.db);
|
|
106
|
+
} catch {
|
|
107
|
+
// Rollback failed — nothing we can do
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
results.push({
|
|
112
|
+
version: migration.version,
|
|
113
|
+
description: migration.description,
|
|
114
|
+
status: 'failed',
|
|
115
|
+
error: err instanceof Error ? err.message : String(err),
|
|
116
|
+
durationMs: Date.now() - start,
|
|
117
|
+
});
|
|
118
|
+
// Stop on failure — don't run subsequent migrations
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return results;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Get list of applied migrations.
|
|
128
|
+
*/
|
|
129
|
+
listApplied(): MigrationState[] {
|
|
130
|
+
const stmt = this.db.prepare(
|
|
131
|
+
'SELECT version, applied_at, description FROM _soleri_migrations ORDER BY version',
|
|
132
|
+
);
|
|
133
|
+
const rows = stmt.all() as Array<{ version: string; applied_at: string; description: string }>;
|
|
134
|
+
return rows.map((row) => ({
|
|
135
|
+
version: row.version,
|
|
136
|
+
appliedAt: row.applied_at,
|
|
137
|
+
description: row.description,
|
|
138
|
+
}));
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Get pending migrations (not yet applied).
|
|
143
|
+
*/
|
|
144
|
+
getPending(migrations: Migration[]): Migration[] {
|
|
145
|
+
const applied = this.getApplied();
|
|
146
|
+
return migrations
|
|
147
|
+
.filter((m) => !applied.has(m.version))
|
|
148
|
+
.sort((a, b) => compareVersions(a.version, b.version));
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
private getApplied(): Set<string> {
|
|
152
|
+
const stmt = this.db.prepare('SELECT version FROM _soleri_migrations');
|
|
153
|
+
const rows = stmt.all() as Array<{ version: string }>;
|
|
154
|
+
return new Set(rows.map((r) => r.version));
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
private recordApplied(migration: Migration): void {
|
|
158
|
+
const stmt = this.db.prepare(
|
|
159
|
+
'INSERT INTO _soleri_migrations (version, applied_at, description) VALUES (?, ?, ?)',
|
|
160
|
+
);
|
|
161
|
+
stmt.run(migration.version, new Date().toISOString(), migration.description);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
private ensureTable(): void {
|
|
165
|
+
this.db.exec(`
|
|
166
|
+
CREATE TABLE IF NOT EXISTS _soleri_migrations (
|
|
167
|
+
version TEXT PRIMARY KEY,
|
|
168
|
+
applied_at TEXT NOT NULL,
|
|
169
|
+
description TEXT NOT NULL
|
|
170
|
+
)
|
|
171
|
+
`);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// ─── Helpers ──────────────────────────────────────────────────────────
|
|
176
|
+
|
|
177
|
+
function compareVersions(a: string, b: string): number {
|
|
178
|
+
const pa = a.split('.').map(Number);
|
|
179
|
+
const pb = b.split('.').map(Number);
|
|
180
|
+
for (let i = 0; i < 3; i++) {
|
|
181
|
+
const diff = (pa[i] || 0) - (pb[i] || 0);
|
|
182
|
+
if (diff !== 0) return diff;
|
|
183
|
+
}
|
|
184
|
+
return 0;
|
|
185
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Knowledge Packs — Barrel Exports
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export {
|
|
6
|
+
packManifestSchema,
|
|
7
|
+
type PackManifest,
|
|
8
|
+
type PackStatus,
|
|
9
|
+
type InstalledPack,
|
|
10
|
+
type InstallResult,
|
|
11
|
+
type ValidateResult,
|
|
12
|
+
} from './types.js';
|
|
13
|
+
|
|
14
|
+
export { PackInstaller } from './pack-installer.js';
|
|
15
|
+
|
|
16
|
+
export { PackLockfile, inferPackType } from './lockfile.js';
|
|
17
|
+
export type { LockEntry, PackType, PackSource, LockfileData } from './lockfile.js';
|
|
18
|
+
|
|
19
|
+
export { resolvePack, checkNpmVersion, checkVersionCompat } from './resolver.js';
|
|
20
|
+
export type { ResolvedPack, ResolveOptions } from './resolver.js';
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pack Lockfile — persists installed pack metadata to `soleri.lock`.
|
|
3
|
+
*
|
|
4
|
+
* Tracks installed pack versions, types, sources, and integrity hashes
|
|
5
|
+
* for reproducible agent setups. The lockfile enables:
|
|
6
|
+
* - `soleri pack install --frozen` (CI mode — fail if lockfile is stale)
|
|
7
|
+
* - `soleri pack outdated` (compare installed vs. latest available)
|
|
8
|
+
* - Persistence across restarts (unlike the in-memory PackInstaller registry)
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
12
|
+
import { dirname } from 'node:path';
|
|
13
|
+
import { createHash } from 'node:crypto';
|
|
14
|
+
|
|
15
|
+
// ─── Types ────────────────────────────────────────────────────────────
|
|
16
|
+
|
|
17
|
+
export interface LockEntry {
|
|
18
|
+
/** Pack ID (from manifest) */
|
|
19
|
+
id: string;
|
|
20
|
+
/** Installed version (semver) */
|
|
21
|
+
version: string;
|
|
22
|
+
/** Pack type: hooks, skills, knowledge, domain, bundle */
|
|
23
|
+
type: PackType;
|
|
24
|
+
/** Where it was installed from */
|
|
25
|
+
source: PackSource;
|
|
26
|
+
/** Path to installed pack directory */
|
|
27
|
+
directory: string;
|
|
28
|
+
/** SHA-256 of the manifest file at install time */
|
|
29
|
+
integrity: string;
|
|
30
|
+
/** ISO timestamp of install */
|
|
31
|
+
installedAt: string;
|
|
32
|
+
/** Number of vault entries seeded */
|
|
33
|
+
vaultEntries: number;
|
|
34
|
+
/** Skill names discovered */
|
|
35
|
+
skills: string[];
|
|
36
|
+
/** Hook names discovered */
|
|
37
|
+
hooks: string[];
|
|
38
|
+
/** Whether facades were registered */
|
|
39
|
+
facadesRegistered: boolean;
|
|
40
|
+
/** Compatible @soleri/core version range (from manifest "soleri" field) */
|
|
41
|
+
soleriRange?: string;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export type PackType = 'hooks' | 'skills' | 'knowledge' | 'domain' | 'bundle';
|
|
45
|
+
export type PackSource = 'built-in' | 'local' | 'npm';
|
|
46
|
+
|
|
47
|
+
export interface LockfileData {
|
|
48
|
+
/** Lockfile format version */
|
|
49
|
+
version: 1;
|
|
50
|
+
/** Map of packId → lock entry */
|
|
51
|
+
packs: Record<string, LockEntry>;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// ─── Lockfile Manager ─────────────────────────────────────────────────
|
|
55
|
+
|
|
56
|
+
export class PackLockfile {
|
|
57
|
+
private data: LockfileData;
|
|
58
|
+
private dirty = false;
|
|
59
|
+
|
|
60
|
+
constructor(private readonly filePath: string) {
|
|
61
|
+
this.data = this.load();
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Get a lock entry by pack ID.
|
|
66
|
+
*/
|
|
67
|
+
get(packId: string): LockEntry | undefined {
|
|
68
|
+
return this.data.packs[packId];
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Set (add or update) a lock entry.
|
|
73
|
+
*/
|
|
74
|
+
set(entry: LockEntry): void {
|
|
75
|
+
this.data.packs[entry.id] = entry;
|
|
76
|
+
this.dirty = true;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Remove a lock entry.
|
|
81
|
+
*/
|
|
82
|
+
remove(packId: string): boolean {
|
|
83
|
+
if (!(packId in this.data.packs)) return false;
|
|
84
|
+
delete this.data.packs[packId];
|
|
85
|
+
this.dirty = true;
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* List all lock entries.
|
|
91
|
+
*/
|
|
92
|
+
list(): LockEntry[] {
|
|
93
|
+
return Object.values(this.data.packs);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Check if a pack is locked.
|
|
98
|
+
*/
|
|
99
|
+
has(packId: string): boolean {
|
|
100
|
+
return packId in this.data.packs;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Get number of locked packs.
|
|
105
|
+
*/
|
|
106
|
+
get size(): number {
|
|
107
|
+
return Object.keys(this.data.packs).length;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Save lockfile to disk (only if dirty).
|
|
112
|
+
*/
|
|
113
|
+
save(): boolean {
|
|
114
|
+
if (!this.dirty) return false;
|
|
115
|
+
const dir = dirname(this.filePath);
|
|
116
|
+
if (!existsSync(dir)) {
|
|
117
|
+
mkdirSync(dir, { recursive: true });
|
|
118
|
+
}
|
|
119
|
+
writeFileSync(this.filePath, JSON.stringify(this.data, null, 2) + '\n', 'utf-8');
|
|
120
|
+
this.dirty = false;
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Force reload from disk.
|
|
126
|
+
*/
|
|
127
|
+
reload(): void {
|
|
128
|
+
this.data = this.load();
|
|
129
|
+
this.dirty = false;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Compute integrity hash for a manifest file.
|
|
134
|
+
*/
|
|
135
|
+
static computeIntegrity(manifestPath: string): string {
|
|
136
|
+
if (!existsSync(manifestPath)) return '';
|
|
137
|
+
const content = readFileSync(manifestPath, 'utf-8');
|
|
138
|
+
return 'sha256-' + createHash('sha256').update(content).digest('hex');
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
private load(): LockfileData {
|
|
142
|
+
if (!existsSync(this.filePath)) {
|
|
143
|
+
return { version: 1, packs: {} };
|
|
144
|
+
}
|
|
145
|
+
try {
|
|
146
|
+
const raw = JSON.parse(readFileSync(this.filePath, 'utf-8'));
|
|
147
|
+
if (raw.version === 1 && typeof raw.packs === 'object') {
|
|
148
|
+
return raw as LockfileData;
|
|
149
|
+
}
|
|
150
|
+
return { version: 1, packs: {} };
|
|
151
|
+
} catch {
|
|
152
|
+
return { version: 1, packs: {} };
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Infer pack type from manifest content.
|
|
159
|
+
*/
|
|
160
|
+
export function inferPackType(manifest: {
|
|
161
|
+
vault?: unknown;
|
|
162
|
+
skills?: unknown;
|
|
163
|
+
hooks?: unknown;
|
|
164
|
+
facades?: unknown[];
|
|
165
|
+
domains?: string[];
|
|
166
|
+
}): PackType {
|
|
167
|
+
const hasVault = !!manifest.vault;
|
|
168
|
+
const hasSkills = !!manifest.skills;
|
|
169
|
+
const hasHooks = !!manifest.hooks;
|
|
170
|
+
const hasFacades = (manifest.facades?.length ?? 0) > 0;
|
|
171
|
+
|
|
172
|
+
// Bundle if multiple content types
|
|
173
|
+
const types = [hasVault, hasSkills, hasHooks, hasFacades].filter(Boolean).length;
|
|
174
|
+
if (types > 1) return 'bundle';
|
|
175
|
+
|
|
176
|
+
if (hasHooks) return 'hooks';
|
|
177
|
+
if (hasSkills) return 'skills';
|
|
178
|
+
if (hasFacades) return 'domain';
|
|
179
|
+
return 'knowledge';
|
|
180
|
+
}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pack Installer — validates, loads vault entries, registers facades.
|
|
3
|
+
*
|
|
4
|
+
* Install flow:
|
|
5
|
+
* 1. Read and validate soleri-pack.json manifest
|
|
6
|
+
* 2. Load vault intelligence bundles from vault/ subdirectory
|
|
7
|
+
* 3. Register facades via plugin system
|
|
8
|
+
* 4. Discover skills and hooks
|
|
9
|
+
* 5. Return install summary
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
13
|
+
import { join, basename } from 'node:path';
|
|
14
|
+
import {
|
|
15
|
+
packManifestSchema,
|
|
16
|
+
type InstalledPack,
|
|
17
|
+
type InstallResult,
|
|
18
|
+
type ValidateResult,
|
|
19
|
+
} from './types.js';
|
|
20
|
+
import { loadIntelligenceData } from '../intelligence/loader.js';
|
|
21
|
+
import type { Vault } from '../vault/vault.js';
|
|
22
|
+
import type { PluginRegistry } from '../plugins/plugin-registry.js';
|
|
23
|
+
import type { PluginContext } from '../plugins/types.js';
|
|
24
|
+
|
|
25
|
+
const MANIFEST_FILENAME = 'soleri-pack.json';
|
|
26
|
+
|
|
27
|
+
// =============================================================================
|
|
28
|
+
// PACK REGISTRY (in-memory)
|
|
29
|
+
// =============================================================================
|
|
30
|
+
|
|
31
|
+
export class PackInstaller {
|
|
32
|
+
private packs = new Map<string, InstalledPack>();
|
|
33
|
+
|
|
34
|
+
constructor(
|
|
35
|
+
private vault: Vault,
|
|
36
|
+
private pluginRegistry: PluginRegistry,
|
|
37
|
+
) {}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Validate a pack directory without installing.
|
|
41
|
+
*/
|
|
42
|
+
validate(packDir: string): ValidateResult {
|
|
43
|
+
const errors: string[] = [];
|
|
44
|
+
const warnings: string[] = [];
|
|
45
|
+
|
|
46
|
+
// 1. Check manifest
|
|
47
|
+
const manifestPath = join(packDir, MANIFEST_FILENAME);
|
|
48
|
+
if (!existsSync(manifestPath)) {
|
|
49
|
+
return { valid: false, errors: [`No ${MANIFEST_FILENAME} found in ${packDir}`], warnings };
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
let raw: unknown;
|
|
53
|
+
try {
|
|
54
|
+
raw = JSON.parse(readFileSync(manifestPath, 'utf-8'));
|
|
55
|
+
} catch (e) {
|
|
56
|
+
return {
|
|
57
|
+
valid: false,
|
|
58
|
+
errors: [`Invalid JSON: ${e instanceof Error ? e.message : String(e)}`],
|
|
59
|
+
warnings,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const parseResult = packManifestSchema.safeParse(raw);
|
|
64
|
+
if (!parseResult.success) {
|
|
65
|
+
const issues = parseResult.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`);
|
|
66
|
+
return { valid: false, errors: issues, warnings };
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const manifest = parseResult.data;
|
|
70
|
+
|
|
71
|
+
// 2. Count vault entries
|
|
72
|
+
let vaultEntries = 0;
|
|
73
|
+
const vaultDir = join(packDir, manifest.vault?.dir ?? 'vault');
|
|
74
|
+
if (existsSync(vaultDir)) {
|
|
75
|
+
const entries = loadIntelligenceData(vaultDir);
|
|
76
|
+
vaultEntries = entries.length;
|
|
77
|
+
} else if (manifest.vault) {
|
|
78
|
+
warnings.push(`Vault directory "${manifest.vault.dir}" declared but not found`);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// 3. Count skills
|
|
82
|
+
const skillsDir = join(packDir, manifest.skills?.dir ?? 'skills');
|
|
83
|
+
const skills = existsSync(skillsDir) ? listMarkdownFiles(skillsDir) : [];
|
|
84
|
+
if (manifest.skills && skills.length === 0) {
|
|
85
|
+
warnings.push(`Skills directory "${manifest.skills.dir}" declared but empty or not found`);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// 4. Count hooks
|
|
89
|
+
const hooksDir = join(packDir, manifest.hooks?.dir ?? 'hooks');
|
|
90
|
+
const hooks = existsSync(hooksDir) ? listMarkdownFiles(hooksDir) : [];
|
|
91
|
+
if (manifest.hooks && hooks.length === 0) {
|
|
92
|
+
warnings.push(`Hooks directory "${manifest.hooks.dir}" declared but empty or not found`);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// 5. Count facades/ops
|
|
96
|
+
const facades = manifest.facades.length;
|
|
97
|
+
const ops = manifest.facades.reduce((sum, f) => sum + f.ops.length, 0);
|
|
98
|
+
|
|
99
|
+
return {
|
|
100
|
+
valid: true,
|
|
101
|
+
manifest,
|
|
102
|
+
errors,
|
|
103
|
+
warnings,
|
|
104
|
+
counts: { vaultEntries, skills: skills.length, hooks: hooks.length, facades, ops },
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Install a knowledge pack from a directory.
|
|
110
|
+
*/
|
|
111
|
+
async install(packDir: string, runtimeCtx?: unknown): Promise<InstallResult> {
|
|
112
|
+
// Validate first
|
|
113
|
+
const validation = this.validate(packDir);
|
|
114
|
+
if (!validation.valid || !validation.manifest) {
|
|
115
|
+
return {
|
|
116
|
+
id: 'unknown',
|
|
117
|
+
installed: false,
|
|
118
|
+
vaultEntries: 0,
|
|
119
|
+
skills: [],
|
|
120
|
+
hooks: [],
|
|
121
|
+
facades: 0,
|
|
122
|
+
error: validation.errors.join('; '),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const manifest = validation.manifest;
|
|
127
|
+
|
|
128
|
+
// Check duplicate
|
|
129
|
+
if (this.packs.has(manifest.id)) {
|
|
130
|
+
return {
|
|
131
|
+
id: manifest.id,
|
|
132
|
+
installed: false,
|
|
133
|
+
vaultEntries: 0,
|
|
134
|
+
skills: [],
|
|
135
|
+
hooks: [],
|
|
136
|
+
facades: 0,
|
|
137
|
+
error: `Pack "${manifest.id}" is already installed`,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
try {
|
|
142
|
+
// 1. Seed vault entries
|
|
143
|
+
let vaultEntries = 0;
|
|
144
|
+
const vaultDir = join(packDir, manifest.vault?.dir ?? 'vault');
|
|
145
|
+
if (existsSync(vaultDir)) {
|
|
146
|
+
const entries = loadIntelligenceData(vaultDir);
|
|
147
|
+
if (entries.length > 0) {
|
|
148
|
+
this.vault.seed(entries);
|
|
149
|
+
vaultEntries = entries.length;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// 2. Register facades via plugin system
|
|
154
|
+
let facadesRegistered = false;
|
|
155
|
+
if (manifest.facades.length > 0) {
|
|
156
|
+
// Convert pack manifest to plugin-compatible format for registry
|
|
157
|
+
const pluginLoaded = {
|
|
158
|
+
manifest: {
|
|
159
|
+
id: manifest.id,
|
|
160
|
+
name: manifest.name,
|
|
161
|
+
version: manifest.version,
|
|
162
|
+
description: manifest.description,
|
|
163
|
+
domain: manifest.domains[0],
|
|
164
|
+
dependencies: manifest.dependencies,
|
|
165
|
+
facades: manifest.facades,
|
|
166
|
+
intelligence: [],
|
|
167
|
+
},
|
|
168
|
+
directory: packDir,
|
|
169
|
+
provenance: 'custom' as const,
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
if (!this.pluginRegistry.get(manifest.id)) {
|
|
173
|
+
this.pluginRegistry.register(pluginLoaded);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
const ctx: PluginContext = {
|
|
177
|
+
runtime: runtimeCtx ?? {},
|
|
178
|
+
manifest: pluginLoaded.manifest,
|
|
179
|
+
directory: packDir,
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
await this.pluginRegistry.activate(manifest.id, ctx);
|
|
183
|
+
facadesRegistered = true;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// 3. Discover skills
|
|
187
|
+
const skillsDir = join(packDir, manifest.skills?.dir ?? 'skills');
|
|
188
|
+
const skills = existsSync(skillsDir) ? listMarkdownFiles(skillsDir) : [];
|
|
189
|
+
|
|
190
|
+
// 4. Discover hooks
|
|
191
|
+
const hooksDir = join(packDir, manifest.hooks?.dir ?? 'hooks');
|
|
192
|
+
const hooks = existsSync(hooksDir) ? listMarkdownFiles(hooksDir) : [];
|
|
193
|
+
|
|
194
|
+
// Track installed pack
|
|
195
|
+
const installed: InstalledPack = {
|
|
196
|
+
id: manifest.id,
|
|
197
|
+
manifest,
|
|
198
|
+
directory: packDir,
|
|
199
|
+
status: 'installed',
|
|
200
|
+
vaultEntries,
|
|
201
|
+
skills,
|
|
202
|
+
hooks,
|
|
203
|
+
facadesRegistered,
|
|
204
|
+
installedAt: Date.now(),
|
|
205
|
+
};
|
|
206
|
+
this.packs.set(manifest.id, installed);
|
|
207
|
+
|
|
208
|
+
return {
|
|
209
|
+
id: manifest.id,
|
|
210
|
+
installed: true,
|
|
211
|
+
vaultEntries,
|
|
212
|
+
skills,
|
|
213
|
+
hooks,
|
|
214
|
+
facades: manifest.facades.length,
|
|
215
|
+
};
|
|
216
|
+
} catch (e) {
|
|
217
|
+
const error = e instanceof Error ? e.message : String(e);
|
|
218
|
+
|
|
219
|
+
this.packs.set(manifest.id, {
|
|
220
|
+
id: manifest.id,
|
|
221
|
+
manifest,
|
|
222
|
+
directory: packDir,
|
|
223
|
+
status: 'error',
|
|
224
|
+
error,
|
|
225
|
+
vaultEntries: 0,
|
|
226
|
+
skills: [],
|
|
227
|
+
hooks: [],
|
|
228
|
+
facadesRegistered: false,
|
|
229
|
+
installedAt: Date.now(),
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
return {
|
|
233
|
+
id: manifest.id,
|
|
234
|
+
installed: false,
|
|
235
|
+
vaultEntries: 0,
|
|
236
|
+
skills: [],
|
|
237
|
+
hooks: [],
|
|
238
|
+
facades: 0,
|
|
239
|
+
error,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Uninstall a pack — deactivates facades, removes from registry.
|
|
246
|
+
* Note: vault entries are NOT removed (they become part of knowledge).
|
|
247
|
+
*/
|
|
248
|
+
uninstall(packId: string): boolean {
|
|
249
|
+
const pack = this.packs.get(packId);
|
|
250
|
+
if (!pack) return false;
|
|
251
|
+
|
|
252
|
+
// Deactivate facades
|
|
253
|
+
if (pack.facadesRegistered) {
|
|
254
|
+
this.pluginRegistry.deactivate(packId);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
pack.status = 'uninstalled';
|
|
258
|
+
this.packs.delete(packId);
|
|
259
|
+
return true;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Get an installed pack by ID.
|
|
264
|
+
*/
|
|
265
|
+
get(packId: string): InstalledPack | undefined {
|
|
266
|
+
return this.packs.get(packId);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* List all installed packs.
|
|
271
|
+
*/
|
|
272
|
+
list(): InstalledPack[] {
|
|
273
|
+
return Array.from(this.packs.values());
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// =============================================================================
|
|
278
|
+
// HELPERS
|
|
279
|
+
// =============================================================================
|
|
280
|
+
|
|
281
|
+
function listMarkdownFiles(dir: string): string[] {
|
|
282
|
+
try {
|
|
283
|
+
return readdirSync(dir)
|
|
284
|
+
.filter((f) => f.endsWith('.md'))
|
|
285
|
+
.map((f) => basename(f, '.md'));
|
|
286
|
+
} catch {
|
|
287
|
+
return [];
|
|
288
|
+
}
|
|
289
|
+
}
|