@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,326 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agency Manager — proactive file watching, pattern surfacing, and warning detection.
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates:
|
|
5
|
+
* 1. File watcher (fs.watch with debouncing)
|
|
6
|
+
* 2. Warning detectors (pluggable, domain-agnostic)
|
|
7
|
+
* 3. Pattern surfacer (vault search on file changes)
|
|
8
|
+
* 4. Clarifier (generate questions for ambiguous intent)
|
|
9
|
+
*
|
|
10
|
+
* Feature-flagged: disabled by default, opt-in via agency_enable.
|
|
11
|
+
* Uses Node.js fs.watch — no dependencies.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { watch, readFileSync, existsSync } from 'node:fs';
|
|
15
|
+
import { join, extname } from 'node:path';
|
|
16
|
+
import type { FSWatcher } from 'node:fs';
|
|
17
|
+
import type { Vault } from '../vault/vault.js';
|
|
18
|
+
import type {
|
|
19
|
+
AgencyConfig,
|
|
20
|
+
AgencyStatus,
|
|
21
|
+
FileChange,
|
|
22
|
+
FileChangeListener,
|
|
23
|
+
Warning,
|
|
24
|
+
WarningDetector,
|
|
25
|
+
SurfacedPattern,
|
|
26
|
+
ClarificationQuestion,
|
|
27
|
+
} from './types.js';
|
|
28
|
+
|
|
29
|
+
// ─── Defaults ──────────────────────────────────────────────────────
|
|
30
|
+
|
|
31
|
+
const DEFAULT_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.css', '.json'];
|
|
32
|
+
const DEFAULT_IGNORE = [
|
|
33
|
+
'node_modules',
|
|
34
|
+
'.git',
|
|
35
|
+
'dist',
|
|
36
|
+
'build',
|
|
37
|
+
'.next',
|
|
38
|
+
'coverage',
|
|
39
|
+
'.turbo',
|
|
40
|
+
'.cache',
|
|
41
|
+
];
|
|
42
|
+
const DEFAULT_DEBOUNCE_MS = 300;
|
|
43
|
+
const DEFAULT_COOLDOWN_MS = 300_000; // 5 minutes
|
|
44
|
+
const DEFAULT_MIN_CONFIDENCE = 0.5;
|
|
45
|
+
|
|
46
|
+
// ─── Class ──────────────────────────────────────────────────────────
|
|
47
|
+
|
|
48
|
+
export class AgencyManager {
|
|
49
|
+
private vault: Vault;
|
|
50
|
+
private config: Required<AgencyConfig>;
|
|
51
|
+
private watchers: FSWatcher[] = [];
|
|
52
|
+
private detectors: WarningDetector[] = [];
|
|
53
|
+
private changeListeners: FileChangeListener[] = [];
|
|
54
|
+
private pendingWarnings: Warning[] = [];
|
|
55
|
+
private surfacedPatterns: SurfacedPattern[] = [];
|
|
56
|
+
private changesProcessed = 0;
|
|
57
|
+
private cooldownMap = new Map<string, number>();
|
|
58
|
+
private debounceTimers = new Map<string, ReturnType<typeof setTimeout>>();
|
|
59
|
+
|
|
60
|
+
constructor(vault: Vault, config?: AgencyConfig) {
|
|
61
|
+
this.vault = vault;
|
|
62
|
+
this.config = {
|
|
63
|
+
enabled: config?.enabled ?? false,
|
|
64
|
+
watchPaths: config?.watchPaths ?? ['.'],
|
|
65
|
+
ignorePatterns: config?.ignorePatterns ?? DEFAULT_IGNORE,
|
|
66
|
+
extensions: config?.extensions ?? DEFAULT_EXTENSIONS,
|
|
67
|
+
debounceMs: config?.debounceMs ?? DEFAULT_DEBOUNCE_MS,
|
|
68
|
+
minPatternConfidence: config?.minPatternConfidence ?? DEFAULT_MIN_CONFIDENCE,
|
|
69
|
+
cooldownMs: config?.cooldownMs ?? DEFAULT_COOLDOWN_MS,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// ─── Lifecycle ──────────────────────────────────────────────────
|
|
74
|
+
|
|
75
|
+
enable(projectPath?: string): void {
|
|
76
|
+
if (this.config.enabled) return;
|
|
77
|
+
this.config.enabled = true;
|
|
78
|
+
if (projectPath) this.startWatching(projectPath);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
disable(): void {
|
|
82
|
+
this.config.enabled = false;
|
|
83
|
+
this.stopWatching();
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
getStatus(): AgencyStatus {
|
|
87
|
+
return {
|
|
88
|
+
enabled: this.config.enabled,
|
|
89
|
+
watching: this.watchers.length > 0,
|
|
90
|
+
watchPaths: this.config.watchPaths,
|
|
91
|
+
detectorCount: this.detectors.length,
|
|
92
|
+
pendingWarnings: this.pendingWarnings.length,
|
|
93
|
+
surfacedPatterns: this.surfacedPatterns.length,
|
|
94
|
+
fileChangesProcessed: this.changesProcessed,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
updateConfig(config: Partial<AgencyConfig>): void {
|
|
99
|
+
Object.assign(this.config, config);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// ─── File Watching ──────────────────────────────────────────────
|
|
103
|
+
|
|
104
|
+
startWatching(projectPath: string): void {
|
|
105
|
+
this.stopWatching();
|
|
106
|
+
for (const watchPath of this.config.watchPaths) {
|
|
107
|
+
const fullPath = join(projectPath, watchPath);
|
|
108
|
+
if (!existsSync(fullPath)) continue;
|
|
109
|
+
|
|
110
|
+
try {
|
|
111
|
+
const watcher = watch(fullPath, { recursive: true }, (_event, filename) => {
|
|
112
|
+
if (!filename) return;
|
|
113
|
+
const filePath = join(fullPath, filename);
|
|
114
|
+
if (this.shouldIgnore(filePath)) return;
|
|
115
|
+
if (!this.hasValidExtension(filePath)) return;
|
|
116
|
+
this.debounceChange(filePath);
|
|
117
|
+
});
|
|
118
|
+
this.watchers.push(watcher);
|
|
119
|
+
} catch {
|
|
120
|
+
// Directory may not support watching — skip
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
stopWatching(): void {
|
|
126
|
+
for (const w of this.watchers) w.close();
|
|
127
|
+
this.watchers = [];
|
|
128
|
+
for (const timer of this.debounceTimers.values()) clearTimeout(timer);
|
|
129
|
+
this.debounceTimers.clear();
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
onFileChange(listener: FileChangeListener): void {
|
|
133
|
+
this.changeListeners.push(listener);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// ─── Warning Detection ──────────────────────────────────────────
|
|
137
|
+
|
|
138
|
+
registerDetector(detector: WarningDetector): void {
|
|
139
|
+
this.detectors.push(detector);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
scanFile(filePath: string): Warning[] {
|
|
143
|
+
if (!existsSync(filePath)) return [];
|
|
144
|
+
|
|
145
|
+
const ext = extname(filePath);
|
|
146
|
+
const applicableDetectors = this.detectors.filter((d) => d.extensions.includes(ext));
|
|
147
|
+
if (applicableDetectors.length === 0) return [];
|
|
148
|
+
|
|
149
|
+
let content: string;
|
|
150
|
+
try {
|
|
151
|
+
content = readFileSync(filePath, 'utf-8');
|
|
152
|
+
} catch {
|
|
153
|
+
return [];
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const warnings: Warning[] = [];
|
|
157
|
+
for (const detector of applicableDetectors) {
|
|
158
|
+
try {
|
|
159
|
+
warnings.push(...detector.detect(filePath, content));
|
|
160
|
+
} catch {
|
|
161
|
+
// Detector failure is non-critical
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
this.pendingWarnings.push(...warnings);
|
|
166
|
+
return warnings;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
getPendingWarnings(): Warning[] {
|
|
170
|
+
return [...this.pendingWarnings];
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
clearWarnings(): void {
|
|
174
|
+
this.pendingWarnings = [];
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// ─── Pattern Surfacing ──────────────────────────────────────────
|
|
178
|
+
|
|
179
|
+
surfacePatterns(filePath: string): SurfacedPattern[] {
|
|
180
|
+
const now = Date.now();
|
|
181
|
+
const lastSurfaced = this.cooldownMap.get(filePath);
|
|
182
|
+
if (lastSurfaced && now - lastSurfaced < this.config.cooldownMs) return [];
|
|
183
|
+
|
|
184
|
+
const ext = extname(filePath);
|
|
185
|
+
const filename = filePath.split('/').pop() ?? '';
|
|
186
|
+
|
|
187
|
+
// Build search query from file context
|
|
188
|
+
const terms: string[] = [];
|
|
189
|
+
if (ext === '.ts' || ext === '.tsx') terms.push('typescript');
|
|
190
|
+
if (ext === '.css') terms.push('css', 'styling');
|
|
191
|
+
if (ext === '.json') terms.push('configuration');
|
|
192
|
+
if (filename.includes('test')) terms.push('testing');
|
|
193
|
+
if (filename.includes('component')) terms.push('component');
|
|
194
|
+
|
|
195
|
+
if (terms.length === 0) return [];
|
|
196
|
+
|
|
197
|
+
const query = terms.join(' ');
|
|
198
|
+
try {
|
|
199
|
+
const results = this.vault.search(query, { limit: 5 });
|
|
200
|
+
const patterns: SurfacedPattern[] = [];
|
|
201
|
+
|
|
202
|
+
for (const r of results) {
|
|
203
|
+
const relevance = r.score > 0 ? Math.min(1, r.score / (results[0]?.score || 1)) : 0;
|
|
204
|
+
if (relevance < this.config.minPatternConfidence) continue;
|
|
205
|
+
|
|
206
|
+
patterns.push({
|
|
207
|
+
entryId: r.entry.id,
|
|
208
|
+
title: r.entry.title,
|
|
209
|
+
domain: r.entry.domain,
|
|
210
|
+
relevance,
|
|
211
|
+
trigger: filePath,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
if (patterns.length > 0) {
|
|
216
|
+
this.cooldownMap.set(filePath, now);
|
|
217
|
+
this.surfacedPatterns.push(...patterns);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
return patterns;
|
|
221
|
+
} catch {
|
|
222
|
+
return [];
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
getSurfacedPatterns(): SurfacedPattern[] {
|
|
227
|
+
return [...this.surfacedPatterns];
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
clearSurfacedPatterns(): void {
|
|
231
|
+
this.surfacedPatterns = [];
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// ─── Clarification ──────────────────────────────────────────────
|
|
235
|
+
|
|
236
|
+
generateClarification(prompt: string, confidence: number): ClarificationQuestion | null {
|
|
237
|
+
if (confidence >= 0.7) return null; // High confidence — no need to clarify
|
|
238
|
+
|
|
239
|
+
const words = prompt.toLowerCase().split(/\s+/);
|
|
240
|
+
const hasAction = words.some((w) =>
|
|
241
|
+
['create', 'fix', 'build', 'add', 'remove', 'update', 'improve', 'deploy'].includes(w),
|
|
242
|
+
);
|
|
243
|
+
const hasTarget = words.length > 3;
|
|
244
|
+
|
|
245
|
+
if (!hasAction && !hasTarget) {
|
|
246
|
+
return {
|
|
247
|
+
question: 'Could you clarify what you would like me to do? I need an action and a target.',
|
|
248
|
+
reason: 'No clear action or target detected in the prompt.',
|
|
249
|
+
options: [
|
|
250
|
+
'Create something new',
|
|
251
|
+
'Fix an existing issue',
|
|
252
|
+
'Review or validate code',
|
|
253
|
+
'Explore the codebase',
|
|
254
|
+
],
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
if (!hasAction) {
|
|
259
|
+
return {
|
|
260
|
+
question: 'What action would you like me to take?',
|
|
261
|
+
reason: 'The prompt describes a target but no clear action.',
|
|
262
|
+
options: ['Build', 'Fix', 'Review', 'Improve', 'Deploy'],
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
if (confidence < 0.3) {
|
|
267
|
+
return {
|
|
268
|
+
question: 'Could you provide more context about what you need?',
|
|
269
|
+
reason: 'The prompt is too brief to determine intent reliably.',
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// ─── Private Helpers ────────────────────────────────────────────
|
|
277
|
+
|
|
278
|
+
private debounceChange(filePath: string): void {
|
|
279
|
+
const existing = this.debounceTimers.get(filePath);
|
|
280
|
+
if (existing) clearTimeout(existing);
|
|
281
|
+
|
|
282
|
+
this.debounceTimers.set(
|
|
283
|
+
filePath,
|
|
284
|
+
setTimeout(() => {
|
|
285
|
+
this.debounceTimers.delete(filePath);
|
|
286
|
+
this.processChange(filePath);
|
|
287
|
+
}, this.config.debounceMs),
|
|
288
|
+
);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
private processChange(filePath: string): void {
|
|
292
|
+
this.changesProcessed++;
|
|
293
|
+
|
|
294
|
+
const change: FileChange = {
|
|
295
|
+
path: filePath,
|
|
296
|
+
type: existsSync(filePath) ? 'modify' : 'delete',
|
|
297
|
+
timestamp: Date.now(),
|
|
298
|
+
};
|
|
299
|
+
|
|
300
|
+
// Notify listeners
|
|
301
|
+
for (const listener of this.changeListeners) {
|
|
302
|
+
try {
|
|
303
|
+
listener(change);
|
|
304
|
+
} catch {
|
|
305
|
+
// Listener failure is non-critical
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
// Auto-scan for warnings if detectors are registered
|
|
310
|
+
if (this.detectors.length > 0 && change.type !== 'delete') {
|
|
311
|
+
this.scanFile(filePath);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// Auto-surface patterns
|
|
315
|
+
this.surfacePatterns(filePath);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
private shouldIgnore(filePath: string): boolean {
|
|
319
|
+
return this.config.ignorePatterns.some((pattern) => filePath.includes(pattern));
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
private hasValidExtension(filePath: string): boolean {
|
|
323
|
+
const ext = extname(filePath);
|
|
324
|
+
return this.config.extensions.includes(ext);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { AgencyManager } from './agency-manager.js';
|
|
2
|
+
export type {
|
|
3
|
+
ChangeType,
|
|
4
|
+
FileChange,
|
|
5
|
+
FileChangeListener,
|
|
6
|
+
WarningSeverity,
|
|
7
|
+
Warning,
|
|
8
|
+
WarningDetector,
|
|
9
|
+
SurfacedPattern,
|
|
10
|
+
ClarificationQuestion,
|
|
11
|
+
AgencyConfig,
|
|
12
|
+
AgencyStatus,
|
|
13
|
+
} from './types.js';
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agency mode types — proactive file watching, pattern surfacing, warning detection.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
// ─── File Watching ──────────────────────────────────────────────────
|
|
6
|
+
|
|
7
|
+
export type ChangeType = 'create' | 'modify' | 'delete';
|
|
8
|
+
|
|
9
|
+
export interface FileChange {
|
|
10
|
+
path: string;
|
|
11
|
+
type: ChangeType;
|
|
12
|
+
timestamp: number;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export type FileChangeListener = (change: FileChange) => void;
|
|
16
|
+
|
|
17
|
+
// ─── Warning Detection ──────────────────────────────────────────────
|
|
18
|
+
|
|
19
|
+
export type WarningSeverity = 'critical' | 'warning' | 'info';
|
|
20
|
+
|
|
21
|
+
export interface Warning {
|
|
22
|
+
id: string;
|
|
23
|
+
file: string;
|
|
24
|
+
line?: number;
|
|
25
|
+
severity: WarningSeverity;
|
|
26
|
+
category: string;
|
|
27
|
+
message: string;
|
|
28
|
+
suggestion?: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Pluggable warning detector. Agents define their own domain-specific detectors.
|
|
33
|
+
*/
|
|
34
|
+
export interface WarningDetector {
|
|
35
|
+
/** Unique name for this detector. */
|
|
36
|
+
name: string;
|
|
37
|
+
/** File extensions this detector applies to (e.g., ['.ts', '.tsx']). */
|
|
38
|
+
extensions: string[];
|
|
39
|
+
/** Detect warnings in file content. */
|
|
40
|
+
detect(filePath: string, content: string): Warning[];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// ─── Pattern Surfacing ──────────────────────────────────────────────
|
|
44
|
+
|
|
45
|
+
export interface SurfacedPattern {
|
|
46
|
+
entryId: string;
|
|
47
|
+
title: string;
|
|
48
|
+
domain: string;
|
|
49
|
+
relevance: number;
|
|
50
|
+
trigger: string;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// ─── Clarification ──────────────────────────────────────────────────
|
|
54
|
+
|
|
55
|
+
export interface ClarificationQuestion {
|
|
56
|
+
question: string;
|
|
57
|
+
reason: string;
|
|
58
|
+
options?: string[];
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// ─── Agency Config ──────────────────────────────────────────────────
|
|
62
|
+
|
|
63
|
+
export interface AgencyConfig {
|
|
64
|
+
/** Enable/disable agency mode. Default: false. */
|
|
65
|
+
enabled?: boolean;
|
|
66
|
+
/** Directories to watch (relative to project root). Default: ['.'] */
|
|
67
|
+
watchPaths?: string[];
|
|
68
|
+
/** Glob patterns to ignore. Default: common ignores. */
|
|
69
|
+
ignorePatterns?: string[];
|
|
70
|
+
/** File extensions to watch. Default: ['.ts', '.tsx', '.js', '.jsx', '.css', '.json'] */
|
|
71
|
+
extensions?: string[];
|
|
72
|
+
/** Debounce interval in ms for file change batching. Default: 300. */
|
|
73
|
+
debounceMs?: number;
|
|
74
|
+
/** Minimum confidence to surface a pattern. Default: 0.5. */
|
|
75
|
+
minPatternConfidence?: number;
|
|
76
|
+
/** Cooldown per file path (ms) before re-surfacing. Default: 300000 (5 min). */
|
|
77
|
+
cooldownMs?: number;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export interface AgencyStatus {
|
|
81
|
+
enabled: boolean;
|
|
82
|
+
watching: boolean;
|
|
83
|
+
watchPaths: string[];
|
|
84
|
+
detectorCount: number;
|
|
85
|
+
pendingWarnings: number;
|
|
86
|
+
surfacedPatterns: number;
|
|
87
|
+
fileChangesProcessed: number;
|
|
88
|
+
}
|
package/src/brain/brain.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Vault } from '../vault/vault.js';
|
|
2
2
|
import type { SearchResult } from '../vault/vault.js';
|
|
3
3
|
import type { IntelligenceEntry } from '../intelligence/types.js';
|
|
4
|
+
import { computeContentHash } from '../vault/content-hash.js';
|
|
4
5
|
import {
|
|
5
6
|
tokenize,
|
|
6
7
|
calculateTf,
|
|
@@ -22,17 +23,6 @@ import type {
|
|
|
22
23
|
FeedbackStats,
|
|
23
24
|
} from './types.js';
|
|
24
25
|
|
|
25
|
-
// Re-export types for backward compatibility
|
|
26
|
-
export type {
|
|
27
|
-
ScoringWeights,
|
|
28
|
-
ScoreBreakdown,
|
|
29
|
-
RankedResult,
|
|
30
|
-
SearchOptions,
|
|
31
|
-
CaptureResult,
|
|
32
|
-
BrainStats,
|
|
33
|
-
QueryContext,
|
|
34
|
-
} from './types.js';
|
|
35
|
-
|
|
36
26
|
// ─── Severity scoring ──────────────────────────────────────────────
|
|
37
27
|
|
|
38
28
|
const SEVERITY_SCORES: Record<string, number> = {
|
|
@@ -182,6 +172,7 @@ export class Brain {
|
|
|
182
172
|
|
|
183
173
|
if (rawResults.length === 0) return [];
|
|
184
174
|
|
|
175
|
+
const seedCount = rawResults.length;
|
|
185
176
|
const queryTokens = tokenize(query);
|
|
186
177
|
const queryTags = options?.tags ?? [];
|
|
187
178
|
const queryDomain = options?.domain;
|
|
@@ -207,6 +198,17 @@ export class Brain {
|
|
|
207
198
|
});
|
|
208
199
|
|
|
209
200
|
ranked.sort((a, b) => b.score - a.score);
|
|
201
|
+
|
|
202
|
+
// Small corpus guard: when the FTS seed is small (< 50 entries), TF-IDF scoring
|
|
203
|
+
// becomes too aggressive and filters out relevant results. If filtering to `limit`
|
|
204
|
+
// would discard more than half the seed, return all seed results sorted by score.
|
|
205
|
+
if (seedCount < 50 && limit < seedCount && ranked.length > limit) {
|
|
206
|
+
const wouldKeep = limit;
|
|
207
|
+
if (wouldKeep < seedCount / 2) {
|
|
208
|
+
return ranked.slice(0, seedCount);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
210
212
|
return ranked.slice(0, limit);
|
|
211
213
|
}
|
|
212
214
|
|
|
@@ -248,8 +250,22 @@ export class Brain {
|
|
|
248
250
|
why: entry.why,
|
|
249
251
|
tags: mergedTags,
|
|
250
252
|
appliesTo: entry.appliesTo,
|
|
253
|
+
tier: entry.tier,
|
|
251
254
|
};
|
|
252
255
|
|
|
256
|
+
// Content-hash dedup: check after enrichment so tags match the stored hash
|
|
257
|
+
const contentHash = computeContentHash(fullEntry);
|
|
258
|
+
const existingByHash = this.vault.findByContentHash(contentHash);
|
|
259
|
+
if (existingByHash && existingByHash !== entry.id) {
|
|
260
|
+
return {
|
|
261
|
+
captured: false,
|
|
262
|
+
id: entry.id,
|
|
263
|
+
autoTags,
|
|
264
|
+
duplicate: { id: existingByHash, similarity: 1.0 },
|
|
265
|
+
blocked: true,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
|
|
253
269
|
this.vault.add(fullEntry);
|
|
254
270
|
this.updateVocabularyIncremental(fullEntry);
|
|
255
271
|
|
|
@@ -15,6 +15,9 @@ import type {
|
|
|
15
15
|
StrengthsQuery,
|
|
16
16
|
BrainSession,
|
|
17
17
|
SessionLifecycleInput,
|
|
18
|
+
SessionListQuery,
|
|
19
|
+
SessionQuality,
|
|
20
|
+
SessionReplay,
|
|
18
21
|
KnowledgeProposal,
|
|
19
22
|
ExtractionResult,
|
|
20
23
|
GlobalPattern,
|
|
@@ -240,6 +243,106 @@ export class BrainIntelligence {
|
|
|
240
243
|
return { archived: result.changes };
|
|
241
244
|
}
|
|
242
245
|
|
|
246
|
+
// ─── Session Query & Quality ─────────────────────────────────────
|
|
247
|
+
|
|
248
|
+
getSessionById(id: string): BrainSession | null {
|
|
249
|
+
return this.getSession(id);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
listSessions(query?: SessionListQuery): BrainSession[] {
|
|
253
|
+
const conditions: string[] = [];
|
|
254
|
+
const values: unknown[] = [];
|
|
255
|
+
|
|
256
|
+
if (query?.domain) {
|
|
257
|
+
conditions.push('domain = ?');
|
|
258
|
+
values.push(query.domain);
|
|
259
|
+
}
|
|
260
|
+
if (query?.active === true) {
|
|
261
|
+
conditions.push('ended_at IS NULL');
|
|
262
|
+
} else if (query?.active === false) {
|
|
263
|
+
conditions.push('ended_at IS NOT NULL');
|
|
264
|
+
}
|
|
265
|
+
if (query?.extracted === true) {
|
|
266
|
+
conditions.push('extracted_at IS NOT NULL');
|
|
267
|
+
} else if (query?.extracted === false) {
|
|
268
|
+
conditions.push('extracted_at IS NULL');
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
const where = conditions.length > 0 ? 'WHERE ' + conditions.join(' AND ') : '';
|
|
272
|
+
const limit = query?.limit ?? 50;
|
|
273
|
+
const offset = query?.offset ?? 0;
|
|
274
|
+
values.push(limit, offset);
|
|
275
|
+
|
|
276
|
+
const rows = this.provider.all<{
|
|
277
|
+
id: string;
|
|
278
|
+
started_at: string;
|
|
279
|
+
ended_at: string | null;
|
|
280
|
+
domain: string | null;
|
|
281
|
+
context: string | null;
|
|
282
|
+
tools_used: string;
|
|
283
|
+
files_modified: string;
|
|
284
|
+
plan_id: string | null;
|
|
285
|
+
plan_outcome: string | null;
|
|
286
|
+
extracted_at: string | null;
|
|
287
|
+
}>(`SELECT * FROM brain_sessions ${where} ORDER BY started_at DESC LIMIT ? OFFSET ?`, values);
|
|
288
|
+
|
|
289
|
+
return rows.map((r) => this.rowToSession(r));
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
computeSessionQuality(sessionId: string): SessionQuality {
|
|
293
|
+
const session = this.getSession(sessionId);
|
|
294
|
+
if (!session) throw new Error('Session not found: ' + sessionId);
|
|
295
|
+
|
|
296
|
+
// Completeness (0-25): session ended + has context + has domain
|
|
297
|
+
let completeness = 0;
|
|
298
|
+
if (session.endedAt) completeness += 10;
|
|
299
|
+
if (session.context) completeness += 8;
|
|
300
|
+
if (session.domain) completeness += 7;
|
|
301
|
+
|
|
302
|
+
// Artifact density (0-25): files modified
|
|
303
|
+
const fileCount = session.filesModified.length;
|
|
304
|
+
const artifactDensity = Math.min(25, fileCount * 5);
|
|
305
|
+
|
|
306
|
+
// Tool engagement (0-25): unique tools used
|
|
307
|
+
const uniqueTools = new Set(session.toolsUsed).size;
|
|
308
|
+
const toolEngagement = Math.min(25, uniqueTools * 5);
|
|
309
|
+
|
|
310
|
+
// Outcome clarity (0-25): plan outcome + extraction status
|
|
311
|
+
let outcomeClarity = 0;
|
|
312
|
+
if (session.planId) outcomeClarity += 8;
|
|
313
|
+
if (session.planOutcome === 'completed') outcomeClarity += 10;
|
|
314
|
+
else if (session.planOutcome === 'abandoned') outcomeClarity += 5;
|
|
315
|
+
else if (session.planOutcome) outcomeClarity += 7;
|
|
316
|
+
if (session.extractedAt) outcomeClarity += 7;
|
|
317
|
+
|
|
318
|
+
const overall = completeness + artifactDensity + toolEngagement + outcomeClarity;
|
|
319
|
+
|
|
320
|
+
return {
|
|
321
|
+
sessionId,
|
|
322
|
+
overall,
|
|
323
|
+
completeness,
|
|
324
|
+
artifactDensity,
|
|
325
|
+
toolEngagement,
|
|
326
|
+
outcomeClarity,
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
replaySession(sessionId: string): SessionReplay {
|
|
331
|
+
const session = this.getSession(sessionId);
|
|
332
|
+
if (!session) throw new Error('Session not found: ' + sessionId);
|
|
333
|
+
|
|
334
|
+
const quality = this.computeSessionQuality(sessionId);
|
|
335
|
+
const proposals = this.getProposals({ sessionId });
|
|
336
|
+
|
|
337
|
+
let durationMinutes: number | null = null;
|
|
338
|
+
if (session.startedAt && session.endedAt) {
|
|
339
|
+
const ms = new Date(session.endedAt).getTime() - new Date(session.startedAt).getTime();
|
|
340
|
+
durationMinutes = Math.round(ms / 60000);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
return { session, quality, proposals, durationMinutes };
|
|
344
|
+
}
|
|
345
|
+
|
|
243
346
|
// ─── Strength Scoring ─────────────────────────────────────────────
|
|
244
347
|
|
|
245
348
|
computeStrengths(): PatternStrength[] {
|
package/src/brain/types.ts
CHANGED
|
@@ -212,3 +212,29 @@ export interface BrainImportResult {
|
|
|
212
212
|
domainProfiles: number;
|
|
213
213
|
};
|
|
214
214
|
}
|
|
215
|
+
|
|
216
|
+
// ─── Session Management Types ─────────────────────────────────────
|
|
217
|
+
|
|
218
|
+
export interface SessionListQuery {
|
|
219
|
+
domain?: string;
|
|
220
|
+
active?: boolean;
|
|
221
|
+
extracted?: boolean;
|
|
222
|
+
limit?: number;
|
|
223
|
+
offset?: number;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
export interface SessionQuality {
|
|
227
|
+
sessionId: string;
|
|
228
|
+
overall: number;
|
|
229
|
+
completeness: number;
|
|
230
|
+
artifactDensity: number;
|
|
231
|
+
toolEngagement: number;
|
|
232
|
+
outcomeClarity: number;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
export interface SessionReplay {
|
|
236
|
+
session: BrainSession;
|
|
237
|
+
quality: SessionQuality;
|
|
238
|
+
proposals: KnowledgeProposal[];
|
|
239
|
+
durationMinutes: number | null;
|
|
240
|
+
}
|