@soleri/core 9.0.4 → 9.2.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/brain/intelligence.d.ts +27 -0
- package/dist/brain/intelligence.d.ts.map +1 -1
- package/dist/brain/intelligence.js +160 -14
- package/dist/brain/intelligence.js.map +1 -1
- package/dist/brain/learning-radar.d.ts +4 -0
- package/dist/brain/learning-radar.d.ts.map +1 -1
- package/dist/brain/learning-radar.js +20 -1
- package/dist/brain/learning-radar.js.map +1 -1
- package/dist/brain/strength-scorer.d.ts +31 -0
- package/dist/brain/strength-scorer.d.ts.map +1 -0
- package/dist/brain/strength-scorer.js +264 -0
- package/dist/brain/strength-scorer.js.map +1 -0
- package/dist/chat/agent-loop.d.ts.map +1 -1
- package/dist/chat/agent-loop.js +2 -0
- package/dist/chat/agent-loop.js.map +1 -1
- package/dist/chat/notifications.d.ts.map +1 -1
- package/dist/chat/notifications.js +2 -0
- package/dist/chat/notifications.js.map +1 -1
- package/dist/claudemd/compose.js +1 -1
- package/dist/claudemd/compose.js.map +1 -1
- package/dist/control/intent-router.d.ts.map +1 -1
- package/dist/control/intent-router.js +12 -4
- package/dist/control/intent-router.js.map +1 -1
- package/dist/curator/contradiction-detector.d.ts +27 -0
- package/dist/curator/contradiction-detector.d.ts.map +1 -0
- package/dist/curator/contradiction-detector.js +62 -0
- package/dist/curator/contradiction-detector.js.map +1 -0
- package/dist/curator/curator.d.ts +3 -4
- package/dist/curator/curator.d.ts.map +1 -1
- package/dist/curator/curator.js +90 -525
- package/dist/curator/curator.js.map +1 -1
- package/dist/curator/duplicate-detector.d.ts +14 -0
- package/dist/curator/duplicate-detector.d.ts.map +1 -0
- package/dist/curator/duplicate-detector.js +77 -0
- package/dist/curator/duplicate-detector.js.map +1 -0
- package/dist/curator/health-audit.d.ts +15 -0
- package/dist/curator/health-audit.d.ts.map +1 -0
- package/dist/curator/health-audit.js +97 -0
- package/dist/curator/health-audit.js.map +1 -0
- package/dist/curator/metadata-enricher.d.ts +17 -0
- package/dist/curator/metadata-enricher.d.ts.map +1 -0
- package/dist/curator/metadata-enricher.js +60 -0
- package/dist/curator/metadata-enricher.js.map +1 -0
- package/dist/curator/schema.d.ts +7 -0
- package/dist/curator/schema.d.ts.map +1 -0
- package/dist/curator/schema.js +62 -0
- package/dist/curator/schema.js.map +1 -0
- package/dist/curator/tag-manager.d.ts +36 -0
- package/dist/curator/tag-manager.d.ts.map +1 -0
- package/dist/curator/tag-manager.js +78 -0
- package/dist/curator/tag-manager.js.map +1 -0
- package/dist/engine/bin/soleri-engine.js +24 -3
- package/dist/engine/bin/soleri-engine.js.map +1 -1
- package/dist/engine/core-ops.d.ts.map +1 -1
- package/dist/engine/core-ops.js +23 -8
- package/dist/engine/core-ops.js.map +1 -1
- package/dist/engine/module-manifest.d.ts.map +1 -1
- package/dist/engine/module-manifest.js +22 -2
- package/dist/engine/module-manifest.js.map +1 -1
- package/dist/engine/register-engine.d.ts.map +1 -1
- package/dist/engine/register-engine.js +26 -2
- package/dist/engine/register-engine.js.map +1 -1
- package/dist/errors/retry.d.ts.map +1 -1
- package/dist/errors/retry.js +2 -0
- package/dist/errors/retry.js.map +1 -1
- package/dist/facades/types.d.ts +1 -1
- package/dist/flows/chain-types.d.ts +18 -18
- package/dist/flows/gate-evaluator.d.ts.map +1 -1
- package/dist/flows/gate-evaluator.js +22 -0
- package/dist/flows/gate-evaluator.js.map +1 -1
- package/dist/flows/types.d.ts +157 -28
- package/dist/flows/types.d.ts.map +1 -1
- package/dist/flows/types.js +4 -0
- package/dist/flows/types.js.map +1 -1
- package/dist/index.d.ts +10 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/intake/intake-pipeline.d.ts.map +1 -1
- package/dist/intake/intake-pipeline.js +1 -0
- package/dist/intake/intake-pipeline.js.map +1 -1
- package/dist/intake/text-ingester.d.ts.map +1 -1
- package/dist/intake/text-ingester.js +2 -0
- package/dist/intake/text-ingester.js.map +1 -1
- package/dist/llm/key-pool.d.ts +1 -1
- package/dist/llm/key-pool.d.ts.map +1 -1
- package/dist/llm/key-pool.js +3 -4
- package/dist/llm/key-pool.js.map +1 -1
- package/dist/llm/utils.d.ts.map +1 -1
- package/dist/llm/utils.js +2 -0
- package/dist/llm/utils.js.map +1 -1
- package/dist/migrations/migration-runner.test-helpers.d.ts +13 -0
- package/dist/migrations/migration-runner.test-helpers.d.ts.map +1 -0
- package/dist/migrations/migration-runner.test-helpers.js +47 -0
- package/dist/migrations/migration-runner.test-helpers.js.map +1 -0
- package/dist/operator/operator-profile.d.ts +44 -0
- package/dist/operator/operator-profile.d.ts.map +1 -0
- package/dist/operator/operator-profile.js +377 -0
- package/dist/operator/operator-profile.js.map +1 -0
- package/dist/operator/operator-signals.d.ts +45 -0
- package/dist/operator/operator-signals.d.ts.map +1 -0
- package/dist/operator/operator-signals.js +228 -0
- package/dist/operator/operator-signals.js.map +1 -0
- package/dist/operator/operator-types.d.ts +360 -0
- package/dist/operator/operator-types.d.ts.map +1 -0
- package/dist/operator/operator-types.js +24 -0
- package/dist/operator/operator-types.js.map +1 -0
- package/dist/packs/types.d.ts +27 -27
- package/dist/paths.d.ts +40 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +98 -0
- package/dist/paths.js.map +1 -0
- package/dist/persistence/index.d.ts +1 -1
- package/dist/persistence/index.d.ts.map +1 -1
- package/dist/persistence/index.js +1 -1
- package/dist/persistence/index.js.map +1 -1
- package/dist/persistence/sqlite-provider.d.ts +2 -0
- package/dist/persistence/sqlite-provider.d.ts.map +1 -1
- package/dist/persistence/sqlite-provider.js +8 -5
- package/dist/persistence/sqlite-provider.js.map +1 -1
- package/dist/planning/evidence-collector.d.ts +13 -1
- package/dist/planning/evidence-collector.d.ts.map +1 -1
- package/dist/planning/evidence-collector.js +33 -0
- package/dist/planning/evidence-collector.js.map +1 -1
- package/dist/planning/gap-analysis.d.ts +5 -4
- package/dist/planning/gap-analysis.d.ts.map +1 -1
- package/dist/planning/gap-analysis.js +7 -341
- package/dist/planning/gap-analysis.js.map +1 -1
- package/dist/planning/gap-passes.d.ts +19 -0
- package/dist/planning/gap-passes.d.ts.map +1 -0
- package/dist/planning/gap-passes.js +157 -0
- package/dist/planning/gap-passes.js.map +1 -0
- package/dist/planning/gap-patterns.d.ts +29 -0
- package/dist/planning/gap-patterns.d.ts.map +1 -0
- package/dist/planning/gap-patterns.js +129 -0
- package/dist/planning/gap-patterns.js.map +1 -0
- package/dist/planning/gap-types.d.ts +1 -1
- package/dist/planning/gap-types.d.ts.map +1 -1
- package/dist/planning/gap-types.js +1 -0
- package/dist/planning/gap-types.js.map +1 -1
- package/dist/planning/github-projection.d.ts +122 -0
- package/dist/planning/github-projection.d.ts.map +1 -0
- package/dist/planning/github-projection.js +294 -0
- package/dist/planning/github-projection.js.map +1 -0
- package/dist/planning/impact-analyzer.d.ts +26 -0
- package/dist/planning/impact-analyzer.d.ts.map +1 -0
- package/dist/planning/impact-analyzer.js +199 -0
- package/dist/planning/impact-analyzer.js.map +1 -0
- package/dist/planning/plan-lifecycle.d.ts +136 -0
- package/dist/planning/plan-lifecycle.d.ts.map +1 -0
- package/dist/planning/plan-lifecycle.js +296 -0
- package/dist/planning/plan-lifecycle.js.map +1 -0
- package/dist/planning/planner-types.d.ts +202 -0
- package/dist/planning/planner-types.d.ts.map +1 -0
- package/dist/planning/planner-types.js +6 -0
- package/dist/planning/planner-types.js.map +1 -0
- package/dist/planning/planner.d.ts +31 -383
- package/dist/planning/planner.d.ts.map +1 -1
- package/dist/planning/planner.js +154 -878
- package/dist/planning/planner.js.map +1 -1
- package/dist/planning/rationalization-detector.d.ts +32 -0
- package/dist/planning/rationalization-detector.d.ts.map +1 -0
- package/dist/planning/rationalization-detector.js +89 -0
- package/dist/planning/rationalization-detector.js.map +1 -0
- package/dist/planning/reconciliation-engine.d.ts +47 -0
- package/dist/planning/reconciliation-engine.d.ts.map +1 -0
- package/dist/planning/reconciliation-engine.js +128 -0
- package/dist/planning/reconciliation-engine.js.map +1 -0
- package/dist/planning/task-verifier.d.ts +85 -0
- package/dist/planning/task-verifier.d.ts.map +1 -0
- package/dist/planning/task-verifier.js +227 -0
- package/dist/planning/task-verifier.js.map +1 -0
- package/dist/plugins/types.d.ts +4 -4
- package/dist/runtime/admin-ops.d.ts +2 -2
- package/dist/runtime/admin-ops.d.ts.map +1 -1
- package/dist/runtime/admin-ops.js +44 -17
- package/dist/runtime/admin-ops.js.map +1 -1
- package/dist/runtime/admin-setup-ops.d.ts.map +1 -1
- package/dist/runtime/admin-setup-ops.js +21 -46
- package/dist/runtime/admin-setup-ops.js.map +1 -1
- package/dist/runtime/archive-ops.d.ts +10 -0
- package/dist/runtime/archive-ops.d.ts.map +1 -0
- package/dist/runtime/archive-ops.js +310 -0
- package/dist/runtime/archive-ops.js.map +1 -0
- package/dist/runtime/capture-ops.d.ts.map +1 -1
- package/dist/runtime/capture-ops.js +42 -7
- package/dist/runtime/capture-ops.js.map +1 -1
- package/dist/runtime/claude-md-helpers.js +1 -1
- package/dist/runtime/claude-md-helpers.js.map +1 -1
- package/dist/runtime/context-health.d.ts +31 -0
- package/dist/runtime/context-health.d.ts.map +1 -0
- package/dist/runtime/context-health.js +57 -0
- package/dist/runtime/context-health.js.map +1 -0
- package/dist/runtime/facades/archive-facade.d.ts +10 -0
- package/dist/runtime/facades/archive-facade.d.ts.map +1 -0
- package/dist/runtime/facades/archive-facade.js +11 -0
- package/dist/runtime/facades/archive-facade.js.map +1 -0
- package/dist/runtime/facades/brain-facade.d.ts.map +1 -1
- package/dist/runtime/facades/brain-facade.js +2 -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 -1
- package/dist/runtime/facades/chat-facade.js +15 -800
- package/dist/runtime/facades/chat-facade.js.map +1 -1
- package/dist/runtime/facades/chat-service-ops.d.ts +9 -0
- package/dist/runtime/facades/chat-service-ops.d.ts.map +1 -0
- package/dist/runtime/facades/chat-service-ops.js +330 -0
- package/dist/runtime/facades/chat-service-ops.js.map +1 -0
- package/dist/runtime/facades/chat-session-ops.d.ts +8 -0
- package/dist/runtime/facades/chat-session-ops.d.ts.map +1 -0
- package/dist/runtime/facades/chat-session-ops.js +136 -0
- package/dist/runtime/facades/chat-session-ops.js.map +1 -0
- package/dist/runtime/facades/chat-state.d.ts +31 -0
- package/dist/runtime/facades/chat-state.d.ts.map +1 -0
- package/dist/runtime/facades/chat-state.js +32 -0
- package/dist/runtime/facades/chat-state.js.map +1 -0
- package/dist/runtime/facades/chat-transport-ops.d.ts +9 -0
- package/dist/runtime/facades/chat-transport-ops.d.ts.map +1 -0
- package/dist/runtime/facades/chat-transport-ops.js +337 -0
- package/dist/runtime/facades/chat-transport-ops.js.map +1 -0
- package/dist/runtime/facades/control-facade.d.ts.map +1 -1
- package/dist/runtime/facades/control-facade.js +4 -1
- package/dist/runtime/facades/control-facade.js.map +1 -1
- package/dist/runtime/facades/index.d.ts.map +1 -1
- package/dist/runtime/facades/index.js +6 -0
- package/dist/runtime/facades/index.js.map +1 -1
- package/dist/runtime/facades/memory-facade.d.ts.map +1 -1
- package/dist/runtime/facades/memory-facade.js +75 -6
- package/dist/runtime/facades/memory-facade.js.map +1 -1
- package/dist/runtime/facades/operator-facade.d.ts +8 -0
- package/dist/runtime/facades/operator-facade.d.ts.map +1 -0
- package/dist/runtime/facades/operator-facade.js +220 -0
- package/dist/runtime/facades/operator-facade.js.map +1 -0
- package/dist/runtime/facades/orchestrate-facade.js +3 -3
- package/dist/runtime/facades/orchestrate-facade.js.map +1 -1
- package/dist/runtime/facades/plan-facade.d.ts.map +1 -1
- package/dist/runtime/facades/plan-facade.js +39 -6
- package/dist/runtime/facades/plan-facade.js.map +1 -1
- package/dist/runtime/facades/review-facade.d.ts +7 -0
- package/dist/runtime/facades/review-facade.d.ts.map +1 -0
- package/dist/runtime/facades/review-facade.js +8 -0
- package/dist/runtime/facades/review-facade.js.map +1 -0
- package/dist/runtime/facades/sync-facade.d.ts +7 -0
- package/dist/runtime/facades/sync-facade.d.ts.map +1 -0
- package/dist/runtime/facades/sync-facade.js +8 -0
- package/dist/runtime/facades/sync-facade.js.map +1 -0
- package/dist/runtime/facades/vault-facade.d.ts +4 -1
- package/dist/runtime/facades/vault-facade.d.ts.map +1 -1
- package/dist/runtime/facades/vault-facade.js +13 -66
- package/dist/runtime/facades/vault-facade.js.map +1 -1
- package/dist/runtime/github-integration.d.ts +49 -0
- package/dist/runtime/github-integration.d.ts.map +1 -0
- package/dist/runtime/github-integration.js +113 -0
- package/dist/runtime/github-integration.js.map +1 -0
- package/dist/runtime/grading-ops.js +1 -1
- package/dist/runtime/grading-ops.js.map +1 -1
- package/dist/runtime/memory-extra-ops.d.ts.map +1 -1
- package/dist/runtime/memory-extra-ops.js +6 -2
- package/dist/runtime/memory-extra-ops.js.map +1 -1
- package/dist/runtime/orchestrate-ops.d.ts.map +1 -1
- package/dist/runtime/orchestrate-ops.js +367 -40
- package/dist/runtime/orchestrate-ops.js.map +1 -1
- package/dist/runtime/planning-extra-ops.d.ts.map +1 -1
- package/dist/runtime/planning-extra-ops.js +69 -4
- package/dist/runtime/planning-extra-ops.js.map +1 -1
- package/dist/runtime/review-ops.d.ts +10 -0
- package/dist/runtime/review-ops.d.ts.map +1 -0
- package/dist/runtime/review-ops.js +97 -0
- package/dist/runtime/review-ops.js.map +1 -0
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +27 -12
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/session-briefing.d.ts +3 -0
- package/dist/runtime/session-briefing.d.ts.map +1 -1
- package/dist/runtime/session-briefing.js +68 -1
- package/dist/runtime/session-briefing.js.map +1 -1
- package/dist/runtime/sync-ops.d.ts +12 -0
- package/dist/runtime/sync-ops.d.ts.map +1 -0
- package/dist/runtime/sync-ops.js +288 -0
- package/dist/runtime/sync-ops.js.map +1 -0
- package/dist/runtime/types.d.ts +10 -4
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/vault-extra-ops.d.ts +5 -4
- package/dist/runtime/vault-extra-ops.d.ts.map +1 -1
- package/dist/runtime/vault-extra-ops.js +5 -300
- package/dist/runtime/vault-extra-ops.js.map +1 -1
- package/dist/runtime/vault-sharing-ops.d.ts +4 -4
- package/dist/runtime/vault-sharing-ops.d.ts.map +1 -1
- package/dist/runtime/vault-sharing-ops.js +5 -300
- package/dist/runtime/vault-sharing-ops.js.map +1 -1
- package/dist/skills/sync-skills.d.ts +27 -0
- package/dist/skills/sync-skills.d.ts.map +1 -0
- package/dist/skills/sync-skills.js +81 -0
- package/dist/skills/sync-skills.js.map +1 -0
- package/dist/update-check.d.ts +14 -0
- package/dist/update-check.d.ts.map +1 -0
- package/dist/update-check.js +96 -0
- package/dist/update-check.js.map +1 -0
- package/dist/vault/linking.d.ts +10 -12
- package/dist/vault/linking.d.ts.map +1 -1
- package/dist/vault/linking.js +104 -161
- package/dist/vault/linking.js.map +1 -1
- package/dist/vault/vault-entries.d.ts +69 -0
- package/dist/vault/vault-entries.d.ts.map +1 -0
- package/dist/vault/vault-entries.js +257 -0
- package/dist/vault/vault-entries.js.map +1 -0
- package/dist/vault/vault-interfaces.d.ts +153 -0
- package/dist/vault/vault-interfaces.d.ts.map +1 -0
- package/dist/vault/vault-interfaces.js +2 -0
- package/dist/vault/vault-interfaces.js.map +1 -0
- package/dist/vault/vault-maintenance.d.ts +40 -0
- package/dist/vault/vault-maintenance.d.ts.map +1 -0
- package/dist/vault/vault-maintenance.js +142 -0
- package/dist/vault/vault-maintenance.js.map +1 -0
- package/dist/vault/vault-markdown-sync.d.ts +22 -0
- package/dist/vault/vault-markdown-sync.d.ts.map +1 -0
- package/dist/vault/vault-markdown-sync.js +143 -0
- package/dist/vault/vault-markdown-sync.js.map +1 -0
- package/dist/vault/vault-memories.d.ts +61 -0
- package/dist/vault/vault-memories.d.ts.map +1 -0
- package/dist/vault/vault-memories.js +240 -0
- package/dist/vault/vault-memories.js.map +1 -0
- package/dist/vault/vault-schema.d.ts +9 -0
- package/dist/vault/vault-schema.d.ts.map +1 -0
- package/dist/vault/vault-schema.js +179 -0
- package/dist/vault/vault-schema.js.map +1 -0
- package/dist/vault/vault.d.ts +29 -81
- package/dist/vault/vault.d.ts.map +1 -1
- package/dist/vault/vault.js +78 -931
- package/dist/vault/vault.js.map +1 -1
- package/package.json +1 -1
- package/src/agency/agency-manager.test.ts +600 -0
- package/src/agency/default-rules.test.ts +228 -0
- package/src/{__tests__ → brain}/brain-intelligence.test.ts +37 -14
- package/src/{__tests__ → brain}/brain.test.ts +1 -1
- package/src/brain/intelligence.ts +196 -15
- package/src/brain/learning-radar.ts +22 -1
- package/src/{__tests__ → brain}/second-brain-features.test.ts +4 -4
- package/src/{__tests__ → brain}/session-lifecycle.test.ts +2 -2
- package/src/brain/strength-scorer.ts +404 -0
- package/src/capabilities/chain-mapping.test.ts +66 -0
- package/src/capabilities/registry.test.ts +369 -0
- package/src/chat/agent-loop.test.ts +394 -0
- package/src/chat/agent-loop.ts +2 -0
- package/src/{__tests__ → chat}/chat-differentiators.test.ts +3 -3
- package/src/{__tests__ → chat}/chat-enhanced.test.ts +4 -4
- package/src/{__tests__ → chat}/chat-transport.test.ts +6 -6
- package/src/chat/mcp-bridge.test.ts +173 -0
- package/src/chat/notifications.ts +2 -0
- package/src/chat/output-compressor.test.ts +164 -0
- package/src/claudemd/compose.test.ts +178 -0
- package/src/claudemd/compose.ts +1 -1
- package/src/claudemd/inject.test.ts +211 -0
- package/src/context/context-engine.test.ts +461 -0
- package/src/control/identity-manager.test.ts +305 -0
- package/src/control/intent-router.test.ts +360 -0
- package/src/control/intent-router.ts +13 -4
- package/src/curator/classifier.test.ts +104 -0
- package/src/curator/contradiction-detector.test.ts +180 -0
- package/src/curator/contradiction-detector.ts +87 -0
- package/src/{__tests__ → curator}/curator-pipeline-e2e.test.ts +10 -10
- package/src/{__tests__ → curator}/curator.test.ts +77 -1
- package/src/curator/curator.ts +115 -777
- package/src/curator/duplicate-detector.test.ts +183 -0
- package/src/curator/duplicate-detector.ts +103 -0
- package/src/curator/health-audit.ts +126 -0
- package/src/curator/metadata-enricher.ts +84 -0
- package/src/curator/quality-gate.test.ts +135 -0
- package/src/curator/schema.ts +65 -0
- package/src/curator/tag-manager.test.ts +165 -0
- package/src/curator/tag-manager.ts +109 -0
- package/src/domain-packs/inject-rules.test.ts +117 -0
- package/src/domain-packs/knowledge-installer.test.ts +171 -0
- package/src/domain-packs/loader.test.ts +86 -0
- package/src/domain-packs/pack-runtime.test.ts +140 -0
- package/src/domain-packs/skills-installer.test.ts +135 -0
- package/src/domain-packs/token-resolver.test.ts +150 -0
- package/src/domain-packs/types.test.ts +130 -0
- package/src/enforcement/adapters/claude-code.test.ts +216 -0
- package/src/enforcement/registry.test.ts +264 -0
- package/src/engine/bin/soleri-engine.ts +28 -4
- package/src/engine/core-ops.test.ts +254 -0
- package/src/engine/core-ops.ts +25 -8
- package/src/engine/module-manifest.test.ts +124 -0
- package/src/engine/module-manifest.ts +22 -2
- package/src/engine/register-engine.test.ts +230 -0
- package/src/engine/register-engine.ts +26 -2
- package/src/errors/classify.test.ts +199 -0
- package/src/errors/retry.test.ts +156 -0
- package/src/errors/retry.ts +2 -0
- package/src/errors/types.test.ts +108 -0
- package/src/events/event-bus.test.ts +149 -0
- package/src/extensions/middleware.test.ts +234 -0
- package/src/facades/facade-factory.test.ts +424 -0
- package/src/flows/chain-runner.test.ts +273 -0
- package/src/flows/context-router.test.ts +52 -0
- package/src/flows/dispatch-registry.test.ts +128 -0
- package/src/flows/epilogue.test.ts +107 -0
- package/src/flows/executor.test.ts +263 -0
- package/src/flows/gate-evaluator.test.ts +194 -0
- package/src/flows/gate-evaluator.ts +25 -0
- package/src/flows/types.ts +4 -0
- package/src/governance/governance.test.ts +726 -0
- package/src/health/health-registry.test.ts +186 -0
- package/src/health/vault-integrity.test.ts +110 -0
- package/src/index.ts +92 -0
- package/src/intake/content-classifier.test.ts +209 -0
- package/src/intake/dedup-gate.test.ts +131 -0
- package/src/intake/intake-pipeline.test.ts +506 -0
- package/src/intake/intake-pipeline.ts +1 -0
- package/src/intake/text-ingester.test.ts +194 -0
- package/src/intake/text-ingester.ts +2 -0
- package/src/llm/key-pool.test.ts +236 -0
- package/src/llm/key-pool.ts +3 -4
- package/src/llm/llm-client.test.ts +345 -0
- package/src/llm/oauth-discovery.test.ts +180 -0
- package/src/llm/utils.test.ts +327 -0
- package/src/llm/utils.ts +2 -0
- package/src/{__tests__ → logging}/logger.test.ts +41 -62
- package/src/loop/loop-manager.test.ts +519 -0
- package/src/migrations/migration-runner.edge-cases.test.ts +319 -0
- package/src/migrations/migration-runner.test-helpers.ts +64 -0
- package/src/migrations/migration-runner.test.ts +385 -0
- package/src/operator/auto-signal-pipeline.test.ts +207 -0
- package/src/operator/operator-profile-extended.test.ts +320 -0
- package/src/operator/operator-profile.test.ts +314 -0
- package/src/operator/operator-profile.ts +469 -0
- package/src/operator/operator-signals-extended.test.ts +245 -0
- package/src/operator/operator-signals.test.ts +281 -0
- package/src/operator/operator-signals.ts +261 -0
- package/src/operator/operator-types.ts +444 -0
- package/src/operator/prompts/hook-precompact-operator-dispatch.md +94 -0
- package/src/operator/prompts/subagent-soft-signal-extractor.md +125 -0
- package/src/operator/prompts/subagent-synthesis-cognition.md +181 -0
- package/src/operator/prompts/subagent-synthesis-communication.md +140 -0
- package/src/operator/prompts/subagent-synthesis-technical.md +160 -0
- package/src/operator/prompts/subagent-synthesis-trust.md +143 -0
- package/src/{__tests__ → packs}/pack-lockfile.test.ts +3 -3
- package/src/{__tests__ → packs}/pack-system.test.ts +2 -2
- package/src/paths.ts +115 -0
- package/src/persistence/index.ts +1 -1
- package/src/persistence/sqlite-provider.test.ts +540 -0
- package/src/persistence/sqlite-provider.ts +8 -5
- package/src/persona/defaults.test.ts +59 -0
- package/src/persona/loader.test.ts +67 -0
- package/src/persona/prompt-generator.test.ts +127 -0
- package/src/planning/evidence-collector.test.ts +406 -0
- package/src/planning/evidence-collector.ts +50 -0
- package/src/planning/gap-analysis-alternatives.test.ts +169 -0
- package/src/planning/gap-analysis.ts +21 -636
- package/src/planning/gap-passes.test.ts +372 -0
- package/src/planning/gap-passes.ts +298 -0
- package/src/planning/gap-patterns.test.ts +320 -0
- package/src/planning/gap-patterns.ts +234 -0
- package/src/planning/gap-types.ts +4 -1
- package/src/planning/github-projection.test.ts +177 -0
- package/src/planning/github-projection.ts +425 -0
- package/src/planning/impact-analyzer.test.ts +180 -0
- package/src/planning/impact-analyzer.ts +264 -0
- package/src/planning/plan-lifecycle.test.ts +312 -0
- package/src/planning/plan-lifecycle.ts +346 -0
- package/src/planning/planner-types.ts +215 -0
- package/src/{__tests__ → planning}/planner.test.ts +169 -15
- package/src/planning/planner.ts +197 -1228
- package/src/planning/rationalization-detector.test.ts +171 -0
- package/src/planning/rationalization-detector.ts +138 -0
- package/src/planning/reconciliation-engine.test.ts +141 -0
- package/src/planning/reconciliation-engine.ts +162 -0
- package/src/planning/task-verifier.test.ts +235 -0
- package/src/planning/task-verifier.ts +303 -0
- package/src/planning/verification-protocol.test.ts +201 -0
- package/src/playbooks/generic/generic-playbooks.test.ts +438 -0
- package/src/playbooks/index.test.ts +77 -0
- package/src/playbooks/playbook-executor.test.ts +255 -0
- package/src/playbooks/playbook-registry.test.ts +232 -0
- package/src/playbooks/playbook-seeder.test.ts +153 -0
- package/src/plugins/plugin-loader.test.ts +212 -0
- package/src/plugins/plugin-registry.test.ts +272 -0
- package/src/project/project-registry.test.ts +428 -0
- package/src/prompts/parser.test.ts +100 -0
- package/src/prompts/template-manager.test.ts +109 -0
- package/src/{__tests__ → queue}/async-infrastructure.test.ts +3 -3
- package/src/queue/job-queue.test.ts +331 -0
- package/src/queue/pipeline-runner.test.ts +209 -0
- package/src/runtime/admin-extra-ops.test.ts +527 -0
- package/src/runtime/admin-ops.test.ts +257 -0
- package/src/runtime/admin-ops.ts +45 -17
- package/src/runtime/admin-setup-ops.test.ts +328 -0
- package/src/runtime/admin-setup-ops.ts +20 -43
- package/src/runtime/archive-ops.test.ts +269 -0
- package/src/runtime/archive-ops.ts +347 -0
- package/src/runtime/capture-ops.test.ts +433 -0
- package/src/runtime/capture-ops.ts +50 -8
- package/src/runtime/chain-ops.test.ts +149 -0
- package/src/runtime/claude-md-helpers.test.ts +191 -0
- package/src/runtime/claude-md-helpers.ts +1 -1
- package/src/runtime/context-health.test.ts +78 -0
- package/src/runtime/context-health.ts +85 -0
- package/src/runtime/curator-extra-ops.test.ts +202 -0
- package/src/runtime/deprecation.test.ts +98 -0
- package/src/runtime/domain-ops.test.ts +268 -0
- package/src/runtime/facades/admin-facade.test.ts +333 -0
- package/src/runtime/facades/agency-facade.test.ts +278 -0
- package/src/runtime/facades/archive-facade.test.ts +294 -0
- package/src/runtime/facades/archive-facade.ts +14 -0
- package/src/runtime/facades/brain-facade.test.ts +714 -0
- package/src/runtime/facades/brain-facade.ts +2 -0
- package/src/runtime/facades/chat-facade.test.ts +166 -0
- package/src/runtime/facades/chat-facade.ts +15 -906
- package/src/runtime/facades/chat-service-ops.test.ts +276 -0
- package/src/runtime/facades/chat-service-ops.ts +374 -0
- package/src/runtime/facades/chat-session-ops.test.ts +197 -0
- package/src/runtime/facades/chat-session-ops.ts +146 -0
- package/src/runtime/facades/chat-state.ts +60 -0
- package/src/runtime/facades/chat-transport-ops.test.ts +269 -0
- package/src/runtime/facades/chat-transport-ops.ts +380 -0
- package/src/runtime/facades/context-facade.test.ts +108 -0
- package/src/runtime/facades/control-facade.test.ts +436 -0
- package/src/runtime/facades/control-facade.ts +6 -1
- package/src/runtime/facades/curator-facade.test.ts +303 -0
- package/src/runtime/facades/index.ts +6 -0
- package/src/runtime/facades/loop-facade.test.ts +245 -0
- package/src/runtime/facades/memory-facade.test.ts +269 -0
- package/src/runtime/facades/memory-facade.ts +78 -6
- package/src/runtime/facades/operator-facade.test.ts +208 -0
- package/src/runtime/facades/operator-facade.ts +236 -0
- package/src/runtime/facades/orchestrate-facade.test.ts +185 -0
- package/src/runtime/facades/orchestrate-facade.ts +3 -3
- package/src/runtime/facades/plan-facade.test.ts +266 -0
- package/src/runtime/facades/plan-facade.ts +42 -6
- package/src/runtime/facades/review-facade.test.ts +82 -0
- package/src/runtime/facades/review-facade.ts +11 -0
- package/src/runtime/facades/sync-facade.test.ts +113 -0
- package/src/runtime/facades/sync-facade.ts +11 -0
- package/src/runtime/facades/vault-facade.test.ts +631 -0
- package/src/runtime/facades/vault-facade.ts +15 -70
- package/src/runtime/feature-flags.test.ts +140 -0
- package/src/runtime/github-integration.test.ts +89 -0
- package/src/runtime/github-integration.ts +159 -0
- package/src/runtime/grading-ops.test.ts +141 -0
- package/src/runtime/grading-ops.ts +1 -1
- package/src/runtime/intake-ops.test.ts +208 -0
- package/src/runtime/loop-ops.test.ts +238 -0
- package/src/runtime/memory-cross-project-ops.test.ts +177 -0
- package/src/runtime/memory-extra-ops.test.ts +453 -0
- package/src/runtime/memory-extra-ops.ts +6 -2
- package/src/runtime/orchestrate-ops.test.ts +302 -0
- package/src/runtime/orchestrate-ops.ts +435 -46
- package/src/runtime/pack-ops.test.ts +158 -0
- package/src/runtime/planning-extra-ops.test.ts +583 -0
- package/src/runtime/planning-extra-ops.ts +72 -4
- package/src/{__tests__ → runtime}/playbook-ops-execution.test.ts +3 -3
- package/src/runtime/playbook-ops.test.ts +262 -0
- package/src/runtime/plugin-ops.test.ts +201 -0
- package/src/runtime/project-ops.test.ts +235 -0
- package/src/runtime/review-ops.test.ts +142 -0
- package/src/runtime/review-ops.ts +99 -0
- package/src/runtime/runtime.test.ts +363 -0
- package/src/runtime/runtime.ts +39 -12
- package/src/runtime/session-briefing.test.ts +302 -0
- package/src/runtime/session-briefing.ts +80 -1
- package/src/runtime/sync-ops.test.ts +221 -0
- package/src/runtime/sync-ops.ts +325 -0
- package/src/runtime/telemetry-ops.test.ts +132 -0
- package/src/runtime/types.ts +10 -4
- package/src/runtime/vault-extra-ops.test.ts +246 -0
- package/src/runtime/vault-extra-ops.ts +5 -332
- package/src/runtime/vault-linking-ops.test.ts +237 -0
- package/src/runtime/vault-sharing-ops.test.ts +130 -0
- package/src/runtime/vault-sharing-ops.ts +5 -329
- package/src/skills/sync-skills.ts +108 -0
- package/src/streams/normalize.test.ts +95 -0
- package/src/streams/replayable-stream.test.ts +166 -0
- package/src/telemetry/telemetry.test.ts +143 -0
- package/src/transport/http-server.test.ts +394 -0
- package/src/transport/lsp-server.test.ts +458 -0
- package/src/transport/rate-limiter.test.ts +126 -0
- package/src/transport/session-manager.test.ts +133 -0
- package/src/transport/token-auth.test.ts +136 -0
- package/src/transport/ws-server.test.ts +294 -0
- package/src/update-check.ts +111 -0
- package/src/vault/__tests__/vault-characterization.test.ts +168 -0
- package/src/vault/content-hash.test.ts +78 -0
- package/src/vault/git-vault-sync.test.ts +234 -0
- package/src/vault/knowledge-review.test.ts +269 -0
- package/src/vault/linking.test.ts +358 -0
- package/src/vault/linking.ts +149 -183
- package/src/vault/obsidian-sync.test.ts +342 -0
- package/src/vault/playbook.test.ts +152 -0
- package/src/vault/scope-detector.test.ts +187 -0
- package/src/vault/vault-branching.test.ts +250 -0
- package/src/{__tests__ → vault}/vault-connect.test.ts +1 -1
- package/src/vault/vault-entries.ts +282 -0
- package/src/vault/vault-interfaces.ts +56 -0
- package/src/vault/vault-maintenance.ts +205 -0
- package/src/vault/vault-manager.test.ts +206 -0
- package/src/vault/vault-markdown-sync.test.ts +203 -0
- package/src/vault/vault-markdown-sync.ts +160 -0
- package/src/vault/vault-memories.ts +339 -0
- package/src/{__tests__ → vault}/vault-scaling.test.ts +1 -1
- package/src/vault/vault-schema.ts +181 -0
- package/src/{__tests__ → vault}/vault-sharing.test.ts +4 -4
- package/src/{__tests__ → vault}/vault.test.ts +2 -2
- package/src/vault/vault.ts +89 -1171
- package/dist/cognee/client.d.ts +0 -43
- package/dist/cognee/client.d.ts.map +0 -1
- package/dist/cognee/client.js +0 -375
- package/dist/cognee/client.js.map +0 -1
- package/dist/cognee/sync-manager.d.ts +0 -153
- package/dist/cognee/sync-manager.d.ts.map +0 -1
- package/dist/cognee/sync-manager.js +0 -390
- package/dist/cognee/sync-manager.js.map +0 -1
- package/dist/cognee/types.d.ts +0 -62
- package/dist/cognee/types.d.ts.map +0 -1
- package/dist/cognee/types.js +0 -3
- package/dist/cognee/types.js.map +0 -1
- package/dist/governance/index.d.ts +0 -3
- package/dist/governance/index.d.ts.map +0 -1
- package/dist/governance/index.js +0 -2
- package/dist/governance/index.js.map +0 -1
- package/dist/health/doctor-checks.d.ts +0 -15
- package/dist/health/doctor-checks.d.ts.map +0 -1
- package/dist/health/doctor-checks.js +0 -98
- package/dist/health/doctor-checks.js.map +0 -1
- package/dist/persistence/postgres-provider.d.ts +0 -81
- package/dist/persistence/postgres-provider.d.ts.map +0 -1
- package/dist/persistence/postgres-provider.js +0 -256
- package/dist/persistence/postgres-provider.js.map +0 -1
- package/dist/runtime/cognee-sync-ops.d.ts +0 -12
- package/dist/runtime/cognee-sync-ops.d.ts.map +0 -1
- package/dist/runtime/cognee-sync-ops.js +0 -93
- package/dist/runtime/cognee-sync-ops.js.map +0 -1
- package/dist/runtime/core-ops.d.ts +0 -23
- package/dist/runtime/core-ops.d.ts.map +0 -1
- package/dist/runtime/core-ops.js +0 -1296
- package/dist/runtime/core-ops.js.map +0 -1
- package/dist/runtime/facades/cognee-facade.d.ts +0 -8
- package/dist/runtime/facades/cognee-facade.d.ts.map +0 -1
- package/dist/runtime/facades/cognee-facade.js +0 -156
- package/dist/runtime/facades/cognee-facade.js.map +0 -1
- package/src/__tests__/admin-extra-ops.test.ts +0 -484
- package/src/__tests__/admin-ops.test.ts +0 -268
- package/src/__tests__/admin-setup-ops.test.ts +0 -355
- package/src/__tests__/agency-manager.test.ts +0 -374
- package/src/__tests__/agent-loop.test.ts +0 -256
- package/src/__tests__/capture-ops.test.ts +0 -784
- package/src/__tests__/claudemd.test.ts +0 -282
- package/src/__tests__/content-hash.test.ts +0 -60
- package/src/__tests__/context-engine.test.ts +0 -251
- package/src/__tests__/core-ops.test.ts +0 -550
- package/src/__tests__/curator-extra-ops.test.ts +0 -383
- package/src/__tests__/deprecation.test.ts +0 -78
- package/src/__tests__/domain-ops.test.ts +0 -226
- package/src/__tests__/domain-packs.test.ts +0 -421
- package/src/__tests__/enforcement.test.ts +0 -153
- package/src/__tests__/errors.test.ts +0 -388
- package/src/__tests__/extensions.test.ts +0 -233
- package/src/__tests__/facade-factory.test.ts +0 -271
- package/src/__tests__/feature-flags.test.ts +0 -137
- package/src/__tests__/flows.test.ts +0 -604
- package/src/__tests__/git-vault-sync.test.ts +0 -230
- package/src/__tests__/governance.test.ts +0 -522
- package/src/__tests__/grading-ops.test.ts +0 -361
- package/src/__tests__/health-registry.test.ts +0 -173
- package/src/__tests__/identity-manager.test.ts +0 -243
- package/src/__tests__/intake-pipeline.test.ts +0 -162
- package/src/__tests__/intent-router.test.ts +0 -222
- package/src/__tests__/knowledge-review.test.ts +0 -104
- package/src/__tests__/llm-client.test.ts +0 -69
- package/src/__tests__/llm.test.ts +0 -556
- package/src/__tests__/loader.test.ts +0 -176
- package/src/__tests__/loop-ops.test.ts +0 -469
- package/src/__tests__/lsp-transport.test.ts +0 -442
- package/src/__tests__/memory-cross-project-ops.test.ts +0 -248
- package/src/__tests__/memory-extra-ops.test.ts +0 -352
- package/src/__tests__/migration-runner.test.ts +0 -170
- package/src/__tests__/module-manifest-drift.test.ts +0 -59
- package/src/__tests__/normalize.test.ts +0 -85
- package/src/__tests__/obsidian-sync.test.ts +0 -354
- package/src/__tests__/orchestrate-ops.test.ts +0 -289
- package/src/__tests__/pack-ops.test.ts +0 -146
- package/src/__tests__/persistence.test.ts +0 -291
- package/src/__tests__/planning-extra-ops.test.ts +0 -706
- package/src/__tests__/playbook-executor.test.ts +0 -249
- package/src/__tests__/playbook-registry.test.ts +0 -326
- package/src/__tests__/playbook-seeder.test.ts +0 -163
- package/src/__tests__/playbook.test.ts +0 -389
- package/src/__tests__/plugin-ops.test.ts +0 -411
- package/src/__tests__/plugin-system.test.ts +0 -509
- package/src/__tests__/project-ops.test.ts +0 -381
- package/src/__tests__/replayable-stream.test.ts +0 -177
- package/src/__tests__/runtime.test.ts +0 -95
- package/src/__tests__/scope-detector.test.ts +0 -121
- package/src/__tests__/template-manager.test.ts +0 -222
- package/src/__tests__/token-resolver.test.ts +0 -79
- package/src/__tests__/transport.test.ts +0 -758
- package/src/__tests__/vault-branching.test.ts +0 -274
- package/src/__tests__/vault-extra-ops.test.ts +0 -482
- package/src/__tests__/vault-integrity.test.ts +0 -71
- package/src/__tests__/vault-manager.test.ts +0 -238
- package/src/__tests__/ws-transport.test.ts +0 -479
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vault Markdown Sync — auto-sync vault entries to browsable markdown files.
|
|
3
|
+
*
|
|
4
|
+
* Writes entries as markdown with YAML frontmatter to knowledge/vault/{domain}/{slug}.md
|
|
5
|
+
* for offline browsability. Reuses patterns from obsidian-sync.ts.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { mkdirSync, writeFileSync, readFileSync, readdirSync, existsSync } from 'node:fs';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import type { IntelligenceEntry } from '../intelligence/types.js';
|
|
11
|
+
import { computeContentHash } from './content-hash.js';
|
|
12
|
+
import type { Vault } from './vault.js';
|
|
13
|
+
|
|
14
|
+
// ─── Format ─────────────────────────────────────────────────────────
|
|
15
|
+
|
|
16
|
+
/** Slugify a title for use as a filename. */
|
|
17
|
+
export function titleToSlug(title: string): string {
|
|
18
|
+
return title
|
|
19
|
+
.toLowerCase()
|
|
20
|
+
.replace(/[^\w\s-]/g, '')
|
|
21
|
+
.replace(/\s+/g, '-')
|
|
22
|
+
.replace(/-+/g, '-')
|
|
23
|
+
.replace(/^-|-$/g, '')
|
|
24
|
+
.slice(0, 80);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Convert a vault entry to markdown string with YAML frontmatter. */
|
|
28
|
+
export function entryToMarkdown(entry: IntelligenceEntry): string {
|
|
29
|
+
const lines: string[] = ['---'];
|
|
30
|
+
lines.push(`id: "${entry.id}"`);
|
|
31
|
+
lines.push(`type: "${entry.type}"`);
|
|
32
|
+
if (entry.domain) lines.push(`domain: "${entry.domain}"`);
|
|
33
|
+
if (entry.tags && entry.tags.length > 0) {
|
|
34
|
+
lines.push(`tags: [${entry.tags.map((t) => `"${t}"`).join(', ')}]`);
|
|
35
|
+
}
|
|
36
|
+
if (entry.severity) lines.push(`severity: "${entry.severity}"`);
|
|
37
|
+
if (entry.tier) lines.push(`tier: "${entry.tier}"`);
|
|
38
|
+
if (entry.origin) lines.push(`origin: "${entry.origin}"`);
|
|
39
|
+
const created = entry.validFrom
|
|
40
|
+
? new Date(entry.validFrom * 1000).toISOString().slice(0, 10)
|
|
41
|
+
: new Date().toISOString().slice(0, 10);
|
|
42
|
+
lines.push(`created: ${created}`);
|
|
43
|
+
lines.push(`content_hash: "${computeContentHash(entry)}"`);
|
|
44
|
+
lines.push('---');
|
|
45
|
+
lines.push('');
|
|
46
|
+
lines.push(`# ${entry.title}`);
|
|
47
|
+
lines.push('');
|
|
48
|
+
lines.push(entry.description);
|
|
49
|
+
if (entry.context) {
|
|
50
|
+
lines.push('');
|
|
51
|
+
lines.push('## Context');
|
|
52
|
+
lines.push('');
|
|
53
|
+
lines.push(entry.context);
|
|
54
|
+
}
|
|
55
|
+
if (entry.example) {
|
|
56
|
+
lines.push('');
|
|
57
|
+
lines.push('## Example');
|
|
58
|
+
lines.push('');
|
|
59
|
+
lines.push(entry.example);
|
|
60
|
+
}
|
|
61
|
+
if (entry.counterExample) {
|
|
62
|
+
lines.push('');
|
|
63
|
+
lines.push('## Counter-Example');
|
|
64
|
+
lines.push('');
|
|
65
|
+
lines.push(entry.counterExample);
|
|
66
|
+
}
|
|
67
|
+
if (entry.why) {
|
|
68
|
+
lines.push('');
|
|
69
|
+
lines.push('## Why');
|
|
70
|
+
lines.push('');
|
|
71
|
+
lines.push(entry.why);
|
|
72
|
+
}
|
|
73
|
+
lines.push('');
|
|
74
|
+
return lines.join('\n');
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// ─── Sync ───────────────────────────────────────────────────────────
|
|
78
|
+
|
|
79
|
+
/** Write a single entry as a markdown file to knowledge/vault/{domain}/{slug}.md */
|
|
80
|
+
export async function syncEntryToMarkdown(
|
|
81
|
+
entry: IntelligenceEntry,
|
|
82
|
+
knowledgeDir: string,
|
|
83
|
+
): Promise<void> {
|
|
84
|
+
const domain = entry.domain || '_general';
|
|
85
|
+
const slug = titleToSlug(entry.title);
|
|
86
|
+
if (!slug) return;
|
|
87
|
+
|
|
88
|
+
const dir = join(knowledgeDir, 'vault', domain);
|
|
89
|
+
mkdirSync(dir, { recursive: true });
|
|
90
|
+
|
|
91
|
+
const filePath = join(dir, `${slug}.md`);
|
|
92
|
+
const content = entryToMarkdown(entry);
|
|
93
|
+
writeFileSync(filePath, content, 'utf-8');
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** Sync all vault entries to markdown, skipping entries whose content hash matches. */
|
|
97
|
+
export async function syncAllToMarkdown(
|
|
98
|
+
vault: Vault,
|
|
99
|
+
knowledgeDir: string,
|
|
100
|
+
): Promise<{ synced: number; skipped: number }> {
|
|
101
|
+
const entries = vault.list({ limit: 10000 });
|
|
102
|
+
let synced = 0;
|
|
103
|
+
let skipped = 0;
|
|
104
|
+
|
|
105
|
+
for (const entry of entries) {
|
|
106
|
+
const domain = entry.domain || '_general';
|
|
107
|
+
const slug = titleToSlug(entry.title);
|
|
108
|
+
if (!slug) { skipped++; continue; }
|
|
109
|
+
|
|
110
|
+
const filePath = join(knowledgeDir, 'vault', domain, `${slug}.md`);
|
|
111
|
+
if (existsSync(filePath)) {
|
|
112
|
+
const existing = readFileSync(filePath, 'utf-8');
|
|
113
|
+
const hashMatch = existing.match(/^content_hash:\s*"([^"]+)"/m);
|
|
114
|
+
if (hashMatch && hashMatch[1] === computeContentHash(entry)) {
|
|
115
|
+
skipped++;
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
await syncEntryToMarkdown(entry, knowledgeDir);
|
|
121
|
+
synced++;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
await generateIndex(knowledgeDir);
|
|
125
|
+
return { synced, skipped };
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// ─── Index ──────────────────────────────────────────────────────────
|
|
129
|
+
|
|
130
|
+
/** Generate _index.md with entry counts per domain. */
|
|
131
|
+
export async function generateIndex(knowledgeDir: string): Promise<void> {
|
|
132
|
+
const vaultDir = join(knowledgeDir, 'vault');
|
|
133
|
+
if (!existsSync(vaultDir)) return;
|
|
134
|
+
|
|
135
|
+
const domains: Array<{ name: string; count: number }> = [];
|
|
136
|
+
const entries = readdirSync(vaultDir, { withFileTypes: true });
|
|
137
|
+
|
|
138
|
+
for (const entry of entries) {
|
|
139
|
+
if (!entry.isDirectory()) continue;
|
|
140
|
+
const domainDir = join(vaultDir, entry.name);
|
|
141
|
+
const files = readdirSync(domainDir).filter((f) => f.endsWith('.md'));
|
|
142
|
+
domains.push({ name: entry.name, count: files.length });
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
domains.sort((a, b) => b.count - a.count);
|
|
146
|
+
const total = domains.reduce((sum, d) => sum + d.count, 0);
|
|
147
|
+
|
|
148
|
+
const lines: string[] = [
|
|
149
|
+
'# Vault Knowledge Index',
|
|
150
|
+
'',
|
|
151
|
+
`> Auto-generated. ${total} entries across ${domains.length} domains.`,
|
|
152
|
+
'',
|
|
153
|
+
'| Domain | Entries |',
|
|
154
|
+
'|--------|---------|',
|
|
155
|
+
...domains.map((d) => `| [${d.name}](./${d.name}/) | ${d.count} |`),
|
|
156
|
+
'',
|
|
157
|
+
];
|
|
158
|
+
|
|
159
|
+
writeFileSync(join(vaultDir, '_index.md'), lines.join('\n'), 'utf-8');
|
|
160
|
+
}
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vault memory/session operations — capture, search, list, export, import, prune, dedup.
|
|
3
|
+
* Extracted from vault.ts as part of Wave 0C decomposition.
|
|
4
|
+
*/
|
|
5
|
+
import type { PersistenceProvider } from '../persistence/types.js';
|
|
6
|
+
import type { Memory, MemoryStats } from './vault.js';
|
|
7
|
+
|
|
8
|
+
export function captureMemory(
|
|
9
|
+
provider: PersistenceProvider,
|
|
10
|
+
memory: Omit<Memory, 'id' | 'createdAt' | 'archivedAt'>,
|
|
11
|
+
): Memory {
|
|
12
|
+
const id = `mem-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
13
|
+
provider.run(
|
|
14
|
+
`INSERT INTO memories (id, project_path, type, context, summary, topics, files_modified, tools_used, intent, decisions, current_state, next_steps, vault_entries_referenced)
|
|
15
|
+
VALUES (@id, @projectPath, @type, @context, @summary, @topics, @filesModified, @toolsUsed, @intent, @decisions, @currentState, @nextSteps, @vaultEntriesReferenced)`,
|
|
16
|
+
{
|
|
17
|
+
id,
|
|
18
|
+
projectPath: memory.projectPath,
|
|
19
|
+
type: memory.type,
|
|
20
|
+
context: memory.context,
|
|
21
|
+
summary: memory.summary,
|
|
22
|
+
topics: JSON.stringify(memory.topics),
|
|
23
|
+
filesModified: JSON.stringify(memory.filesModified),
|
|
24
|
+
toolsUsed: JSON.stringify(memory.toolsUsed),
|
|
25
|
+
intent: memory.intent ?? null,
|
|
26
|
+
decisions: JSON.stringify(memory.decisions ?? []),
|
|
27
|
+
currentState: memory.currentState ?? null,
|
|
28
|
+
nextSteps: JSON.stringify(memory.nextSteps ?? []),
|
|
29
|
+
vaultEntriesReferenced: JSON.stringify(memory.vaultEntriesReferenced ?? []),
|
|
30
|
+
},
|
|
31
|
+
);
|
|
32
|
+
return getMemory(provider, id)!;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function getMemory(provider: PersistenceProvider, id: string): Memory | null {
|
|
36
|
+
const row = provider.get<Record<string, unknown>>('SELECT * FROM memories WHERE id = ?', [id]);
|
|
37
|
+
return row ? rowToMemory(row) : null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function deleteMemory(provider: PersistenceProvider, id: string): boolean {
|
|
41
|
+
return provider.run('DELETE FROM memories WHERE id = ?', [id]).changes > 0;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function searchMemories(
|
|
45
|
+
provider: PersistenceProvider,
|
|
46
|
+
query: string,
|
|
47
|
+
options?: { type?: string; projectPath?: string; intent?: string; limit?: number },
|
|
48
|
+
): Memory[] {
|
|
49
|
+
const limit = options?.limit ?? 10;
|
|
50
|
+
const filters: string[] = ['m.archived_at IS NULL'];
|
|
51
|
+
const fp: Record<string, unknown> = {};
|
|
52
|
+
if (options?.type) {
|
|
53
|
+
filters.push('m.type = @type');
|
|
54
|
+
fp.type = options.type;
|
|
55
|
+
}
|
|
56
|
+
if (options?.projectPath) {
|
|
57
|
+
filters.push('m.project_path = @projectPath');
|
|
58
|
+
fp.projectPath = options.projectPath;
|
|
59
|
+
}
|
|
60
|
+
if (options?.intent) {
|
|
61
|
+
filters.push('m.intent = @intent');
|
|
62
|
+
fp.intent = options.intent;
|
|
63
|
+
}
|
|
64
|
+
const wc = filters.length > 0 ? `AND ${filters.join(' AND ')}` : '';
|
|
65
|
+
try {
|
|
66
|
+
const rows = provider.all<Record<string, unknown>>(
|
|
67
|
+
`SELECT m.* FROM memories_fts fts JOIN memories m ON m.rowid = fts.rowid WHERE memories_fts MATCH @query ${wc} ORDER BY rank LIMIT @limit`,
|
|
68
|
+
{ query, limit, ...fp },
|
|
69
|
+
);
|
|
70
|
+
return rows.map(rowToMemory);
|
|
71
|
+
} catch {
|
|
72
|
+
return [];
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export function listMemories(
|
|
77
|
+
provider: PersistenceProvider,
|
|
78
|
+
options?: { type?: string; projectPath?: string; limit?: number; offset?: number },
|
|
79
|
+
): Memory[] {
|
|
80
|
+
const filters: string[] = ['archived_at IS NULL'];
|
|
81
|
+
const params: Record<string, unknown> = {};
|
|
82
|
+
if (options?.type) {
|
|
83
|
+
filters.push('type = @type');
|
|
84
|
+
params.type = options.type;
|
|
85
|
+
}
|
|
86
|
+
if (options?.projectPath) {
|
|
87
|
+
filters.push('project_path = @projectPath');
|
|
88
|
+
params.projectPath = options.projectPath;
|
|
89
|
+
}
|
|
90
|
+
const wc = `WHERE ${filters.join(' AND ')}`;
|
|
91
|
+
const rows = provider.all<Record<string, unknown>>(
|
|
92
|
+
`SELECT * FROM memories ${wc} ORDER BY created_at DESC LIMIT @limit OFFSET @offset`,
|
|
93
|
+
{ ...params, limit: options?.limit ?? 50, offset: options?.offset ?? 0 },
|
|
94
|
+
);
|
|
95
|
+
return rows.map(rowToMemory);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export function memoryStats(provider: PersistenceProvider): MemoryStats {
|
|
99
|
+
const total = provider.get<{ count: number }>(
|
|
100
|
+
'SELECT COUNT(*) as count FROM memories WHERE archived_at IS NULL',
|
|
101
|
+
)!.count;
|
|
102
|
+
const byTypeRows = provider.all<{ key: string; count: number }>(
|
|
103
|
+
'SELECT type as key, COUNT(*) as count FROM memories WHERE archived_at IS NULL GROUP BY type',
|
|
104
|
+
);
|
|
105
|
+
const byProjectRows = provider.all<{ key: string; count: number }>(
|
|
106
|
+
'SELECT project_path as key, COUNT(*) as count FROM memories WHERE archived_at IS NULL GROUP BY project_path',
|
|
107
|
+
);
|
|
108
|
+
return {
|
|
109
|
+
total,
|
|
110
|
+
byType: Object.fromEntries(byTypeRows.map((r) => [r.key, r.count])),
|
|
111
|
+
byProject: Object.fromEntries(byProjectRows.map((r) => [r.key, r.count])),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export function memoryStatsDetailed(
|
|
116
|
+
provider: PersistenceProvider,
|
|
117
|
+
options?: { projectPath?: string; fromDate?: number; toDate?: number },
|
|
118
|
+
): MemoryStats & { oldest: number | null; newest: number | null; archivedCount: number } {
|
|
119
|
+
const filters: string[] = [];
|
|
120
|
+
const params: Record<string, unknown> = {};
|
|
121
|
+
if (options?.projectPath) {
|
|
122
|
+
filters.push('project_path = @projectPath');
|
|
123
|
+
params.projectPath = options.projectPath;
|
|
124
|
+
}
|
|
125
|
+
if (options?.fromDate) {
|
|
126
|
+
filters.push('created_at >= @fromDate');
|
|
127
|
+
params.fromDate = options.fromDate;
|
|
128
|
+
}
|
|
129
|
+
if (options?.toDate) {
|
|
130
|
+
filters.push('created_at <= @toDate');
|
|
131
|
+
params.toDate = options.toDate;
|
|
132
|
+
}
|
|
133
|
+
const wc = filters.length > 0 ? `WHERE ${filters.join(' AND ')}` : '';
|
|
134
|
+
|
|
135
|
+
const total = provider.get<{ count: number }>(
|
|
136
|
+
`SELECT COUNT(*) as count FROM memories ${wc}${wc ? ' AND' : ' WHERE'} archived_at IS NULL`,
|
|
137
|
+
params,
|
|
138
|
+
)!.count;
|
|
139
|
+
|
|
140
|
+
const archivedCount = provider.get<{ count: number }>(
|
|
141
|
+
`SELECT COUNT(*) as count FROM memories ${wc}${wc ? ' AND' : ' WHERE'} archived_at IS NOT NULL`,
|
|
142
|
+
params,
|
|
143
|
+
)!.count;
|
|
144
|
+
|
|
145
|
+
const byTypeRows = provider.all<{ key: string; count: number }>(
|
|
146
|
+
`SELECT type as key, COUNT(*) as count FROM memories ${wc}${wc ? ' AND' : ' WHERE'} archived_at IS NULL GROUP BY type`,
|
|
147
|
+
params,
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
const byProjectRows = provider.all<{ key: string; count: number }>(
|
|
151
|
+
`SELECT project_path as key, COUNT(*) as count FROM memories ${wc}${wc ? ' AND' : ' WHERE'} archived_at IS NULL GROUP BY project_path`,
|
|
152
|
+
params,
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
const dateRange = provider.get<{ oldest: number | null; newest: number | null }>(
|
|
156
|
+
`SELECT MIN(created_at) as oldest, MAX(created_at) as newest FROM memories ${wc}${wc ? ' AND' : ' WHERE'} archived_at IS NULL`,
|
|
157
|
+
params,
|
|
158
|
+
)!;
|
|
159
|
+
|
|
160
|
+
return {
|
|
161
|
+
total,
|
|
162
|
+
byType: Object.fromEntries(byTypeRows.map((r) => [r.key, r.count])),
|
|
163
|
+
byProject: Object.fromEntries(byProjectRows.map((r) => [r.key, r.count])),
|
|
164
|
+
oldest: dateRange.oldest,
|
|
165
|
+
newest: dateRange.newest,
|
|
166
|
+
archivedCount,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export function exportMemories(
|
|
171
|
+
provider: PersistenceProvider,
|
|
172
|
+
options?: { projectPath?: string; type?: string; includeArchived?: boolean },
|
|
173
|
+
): Memory[] {
|
|
174
|
+
const filters: string[] = [];
|
|
175
|
+
const params: Record<string, unknown> = {};
|
|
176
|
+
if (!options?.includeArchived) {
|
|
177
|
+
filters.push('archived_at IS NULL');
|
|
178
|
+
}
|
|
179
|
+
if (options?.projectPath) {
|
|
180
|
+
filters.push('project_path = @projectPath');
|
|
181
|
+
params.projectPath = options.projectPath;
|
|
182
|
+
}
|
|
183
|
+
if (options?.type) {
|
|
184
|
+
filters.push('type = @type');
|
|
185
|
+
params.type = options.type;
|
|
186
|
+
}
|
|
187
|
+
const wc = filters.length > 0 ? `WHERE ${filters.join(' AND ')}` : '';
|
|
188
|
+
const rows = provider.all<Record<string, unknown>>(
|
|
189
|
+
`SELECT * FROM memories ${wc} ORDER BY created_at ASC`,
|
|
190
|
+
Object.keys(params).length > 0 ? params : undefined,
|
|
191
|
+
);
|
|
192
|
+
return rows.map(rowToMemory);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
export function importMemories(
|
|
196
|
+
provider: PersistenceProvider,
|
|
197
|
+
memories: Memory[],
|
|
198
|
+
): { imported: number; skipped: number } {
|
|
199
|
+
const sql = `
|
|
200
|
+
INSERT OR IGNORE INTO memories (id, project_path, type, context, summary, topics, files_modified, tools_used, created_at, archived_at)
|
|
201
|
+
VALUES (@id, @projectPath, @type, @context, @summary, @topics, @filesModified, @toolsUsed, @createdAt, @archivedAt)
|
|
202
|
+
`;
|
|
203
|
+
let imported = 0;
|
|
204
|
+
let skipped = 0;
|
|
205
|
+
provider.transaction(() => {
|
|
206
|
+
for (const m of memories) {
|
|
207
|
+
const result = provider.run(sql, {
|
|
208
|
+
id: m.id,
|
|
209
|
+
projectPath: m.projectPath,
|
|
210
|
+
type: m.type,
|
|
211
|
+
context: m.context,
|
|
212
|
+
summary: m.summary,
|
|
213
|
+
topics: JSON.stringify(m.topics),
|
|
214
|
+
filesModified: JSON.stringify(m.filesModified),
|
|
215
|
+
toolsUsed: JSON.stringify(m.toolsUsed),
|
|
216
|
+
createdAt: m.createdAt,
|
|
217
|
+
archivedAt: m.archivedAt,
|
|
218
|
+
});
|
|
219
|
+
if (result.changes > 0) imported++;
|
|
220
|
+
else skipped++;
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
return { imported, skipped };
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
export function pruneMemories(
|
|
227
|
+
provider: PersistenceProvider,
|
|
228
|
+
olderThanDays: number,
|
|
229
|
+
): { pruned: number } {
|
|
230
|
+
const cutoff = Math.floor(Date.now() / 1000) - olderThanDays * 86400;
|
|
231
|
+
const result = provider.run(
|
|
232
|
+
'DELETE FROM memories WHERE created_at < ? AND archived_at IS NULL',
|
|
233
|
+
[cutoff],
|
|
234
|
+
);
|
|
235
|
+
return { pruned: result.changes };
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
export function deduplicateMemories(
|
|
239
|
+
provider: PersistenceProvider,
|
|
240
|
+
): { removed: number; groups: Array<{ kept: string; removed: string[] }> } {
|
|
241
|
+
const dupeRows = provider.all<{ id1: string; id2: string }>(`
|
|
242
|
+
SELECT m1.id as id1, m2.id as id2
|
|
243
|
+
FROM memories m1
|
|
244
|
+
JOIN memories m2 ON m1.summary = m2.summary
|
|
245
|
+
AND m1.project_path = m2.project_path
|
|
246
|
+
AND m1.type = m2.type
|
|
247
|
+
AND m1.id < m2.id
|
|
248
|
+
AND m1.archived_at IS NULL
|
|
249
|
+
AND m2.archived_at IS NULL
|
|
250
|
+
`);
|
|
251
|
+
|
|
252
|
+
const groupMap = new Map<string, Set<string>>();
|
|
253
|
+
for (const row of dupeRows) {
|
|
254
|
+
if (!groupMap.has(row.id1)) groupMap.set(row.id1, new Set());
|
|
255
|
+
groupMap.get(row.id1)!.add(row.id2);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
const groups: Array<{ kept: string; removed: string[] }> = [];
|
|
259
|
+
const toRemove = new Set<string>();
|
|
260
|
+
for (const [kept, removedSet] of groupMap) {
|
|
261
|
+
const removed = [...removedSet].filter((id) => !toRemove.has(id));
|
|
262
|
+
if (removed.length > 0) {
|
|
263
|
+
groups.push({ kept, removed });
|
|
264
|
+
for (const id of removed) toRemove.add(id);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
if (toRemove.size > 0) {
|
|
269
|
+
provider.transaction(() => {
|
|
270
|
+
for (const id of toRemove) {
|
|
271
|
+
provider.run('DELETE FROM memories WHERE id = ?', [id]);
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
return { removed: toRemove.size, groups };
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
export function memoryTopics(
|
|
280
|
+
provider: PersistenceProvider,
|
|
281
|
+
): Array<{ topic: string; count: number }> {
|
|
282
|
+
const rows = provider.all<{ topics: string }>(
|
|
283
|
+
'SELECT topics FROM memories WHERE archived_at IS NULL',
|
|
284
|
+
);
|
|
285
|
+
|
|
286
|
+
const topicCounts = new Map<string, number>();
|
|
287
|
+
for (const row of rows) {
|
|
288
|
+
const topics: string[] = JSON.parse(row.topics || '[]');
|
|
289
|
+
for (const topic of topics) {
|
|
290
|
+
topicCounts.set(topic, (topicCounts.get(topic) ?? 0) + 1);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
return [...topicCounts.entries()]
|
|
295
|
+
.map(([topic, count]) => ({ topic, count }))
|
|
296
|
+
.sort((a, b) => b.count - a.count);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
export function memoriesByProject(
|
|
300
|
+
provider: PersistenceProvider,
|
|
301
|
+
): Array<{ project: string; count: number; memories: Memory[] }> {
|
|
302
|
+
const rows = provider.all<{ project: string; count: number }>(
|
|
303
|
+
'SELECT project_path as project, COUNT(*) as count FROM memories WHERE archived_at IS NULL GROUP BY project_path ORDER BY count DESC',
|
|
304
|
+
);
|
|
305
|
+
|
|
306
|
+
return rows.map((row) => {
|
|
307
|
+
const mems = provider.all<Record<string, unknown>>(
|
|
308
|
+
'SELECT * FROM memories WHERE project_path = ? AND archived_at IS NULL ORDER BY created_at DESC',
|
|
309
|
+
[row.project],
|
|
310
|
+
);
|
|
311
|
+
return {
|
|
312
|
+
project: row.project,
|
|
313
|
+
count: row.count,
|
|
314
|
+
memories: mems.map(rowToMemory),
|
|
315
|
+
};
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// ── Helper ──────────────────────────────────────────────────────────────
|
|
320
|
+
|
|
321
|
+
export function rowToMemory(row: Record<string, unknown>): Memory {
|
|
322
|
+
return {
|
|
323
|
+
id: row.id as string,
|
|
324
|
+
projectPath: row.project_path as string,
|
|
325
|
+
type: row.type as Memory['type'],
|
|
326
|
+
context: row.context as string,
|
|
327
|
+
summary: row.summary as string,
|
|
328
|
+
topics: JSON.parse((row.topics as string) || '[]'),
|
|
329
|
+
filesModified: JSON.parse((row.files_modified as string) || '[]'),
|
|
330
|
+
toolsUsed: JSON.parse((row.tools_used as string) || '[]'),
|
|
331
|
+
intent: (row.intent as string) ?? null,
|
|
332
|
+
decisions: JSON.parse((row.decisions as string) || '[]'),
|
|
333
|
+
currentState: (row.current_state as string) ?? null,
|
|
334
|
+
nextSteps: JSON.parse((row.next_steps as string) || '[]'),
|
|
335
|
+
vaultEntriesReferenced: JSON.parse((row.vault_entries_referenced as string) || '[]'),
|
|
336
|
+
createdAt: row.created_at as number,
|
|
337
|
+
archivedAt: (row.archived_at as number) ?? null,
|
|
338
|
+
};
|
|
339
|
+
}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import { describe, test, expect, afterEach } from 'vitest';
|
|
9
|
-
import { Vault } from '
|
|
9
|
+
import { Vault } from './vault.js';
|
|
10
10
|
import { Brain } from '../brain/brain.js';
|
|
11
11
|
import type { IntelligenceEntry } from '../intelligence/types.js';
|
|
12
12
|
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vault schema management — table creation, migrations, format versioning.
|
|
3
|
+
* Extracted from vault.ts as part of Wave 0C decomposition.
|
|
4
|
+
*/
|
|
5
|
+
import type { PersistenceProvider } from '../persistence/types.js';
|
|
6
|
+
import { computeContentHash } from './content-hash.js';
|
|
7
|
+
|
|
8
|
+
export const VAULT_FORMAT_VERSION = 1;
|
|
9
|
+
|
|
10
|
+
export function checkFormatVersion(provider: PersistenceProvider): void {
|
|
11
|
+
const row = provider.get<{ user_version: number }>('PRAGMA user_version');
|
|
12
|
+
const current = row?.user_version ?? 0;
|
|
13
|
+
if (current === 0) {
|
|
14
|
+
provider.run(`PRAGMA user_version = ${VAULT_FORMAT_VERSION}`);
|
|
15
|
+
} else if (current > VAULT_FORMAT_VERSION) {
|
|
16
|
+
throw new Error(
|
|
17
|
+
`Vault format version ${current} is newer than engine supports (${VAULT_FORMAT_VERSION}). ` +
|
|
18
|
+
`Upgrade @soleri/core to a compatible version.`,
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function initializeSchema(provider: PersistenceProvider): void {
|
|
24
|
+
createCoreTables(provider);
|
|
25
|
+
migrateBrainSchema(provider);
|
|
26
|
+
migrateTemporalSchema(provider);
|
|
27
|
+
migrateOriginColumn(provider);
|
|
28
|
+
migrateContentHash(provider);
|
|
29
|
+
migrateTierColumn(provider);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function createCoreTables(provider: PersistenceProvider): void {
|
|
33
|
+
provider.execSql(`
|
|
34
|
+
CREATE TABLE IF NOT EXISTS entries (
|
|
35
|
+
id TEXT PRIMARY KEY,
|
|
36
|
+
type TEXT NOT NULL CHECK(type IN ('pattern', 'anti-pattern', 'rule', 'playbook')),
|
|
37
|
+
domain TEXT NOT NULL,
|
|
38
|
+
title TEXT NOT NULL,
|
|
39
|
+
severity TEXT NOT NULL CHECK(severity IN ('critical', 'warning', 'suggestion')),
|
|
40
|
+
description TEXT NOT NULL,
|
|
41
|
+
context TEXT, example TEXT, counter_example TEXT, why TEXT,
|
|
42
|
+
tags TEXT NOT NULL DEFAULT '[]',
|
|
43
|
+
applies_to TEXT DEFAULT '[]',
|
|
44
|
+
created_at INTEGER NOT NULL DEFAULT (unixepoch()),
|
|
45
|
+
updated_at INTEGER NOT NULL DEFAULT (unixepoch())
|
|
46
|
+
);
|
|
47
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS entries_fts USING fts5(
|
|
48
|
+
id, title, description, context, tags,
|
|
49
|
+
content='entries', content_rowid='rowid', tokenize='porter unicode61'
|
|
50
|
+
);
|
|
51
|
+
CREATE TRIGGER IF NOT EXISTS entries_ai AFTER INSERT ON entries BEGIN
|
|
52
|
+
INSERT INTO entries_fts(rowid,id,title,description,context,tags) VALUES(new.rowid,new.id,new.title,new.description,new.context,new.tags);
|
|
53
|
+
END;
|
|
54
|
+
CREATE TRIGGER IF NOT EXISTS entries_ad AFTER DELETE ON entries BEGIN
|
|
55
|
+
INSERT INTO entries_fts(entries_fts,rowid,id,title,description,context,tags) VALUES('delete',old.rowid,old.id,old.title,old.description,old.context,old.tags);
|
|
56
|
+
END;
|
|
57
|
+
CREATE TRIGGER IF NOT EXISTS entries_au AFTER UPDATE ON entries BEGIN
|
|
58
|
+
INSERT INTO entries_fts(entries_fts,rowid,id,title,description,context,tags) VALUES('delete',old.rowid,old.id,old.title,old.description,old.context,old.tags);
|
|
59
|
+
INSERT INTO entries_fts(rowid,id,title,description,context,tags) VALUES(new.rowid,new.id,new.title,new.description,new.context,new.tags);
|
|
60
|
+
END;
|
|
61
|
+
CREATE TABLE IF NOT EXISTS entries_archive (
|
|
62
|
+
id TEXT PRIMARY KEY,
|
|
63
|
+
type TEXT NOT NULL, domain TEXT NOT NULL, title TEXT NOT NULL, severity TEXT NOT NULL,
|
|
64
|
+
description TEXT NOT NULL, context TEXT, example TEXT, counter_example TEXT, why TEXT,
|
|
65
|
+
tags TEXT NOT NULL DEFAULT '[]', applies_to TEXT DEFAULT '[]',
|
|
66
|
+
created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL,
|
|
67
|
+
valid_from INTEGER, valid_until INTEGER,
|
|
68
|
+
archived_at INTEGER NOT NULL DEFAULT (unixepoch()), archive_reason TEXT
|
|
69
|
+
);
|
|
70
|
+
CREATE TABLE IF NOT EXISTS projects (
|
|
71
|
+
path TEXT PRIMARY KEY, name TEXT NOT NULL,
|
|
72
|
+
registered_at INTEGER NOT NULL DEFAULT (unixepoch()),
|
|
73
|
+
last_seen_at INTEGER NOT NULL DEFAULT (unixepoch()),
|
|
74
|
+
session_count INTEGER NOT NULL DEFAULT 1
|
|
75
|
+
);
|
|
76
|
+
CREATE TABLE IF NOT EXISTS memories (
|
|
77
|
+
id TEXT PRIMARY KEY, project_path TEXT NOT NULL,
|
|
78
|
+
type TEXT NOT NULL CHECK(type IN ('session', 'lesson', 'preference')),
|
|
79
|
+
context TEXT NOT NULL, summary TEXT NOT NULL,
|
|
80
|
+
topics TEXT NOT NULL DEFAULT '[]', files_modified TEXT NOT NULL DEFAULT '[]',
|
|
81
|
+
tools_used TEXT NOT NULL DEFAULT '[]',
|
|
82
|
+
created_at INTEGER NOT NULL DEFAULT (unixepoch()), archived_at INTEGER
|
|
83
|
+
);
|
|
84
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS memories_fts USING fts5(
|
|
85
|
+
id, context, summary, topics,
|
|
86
|
+
content='memories', content_rowid='rowid', tokenize='porter unicode61'
|
|
87
|
+
);`);
|
|
88
|
+
|
|
89
|
+
// Add memory columns if missing
|
|
90
|
+
const memCols = provider.all<{ name: string }>('PRAGMA table_info(memories)').map((r: { name: string }) => r.name);
|
|
91
|
+
if (!memCols.includes('intent')) {
|
|
92
|
+
provider.execSql(`
|
|
93
|
+
ALTER TABLE memories ADD COLUMN intent TEXT;
|
|
94
|
+
ALTER TABLE memories ADD COLUMN decisions TEXT NOT NULL DEFAULT '[]';
|
|
95
|
+
ALTER TABLE memories ADD COLUMN current_state TEXT;
|
|
96
|
+
ALTER TABLE memories ADD COLUMN next_steps TEXT NOT NULL DEFAULT '[]';
|
|
97
|
+
ALTER TABLE memories ADD COLUMN vault_entries_referenced TEXT NOT NULL DEFAULT '[]';
|
|
98
|
+
`);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
provider.execSql(`
|
|
102
|
+
CREATE TRIGGER IF NOT EXISTS memories_ai AFTER INSERT ON memories BEGIN
|
|
103
|
+
INSERT INTO memories_fts(rowid,id,context,summary,topics) VALUES(new.rowid,new.id,new.context,new.summary,new.topics);
|
|
104
|
+
END;
|
|
105
|
+
CREATE TRIGGER IF NOT EXISTS memories_ad AFTER DELETE ON memories BEGIN
|
|
106
|
+
INSERT INTO memories_fts(memories_fts,rowid,id,context,summary,topics) VALUES('delete',old.rowid,old.id,old.context,old.summary,old.topics);
|
|
107
|
+
END;
|
|
108
|
+
CREATE TRIGGER IF NOT EXISTS memories_au AFTER UPDATE ON memories BEGIN
|
|
109
|
+
INSERT INTO memories_fts(memories_fts,rowid,id,context,summary,topics) VALUES('delete',old.rowid,old.id,old.context,old.summary,old.topics);
|
|
110
|
+
INSERT INTO memories_fts(rowid,id,context,summary,topics) VALUES(new.rowid,new.id,new.context,new.summary,new.topics);
|
|
111
|
+
END;
|
|
112
|
+
CREATE TABLE IF NOT EXISTS brain_vocabulary (
|
|
113
|
+
term TEXT PRIMARY KEY, idf REAL NOT NULL, doc_count INTEGER NOT NULL DEFAULT 1,
|
|
114
|
+
updated_at INTEGER NOT NULL DEFAULT (unixepoch())
|
|
115
|
+
);
|
|
116
|
+
CREATE TABLE IF NOT EXISTS brain_feedback (
|
|
117
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT, query TEXT NOT NULL, entry_id TEXT NOT NULL,
|
|
118
|
+
action TEXT NOT NULL CHECK(action IN ('accepted', 'dismissed', 'modified', 'failed')),
|
|
119
|
+
source TEXT NOT NULL DEFAULT 'search', confidence REAL NOT NULL DEFAULT 0.6,
|
|
120
|
+
duration INTEGER, context TEXT NOT NULL DEFAULT '{}', reason TEXT,
|
|
121
|
+
created_at INTEGER NOT NULL DEFAULT (unixepoch())
|
|
122
|
+
);
|
|
123
|
+
CREATE INDEX IF NOT EXISTS idx_brain_feedback_query ON brain_feedback(query);
|
|
124
|
+
CREATE INDEX IF NOT EXISTS idx_entries_domain ON entries(domain);
|
|
125
|
+
CREATE INDEX IF NOT EXISTS idx_entries_type ON entries(type);
|
|
126
|
+
CREATE INDEX IF NOT EXISTS idx_entries_severity ON entries(severity);
|
|
127
|
+
CREATE INDEX IF NOT EXISTS idx_memories_project ON memories(project_path);
|
|
128
|
+
CREATE INDEX IF NOT EXISTS idx_memories_type ON memories(type);
|
|
129
|
+
`);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function migrateBrainSchema(provider: PersistenceProvider): void {
|
|
133
|
+
const columns = provider.all<{ name: string }>('PRAGMA table_info(brain_feedback)');
|
|
134
|
+
const hasSource = columns.some((c: { name: string }) => c.name === 'source');
|
|
135
|
+
if (!hasSource && columns.length > 0) {
|
|
136
|
+
provider.transaction(() => {
|
|
137
|
+
provider.run(`CREATE TABLE brain_feedback_new (id INTEGER PRIMARY KEY AUTOINCREMENT, query TEXT NOT NULL, entry_id TEXT NOT NULL, action TEXT NOT NULL CHECK(action IN ('accepted', 'dismissed', 'modified', 'failed')), source TEXT NOT NULL DEFAULT 'search', confidence REAL NOT NULL DEFAULT 0.6, duration INTEGER, context TEXT NOT NULL DEFAULT '{}', reason TEXT, created_at INTEGER NOT NULL DEFAULT (unixepoch()))`);
|
|
138
|
+
provider.run(`INSERT INTO brain_feedback_new (id, query, entry_id, action, created_at) SELECT id, query, entry_id, action, created_at FROM brain_feedback`);
|
|
139
|
+
provider.run('DROP TABLE brain_feedback');
|
|
140
|
+
provider.run('ALTER TABLE brain_feedback_new RENAME TO brain_feedback');
|
|
141
|
+
provider.run('CREATE INDEX IF NOT EXISTS idx_brain_feedback_query ON brain_feedback(query)');
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
try {
|
|
145
|
+
const sessionCols = provider.all<{ name: string }>('PRAGMA table_info(brain_sessions)');
|
|
146
|
+
if (sessionCols.length > 0 && !sessionCols.some((c: { name: string }) => c.name === 'extracted_at')) {
|
|
147
|
+
provider.run('ALTER TABLE brain_sessions ADD COLUMN extracted_at TEXT');
|
|
148
|
+
}
|
|
149
|
+
} catch { /* brain_sessions doesn't exist yet */ }
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function migrateTemporalSchema(provider: PersistenceProvider): void {
|
|
153
|
+
try { provider.run('ALTER TABLE entries ADD COLUMN valid_from INTEGER'); } catch { /* exists */ }
|
|
154
|
+
try { provider.run('ALTER TABLE entries ADD COLUMN valid_until INTEGER'); } catch { /* exists */ }
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function migrateOriginColumn(provider: PersistenceProvider): void {
|
|
158
|
+
try { provider.run("ALTER TABLE entries ADD COLUMN origin TEXT NOT NULL DEFAULT 'user' CHECK(origin IN ('agent', 'pack', 'user'))"); } catch { /* exists */ }
|
|
159
|
+
provider.execSql('CREATE INDEX IF NOT EXISTS idx_entries_origin ON entries(origin)');
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function migrateContentHash(provider: PersistenceProvider): void {
|
|
163
|
+
try { provider.run('ALTER TABLE entries ADD COLUMN content_hash TEXT'); } catch { /* exists */ }
|
|
164
|
+
provider.execSql('CREATE INDEX IF NOT EXISTS idx_entries_content_hash ON entries(content_hash) WHERE content_hash IS NOT NULL');
|
|
165
|
+
const unhashed = provider.all<{ id: string; type: string; domain: string; title: string; description: string; tags: string; example: string | null; counter_example: string | null }>(
|
|
166
|
+
'SELECT id, type, domain, title, description, tags, example, counter_example FROM entries WHERE content_hash IS NULL',
|
|
167
|
+
);
|
|
168
|
+
if (unhashed.length > 0) {
|
|
169
|
+
provider.transaction(() => {
|
|
170
|
+
for (const row of unhashed) {
|
|
171
|
+
const hash = computeContentHash({ type: row.type, domain: row.domain, title: row.title, description: row.description, tags: JSON.parse(row.tags), example: row.example ?? undefined, counterExample: row.counter_example ?? undefined });
|
|
172
|
+
provider.run('UPDATE entries SET content_hash = @hash WHERE id = @id', { hash, id: row.id });
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function migrateTierColumn(provider: PersistenceProvider): void {
|
|
179
|
+
try { provider.run("ALTER TABLE entries ADD COLUMN tier TEXT DEFAULT 'agent'"); } catch { /* exists */ }
|
|
180
|
+
provider.execSql('CREATE INDEX IF NOT EXISTS idx_entries_tier ON entries(tier) WHERE tier IS NOT NULL');
|
|
181
|
+
}
|