@soleri/core 2.10.0 → 2.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agency/agency-manager.d.ts +47 -0
- package/dist/agency/agency-manager.d.ts.map +1 -0
- package/dist/agency/agency-manager.js +281 -0
- package/dist/agency/agency-manager.js.map +1 -0
- package/dist/agency/index.d.ts +3 -0
- package/dist/agency/index.d.ts.map +1 -0
- package/dist/agency/index.js +2 -0
- package/dist/agency/index.js.map +1 -0
- package/dist/agency/types.d.ts +69 -0
- package/dist/agency/types.d.ts.map +1 -0
- package/dist/agency/types.js +5 -0
- package/dist/agency/types.js.map +1 -0
- package/dist/brain/brain.d.ts +0 -1
- package/dist/brain/brain.d.ts.map +1 -1
- package/dist/brain/brain.js +14 -0
- package/dist/brain/brain.js.map +1 -1
- package/dist/brain/intelligence.d.ts +5 -1
- package/dist/brain/intelligence.d.ts.map +1 -1
- package/dist/brain/intelligence.js +83 -0
- package/dist/brain/intelligence.js.map +1 -1
- package/dist/brain/types.d.ts +21 -0
- package/dist/brain/types.d.ts.map +1 -1
- package/dist/chat/agent-loop-types.d.ts +82 -0
- package/dist/chat/agent-loop-types.d.ts.map +1 -0
- package/dist/chat/agent-loop-types.js +8 -0
- package/dist/chat/agent-loop-types.js.map +1 -0
- package/dist/chat/agent-loop.d.ts +19 -0
- package/dist/chat/agent-loop.d.ts.map +1 -0
- package/dist/chat/agent-loop.js +261 -0
- package/dist/chat/agent-loop.js.map +1 -0
- package/dist/chat/auth-manager.d.ts +49 -0
- package/dist/chat/auth-manager.d.ts.map +1 -0
- package/dist/chat/auth-manager.js +152 -0
- package/dist/chat/auth-manager.js.map +1 -0
- package/dist/chat/browser-session.d.ts +86 -0
- package/dist/chat/browser-session.d.ts.map +1 -0
- package/dist/chat/browser-session.js +143 -0
- package/dist/chat/browser-session.js.map +1 -0
- package/dist/chat/cancellation.d.ts +54 -0
- package/dist/chat/cancellation.d.ts.map +1 -0
- package/dist/chat/cancellation.js +80 -0
- package/dist/chat/cancellation.js.map +1 -0
- package/dist/chat/chat-session.d.ts +86 -0
- package/dist/chat/chat-session.d.ts.map +1 -0
- package/dist/chat/chat-session.js +252 -0
- package/dist/chat/chat-session.js.map +1 -0
- package/dist/chat/file-handler.d.ts +63 -0
- package/dist/chat/file-handler.d.ts.map +1 -0
- package/dist/chat/file-handler.js +182 -0
- package/dist/chat/file-handler.js.map +1 -0
- package/dist/chat/fragment-buffer.d.ts +49 -0
- package/dist/chat/fragment-buffer.d.ts.map +1 -0
- package/dist/chat/fragment-buffer.js +130 -0
- package/dist/chat/fragment-buffer.js.map +1 -0
- package/dist/chat/index.d.ts +24 -0
- package/dist/chat/index.d.ts.map +1 -0
- package/dist/chat/index.js +15 -0
- package/dist/chat/index.js.map +1 -0
- package/dist/chat/mcp-bridge.d.ts +60 -0
- package/dist/chat/mcp-bridge.d.ts.map +1 -0
- package/dist/chat/mcp-bridge.js +111 -0
- package/dist/chat/mcp-bridge.js.map +1 -0
- package/dist/chat/notifications.d.ts +82 -0
- package/dist/chat/notifications.d.ts.map +1 -0
- package/dist/chat/notifications.js +119 -0
- package/dist/chat/notifications.js.map +1 -0
- package/dist/chat/output-compressor.d.ts +30 -0
- package/dist/chat/output-compressor.d.ts.map +1 -0
- package/dist/chat/output-compressor.js +95 -0
- package/dist/chat/output-compressor.js.map +1 -0
- package/dist/chat/queue.d.ts +91 -0
- package/dist/chat/queue.d.ts.map +1 -0
- package/dist/chat/queue.js +146 -0
- package/dist/chat/queue.js.map +1 -0
- package/dist/chat/response-chunker.d.ts +29 -0
- package/dist/chat/response-chunker.d.ts.map +1 -0
- package/dist/chat/response-chunker.js +163 -0
- package/dist/chat/response-chunker.js.map +1 -0
- package/dist/chat/self-update.d.ts +62 -0
- package/dist/chat/self-update.d.ts.map +1 -0
- package/dist/chat/self-update.js +90 -0
- package/dist/chat/self-update.js.map +1 -0
- package/dist/chat/types.d.ts +105 -0
- package/dist/chat/types.d.ts.map +1 -0
- package/dist/chat/types.js +8 -0
- package/dist/chat/types.js.map +1 -0
- package/dist/chat/voice.d.ts +39 -0
- package/dist/chat/voice.d.ts.map +1 -0
- package/dist/chat/voice.js +80 -0
- package/dist/chat/voice.js.map +1 -0
- package/dist/claudemd/compose.d.ts +31 -0
- package/dist/claudemd/compose.d.ts.map +1 -0
- package/dist/claudemd/compose.js +105 -0
- package/dist/claudemd/compose.js.map +1 -0
- package/dist/claudemd/index.d.ts +5 -0
- package/dist/claudemd/index.d.ts.map +1 -0
- package/dist/claudemd/index.js +3 -0
- package/dist/claudemd/index.js.map +1 -0
- package/dist/claudemd/inject.d.ts +31 -0
- package/dist/claudemd/inject.d.ts.map +1 -0
- package/dist/claudemd/inject.js +157 -0
- package/dist/claudemd/inject.js.map +1 -0
- package/dist/claudemd/types.d.ts +41 -0
- package/dist/claudemd/types.d.ts.map +1 -0
- package/dist/claudemd/types.js +5 -0
- package/dist/claudemd/types.js.map +1 -0
- package/dist/context/context-engine.d.ts +31 -0
- package/dist/context/context-engine.d.ts.map +1 -0
- package/dist/context/context-engine.js +245 -0
- package/dist/context/context-engine.js.map +1 -0
- package/dist/context/index.d.ts +3 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +2 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/types.d.ts +54 -0
- package/dist/context/types.d.ts.map +1 -0
- package/dist/context/types.js +5 -0
- package/dist/context/types.js.map +1 -0
- package/dist/enforcement/adapters/claude-code.d.ts +18 -0
- package/dist/enforcement/adapters/claude-code.d.ts.map +1 -0
- package/dist/enforcement/adapters/claude-code.js +106 -0
- package/dist/enforcement/adapters/claude-code.js.map +1 -0
- package/dist/enforcement/adapters/index.d.ts +2 -0
- package/dist/enforcement/adapters/index.d.ts.map +1 -0
- package/dist/enforcement/adapters/index.js +2 -0
- package/dist/enforcement/adapters/index.js.map +1 -0
- package/dist/enforcement/index.d.ts +4 -0
- package/dist/enforcement/index.d.ts.map +1 -0
- package/dist/enforcement/index.js +3 -0
- package/dist/enforcement/index.js.map +1 -0
- package/dist/enforcement/registry.d.ts +23 -0
- package/dist/enforcement/registry.d.ts.map +1 -0
- package/dist/enforcement/registry.js +63 -0
- package/dist/enforcement/registry.js.map +1 -0
- package/dist/enforcement/types.d.ts +51 -0
- package/dist/enforcement/types.d.ts.map +1 -0
- package/dist/enforcement/types.js +8 -0
- package/dist/enforcement/types.js.map +1 -0
- package/dist/facades/facade-factory.d.ts +10 -3
- package/dist/facades/facade-factory.d.ts.map +1 -1
- package/dist/facades/facade-factory.js +94 -5
- package/dist/facades/facade-factory.js.map +1 -1
- package/dist/facades/types.d.ts +15 -1
- package/dist/facades/types.d.ts.map +1 -1
- package/dist/facades/types.js +6 -0
- package/dist/facades/types.js.map +1 -1
- package/dist/health/health-registry.d.ts +40 -0
- package/dist/health/health-registry.d.ts.map +1 -0
- package/dist/health/health-registry.js +134 -0
- package/dist/health/health-registry.js.map +1 -0
- package/dist/health/index.d.ts +5 -0
- package/dist/health/index.d.ts.map +1 -0
- package/dist/health/index.js +3 -0
- package/dist/health/index.js.map +1 -0
- package/dist/health/vault-integrity.d.ts +13 -0
- package/dist/health/vault-integrity.d.ts.map +1 -0
- package/dist/health/vault-integrity.js +49 -0
- package/dist/health/vault-integrity.js.map +1 -0
- package/dist/index.d.ts +67 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +51 -3
- package/dist/index.js.map +1 -1
- package/dist/intake/intake-pipeline.d.ts +0 -7
- package/dist/intake/intake-pipeline.d.ts.map +1 -1
- package/dist/intake/intake-pipeline.js +1 -1
- package/dist/intake/intake-pipeline.js.map +1 -1
- package/dist/intelligence/types.d.ts +1 -0
- package/dist/intelligence/types.d.ts.map +1 -1
- package/dist/migrations/index.d.ts +6 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +5 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/migration-runner.d.ts +51 -0
- package/dist/migrations/migration-runner.d.ts.map +1 -0
- package/dist/migrations/migration-runner.js +141 -0
- package/dist/migrations/migration-runner.js.map +1 -0
- package/dist/packs/index.d.ts +10 -0
- package/dist/packs/index.d.ts.map +1 -0
- package/dist/packs/index.js +8 -0
- package/dist/packs/index.js.map +1 -0
- package/dist/packs/lockfile.d.ts +97 -0
- package/dist/packs/lockfile.d.ts.map +1 -0
- package/dist/packs/lockfile.js +129 -0
- package/dist/packs/lockfile.js.map +1 -0
- package/dist/packs/pack-installer.d.ts +41 -0
- package/dist/packs/pack-installer.d.ts.map +1 -0
- package/dist/packs/pack-installer.js +253 -0
- package/dist/packs/pack-installer.js.map +1 -0
- package/dist/packs/resolver.d.ts +51 -0
- package/dist/packs/resolver.d.ts.map +1 -0
- package/dist/packs/resolver.js +195 -0
- package/dist/packs/resolver.js.map +1 -0
- package/dist/packs/types.d.ts +186 -0
- package/dist/packs/types.d.ts.map +1 -0
- package/dist/packs/types.js +69 -0
- package/dist/packs/types.js.map +1 -0
- package/dist/persistence/postgres-provider.d.ts +42 -7
- package/dist/persistence/postgres-provider.d.ts.map +1 -1
- package/dist/persistence/postgres-provider.js +187 -46
- package/dist/persistence/postgres-provider.js.map +1 -1
- package/dist/playbooks/index.d.ts +2 -0
- package/dist/playbooks/index.d.ts.map +1 -1
- package/dist/playbooks/index.js +2 -0
- package/dist/playbooks/index.js.map +1 -1
- package/dist/playbooks/playbook-executor.d.ts +100 -0
- package/dist/playbooks/playbook-executor.d.ts.map +1 -0
- package/dist/playbooks/playbook-executor.js +207 -0
- package/dist/playbooks/playbook-executor.js.map +1 -0
- package/dist/plugins/index.d.ts +7 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +7 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/plugin-loader.d.ts +28 -0
- package/dist/plugins/plugin-loader.d.ts.map +1 -0
- package/dist/plugins/plugin-loader.js +150 -0
- package/dist/plugins/plugin-loader.js.map +1 -0
- package/dist/plugins/plugin-registry.d.ts +58 -0
- package/dist/plugins/plugin-registry.d.ts.map +1 -0
- package/dist/plugins/plugin-registry.js +157 -0
- package/dist/plugins/plugin-registry.js.map +1 -0
- package/dist/plugins/types.d.ts +180 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +48 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/runtime/admin-extra-ops.d.ts.map +1 -1
- package/dist/runtime/admin-extra-ops.js +181 -8
- package/dist/runtime/admin-extra-ops.js.map +1 -1
- package/dist/runtime/capture-ops.d.ts.map +1 -1
- package/dist/runtime/capture-ops.js +106 -7
- package/dist/runtime/capture-ops.js.map +1 -1
- package/dist/runtime/deprecation.d.ts +33 -0
- package/dist/runtime/deprecation.d.ts.map +1 -0
- package/dist/runtime/deprecation.js +41 -0
- package/dist/runtime/deprecation.js.map +1 -0
- package/dist/runtime/facades/admin-facade.d.ts.map +1 -1
- package/dist/runtime/facades/admin-facade.js +12 -1
- package/dist/runtime/facades/admin-facade.js.map +1 -1
- package/dist/runtime/facades/agency-facade.d.ts +7 -0
- package/dist/runtime/facades/agency-facade.d.ts.map +1 -0
- package/dist/runtime/facades/agency-facade.js +103 -0
- package/dist/runtime/facades/agency-facade.js.map +1 -0
- package/dist/runtime/facades/brain-facade.d.ts.map +1 -1
- package/dist/runtime/facades/brain-facade.js +58 -0
- package/dist/runtime/facades/brain-facade.js.map +1 -1
- package/dist/runtime/facades/chat-facade.d.ts +7 -0
- package/dist/runtime/facades/chat-facade.d.ts.map +1 -0
- package/dist/runtime/facades/chat-facade.js +808 -0
- package/dist/runtime/facades/chat-facade.js.map +1 -0
- package/dist/runtime/facades/context-facade.d.ts +7 -0
- package/dist/runtime/facades/context-facade.d.ts.map +1 -0
- package/dist/runtime/facades/context-facade.js +45 -0
- package/dist/runtime/facades/context-facade.js.map +1 -0
- package/dist/runtime/facades/index.d.ts.map +1 -1
- package/dist/runtime/facades/index.js +18 -0
- package/dist/runtime/facades/index.js.map +1 -1
- package/dist/runtime/facades/vault-facade.d.ts.map +1 -1
- package/dist/runtime/facades/vault-facade.js +247 -1
- package/dist/runtime/facades/vault-facade.js.map +1 -1
- package/dist/runtime/feature-flags.d.ts +18 -0
- package/dist/runtime/feature-flags.d.ts.map +1 -0
- package/dist/runtime/feature-flags.js +90 -0
- package/dist/runtime/feature-flags.js.map +1 -0
- package/dist/runtime/pack-ops.d.ts +9 -0
- package/dist/runtime/pack-ops.d.ts.map +1 -0
- package/dist/runtime/pack-ops.js +76 -0
- package/dist/runtime/pack-ops.js.map +1 -0
- package/dist/runtime/playbook-ops.d.ts +3 -7
- package/dist/runtime/playbook-ops.d.ts.map +1 -1
- package/dist/runtime/playbook-ops.js +101 -10
- package/dist/runtime/playbook-ops.js.map +1 -1
- package/dist/runtime/plugin-ops.d.ts +9 -0
- package/dist/runtime/plugin-ops.d.ts.map +1 -0
- package/dist/runtime/plugin-ops.js +235 -0
- package/dist/runtime/plugin-ops.js.map +1 -0
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +72 -5
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/telemetry-ops.d.ts +10 -0
- package/dist/runtime/telemetry-ops.d.ts.map +1 -0
- package/dist/runtime/telemetry-ops.js +53 -0
- package/dist/runtime/telemetry-ops.js.map +1 -0
- package/dist/runtime/types.d.ts +35 -0
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/vault-sharing-ops.d.ts +13 -0
- package/dist/runtime/vault-sharing-ops.d.ts.map +1 -0
- package/dist/runtime/vault-sharing-ops.js +345 -0
- package/dist/runtime/vault-sharing-ops.js.map +1 -0
- package/dist/streams/index.d.ts +1 -1
- package/dist/streams/index.d.ts.map +1 -1
- package/dist/streams/index.js +1 -1
- package/dist/streams/index.js.map +1 -1
- package/dist/streams/replayable-stream.d.ts +13 -1
- package/dist/streams/replayable-stream.d.ts.map +1 -1
- package/dist/streams/replayable-stream.js +27 -3
- package/dist/streams/replayable-stream.js.map +1 -1
- package/dist/text/similarity.d.ts +0 -1
- package/dist/text/similarity.d.ts.map +1 -1
- package/dist/text/similarity.js +1 -1
- package/dist/text/similarity.js.map +1 -1
- package/dist/transport/http-server.d.ts +56 -0
- package/dist/transport/http-server.d.ts.map +1 -0
- package/dist/transport/http-server.js +210 -0
- package/dist/transport/http-server.js.map +1 -0
- package/dist/transport/index.d.ts +11 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +10 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/lsp-server.d.ts +140 -0
- package/dist/transport/lsp-server.d.ts.map +1 -0
- package/dist/transport/lsp-server.js +239 -0
- package/dist/transport/lsp-server.js.map +1 -0
- package/dist/transport/rate-limiter.d.ts +35 -0
- package/dist/transport/rate-limiter.d.ts.map +1 -0
- package/dist/transport/rate-limiter.js +72 -0
- package/dist/transport/rate-limiter.js.map +1 -0
- package/dist/transport/session-manager.d.ts +49 -0
- package/dist/transport/session-manager.d.ts.map +1 -0
- package/dist/transport/session-manager.js +83 -0
- package/dist/transport/session-manager.js.map +1 -0
- package/dist/transport/token-auth.d.ts +29 -0
- package/dist/transport/token-auth.d.ts.map +1 -0
- package/dist/transport/token-auth.js +84 -0
- package/dist/transport/token-auth.js.map +1 -0
- package/dist/transport/types.d.ts +61 -0
- package/dist/transport/types.d.ts.map +1 -0
- package/dist/transport/types.js +5 -0
- package/dist/transport/types.js.map +1 -0
- package/dist/transport/ws-server.d.ts +78 -0
- package/dist/transport/ws-server.d.ts.map +1 -0
- package/dist/transport/ws-server.js +342 -0
- package/dist/transport/ws-server.js.map +1 -0
- package/dist/vault/git-vault-sync.d.ts +107 -0
- package/dist/vault/git-vault-sync.d.ts.map +1 -0
- package/dist/vault/git-vault-sync.js +251 -0
- package/dist/vault/git-vault-sync.js.map +1 -0
- package/dist/vault/knowledge-review.d.ts +67 -0
- package/dist/vault/knowledge-review.d.ts.map +1 -0
- package/dist/vault/knowledge-review.js +133 -0
- package/dist/vault/knowledge-review.js.map +1 -0
- package/dist/vault/obsidian-sync.d.ts +94 -0
- package/dist/vault/obsidian-sync.d.ts.map +1 -0
- package/dist/vault/obsidian-sync.js +247 -0
- package/dist/vault/obsidian-sync.js.map +1 -0
- package/dist/vault/scope-detector.d.ts +31 -0
- package/dist/vault/scope-detector.d.ts.map +1 -0
- package/dist/vault/scope-detector.js +182 -0
- package/dist/vault/scope-detector.js.map +1 -0
- package/dist/vault/vault-branching.d.ts +71 -0
- package/dist/vault/vault-branching.d.ts.map +1 -0
- package/dist/vault/vault-branching.js +180 -0
- package/dist/vault/vault-branching.js.map +1 -0
- package/dist/vault/vault-manager.d.ts +89 -0
- package/dist/vault/vault-manager.d.ts.map +1 -0
- package/dist/vault/vault-manager.js +199 -0
- package/dist/vault/vault-manager.js.map +1 -0
- package/dist/vault/vault-types.d.ts +30 -0
- package/dist/vault/vault-types.d.ts.map +1 -0
- package/dist/vault/vault-types.js +10 -0
- package/dist/vault/vault-types.js.map +1 -0
- package/dist/vault/vault.d.ts +10 -0
- package/dist/vault/vault.d.ts.map +1 -1
- package/dist/vault/vault.js +36 -3
- package/dist/vault/vault.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/admin-extra-ops.test.ts +31 -11
- package/src/__tests__/agency-manager.test.ts +374 -0
- package/src/__tests__/agent-loop.test.ts +256 -0
- package/src/__tests__/capture-ops.test.ts +275 -0
- package/src/__tests__/chat-differentiators.test.ts +251 -0
- package/src/__tests__/chat-enhanced.test.ts +390 -0
- package/src/__tests__/chat-transport.test.ts +665 -0
- package/src/__tests__/claudemd.test.ts +282 -0
- package/src/__tests__/context-engine.test.ts +256 -0
- package/src/__tests__/core-ops.test.ts +97 -5
- package/src/__tests__/deprecation.test.ts +78 -0
- package/src/__tests__/enforcement.test.ts +153 -0
- package/src/__tests__/facade-factory.test.ts +271 -0
- package/src/__tests__/feature-flags.test.ts +138 -0
- package/src/__tests__/git-vault-sync.test.ts +230 -0
- package/src/__tests__/health-registry.test.ts +173 -0
- package/src/__tests__/knowledge-review.test.ts +104 -0
- package/src/__tests__/lsp-transport.test.ts +442 -0
- package/src/__tests__/migration-runner.test.ts +170 -0
- package/src/__tests__/normalize.test.ts +10 -0
- package/src/__tests__/obsidian-sync.test.ts +354 -0
- package/src/__tests__/pack-lockfile.test.ts +261 -0
- package/src/__tests__/pack-ops.test.ts +146 -0
- package/src/__tests__/pack-system.test.ts +423 -0
- package/src/__tests__/playbook-executor.test.ts +249 -0
- package/src/__tests__/playbook-ops-execution.test.ts +189 -0
- package/src/__tests__/plugin-ops.test.ts +411 -0
- package/src/__tests__/plugin-system.test.ts +509 -0
- package/src/__tests__/postgres-provider.test.ts +64 -6
- package/src/__tests__/replayable-stream.test.ts +112 -1
- package/src/__tests__/scope-detector.test.ts +121 -0
- package/src/__tests__/session-lifecycle.test.ts +259 -0
- package/src/__tests__/transport.test.ts +758 -0
- package/src/__tests__/vault-branching.test.ts +274 -0
- package/src/__tests__/vault-connect.test.ts +179 -0
- package/src/__tests__/vault-integrity.test.ts +71 -0
- package/src/__tests__/vault-manager.test.ts +238 -0
- package/src/__tests__/vault-scaling.test.ts +281 -0
- package/src/__tests__/vault-sharing.test.ts +270 -0
- package/src/__tests__/ws-transport.test.ts +479 -0
- package/src/agency/agency-manager.ts +326 -0
- package/src/agency/index.ts +13 -0
- package/src/agency/types.ts +88 -0
- package/src/brain/brain.ts +15 -11
- package/src/brain/intelligence.ts +103 -0
- package/src/brain/types.ts +26 -0
- package/src/chat/agent-loop-types.ts +99 -0
- package/src/chat/agent-loop.ts +357 -0
- package/src/chat/auth-manager.ts +171 -0
- package/src/chat/browser-session.ts +188 -0
- package/src/chat/cancellation.ts +99 -0
- package/src/chat/chat-session.ts +283 -0
- package/src/chat/file-handler.ts +230 -0
- package/src/chat/fragment-buffer.ts +160 -0
- package/src/chat/index.ts +72 -0
- package/src/chat/mcp-bridge.ts +135 -0
- package/src/chat/notifications.ts +164 -0
- package/src/chat/output-compressor.ts +116 -0
- package/src/chat/queue.ts +208 -0
- package/src/chat/response-chunker.ts +200 -0
- package/src/chat/self-update.ts +117 -0
- package/src/chat/types.ts +126 -0
- package/src/chat/voice.ts +134 -0
- package/src/claudemd/compose.ts +142 -0
- package/src/claudemd/index.ts +17 -0
- package/src/claudemd/inject.ts +170 -0
- package/src/claudemd/types.ts +45 -0
- package/src/context/context-engine.ts +302 -0
- package/src/context/index.ts +11 -0
- package/src/context/types.ts +69 -0
- package/src/enforcement/adapters/claude-code.ts +135 -0
- package/src/enforcement/adapters/index.ts +1 -0
- package/src/enforcement/index.ts +10 -0
- package/src/enforcement/registry.ts +82 -0
- package/src/enforcement/types.ts +56 -0
- package/src/facades/facade-factory.ts +138 -5
- package/src/facades/types.ts +21 -0
- package/src/health/health-registry.ts +165 -0
- package/src/health/index.ts +11 -0
- package/src/health/vault-integrity.ts +66 -0
- package/src/index.ts +294 -2
- package/src/intake/intake-pipeline.ts +1 -1
- package/src/intelligence/types.ts +1 -0
- package/src/migrations/index.ts +6 -0
- package/src/migrations/migration-runner.ts +185 -0
- package/src/packs/index.ts +20 -0
- package/src/packs/lockfile.ts +180 -0
- package/src/packs/pack-installer.ts +289 -0
- package/src/packs/resolver.ts +237 -0
- package/src/packs/types.ts +125 -0
- package/src/persistence/postgres-provider.ts +211 -58
- package/src/playbooks/index.ts +11 -0
- package/src/playbooks/playbook-executor.ts +301 -0
- package/src/plugins/index.ts +19 -0
- package/src/plugins/plugin-loader.ts +183 -0
- package/src/plugins/plugin-registry.ts +187 -0
- package/src/plugins/types.ts +119 -0
- package/src/runtime/admin-extra-ops.ts +193 -8
- package/src/runtime/capture-ops.ts +113 -8
- package/src/runtime/deprecation.ts +58 -0
- package/src/runtime/facades/admin-facade.ts +16 -1
- package/src/runtime/facades/agency-facade.ts +111 -0
- package/src/runtime/facades/brain-facade.ts +60 -0
- package/src/runtime/facades/chat-facade.ts +918 -0
- package/src/runtime/facades/context-facade.ts +55 -0
- package/src/runtime/facades/index.ts +22 -1
- package/src/runtime/facades/vault-facade.ts +261 -1
- package/src/runtime/feature-flags.ts +101 -0
- package/src/runtime/pack-ops.ts +85 -0
- package/src/runtime/playbook-ops.ts +113 -9
- package/src/runtime/plugin-ops.ts +258 -0
- package/src/runtime/runtime.ts +84 -5
- package/src/runtime/telemetry-ops.ts +57 -0
- package/src/runtime/types.ts +35 -0
- package/src/runtime/vault-sharing-ops.ts +372 -0
- package/src/streams/index.ts +1 -1
- package/src/streams/replayable-stream.ts +34 -3
- package/src/text/similarity.ts +1 -1
- package/src/transport/http-server.ts +269 -0
- package/src/transport/index.ts +48 -0
- package/src/transport/lsp-server.ts +401 -0
- package/src/transport/rate-limiter.ts +97 -0
- package/src/transport/session-manager.ts +120 -0
- package/src/transport/token-auth.ts +96 -0
- package/src/transport/types.ts +66 -0
- package/src/transport/ws-server.ts +415 -0
- package/src/vault/git-vault-sync.ts +318 -0
- package/src/vault/knowledge-review.ts +221 -0
- package/src/vault/obsidian-sync.ts +346 -0
- package/src/vault/scope-detector.ts +219 -0
- package/src/vault/vault-branching.ts +264 -0
- package/src/vault/vault-manager.ts +237 -0
- package/src/vault/vault-types.ts +50 -0
- package/src/vault/vault.ts +41 -3
- package/src/governance/index.ts +0 -18
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VaultManager Tests — multi-tier vault orchestration.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { describe, test, expect, afterEach } from 'vitest';
|
|
6
|
+
import { VaultManager } from '../vault/vault-manager.js';
|
|
7
|
+
import type { IntelligenceEntry } from '../intelligence/types.js';
|
|
8
|
+
|
|
9
|
+
// =============================================================================
|
|
10
|
+
// HELPERS
|
|
11
|
+
// =============================================================================
|
|
12
|
+
|
|
13
|
+
function makeEntry(id: string, title: string, domain = 'general'): IntelligenceEntry {
|
|
14
|
+
return {
|
|
15
|
+
id,
|
|
16
|
+
type: 'pattern',
|
|
17
|
+
domain,
|
|
18
|
+
title,
|
|
19
|
+
severity: 'suggestion',
|
|
20
|
+
description: `Description for ${title}`,
|
|
21
|
+
tags: [domain],
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// =============================================================================
|
|
26
|
+
// TESTS
|
|
27
|
+
// =============================================================================
|
|
28
|
+
|
|
29
|
+
describe('VaultManager', () => {
|
|
30
|
+
let mgr: VaultManager;
|
|
31
|
+
|
|
32
|
+
afterEach(() => {
|
|
33
|
+
mgr?.close();
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test('constructs without error', () => {
|
|
37
|
+
mgr = new VaultManager({ agentId: 'test-agent' });
|
|
38
|
+
expect(mgr).toBeDefined();
|
|
39
|
+
expect(mgr.size).toBe(0);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
test('open agent tier', () => {
|
|
43
|
+
mgr = new VaultManager({ agentId: 'test-agent' });
|
|
44
|
+
const vault = mgr.open('agent', ':memory:');
|
|
45
|
+
expect(vault).toBeDefined();
|
|
46
|
+
expect(mgr.size).toBe(1);
|
|
47
|
+
expect(mgr.hasTier('agent')).toBe(true);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
test('getTier returns vault', () => {
|
|
51
|
+
mgr = new VaultManager({ agentId: 'test-agent' });
|
|
52
|
+
const vault = mgr.open('agent', ':memory:');
|
|
53
|
+
expect(mgr.getTier('agent')).toBe(vault);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
test('getTier throws for disconnected tier', () => {
|
|
57
|
+
mgr = new VaultManager({ agentId: 'test-agent' });
|
|
58
|
+
expect(() => mgr.getTier('project')).toThrow("Vault tier 'project' is not connected");
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test('hasTier returns false for disconnected', () => {
|
|
62
|
+
mgr = new VaultManager({ agentId: 'test-agent' });
|
|
63
|
+
expect(mgr.hasTier('agent')).toBe(false);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test('disconnect removes tier', () => {
|
|
67
|
+
mgr = new VaultManager({ agentId: 'test-agent' });
|
|
68
|
+
mgr.open('agent', ':memory:');
|
|
69
|
+
expect(mgr.disconnect('agent')).toBe(true);
|
|
70
|
+
expect(mgr.hasTier('agent')).toBe(false);
|
|
71
|
+
expect(mgr.size).toBe(0);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
test('disconnect returns false for non-connected tier', () => {
|
|
75
|
+
mgr = new VaultManager({ agentId: 'test-agent' });
|
|
76
|
+
expect(mgr.disconnect('project')).toBe(false);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
test('re-opening a tier closes previous', () => {
|
|
80
|
+
mgr = new VaultManager({ agentId: 'test-agent' });
|
|
81
|
+
const v1 = mgr.open('agent', ':memory:');
|
|
82
|
+
v1.add(makeEntry('e1', 'First'));
|
|
83
|
+
|
|
84
|
+
const v2 = mgr.open('agent', ':memory:');
|
|
85
|
+
// New vault should be empty (different :memory: DB)
|
|
86
|
+
expect(v2.stats().totalEntries).toBe(0);
|
|
87
|
+
expect(mgr.getTier('agent')).toBe(v2);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test('search on single tier', () => {
|
|
91
|
+
mgr = new VaultManager({ agentId: 'test-agent' });
|
|
92
|
+
const vault = mgr.open('agent', ':memory:');
|
|
93
|
+
vault.add(makeEntry('e1', 'Use semantic tokens for colors'));
|
|
94
|
+
vault.add(makeEntry('e2', 'Avoid hardcoded hex values'));
|
|
95
|
+
|
|
96
|
+
const results = mgr.search('semantic tokens');
|
|
97
|
+
expect(results.length).toBeGreaterThan(0);
|
|
98
|
+
expect(results[0].entry.title).toContain('semantic tokens');
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
test('search cascades across tiers', () => {
|
|
102
|
+
mgr = new VaultManager({ agentId: 'test-agent' });
|
|
103
|
+
const agentVault = mgr.open('agent', ':memory:');
|
|
104
|
+
const projectVault = mgr.open('project', ':memory:');
|
|
105
|
+
|
|
106
|
+
agentVault.add(makeEntry('a1', 'Agent pattern about routing'));
|
|
107
|
+
projectVault.add(makeEntry('p1', 'Project pattern about routing'));
|
|
108
|
+
|
|
109
|
+
const results = mgr.search('routing');
|
|
110
|
+
expect(results.length).toBe(2);
|
|
111
|
+
// Both entries should be present
|
|
112
|
+
const ids = results.map((r) => r.entry.id);
|
|
113
|
+
expect(ids).toContain('a1');
|
|
114
|
+
expect(ids).toContain('p1');
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
test('search applies tier weight — agent ranked higher', () => {
|
|
118
|
+
mgr = new VaultManager({ agentId: 'test-agent' });
|
|
119
|
+
const agentVault = mgr.open('agent', ':memory:');
|
|
120
|
+
const projectVault = mgr.open('project', ':memory:');
|
|
121
|
+
|
|
122
|
+
// Add identical entries to both tiers
|
|
123
|
+
agentVault.add(makeEntry('shared', 'Use tokens for spacing'));
|
|
124
|
+
projectVault.add(makeEntry('shared', 'Use tokens for spacing'));
|
|
125
|
+
|
|
126
|
+
const results = mgr.search('tokens spacing');
|
|
127
|
+
// Dedup: only one result (agent wins with weight 1.0 vs project 0.8)
|
|
128
|
+
expect(results.length).toBe(1);
|
|
129
|
+
// Score should reflect agent weight (1.0 * raw score)
|
|
130
|
+
expect(results[0].score).toBeGreaterThan(0);
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
test('search deduplicates — highest priority wins', () => {
|
|
134
|
+
mgr = new VaultManager({ agentId: 'test-agent' });
|
|
135
|
+
const agentVault = mgr.open('agent', ':memory:');
|
|
136
|
+
const teamVault = mgr.open('team', ':memory:');
|
|
137
|
+
|
|
138
|
+
agentVault.add(makeEntry('dup1', 'Shared pattern'));
|
|
139
|
+
teamVault.add(makeEntry('dup1', 'Shared pattern'));
|
|
140
|
+
|
|
141
|
+
const results = mgr.search('shared pattern');
|
|
142
|
+
const dup1Results = results.filter((r) => r.entry.id === 'dup1');
|
|
143
|
+
expect(dup1Results.length).toBe(1);
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
test('search respects limit', () => {
|
|
147
|
+
mgr = new VaultManager({ agentId: 'test-agent' });
|
|
148
|
+
const vault = mgr.open('agent', ':memory:');
|
|
149
|
+
for (let i = 0; i < 10; i++) {
|
|
150
|
+
vault.add(makeEntry(`e${i}`, `Pattern number ${i} about design`));
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
const results = mgr.search('design', 3);
|
|
154
|
+
expect(results.length).toBeLessThanOrEqual(3);
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
test('search with no connected tiers returns empty', () => {
|
|
158
|
+
mgr = new VaultManager({ agentId: 'test-agent' });
|
|
159
|
+
const results = mgr.search('anything');
|
|
160
|
+
expect(results).toEqual([]);
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
test('custom weights override defaults', () => {
|
|
164
|
+
mgr = new VaultManager({
|
|
165
|
+
agentId: 'test-agent',
|
|
166
|
+
weights: { team: 1.5 }, // boost team above agent
|
|
167
|
+
});
|
|
168
|
+
const agentVault = mgr.open('agent', ':memory:');
|
|
169
|
+
const teamVault = mgr.open('team', ':memory:');
|
|
170
|
+
|
|
171
|
+
agentVault.add(makeEntry('same', 'Important pattern'));
|
|
172
|
+
teamVault.add(makeEntry('same', 'Important pattern'));
|
|
173
|
+
|
|
174
|
+
const results = mgr.search('important pattern');
|
|
175
|
+
// With team weight 1.5 > agent weight 1.0, team's version should have higher score
|
|
176
|
+
expect(results.length).toBe(1);
|
|
177
|
+
// The score should be > 1.0 * raw (since team weight is 1.5)
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
test('listTiers shows all tiers', () => {
|
|
181
|
+
mgr = new VaultManager({ agentId: 'test-agent' });
|
|
182
|
+
mgr.open('agent', ':memory:');
|
|
183
|
+
|
|
184
|
+
const tiers = mgr.listTiers();
|
|
185
|
+
expect(tiers).toHaveLength(3); // agent, project, team
|
|
186
|
+
const agentTier = tiers.find((t) => t.tier === 'agent');
|
|
187
|
+
expect(agentTier?.connected).toBe(true);
|
|
188
|
+
const projectTier = tiers.find((t) => t.tier === 'project');
|
|
189
|
+
expect(projectTier?.connected).toBe(false);
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
test('listTiers shows entry counts', () => {
|
|
193
|
+
mgr = new VaultManager({ agentId: 'test-agent' });
|
|
194
|
+
const vault = mgr.open('agent', ':memory:');
|
|
195
|
+
vault.add(makeEntry('e1', 'Entry one'));
|
|
196
|
+
vault.add(makeEntry('e2', 'Entry two'));
|
|
197
|
+
|
|
198
|
+
const tiers = mgr.listTiers();
|
|
199
|
+
const agentTier = tiers.find((t) => t.tier === 'agent');
|
|
200
|
+
expect(agentTier?.entryCount).toBe(2);
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
test('close closes all connections', () => {
|
|
204
|
+
mgr = new VaultManager({ agentId: 'test-agent' });
|
|
205
|
+
mgr.open('agent', ':memory:');
|
|
206
|
+
mgr.open('project', ':memory:');
|
|
207
|
+
mgr.open('team', ':memory:');
|
|
208
|
+
expect(mgr.size).toBe(3);
|
|
209
|
+
|
|
210
|
+
mgr.close();
|
|
211
|
+
expect(mgr.size).toBe(0);
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
test('getConfig returns config', () => {
|
|
215
|
+
mgr = new VaultManager({ agentId: 'test-agent' });
|
|
216
|
+
expect(mgr.getConfig().agentId).toBe('test-agent');
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
test('three tiers search cascade with correct ordering', () => {
|
|
220
|
+
mgr = new VaultManager({ agentId: 'test-agent' });
|
|
221
|
+
const agentVault = mgr.open('agent', ':memory:');
|
|
222
|
+
const projectVault = mgr.open('project', ':memory:');
|
|
223
|
+
const teamVault = mgr.open('team', ':memory:');
|
|
224
|
+
|
|
225
|
+
agentVault.add(makeEntry('a-only', 'Agent-only design pattern'));
|
|
226
|
+
projectVault.add(makeEntry('p-only', 'Project-only design pattern'));
|
|
227
|
+
teamVault.add(makeEntry('t-only', 'Team-only design pattern'));
|
|
228
|
+
|
|
229
|
+
const results = mgr.search('design pattern');
|
|
230
|
+
expect(results.length).toBe(3);
|
|
231
|
+
|
|
232
|
+
// Verify ordering: agent (1.0) > project (0.8) > team (0.6)
|
|
233
|
+
const ids = results.map((r) => r.entry.id);
|
|
234
|
+
expect(ids[0]).toBe('a-only');
|
|
235
|
+
expect(ids[1]).toBe('p-only');
|
|
236
|
+
expect(ids[2]).toBe('t-only');
|
|
237
|
+
});
|
|
238
|
+
});
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vault Scaling Tests — performance at 10K+ entries.
|
|
3
|
+
*
|
|
4
|
+
* Measures: write throughput, search latency, FTS performance,
|
|
5
|
+
* archive/compaction, and memory footprint at scale.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { describe, test, expect, afterEach } from 'vitest';
|
|
9
|
+
import { Vault } from '../vault/vault.js';
|
|
10
|
+
import { Brain } from '../brain/brain.js';
|
|
11
|
+
import type { IntelligenceEntry } from '../intelligence/types.js';
|
|
12
|
+
|
|
13
|
+
const DOMAINS = ['design', 'a11y', 'performance', 'security', 'architecture', 'testing', 'ux'];
|
|
14
|
+
const TYPES: IntelligenceEntry['type'][] = ['pattern', 'anti-pattern', 'rule', 'playbook'];
|
|
15
|
+
const SEVERITIES: IntelligenceEntry['severity'][] = ['critical', 'warning', 'suggestion'];
|
|
16
|
+
|
|
17
|
+
function generateEntries(count: number): IntelligenceEntry[] {
|
|
18
|
+
const entries: IntelligenceEntry[] = [];
|
|
19
|
+
for (let i = 0; i < count; i++) {
|
|
20
|
+
const domain = DOMAINS[i % DOMAINS.length];
|
|
21
|
+
const type = TYPES[i % TYPES.length];
|
|
22
|
+
const severity = SEVERITIES[i % SEVERITIES.length];
|
|
23
|
+
entries.push({
|
|
24
|
+
id: `entry-${i}`,
|
|
25
|
+
type,
|
|
26
|
+
domain,
|
|
27
|
+
title: `${type} ${i}: ${domain} best practice for component ${i % 100}`,
|
|
28
|
+
severity,
|
|
29
|
+
description: `Detailed description for ${type} ${i} in the ${domain} domain. This entry covers component patterns, accessibility requirements, and performance considerations for item ${i}.`,
|
|
30
|
+
tags: [domain, type, `component-${i % 50}`, `category-${i % 20}`],
|
|
31
|
+
context: `When building ${domain} components, this ${type} applies to scenarios involving layout, state management, and user interaction patterns.`,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
return entries;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
describe('Vault Scaling — 10K entries', () => {
|
|
38
|
+
let vault: Vault;
|
|
39
|
+
|
|
40
|
+
afterEach(() => {
|
|
41
|
+
vault?.close();
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
// ─── Write throughput ─────────────────────────────────
|
|
45
|
+
|
|
46
|
+
test('seed 10K entries in under 5 seconds', () => {
|
|
47
|
+
vault = new Vault(':memory:');
|
|
48
|
+
const entries = generateEntries(10_000);
|
|
49
|
+
|
|
50
|
+
const start = performance.now();
|
|
51
|
+
const seeded = vault.seed(entries);
|
|
52
|
+
const elapsed = performance.now() - start;
|
|
53
|
+
|
|
54
|
+
expect(seeded).toBe(10_000);
|
|
55
|
+
expect(elapsed).toBeLessThan(5_000);
|
|
56
|
+
|
|
57
|
+
const stats = vault.stats();
|
|
58
|
+
expect(stats.totalEntries).toBe(10_000);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
// ─── Search latency ──────────────────────────────────
|
|
62
|
+
|
|
63
|
+
test('FTS search over 10K entries under 50ms', () => {
|
|
64
|
+
vault = new Vault(':memory:');
|
|
65
|
+
vault.seed(generateEntries(10_000));
|
|
66
|
+
|
|
67
|
+
// Warm up
|
|
68
|
+
vault.search('design pattern');
|
|
69
|
+
|
|
70
|
+
// FTS5 queries: use simple terms that exist in the generated data
|
|
71
|
+
const queries = ['design', 'performance', 'security', 'architecture', 'testing'];
|
|
72
|
+
|
|
73
|
+
for (const query of queries) {
|
|
74
|
+
const start = performance.now();
|
|
75
|
+
const results = vault.search(query, { limit: 20 });
|
|
76
|
+
const elapsed = performance.now() - start;
|
|
77
|
+
|
|
78
|
+
expect(results.length).toBeGreaterThan(0);
|
|
79
|
+
expect(elapsed).toBeLessThan(50);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
test('search with domain filter under 50ms at 10K', () => {
|
|
84
|
+
vault = new Vault(':memory:');
|
|
85
|
+
vault.seed(generateEntries(10_000));
|
|
86
|
+
|
|
87
|
+
const start = performance.now();
|
|
88
|
+
const results = vault.search('pattern', { domain: 'design', limit: 20 });
|
|
89
|
+
const elapsed = performance.now() - start;
|
|
90
|
+
|
|
91
|
+
expect(results.length).toBeGreaterThan(0);
|
|
92
|
+
expect(elapsed).toBeLessThan(50);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
test('list with filters under 20ms at 10K', () => {
|
|
96
|
+
vault = new Vault(':memory:');
|
|
97
|
+
vault.seed(generateEntries(10_000));
|
|
98
|
+
|
|
99
|
+
const start = performance.now();
|
|
100
|
+
const entries = vault.list({ domain: 'a11y', type: 'rule', limit: 50 });
|
|
101
|
+
const elapsed = performance.now() - start;
|
|
102
|
+
|
|
103
|
+
expect(entries.length).toBeGreaterThan(0);
|
|
104
|
+
expect(elapsed).toBeLessThan(20);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
// ─── Stats performance ───────────────────────────────
|
|
108
|
+
|
|
109
|
+
test('stats() under 20ms at 10K', () => {
|
|
110
|
+
vault = new Vault(':memory:');
|
|
111
|
+
vault.seed(generateEntries(10_000));
|
|
112
|
+
|
|
113
|
+
const start = performance.now();
|
|
114
|
+
const stats = vault.stats();
|
|
115
|
+
const elapsed = performance.now() - start;
|
|
116
|
+
|
|
117
|
+
expect(stats.totalEntries).toBe(10_000);
|
|
118
|
+
expect(Object.keys(stats.byDomain).length).toBe(DOMAINS.length);
|
|
119
|
+
expect(elapsed).toBeLessThan(20);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
// ─── Archive / compaction ─────────────────────────────
|
|
123
|
+
|
|
124
|
+
test('archive old entries reduces active count', () => {
|
|
125
|
+
vault = new Vault(':memory:');
|
|
126
|
+
vault.seed(generateEntries(1_000));
|
|
127
|
+
|
|
128
|
+
const before = vault.stats().totalEntries;
|
|
129
|
+
expect(before).toBe(1_000);
|
|
130
|
+
|
|
131
|
+
// Archive everything (entries were just created, so use 0 days threshold)
|
|
132
|
+
// First, backdate some entries
|
|
133
|
+
const provider = vault.getProvider();
|
|
134
|
+
const cutoff = Math.floor(Date.now() / 1000) - 100 * 86400; // 100 days ago
|
|
135
|
+
provider.run('UPDATE entries SET updated_at = ? WHERE rowid <= 500', [cutoff]);
|
|
136
|
+
|
|
137
|
+
const result = vault.archive({ olderThanDays: 90, reason: 'test compaction' });
|
|
138
|
+
expect(result.archived).toBe(500);
|
|
139
|
+
|
|
140
|
+
const after = vault.stats().totalEntries;
|
|
141
|
+
expect(after).toBe(500);
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
test('restore archived entry', () => {
|
|
145
|
+
vault = new Vault(':memory:');
|
|
146
|
+
vault.seed(generateEntries(100));
|
|
147
|
+
|
|
148
|
+
const provider = vault.getProvider();
|
|
149
|
+
const cutoff = Math.floor(Date.now() / 1000) - 100 * 86400;
|
|
150
|
+
provider.run("UPDATE entries SET updated_at = ? WHERE id = 'entry-0'", [cutoff]);
|
|
151
|
+
|
|
152
|
+
vault.archive({ olderThanDays: 90 });
|
|
153
|
+
expect(vault.get('entry-0')).toBeNull();
|
|
154
|
+
|
|
155
|
+
const restored = vault.restore('entry-0');
|
|
156
|
+
expect(restored).toBe(true);
|
|
157
|
+
expect(vault.get('entry-0')).not.toBeNull();
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
// ─── Optimize / vacuum ────────────────────────────────
|
|
161
|
+
|
|
162
|
+
test('optimize() completes without error at 10K', () => {
|
|
163
|
+
vault = new Vault(':memory:');
|
|
164
|
+
vault.seed(generateEntries(10_000));
|
|
165
|
+
|
|
166
|
+
const result = vault.optimize();
|
|
167
|
+
expect(result.analyzed).toBe(true);
|
|
168
|
+
expect(result.ftsRebuilt).toBe(true);
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
// ─── Brain TF-IDF at scale ────────────────────────────
|
|
172
|
+
|
|
173
|
+
test('Brain search over 10K entries under 200ms', async () => {
|
|
174
|
+
vault = new Vault(':memory:');
|
|
175
|
+
vault.seed(generateEntries(10_000));
|
|
176
|
+
|
|
177
|
+
// Brain uses TF-IDF scoring on top of vault search
|
|
178
|
+
const brain = new Brain(vault);
|
|
179
|
+
|
|
180
|
+
const start = performance.now();
|
|
181
|
+
const results = await brain.intelligentSearch('design', { limit: 20 });
|
|
182
|
+
const elapsed = performance.now() - start;
|
|
183
|
+
|
|
184
|
+
expect(results.length).toBeGreaterThan(0);
|
|
185
|
+
expect(elapsed).toBeLessThan(200);
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
// ─── Bulk operations ──────────────────────────────────
|
|
189
|
+
|
|
190
|
+
test('bulk remove 1K entries under 500ms', () => {
|
|
191
|
+
vault = new Vault(':memory:');
|
|
192
|
+
vault.seed(generateEntries(5_000));
|
|
193
|
+
|
|
194
|
+
const ids = Array.from({ length: 1_000 }, (_, i) => `entry-${i}`);
|
|
195
|
+
|
|
196
|
+
const start = performance.now();
|
|
197
|
+
const removed = vault.bulkRemove(ids);
|
|
198
|
+
const elapsed = performance.now() - start;
|
|
199
|
+
|
|
200
|
+
expect(removed).toBe(1_000);
|
|
201
|
+
expect(vault.stats().totalEntries).toBe(4_000);
|
|
202
|
+
expect(elapsed).toBeLessThan(500);
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
// ─── Content hash dedup at scale ──────────────────────
|
|
206
|
+
|
|
207
|
+
test('seedDedup detects duplicates with different IDs at scale', () => {
|
|
208
|
+
vault = new Vault(':memory:');
|
|
209
|
+
const entries = generateEntries(1_000);
|
|
210
|
+
vault.seed(entries);
|
|
211
|
+
|
|
212
|
+
// Create entries with DIFFERENT IDs but SAME content (triggers content-hash dedup)
|
|
213
|
+
const dupeEntries = entries.map((e) => ({ ...e, id: `dupe-${e.id}` }));
|
|
214
|
+
|
|
215
|
+
const start = performance.now();
|
|
216
|
+
const results = vault.seedDedup(dupeEntries);
|
|
217
|
+
const elapsed = performance.now() - start;
|
|
218
|
+
|
|
219
|
+
const dupes = results.filter((r) => r.action === 'duplicate');
|
|
220
|
+
expect(dupes.length).toBe(1_000);
|
|
221
|
+
expect(elapsed).toBeLessThan(2_000);
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
// ─── Tags and domains at scale ────────────────────────
|
|
225
|
+
|
|
226
|
+
test('getTags under 100ms at 10K', () => {
|
|
227
|
+
vault = new Vault(':memory:');
|
|
228
|
+
vault.seed(generateEntries(10_000));
|
|
229
|
+
|
|
230
|
+
const start = performance.now();
|
|
231
|
+
const tags = vault.getTags();
|
|
232
|
+
const elapsed = performance.now() - start;
|
|
233
|
+
|
|
234
|
+
expect(tags.length).toBeGreaterThan(0);
|
|
235
|
+
expect(elapsed).toBeLessThan(100);
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
test('getDomains under 10ms at 10K', () => {
|
|
239
|
+
vault = new Vault(':memory:');
|
|
240
|
+
vault.seed(generateEntries(10_000));
|
|
241
|
+
|
|
242
|
+
const start = performance.now();
|
|
243
|
+
const domains = vault.getDomains();
|
|
244
|
+
const elapsed = performance.now() - start;
|
|
245
|
+
|
|
246
|
+
expect(domains.length).toBe(DOMAINS.length);
|
|
247
|
+
expect(elapsed).toBeLessThan(10);
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
// ─── FTS rebuild at scale ─────────────────────────────
|
|
251
|
+
|
|
252
|
+
test('FTS rebuild under 2s at 10K', () => {
|
|
253
|
+
vault = new Vault(':memory:');
|
|
254
|
+
vault.seed(generateEntries(10_000));
|
|
255
|
+
|
|
256
|
+
const start = performance.now();
|
|
257
|
+
vault.rebuildFtsIndex();
|
|
258
|
+
const elapsed = performance.now() - start;
|
|
259
|
+
|
|
260
|
+
expect(elapsed).toBeLessThan(2_000);
|
|
261
|
+
|
|
262
|
+
// Verify search still works after rebuild
|
|
263
|
+
const results = vault.search('design pattern');
|
|
264
|
+
expect(results.length).toBeGreaterThan(0);
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
// ─── Memory profile ──────────────────────────────────
|
|
268
|
+
|
|
269
|
+
test('memory usage stays under 100MB for 10K entries', () => {
|
|
270
|
+
vault = new Vault(':memory:');
|
|
271
|
+
const before = process.memoryUsage().heapUsed;
|
|
272
|
+
|
|
273
|
+
vault.seed(generateEntries(10_000));
|
|
274
|
+
|
|
275
|
+
const after = process.memoryUsage().heapUsed;
|
|
276
|
+
const delta = after - before;
|
|
277
|
+
|
|
278
|
+
// 10K entries should use well under 100MB
|
|
279
|
+
expect(delta).toBeLessThan(100 * 1024 * 1024);
|
|
280
|
+
});
|
|
281
|
+
});
|