hippo-memory 1.60.0 → 1.61.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/README.md +1 -1
- package/dist/ablation.js +9 -27
- package/dist/agent-memories/apply.js +4 -1
- package/dist/agent-memories/claude-code.js +1 -1
- package/dist/agent-memories/codex.js +1 -1
- package/dist/agent-memories/gemini.js +1 -1
- package/dist/agent-memories/legacy.js +1 -1
- package/dist/agent-memories/source.js +1 -1
- package/dist/agent-memories/sync.js +8 -3
- package/dist/ambient-store.d.ts +14 -0
- package/dist/ambient-store.js +90 -0
- package/dist/ambient.d.ts +23 -0
- package/dist/ambient.js +72 -50
- package/dist/api/assemble.d.ts +93 -0
- package/dist/api/assemble.js +152 -0
- package/dist/api/audit.d.ts +17 -0
- package/dist/api/audit.js +23 -0
- package/dist/api/auth.d.ts +79 -0
- package/dist/api/auth.js +178 -0
- package/dist/api/context-types.d.ts +105 -0
- package/dist/api/context-types.js +3 -0
- package/dist/api/context.d.ts +31 -0
- package/dist/api/context.js +705 -0
- package/dist/api/dormant.d.ts +30 -0
- package/dist/api/dormant.js +140 -0
- package/dist/api/drill-down.d.ts +84 -0
- package/dist/api/drill-down.js +123 -0
- package/dist/api/forget.d.ts +57 -0
- package/dist/api/forget.js +87 -0
- package/dist/api/goals.d.ts +18 -0
- package/dist/api/goals.js +33 -0
- package/dist/api/learn.d.ts +31 -0
- package/dist/api/learn.js +88 -0
- package/dist/api/outcome.d.ts +61 -0
- package/dist/api/outcome.js +66 -0
- package/dist/api/promote.d.ts +54 -0
- package/dist/api/promote.js +203 -0
- package/dist/api/quarantine.d.ts +24 -0
- package/dist/api/quarantine.js +121 -0
- package/dist/api/recall-types.d.ts +390 -0
- package/dist/api/recall-types.js +3 -0
- package/dist/api/recall.d.ts +36 -0
- package/dist/api/recall.js +634 -0
- package/dist/api/remember.d.ts +35 -0
- package/dist/api/remember.js +43 -0
- package/dist/api/sleep.d.ts +136 -0
- package/dist/api/sleep.js +271 -0
- package/dist/api/tokens.d.ts +26 -0
- package/dist/api/tokens.js +60 -0
- package/dist/api/types.d.ts +56 -0
- package/dist/api/types.js +38 -0
- package/dist/api.d.ts +20 -1262
- package/dist/api.js +25 -2727
- package/dist/audit.d.ts +3 -0
- package/dist/audit.js +6 -3
- package/dist/auth.d.ts +45 -4
- package/dist/auth.js +125 -48
- package/dist/autolearn.js +2 -2
- package/dist/capture/command.d.ts +33 -0
- package/dist/capture/command.js +264 -0
- package/dist/capture/compact.d.ts +44 -0
- package/dist/capture/compact.js +354 -0
- package/dist/capture/extract.d.ts +21 -0
- package/dist/capture/extract.js +464 -0
- package/dist/capture/transcript.d.ts +40 -0
- package/dist/capture/transcript.js +193 -0
- package/dist/capture-error.js +2 -1
- package/dist/churn-git.js +4 -2
- package/dist/cli/audit.d.ts +3 -0
- package/dist/cli/audit.js +159 -0
- package/dist/cli/auth.d.ts +2 -0
- package/dist/cli/auth.js +171 -0
- package/dist/cli/briefs.d.ts +4 -0
- package/dist/cli/briefs.js +435 -0
- package/dist/cli/card.d.ts +3 -0
- package/dist/cli/card.js +333 -0
- package/dist/cli/context.d.ts +15 -0
- package/dist/cli/context.js +366 -0
- package/dist/cli/continuity.d.ts +6 -0
- package/dist/cli/continuity.js +445 -0
- package/dist/cli/curate.d.ts +19 -0
- package/dist/cli/curate.js +555 -0
- package/dist/cli/dag.d.ts +5 -0
- package/dist/cli/dag.js +177 -0
- package/dist/cli/decisions.d.ts +4 -0
- package/dist/cli/decisions.js +528 -0
- package/dist/cli/eval.d.ts +5 -0
- package/dist/cli/eval.js +213 -0
- package/dist/cli/explain.d.ts +4 -0
- package/dist/cli/explain.js +150 -0
- package/dist/cli/goals.d.ts +2 -0
- package/dist/cli/goals.js +196 -0
- package/dist/cli/hook-blocks.d.ts +18 -0
- package/dist/cli/hook-blocks.js +233 -0
- package/dist/cli/init.d.ts +2 -0
- package/dist/cli/init.js +305 -0
- package/dist/cli/maintenance.d.ts +4 -0
- package/dist/cli/maintenance.js +179 -0
- package/dist/cli/playbooks.d.ts +4 -0
- package/dist/cli/playbooks.js +556 -0
- package/dist/cli/projects.js +1 -1
- package/dist/cli/recall.d.ts +7 -0
- package/dist/cli/recall.js +597 -0
- package/dist/cli/remember.d.ts +5 -0
- package/dist/cli/remember.js +442 -0
- package/dist/cli/serve.d.ts +5 -0
- package/dist/cli/serve.js +40 -0
- package/dist/cli/session-hooks.d.ts +29 -0
- package/dist/cli/session-hooks.js +637 -0
- package/dist/cli/setup.d.ts +4 -0
- package/dist/cli/setup.js +376 -0
- package/dist/cli/shared.d.ts +15 -19
- package/dist/cli/shared.js +50 -341
- package/dist/cli/slack.d.ts +2 -0
- package/dist/cli/slack.js +171 -0
- package/dist/cli/status.d.ts +18 -0
- package/dist/cli/status.js +400 -0
- package/dist/cli/transfer.d.ts +10 -0
- package/dist/cli/transfer.js +438 -0
- package/dist/cli/usage.d.ts +85 -0
- package/dist/cli/usage.js +741 -0
- package/dist/cli.d.ts +71 -120
- package/dist/cli.js +170 -8469
- package/dist/client.js +15 -8
- package/dist/compaction-record.js +6 -4
- package/dist/connectors/github/backfill.js +94 -87
- package/dist/connectors/github/cli-impl.js +4 -3
- package/dist/connectors/github/dlq.js +67 -54
- package/dist/connectors/github/ingest.js +34 -35
- package/dist/connectors/github/tenant-routing.js +3 -2
- package/dist/connectors/github/webhook.js +135 -216
- package/dist/connectors/slack/dlq.js +49 -61
- package/dist/connectors/slack/ingest.js +55 -48
- package/dist/connectors/slack/tenant-routing.js +4 -3
- package/dist/connectors/slack/webhook.js +72 -74
- package/dist/consolidate/conflicts.d.ts +10 -0
- package/dist/consolidate/conflicts.js +178 -0
- package/dist/consolidate/decay.d.ts +12 -0
- package/dist/consolidate/decay.js +145 -0
- package/dist/consolidate/llm-passes.d.ts +3 -0
- package/dist/consolidate/llm-passes.js +141 -0
- package/dist/consolidate/merge.d.ts +7 -0
- package/dist/consolidate/merge.js +251 -0
- package/dist/consolidate/physics-pass.d.ts +3 -0
- package/dist/consolidate/physics-pass.js +60 -0
- package/dist/consolidate/run.d.ts +69 -0
- package/dist/consolidate/run.js +76 -0
- package/dist/consolidate/sleep.d.ts +18 -0
- package/dist/consolidate/sleep.js +209 -0
- package/dist/consolidate/traces.d.ts +4 -0
- package/dist/consolidate/traces.js +178 -0
- package/dist/context-auto.js +7 -11
- package/dist/context-render.d.ts +1 -1
- package/dist/context-render.js +1 -1
- package/dist/customer-notes.d.ts +3 -0
- package/dist/customer-notes.js +6 -4
- package/dist/dag.js +6 -5
- package/dist/dashboard-actions.d.ts +20 -0
- package/dist/dashboard-actions.js +88 -0
- package/dist/dashboard-params.d.ts +45 -0
- package/dist/dashboard-params.js +127 -0
- package/dist/dashboard-queries.d.ts +15 -0
- package/dist/dashboard-queries.js +355 -0
- package/dist/dashboard-snapshot.d.ts +138 -0
- package/dist/dashboard-snapshot.js +308 -0
- package/dist/dashboard-types.d.ts +163 -0
- package/dist/dashboard-types.js +3 -0
- package/dist/dashboard.d.ts +6 -7
- package/dist/dashboard.js +228 -202
- package/dist/db/busy.d.ts +5 -0
- package/dist/db/busy.js +24 -0
- package/dist/db/continuity.d.ts +5 -0
- package/dist/db/continuity.js +145 -0
- package/dist/db/meta.d.ts +8 -0
- package/dist/db/meta.js +35 -0
- package/dist/db/migrate.d.ts +9 -0
- package/dist/db/migrate.js +138 -0
- package/dist/db/migrations/index.d.ts +5 -0
- package/dist/db/migrations/index.js +109 -0
- package/dist/db/migrations/types.d.ts +14 -0
- package/dist/db/migrations/types.js +2 -0
- package/dist/db/migrations/v01.d.ts +3 -0
- package/dist/db/migrations/v01.js +38 -0
- package/dist/db/migrations/v02.d.ts +3 -0
- package/dist/db/migrations/v02.js +21 -0
- package/dist/db/migrations/v03.d.ts +3 -0
- package/dist/db/migrations/v03.js +22 -0
- package/dist/db/migrations/v04.d.ts +3 -0
- package/dist/db/migrations/v04.js +28 -0
- package/dist/db/migrations/v05.d.ts +3 -0
- package/dist/db/migrations/v05.js +21 -0
- package/dist/db/migrations/v06.d.ts +3 -0
- package/dist/db/migrations/v06.js +25 -0
- package/dist/db/migrations/v07.d.ts +3 -0
- package/dist/db/migrations/v07.js +13 -0
- package/dist/db/migrations/v08.d.ts +3 -0
- package/dist/db/migrations/v08.js +8 -0
- package/dist/db/migrations/v09.d.ts +3 -0
- package/dist/db/migrations/v09.js +13 -0
- package/dist/db/migrations/v10.d.ts +3 -0
- package/dist/db/migrations/v10.js +17 -0
- package/dist/db/migrations/v11.d.ts +3 -0
- package/dist/db/migrations/v11.js +15 -0
- package/dist/db/migrations/v12.d.ts +3 -0
- package/dist/db/migrations/v12.js +11 -0
- package/dist/db/migrations/v13.d.ts +3 -0
- package/dist/db/migrations/v13.js +15 -0
- package/dist/db/migrations/v14.d.ts +3 -0
- package/dist/db/migrations/v14.js +66 -0
- package/dist/db/migrations/v15.d.ts +3 -0
- package/dist/db/migrations/v15.js +42 -0
- package/dist/db/migrations/v16.d.ts +3 -0
- package/dist/db/migrations/v16.js +61 -0
- package/dist/db/migrations/v17.d.ts +3 -0
- package/dist/db/migrations/v17.js +46 -0
- package/dist/db/migrations/v18.d.ts +3 -0
- package/dist/db/migrations/v18.js +60 -0
- package/dist/db/migrations/v19.d.ts +3 -0
- package/dist/db/migrations/v19.js +28 -0
- package/dist/db/migrations/v20.d.ts +3 -0
- package/dist/db/migrations/v20.js +42 -0
- package/dist/db/migrations/v21.d.ts +3 -0
- package/dist/db/migrations/v21.js +16 -0
- package/dist/db/migrations/v22.d.ts +3 -0
- package/dist/db/migrations/v22.js +82 -0
- package/dist/db/migrations/v23.d.ts +3 -0
- package/dist/db/migrations/v23.js +48 -0
- package/dist/db/migrations/v24.d.ts +3 -0
- package/dist/db/migrations/v24.js +72 -0
- package/dist/db/migrations/v25.d.ts +3 -0
- package/dist/db/migrations/v25.js +46 -0
- package/dist/db/migrations/v26.d.ts +3 -0
- package/dist/db/migrations/v26.js +23 -0
- package/dist/db/migrations/v27.d.ts +3 -0
- package/dist/db/migrations/v27.js +57 -0
- package/dist/db/migrations/v28.d.ts +3 -0
- package/dist/db/migrations/v28.js +38 -0
- package/dist/db/migrations/v29.d.ts +3 -0
- package/dist/db/migrations/v29.js +78 -0
- package/dist/db/migrations/v30.d.ts +3 -0
- package/dist/db/migrations/v30.js +92 -0
- package/dist/db/migrations/v31.d.ts +3 -0
- package/dist/db/migrations/v31.js +74 -0
- package/dist/db/migrations/v32.d.ts +3 -0
- package/dist/db/migrations/v32.js +102 -0
- package/dist/db/migrations/v33.d.ts +3 -0
- package/dist/db/migrations/v33.js +104 -0
- package/dist/db/migrations/v34.d.ts +3 -0
- package/dist/db/migrations/v34.js +93 -0
- package/dist/db/migrations/v35.d.ts +3 -0
- package/dist/db/migrations/v35.js +98 -0
- package/dist/db/migrations/v36.d.ts +3 -0
- package/dist/db/migrations/v36.js +98 -0
- package/dist/db/migrations/v37.d.ts +3 -0
- package/dist/db/migrations/v37.js +219 -0
- package/dist/db/migrations/v38.d.ts +3 -0
- package/dist/db/migrations/v38.js +277 -0
- package/dist/db/migrations/v39.d.ts +3 -0
- package/dist/db/migrations/v39.js +59 -0
- package/dist/db/migrations/v40.d.ts +3 -0
- package/dist/db/migrations/v40.js +74 -0
- package/dist/db/migrations/v41.d.ts +3 -0
- package/dist/db/migrations/v41.js +43 -0
- package/dist/db/migrations/v42.d.ts +3 -0
- package/dist/db/migrations/v42.js +41 -0
- package/dist/db/migrations/v43.d.ts +3 -0
- package/dist/db/migrations/v43.js +67 -0
- package/dist/db/migrations/v44.d.ts +3 -0
- package/dist/db/migrations/v44.js +28 -0
- package/dist/db/migrations/v45.d.ts +3 -0
- package/dist/db/migrations/v45.js +30 -0
- package/dist/db/migrations/v46.d.ts +3 -0
- package/dist/db/migrations/v46.js +25 -0
- package/dist/db/migrations/v47.d.ts +3 -0
- package/dist/db/migrations/v47.js +17 -0
- package/dist/db/migrations/v48.d.ts +3 -0
- package/dist/db/migrations/v48.js +10 -0
- package/dist/db/migrations/v49.d.ts +3 -0
- package/dist/db/migrations/v49.js +31 -0
- package/dist/db/migrations/v50.d.ts +3 -0
- package/dist/db/migrations/v50.js +67 -0
- package/dist/db/migrations/v51.d.ts +3 -0
- package/dist/db/migrations/v51.js +14 -0
- package/dist/db/migrations/v52.d.ts +3 -0
- package/dist/db/migrations/v52.js +7 -0
- package/dist/db/open.d.ts +23 -0
- package/dist/db/open.js +146 -0
- package/dist/db/sqlite.d.ts +21 -0
- package/dist/db/sqlite.js +8 -0
- package/dist/db/tables.d.ts +7 -0
- package/dist/db/tables.js +38 -0
- package/dist/db.d.ts +6 -46
- package/dist/db.js +5 -3049
- package/dist/decisions.d.ts +4 -1
- package/dist/decisions.js +9 -7
- package/dist/dedupe.js +3 -2
- package/dist/delivery-recorder.js +4 -1
- package/dist/doctor.js +3 -3
- package/dist/embedding-provider.d.ts +1 -1
- package/dist/embedding-provider.js +4 -3
- package/dist/embeddings.d.ts +9 -52
- package/dist/embeddings.js +43 -297
- package/dist/env.d.ts +75 -0
- package/dist/env.js +119 -0
- package/dist/eval-suite.js +1 -1
- package/dist/eval.js +2 -2
- package/dist/extract.js +1 -1
- package/dist/gated-write.js +3 -1
- package/dist/goals.d.ts +3 -1
- package/dist/goals.js +18 -0
- package/dist/graph/read.d.ts +73 -0
- package/dist/graph/read.js +325 -0
- package/dist/graph/rows.d.ts +45 -0
- package/dist/graph/rows.js +51 -0
- package/dist/graph/types.d.ts +83 -0
- package/dist/graph/types.js +11 -0
- package/dist/graph/write.d.ts +93 -0
- package/dist/{graph.js → graph/write.js} +6 -384
- package/dist/graph-extract.js +2 -1
- package/dist/graph-recall.d.ts +1 -1
- package/dist/graph-recall.js +2 -2
- package/dist/graph-stream.js +1 -1
- package/dist/graph-view.d.ts +1 -1
- package/dist/graph-view.js +1 -1
- package/dist/half-life-migration.d.ts +1 -1
- package/dist/half-life-migration.js +2 -1
- package/dist/hooks/codex-session.d.ts +8 -0
- package/dist/hooks/codex-session.js +76 -0
- package/dist/hooks/codex-wrapper.d.ts +55 -0
- package/dist/hooks/codex-wrapper.js +288 -0
- package/dist/hooks/json-hooks.d.ts +63 -0
- package/dist/hooks/json-hooks.js +356 -0
- package/dist/hooks/opencode.d.ts +50 -0
- package/dist/hooks/opencode.js +202 -0
- package/dist/hooks/shared.d.ts +54 -0
- package/dist/hooks/shared.js +77 -0
- package/dist/http-retry.d.ts +2 -0
- package/dist/http-retry.js +4 -3
- package/dist/http-util.d.ts +3 -0
- package/dist/http-util.js +10 -0
- package/dist/{importers.d.ts → importers/core.d.ts} +13 -17
- package/dist/importers/core.js +141 -0
- package/dist/importers/markdown-parse.d.ts +41 -0
- package/dist/importers/markdown-parse.js +132 -0
- package/dist/importers/markdown.d.ts +3 -0
- package/dist/importers/markdown.js +92 -0
- package/dist/importers/sources.d.ts +7 -0
- package/dist/importers/sources.js +229 -0
- package/dist/importers/vault.d.ts +11 -0
- package/dist/importers/vault.js +352 -0
- package/dist/incidents.d.ts +3 -0
- package/dist/incidents.js +7 -5
- package/dist/index.d.ts +25 -6
- package/dist/index.js +23 -6
- package/dist/invalidation.js +2 -1
- package/dist/judgment.js +2 -1
- package/dist/keyset.d.ts +13 -0
- package/dist/keyset.js +8 -0
- package/dist/local-embedding.d.ts +13 -0
- package/dist/local-embedding.js +165 -0
- package/dist/log.d.ts +7 -0
- package/dist/log.js +19 -1
- package/dist/mcp/admin-tools.d.ts +8 -0
- package/dist/mcp/admin-tools.js +116 -0
- package/dist/mcp/format.d.ts +27 -0
- package/dist/mcp/format.js +135 -0
- package/dist/mcp/memory-tools.d.ts +5 -0
- package/dist/mcp/memory-tools.js +83 -0
- package/dist/mcp/protocol.d.ts +83 -0
- package/dist/mcp/protocol.js +55 -0
- package/dist/mcp/recall-tools.d.ts +6 -0
- package/dist/mcp/recall-tools.js +320 -0
- package/dist/mcp/request.d.ts +10 -0
- package/dist/mcp/request.js +163 -0
- package/dist/mcp/server.d.ts +4 -75
- package/dist/mcp/server.js +7 -1190
- package/dist/mcp/session-state.d.ts +11 -0
- package/dist/mcp/session-state.js +28 -0
- package/dist/mcp/stdio.d.ts +8 -0
- package/dist/mcp/stdio.js +79 -0
- package/dist/mcp/tools.d.ts +11 -0
- package/dist/mcp/tools.js +247 -0
- package/dist/memory.d.ts +3 -0
- package/dist/memory.js +27 -1
- package/dist/multihop.d.ts +1 -1
- package/dist/multihop.js +2 -1
- package/dist/owner-validation.js +2 -1
- package/dist/physics-state.js +10 -7
- package/dist/policies.d.ts +3 -0
- package/dist/policies.js +8 -6
- package/dist/postinstall.js +3 -2
- package/dist/predictions/planning-fallacy.d.ts +100 -0
- package/dist/predictions/planning-fallacy.js +190 -0
- package/dist/{predictions.d.ts → predictions/store.d.ts} +7 -102
- package/dist/predictions/store.js +434 -0
- package/dist/processes.d.ts +3 -0
- package/dist/processes.js +7 -5
- package/dist/project-briefs.d.ts +3 -0
- package/dist/project-briefs.js +7 -5
- package/dist/project-identity.js +3 -2
- package/dist/project-merge.js +3 -1
- package/dist/quarantine.d.ts +2 -1
- package/dist/quarantine.js +8 -5
- package/dist/raw-archive.js +1 -1
- package/dist/recall-history.js +3 -2
- package/dist/recall-pipeline.d.ts +2 -2
- package/dist/recall-pipeline.js +16 -8
- package/dist/recall-scope.js +1 -1
- package/dist/recall-trace.d.ts +1 -1
- package/dist/refine-llm.js +2 -1
- package/dist/reject-flow.js +6 -1
- package/dist/rerankers/clef.js +6 -5
- package/dist/rerankers/jev.d.ts +1 -1
- package/dist/rerankers/jev.js +4 -4
- package/dist/rerankers/llm.d.ts +4 -2
- package/dist/rerankers/llm.js +58 -38
- package/dist/rerankers/types.d.ts +1 -1
- package/dist/salience.js +1 -1
- package/dist/scheduler.d.ts +1 -0
- package/dist/scheduler.js +26 -4
- package/dist/scope.js +4 -3
- package/dist/search/as-of.d.ts +10 -0
- package/dist/search/as-of.js +22 -0
- package/dist/search/bm25-search.d.ts +14 -0
- package/dist/search/bm25-search.js +43 -0
- package/dist/search/bm25.d.ts +15 -0
- package/dist/search/bm25.js +54 -0
- package/dist/search/boosts.d.ts +54 -0
- package/dist/search/boosts.js +94 -0
- package/dist/search/breakdown.d.ts +7 -0
- package/dist/search/breakdown.js +20 -0
- package/dist/search/explain.d.ts +25 -0
- package/dist/search/explain.js +31 -0
- package/dist/search/finalize.d.ts +8 -0
- package/dist/search/finalize.js +52 -0
- package/dist/search/fusion.d.ts +27 -0
- package/dist/search/fusion.js +42 -0
- package/dist/search/hybrid-score.d.ts +20 -0
- package/dist/search/hybrid-score.js +73 -0
- package/dist/search/hybrid.d.ts +46 -0
- package/dist/search/hybrid.js +64 -0
- package/dist/search/physics-search.d.ts +29 -0
- package/dist/search/physics-search.js +162 -0
- package/dist/search/rerank.d.ts +10 -0
- package/dist/search/rerank.js +72 -0
- package/dist/search/temporal.d.ts +15 -0
- package/dist/search/temporal.js +45 -0
- package/dist/search/types.d.ts +91 -0
- package/dist/search/types.js +2 -0
- package/dist/search/vector.d.ts +30 -0
- package/dist/search/vector.js +71 -0
- package/dist/secret-detect.d.ts +2 -0
- package/dist/secret-detect.js +2 -1
- package/dist/server/auth.d.ts +52 -0
- package/dist/server/auth.js +221 -0
- package/dist/server/client-ip.d.ts +25 -0
- package/dist/server/client-ip.js +92 -0
- package/dist/server/cursor.d.ts +23 -0
- package/dist/server/cursor.js +58 -0
- package/dist/server/lifecycle.d.ts +7 -0
- package/dist/server/lifecycle.js +29 -0
- package/dist/server/mcp-http.d.ts +5 -0
- package/dist/server/mcp-http.js +199 -0
- package/dist/server/request.d.ts +33 -0
- package/dist/server/request.js +103 -0
- package/dist/server/routes/admin.d.ts +9 -0
- package/dist/server/routes/admin.js +158 -0
- package/dist/server/routes/customer-notes.d.ts +7 -0
- package/dist/server/routes/customer-notes.js +112 -0
- package/dist/server/routes/decisions.d.ts +7 -0
- package/dist/server/routes/decisions.js +133 -0
- package/dist/server/routes/incidents.d.ts +7 -0
- package/dist/server/routes/incidents.js +126 -0
- package/dist/server/routes/memories.d.ts +10 -0
- package/dist/server/routes/memories.js +179 -0
- package/dist/server/routes/policies.d.ts +8 -0
- package/dist/server/routes/policies.js +151 -0
- package/dist/server/routes/predictions.d.ts +7 -0
- package/dist/server/routes/predictions.js +164 -0
- package/dist/server/routes/processes.d.ts +7 -0
- package/dist/server/routes/processes.js +161 -0
- package/dist/server/routes/project-briefs.d.ts +8 -0
- package/dist/server/routes/project-briefs.js +136 -0
- package/dist/server/routes/recall.d.ts +8 -0
- package/dist/server/routes/recall.js +340 -0
- package/dist/server/routes/skills.d.ts +8 -0
- package/dist/server/routes/skills.js +150 -0
- package/dist/server/types.d.ts +56 -0
- package/dist/server/types.js +2 -0
- package/dist/server/validation.d.ts +14 -0
- package/dist/server/validation.js +91 -0
- package/dist/server.d.ts +7 -61
- package/dist/server.js +69 -2362
- package/dist/session-digest.d.ts +1 -1
- package/dist/session-digest.js +9 -2
- package/dist/shared.d.ts +3 -1
- package/dist/shared.js +26 -22
- package/dist/skills.d.ts +3 -0
- package/dist/skills.js +7 -5
- package/dist/stdin.js +2 -2
- package/dist/store/audit-event.d.ts +19 -0
- package/dist/store/audit-event.js +33 -0
- package/dist/store/candidates.d.ts +42 -0
- package/dist/store/candidates.js +152 -0
- package/dist/store/conflicts.d.ts +44 -0
- package/dist/store/conflicts.js +444 -0
- package/dist/store/delete-and-batch.d.ts +63 -0
- package/dist/store/delete-and-batch.js +310 -0
- package/dist/store/entry-reads.d.ts +92 -0
- package/dist/store/entry-reads.js +255 -0
- package/dist/store/entry-row.d.ts +67 -0
- package/dist/store/entry-row.js +208 -0
- package/dist/store/entry-writes.d.ts +46 -0
- package/dist/store/entry-writes.js +148 -0
- package/dist/store/handoffs.d.ts +26 -0
- package/dist/store/handoffs.js +184 -0
- package/dist/store/index-and-stats.d.ts +52 -0
- package/dist/store/index-and-stats.js +214 -0
- package/dist/store/markdown.d.ts +10 -0
- package/dist/store/markdown.js +108 -0
- package/dist/store/mirrors.d.ts +49 -0
- package/dist/store/mirrors.js +312 -0
- package/dist/store/open.d.ts +15 -0
- package/dist/store/open.js +223 -0
- package/dist/store/rows.d.ts +178 -0
- package/dist/store/rows.js +158 -0
- package/dist/store/search-rows.d.ts +86 -0
- package/dist/store/search-rows.js +254 -0
- package/dist/store/sessions.d.ts +83 -0
- package/dist/store/sessions.js +272 -0
- package/dist/store/summaries.d.ts +94 -0
- package/dist/store/summaries.js +377 -0
- package/dist/store/tenant-lookup.d.ts +12 -0
- package/dist/store/tenant-lookup.js +16 -0
- package/dist/store-cards.js +2 -1
- package/dist/summary-dirty.d.ts +4 -0
- package/dist/summary-dirty.js +32 -0
- package/dist/support-bundle.js +4 -3
- package/dist/tenant.js +2 -2
- package/dist/tokenize.d.ts +2 -0
- package/dist/tokenize.js +16 -0
- package/dist/transcript-tail.d.ts +7 -0
- package/dist/transcript-tail.js +48 -0
- package/dist/vector-store.d.ts +27 -0
- package/dist/vector-store.js +210 -0
- package/dist/version.d.ts +2 -2
- package/dist/version.js +2 -2
- package/dist/working-memory.js +1 -1
- package/dist/yaml.js +36 -11
- package/dist-ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
- package/dist-ui/assets/index-DPN7cP19.js +33 -0
- package/dist-ui/assets/index-dFloKRVr.css +1 -0
- package/dist-ui/index.html +3 -25
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
- package/dist/capture.d.ts +0 -155
- package/dist/capture.js +0 -1295
- package/dist/consolidate.d.ts +0 -58
- package/dist/consolidate.js +0 -1124
- package/dist/graph.d.ts +0 -245
- package/dist/hooks.d.ts +0 -208
- package/dist/hooks.js +0 -1076
- package/dist/importers.js +0 -900
- package/dist/predictions.js +0 -620
- package/dist/search.d.ts +0 -320
- package/dist/search.js +0 -970
- package/dist/store.d.ts +0 -776
- package/dist/store.js +0 -3473
- package/dist-ui/assets/d3-BiWEKnn4.js +0 -1
- package/dist-ui/assets/index-BhT8RvO6.js +0 -61
- package/dist-ui/assets/index-RoXXJ5dq.css +0 -1
- package/dist-ui/assets/three-BDgTxR1l.js +0 -4112
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { tableExists } from '../tables.js';
|
|
2
|
+
const SKILLS_TABLE = `
|
|
3
|
+
CREATE TABLE skills (
|
|
4
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
5
|
+
memory_id TEXT,
|
|
6
|
+
tenant_id TEXT NOT NULL,
|
|
7
|
+
skill_name TEXT NOT NULL,
|
|
8
|
+
instructions TEXT NOT NULL,
|
|
9
|
+
trigger_text TEXT,
|
|
10
|
+
version INTEGER NOT NULL DEFAULT 1,
|
|
11
|
+
status TEXT NOT NULL DEFAULT 'active'
|
|
12
|
+
CHECK (status IN ('active', 'superseded', 'closed')),
|
|
13
|
+
superseded_by INTEGER,
|
|
14
|
+
superseded_at TEXT,
|
|
15
|
+
change_summary TEXT,
|
|
16
|
+
closed_at TEXT,
|
|
17
|
+
created_at TEXT NOT NULL,
|
|
18
|
+
FOREIGN KEY (memory_id) REFERENCES memories(id) ON DELETE SET NULL,
|
|
19
|
+
FOREIGN KEY (superseded_by) REFERENCES skills(id) ON DELETE SET NULL
|
|
20
|
+
)
|
|
21
|
+
`;
|
|
22
|
+
const IDX_SKILLS_TENANT_STATUS = `
|
|
23
|
+
CREATE INDEX IF NOT EXISTS idx_skills_tenant_status
|
|
24
|
+
ON skills(tenant_id, status)
|
|
25
|
+
`;
|
|
26
|
+
const IDX_SKILLS_MEMORY = `
|
|
27
|
+
CREATE INDEX IF NOT EXISTS idx_skills_memory
|
|
28
|
+
ON skills(memory_id) WHERE memory_id IS NOT NULL
|
|
29
|
+
`;
|
|
30
|
+
// Cross-tenant safety vs the referenced memory (verbatim mirror of the
|
|
31
|
+
// v32 processes tenant-match triggers).
|
|
32
|
+
const TRG_SKILLS_TENANT_MATCH_INSERT = `
|
|
33
|
+
CREATE TRIGGER IF NOT EXISTS trg_skills_tenant_match_insert
|
|
34
|
+
BEFORE INSERT ON skills
|
|
35
|
+
WHEN NEW.memory_id IS NOT NULL
|
|
36
|
+
BEGIN
|
|
37
|
+
SELECT CASE
|
|
38
|
+
WHEN NEW.tenant_id != (SELECT tenant_id FROM memories WHERE id = NEW.memory_id)
|
|
39
|
+
THEN RAISE(ABORT, 'skills.tenant_id must match memories.tenant_id for the referenced memory')
|
|
40
|
+
END;
|
|
41
|
+
END
|
|
42
|
+
`;
|
|
43
|
+
const TRG_SKILLS_TENANT_MATCH_UPDATE = `
|
|
44
|
+
CREATE TRIGGER IF NOT EXISTS trg_skills_tenant_match_update
|
|
45
|
+
BEFORE UPDATE ON skills
|
|
46
|
+
WHEN NEW.memory_id IS NOT NULL
|
|
47
|
+
AND (NEW.memory_id IS NOT OLD.memory_id OR NEW.tenant_id IS NOT OLD.tenant_id)
|
|
48
|
+
BEGIN
|
|
49
|
+
SELECT CASE
|
|
50
|
+
WHEN NEW.tenant_id != (SELECT tenant_id FROM memories WHERE id = NEW.memory_id)
|
|
51
|
+
THEN RAISE(ABORT, 'skills.tenant_id must match memories.tenant_id for the referenced memory')
|
|
52
|
+
END;
|
|
53
|
+
END
|
|
54
|
+
`;
|
|
55
|
+
// Cross-tenant safety vs the successor skill (self-FK; verbatim mirror of
|
|
56
|
+
// the v32 processes supersede trigger).
|
|
57
|
+
const TRG_SKILLS_SUPERSEDE_TENANT_MATCH_UPDATE = `
|
|
58
|
+
CREATE TRIGGER IF NOT EXISTS trg_skills_supersede_tenant_match_update
|
|
59
|
+
BEFORE UPDATE ON skills
|
|
60
|
+
WHEN NEW.superseded_by IS NOT NULL
|
|
61
|
+
AND NEW.superseded_by IS NOT OLD.superseded_by
|
|
62
|
+
BEGIN
|
|
63
|
+
SELECT CASE
|
|
64
|
+
WHEN NEW.tenant_id != (SELECT tenant_id FROM skills WHERE id = NEW.superseded_by)
|
|
65
|
+
THEN RAISE(ABORT, 'skills.superseded_by must reference a skill in the same tenant')
|
|
66
|
+
END;
|
|
67
|
+
END
|
|
68
|
+
`;
|
|
69
|
+
export const v34 = {
|
|
70
|
+
version: 34,
|
|
71
|
+
up: (db) => {
|
|
72
|
+
// E2 skill first-class object (docs/plans/2026-05-30-e2-skill-object.md).
|
|
73
|
+
// A skill is a reusable, agent-followable capability: an `instructions` body
|
|
74
|
+
// + an optional `trigger_text` (when to apply), evolving via the v32
|
|
75
|
+
// processes supersede machinery (superseded_by self-FK + supersede
|
|
76
|
+
// tenant-match trigger + version + change_summary). This table = the v32
|
|
77
|
+
// processes table MINUS `steps` (a skill's content is a single instructions
|
|
78
|
+
// body) PLUS `instructions` (NOT NULL) and `trigger_text`. "Executable" is
|
|
79
|
+
// scoped to an agent-followable instruction that EXPORTS into the agent's
|
|
80
|
+
// in-force rules (AGENTS.md / CLAUDE.md) via exportSkills; literal code
|
|
81
|
+
// execution is deferred. NOTE: the column is `trigger_text`, NOT `trigger`,
|
|
82
|
+
// because TRIGGER is a SQLite reserved keyword.
|
|
83
|
+
if (!tableExists(db, 'skills')) {
|
|
84
|
+
db.exec(SKILLS_TABLE);
|
|
85
|
+
db.exec(IDX_SKILLS_TENANT_STATUS);
|
|
86
|
+
db.exec(IDX_SKILLS_MEMORY);
|
|
87
|
+
db.exec(TRG_SKILLS_TENANT_MATCH_INSERT);
|
|
88
|
+
db.exec(TRG_SKILLS_TENANT_MATCH_UPDATE);
|
|
89
|
+
db.exec(TRG_SKILLS_SUPERSEDE_TENANT_MATCH_UPDATE);
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
//# sourceMappingURL=v34.js.map
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { tableExists } from '../tables.js';
|
|
2
|
+
const PROJECT_BRIEFS_TABLE = `
|
|
3
|
+
CREATE TABLE project_briefs (
|
|
4
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
5
|
+
memory_id TEXT,
|
|
6
|
+
tenant_id TEXT NOT NULL,
|
|
7
|
+
repo TEXT NOT NULL,
|
|
8
|
+
summary TEXT NOT NULL,
|
|
9
|
+
version INTEGER NOT NULL DEFAULT 1,
|
|
10
|
+
status TEXT NOT NULL DEFAULT 'active'
|
|
11
|
+
CHECK (status IN ('active', 'superseded', 'closed')),
|
|
12
|
+
superseded_by INTEGER,
|
|
13
|
+
superseded_at TEXT,
|
|
14
|
+
change_summary TEXT,
|
|
15
|
+
closed_at TEXT,
|
|
16
|
+
created_at TEXT NOT NULL,
|
|
17
|
+
FOREIGN KEY (memory_id) REFERENCES memories(id) ON DELETE SET NULL,
|
|
18
|
+
FOREIGN KEY (superseded_by) REFERENCES project_briefs(id) ON DELETE SET NULL
|
|
19
|
+
)
|
|
20
|
+
`;
|
|
21
|
+
const IDX_PROJECT_BRIEFS_TENANT_STATUS = `
|
|
22
|
+
CREATE INDEX IF NOT EXISTS idx_project_briefs_tenant_status
|
|
23
|
+
ON project_briefs(tenant_id, status)
|
|
24
|
+
`;
|
|
25
|
+
const IDX_PROJECT_BRIEFS_MEMORY = `
|
|
26
|
+
CREATE INDEX IF NOT EXISTS idx_project_briefs_memory
|
|
27
|
+
ON project_briefs(memory_id) WHERE memory_id IS NOT NULL
|
|
28
|
+
`;
|
|
29
|
+
const IDX_PROJECT_BRIEFS_REPO = `
|
|
30
|
+
CREATE INDEX IF NOT EXISTS idx_project_briefs_repo
|
|
31
|
+
ON project_briefs(tenant_id, repo, status)
|
|
32
|
+
`;
|
|
33
|
+
// Cross-tenant safety vs the referenced memory (verbatim mirror of the
|
|
34
|
+
// v34 skills tenant-match triggers).
|
|
35
|
+
const TRG_PROJECT_BRIEFS_TENANT_MATCH_INSERT = `
|
|
36
|
+
CREATE TRIGGER IF NOT EXISTS trg_project_briefs_tenant_match_insert
|
|
37
|
+
BEFORE INSERT ON project_briefs
|
|
38
|
+
WHEN NEW.memory_id IS NOT NULL
|
|
39
|
+
BEGIN
|
|
40
|
+
SELECT CASE
|
|
41
|
+
WHEN NEW.tenant_id != (SELECT tenant_id FROM memories WHERE id = NEW.memory_id)
|
|
42
|
+
THEN RAISE(ABORT, 'project_briefs.tenant_id must match memories.tenant_id for the referenced memory')
|
|
43
|
+
END;
|
|
44
|
+
END
|
|
45
|
+
`;
|
|
46
|
+
const TRG_PROJECT_BRIEFS_TENANT_MATCH_UPDATE = `
|
|
47
|
+
CREATE TRIGGER IF NOT EXISTS trg_project_briefs_tenant_match_update
|
|
48
|
+
BEFORE UPDATE ON project_briefs
|
|
49
|
+
WHEN NEW.memory_id IS NOT NULL
|
|
50
|
+
AND (NEW.memory_id IS NOT OLD.memory_id OR NEW.tenant_id IS NOT OLD.tenant_id)
|
|
51
|
+
BEGIN
|
|
52
|
+
SELECT CASE
|
|
53
|
+
WHEN NEW.tenant_id != (SELECT tenant_id FROM memories WHERE id = NEW.memory_id)
|
|
54
|
+
THEN RAISE(ABORT, 'project_briefs.tenant_id must match memories.tenant_id for the referenced memory')
|
|
55
|
+
END;
|
|
56
|
+
END
|
|
57
|
+
`;
|
|
58
|
+
// Cross-tenant safety vs the successor brief (self-FK; verbatim mirror of
|
|
59
|
+
// the v34 skills supersede trigger).
|
|
60
|
+
const TRG_PROJECT_BRIEFS_SUPERSEDE_TENANT_MATCH_UPDATE = `
|
|
61
|
+
CREATE TRIGGER IF NOT EXISTS trg_project_briefs_supersede_tenant_match_update
|
|
62
|
+
BEFORE UPDATE ON project_briefs
|
|
63
|
+
WHEN NEW.superseded_by IS NOT NULL
|
|
64
|
+
AND NEW.superseded_by IS NOT OLD.superseded_by
|
|
65
|
+
BEGIN
|
|
66
|
+
SELECT CASE
|
|
67
|
+
WHEN NEW.tenant_id != (SELECT tenant_id FROM project_briefs WHERE id = NEW.superseded_by)
|
|
68
|
+
THEN RAISE(ABORT, 'project_briefs.superseded_by must reference a project_brief in the same tenant')
|
|
69
|
+
END;
|
|
70
|
+
END
|
|
71
|
+
`;
|
|
72
|
+
export const v35 = {
|
|
73
|
+
version: 35,
|
|
74
|
+
up: (db) => {
|
|
75
|
+
// E2 project_brief first-class object
|
|
76
|
+
// (docs/plans/2026-05-30-e2-project-brief-object.md). A project_brief is the
|
|
77
|
+
// living, repo-scoped summary of a repository's state: a `summary` body
|
|
78
|
+
// scoped to a `repo`, evolving via the v34 skills supersede machinery
|
|
79
|
+
// (superseded_by self-FK + supersede tenant-match trigger + version +
|
|
80
|
+
// change_summary). This table = the v34 skills table with
|
|
81
|
+
// skill_name/trigger_text replaced by `repo` (the repo-scoping dimension)
|
|
82
|
+
// PLUS `summary` (the brief body). The distinguishing op (refreshBrief, in
|
|
83
|
+
// src/project-briefs.ts) auto-assembles the summary from the repo's receipts
|
|
84
|
+
// (memory rows tagged path:<repo>); it needs no schema support beyond `repo`.
|
|
85
|
+
// All column names were checked against SQLite reserved words (skill-episode
|
|
86
|
+
// lesson re: `trigger`): repo/summary/version/status/etc. are non-reserved.
|
|
87
|
+
if (!tableExists(db, 'project_briefs')) {
|
|
88
|
+
db.exec(PROJECT_BRIEFS_TABLE);
|
|
89
|
+
db.exec(IDX_PROJECT_BRIEFS_TENANT_STATUS);
|
|
90
|
+
db.exec(IDX_PROJECT_BRIEFS_MEMORY);
|
|
91
|
+
db.exec(IDX_PROJECT_BRIEFS_REPO);
|
|
92
|
+
db.exec(TRG_PROJECT_BRIEFS_TENANT_MATCH_INSERT);
|
|
93
|
+
db.exec(TRG_PROJECT_BRIEFS_TENANT_MATCH_UPDATE);
|
|
94
|
+
db.exec(TRG_PROJECT_BRIEFS_SUPERSEDE_TENANT_MATCH_UPDATE);
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
//# sourceMappingURL=v35.js.map
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { tableExists } from '../tables.js';
|
|
2
|
+
const CUSTOMER_NOTES_TABLE = `
|
|
3
|
+
CREATE TABLE customer_notes (
|
|
4
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
5
|
+
memory_id TEXT,
|
|
6
|
+
tenant_id TEXT NOT NULL,
|
|
7
|
+
customer TEXT NOT NULL,
|
|
8
|
+
note TEXT NOT NULL,
|
|
9
|
+
version INTEGER NOT NULL DEFAULT 1,
|
|
10
|
+
status TEXT NOT NULL DEFAULT 'active'
|
|
11
|
+
CHECK (status IN ('active', 'superseded', 'closed')),
|
|
12
|
+
superseded_by INTEGER,
|
|
13
|
+
superseded_at TEXT,
|
|
14
|
+
change_summary TEXT,
|
|
15
|
+
closed_at TEXT,
|
|
16
|
+
created_at TEXT NOT NULL,
|
|
17
|
+
FOREIGN KEY (memory_id) REFERENCES memories(id) ON DELETE SET NULL,
|
|
18
|
+
FOREIGN KEY (superseded_by) REFERENCES customer_notes(id) ON DELETE SET NULL
|
|
19
|
+
)
|
|
20
|
+
`;
|
|
21
|
+
const IDX_CUSTOMER_NOTES_TENANT_STATUS = `
|
|
22
|
+
CREATE INDEX IF NOT EXISTS idx_customer_notes_tenant_status
|
|
23
|
+
ON customer_notes(tenant_id, status)
|
|
24
|
+
`;
|
|
25
|
+
const IDX_CUSTOMER_NOTES_MEMORY = `
|
|
26
|
+
CREATE INDEX IF NOT EXISTS idx_customer_notes_memory
|
|
27
|
+
ON customer_notes(memory_id) WHERE memory_id IS NOT NULL
|
|
28
|
+
`;
|
|
29
|
+
const IDX_CUSTOMER_NOTES_CUSTOMER = `
|
|
30
|
+
CREATE INDEX IF NOT EXISTS idx_customer_notes_customer
|
|
31
|
+
ON customer_notes(tenant_id, customer, status)
|
|
32
|
+
`;
|
|
33
|
+
// Cross-tenant safety vs the referenced memory (verbatim mirror of the
|
|
34
|
+
// v35 project_briefs tenant-match triggers).
|
|
35
|
+
const TRG_CUSTOMER_NOTES_TENANT_MATCH_INSERT = `
|
|
36
|
+
CREATE TRIGGER IF NOT EXISTS trg_customer_notes_tenant_match_insert
|
|
37
|
+
BEFORE INSERT ON customer_notes
|
|
38
|
+
WHEN NEW.memory_id IS NOT NULL
|
|
39
|
+
BEGIN
|
|
40
|
+
SELECT CASE
|
|
41
|
+
WHEN NEW.tenant_id != (SELECT tenant_id FROM memories WHERE id = NEW.memory_id)
|
|
42
|
+
THEN RAISE(ABORT, 'customer_notes.tenant_id must match memories.tenant_id for the referenced memory')
|
|
43
|
+
END;
|
|
44
|
+
END
|
|
45
|
+
`;
|
|
46
|
+
const TRG_CUSTOMER_NOTES_TENANT_MATCH_UPDATE = `
|
|
47
|
+
CREATE TRIGGER IF NOT EXISTS trg_customer_notes_tenant_match_update
|
|
48
|
+
BEFORE UPDATE ON customer_notes
|
|
49
|
+
WHEN NEW.memory_id IS NOT NULL
|
|
50
|
+
AND (NEW.memory_id IS NOT OLD.memory_id OR NEW.tenant_id IS NOT OLD.tenant_id)
|
|
51
|
+
BEGIN
|
|
52
|
+
SELECT CASE
|
|
53
|
+
WHEN NEW.tenant_id != (SELECT tenant_id FROM memories WHERE id = NEW.memory_id)
|
|
54
|
+
THEN RAISE(ABORT, 'customer_notes.tenant_id must match memories.tenant_id for the referenced memory')
|
|
55
|
+
END;
|
|
56
|
+
END
|
|
57
|
+
`;
|
|
58
|
+
// Cross-tenant safety vs the successor note (self-FK; verbatim mirror of the
|
|
59
|
+
// v35 project_briefs supersede trigger).
|
|
60
|
+
const TRG_CUSTOMER_NOTES_SUPERSEDE_TENANT_MATCH_UPDATE = `
|
|
61
|
+
CREATE TRIGGER IF NOT EXISTS trg_customer_notes_supersede_tenant_match_update
|
|
62
|
+
BEFORE UPDATE ON customer_notes
|
|
63
|
+
WHEN NEW.superseded_by IS NOT NULL
|
|
64
|
+
AND NEW.superseded_by IS NOT OLD.superseded_by
|
|
65
|
+
BEGIN
|
|
66
|
+
SELECT CASE
|
|
67
|
+
WHEN NEW.tenant_id != (SELECT tenant_id FROM customer_notes WHERE id = NEW.superseded_by)
|
|
68
|
+
THEN RAISE(ABORT, 'customer_notes.superseded_by must reference a customer_note in the same tenant')
|
|
69
|
+
END;
|
|
70
|
+
END
|
|
71
|
+
`;
|
|
72
|
+
export const v36 = {
|
|
73
|
+
version: 36,
|
|
74
|
+
up: (db) => {
|
|
75
|
+
// E2 customer_note first-class object (the LAST E2 object)
|
|
76
|
+
// (docs/plans/2026-06-01-e2-customer-note-object.md). A customer_note is a
|
|
77
|
+
// discrete note recorded against an account/customer entity, evolving via the
|
|
78
|
+
// v35 project_briefs supersede machinery (superseded_by self-FK + supersede
|
|
79
|
+
// tenant-match trigger + version + change_summary). This table = the v35
|
|
80
|
+
// project_briefs table with repo/summary replaced by `customer` (the
|
|
81
|
+
// entity-scoping dimension; a free-form account/customer id - the entities
|
|
82
|
+
// table is unbuilt E3.1, so a FK is deferred) PLUS `note` (the note body).
|
|
83
|
+
// MANY notes per customer (each its own supersede chain), unlike the
|
|
84
|
+
// one-summary-per-repo project_brief. All column names checked against SQLite
|
|
85
|
+
// reserved words (skill-episode lesson, codebase-audit rule 10): customer/note/
|
|
86
|
+
// version/status/etc. are non-reserved.
|
|
87
|
+
if (!tableExists(db, 'customer_notes')) {
|
|
88
|
+
db.exec(CUSTOMER_NOTES_TABLE);
|
|
89
|
+
db.exec(IDX_CUSTOMER_NOTES_TENANT_STATUS);
|
|
90
|
+
db.exec(IDX_CUSTOMER_NOTES_MEMORY);
|
|
91
|
+
db.exec(IDX_CUSTOMER_NOTES_CUSTOMER);
|
|
92
|
+
db.exec(TRG_CUSTOMER_NOTES_TENANT_MATCH_INSERT);
|
|
93
|
+
db.exec(TRG_CUSTOMER_NOTES_TENANT_MATCH_UPDATE);
|
|
94
|
+
db.exec(TRG_CUSTOMER_NOTES_SUPERSEDE_TENANT_MATCH_UPDATE);
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
//# sourceMappingURL=v36.js.map
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { tableExists } from '../tables.js';
|
|
2
|
+
const ENTITIES_TABLE = `
|
|
3
|
+
CREATE TABLE entities (
|
|
4
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
5
|
+
tenant_id TEXT NOT NULL,
|
|
6
|
+
entity_type TEXT NOT NULL
|
|
7
|
+
CHECK (entity_type IN ('person', 'project', 'customer', 'system', 'policy', 'decision')),
|
|
8
|
+
name TEXT NOT NULL,
|
|
9
|
+
memory_id TEXT NOT NULL,
|
|
10
|
+
source_kind TEXT NOT NULL CHECK (source_kind IN ('distilled', 'superseded')),
|
|
11
|
+
created_at TEXT NOT NULL,
|
|
12
|
+
FOREIGN KEY (memory_id) REFERENCES memories(id) ON DELETE CASCADE
|
|
13
|
+
)
|
|
14
|
+
`;
|
|
15
|
+
const RELATIONS_TABLE = `
|
|
16
|
+
CREATE TABLE relations (
|
|
17
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
18
|
+
tenant_id TEXT NOT NULL,
|
|
19
|
+
from_entity_id INTEGER NOT NULL,
|
|
20
|
+
to_entity_id INTEGER NOT NULL,
|
|
21
|
+
rel_type TEXT NOT NULL
|
|
22
|
+
CHECK (rel_type IN ('owns', 'supersedes', 'depends-on', 'blocked-by', 'references')),
|
|
23
|
+
memory_id TEXT NOT NULL,
|
|
24
|
+
source_kind TEXT NOT NULL CHECK (source_kind IN ('distilled', 'superseded')),
|
|
25
|
+
created_at TEXT NOT NULL,
|
|
26
|
+
FOREIGN KEY (from_entity_id) REFERENCES entities(id) ON DELETE CASCADE,
|
|
27
|
+
FOREIGN KEY (to_entity_id) REFERENCES entities(id) ON DELETE CASCADE,
|
|
28
|
+
FOREIGN KEY (memory_id) REFERENCES memories(id) ON DELETE CASCADE
|
|
29
|
+
)
|
|
30
|
+
`;
|
|
31
|
+
const GRAPH_EXTRACTION_QUEUE_TABLE = `
|
|
32
|
+
CREATE TABLE graph_extraction_queue (
|
|
33
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
34
|
+
tenant_id TEXT NOT NULL,
|
|
35
|
+
memory_id TEXT NOT NULL,
|
|
36
|
+
kind TEXT NOT NULL CHECK (kind IN ('distilled', 'superseded')),
|
|
37
|
+
status TEXT NOT NULL DEFAULT 'pending'
|
|
38
|
+
CHECK (status IN ('pending', 'processed', 'skipped')),
|
|
39
|
+
enqueued_at TEXT NOT NULL,
|
|
40
|
+
processed_at TEXT,
|
|
41
|
+
FOREIGN KEY (memory_id) REFERENCES memories(id) ON DELETE CASCADE
|
|
42
|
+
)
|
|
43
|
+
`;
|
|
44
|
+
// entities guard: source_kind must equal the FK'd memory's actual kind (so a
|
|
45
|
+
// raw memory or a lying source_kind both ABORT), and tenant must match. Both
|
|
46
|
+
// INSERT and UPDATE (UPDATE fires when memory_id/source_kind/tenant_id change).
|
|
47
|
+
const TRG_ENTITIES_CONSOLIDATED_ONLY_INSERT = `
|
|
48
|
+
CREATE TRIGGER IF NOT EXISTS trg_entities_consolidated_only_insert
|
|
49
|
+
BEFORE INSERT ON entities
|
|
50
|
+
BEGIN
|
|
51
|
+
SELECT CASE
|
|
52
|
+
WHEN NEW.source_kind != (SELECT kind FROM memories WHERE id = NEW.memory_id)
|
|
53
|
+
THEN RAISE(ABORT, 'entities.source_kind must equal the referenced memory kind; the graph indexes consolidated state only (no raw)')
|
|
54
|
+
WHEN NEW.tenant_id != (SELECT tenant_id FROM memories WHERE id = NEW.memory_id)
|
|
55
|
+
THEN RAISE(ABORT, 'entities.tenant_id must match memories.tenant_id for the referenced memory')
|
|
56
|
+
END;
|
|
57
|
+
END
|
|
58
|
+
`;
|
|
59
|
+
const TRG_ENTITIES_CONSOLIDATED_ONLY_UPDATE = `
|
|
60
|
+
CREATE TRIGGER IF NOT EXISTS trg_entities_consolidated_only_update
|
|
61
|
+
BEFORE UPDATE ON entities
|
|
62
|
+
WHEN NEW.memory_id IS NOT OLD.memory_id
|
|
63
|
+
OR NEW.source_kind IS NOT OLD.source_kind
|
|
64
|
+
OR NEW.tenant_id IS NOT OLD.tenant_id
|
|
65
|
+
BEGIN
|
|
66
|
+
SELECT CASE
|
|
67
|
+
WHEN NEW.source_kind != (SELECT kind FROM memories WHERE id = NEW.memory_id)
|
|
68
|
+
THEN RAISE(ABORT, 'entities.source_kind must equal the referenced memory kind; the graph indexes consolidated state only (no raw)')
|
|
69
|
+
WHEN NEW.tenant_id != (SELECT tenant_id FROM memories WHERE id = NEW.memory_id)
|
|
70
|
+
THEN RAISE(ABORT, 'entities.tenant_id must match memories.tenant_id for the referenced memory')
|
|
71
|
+
END;
|
|
72
|
+
END
|
|
73
|
+
`;
|
|
74
|
+
// relations guard: source_kind must equal the FK'd memory's kind; tenant must
|
|
75
|
+
// match the memory AND both endpoint entities (no cross-tenant edges).
|
|
76
|
+
const TRG_RELATIONS_CONSOLIDATED_ONLY_INSERT = `
|
|
77
|
+
CREATE TRIGGER IF NOT EXISTS trg_relations_consolidated_only_insert
|
|
78
|
+
BEFORE INSERT ON relations
|
|
79
|
+
BEGIN
|
|
80
|
+
SELECT CASE
|
|
81
|
+
WHEN NEW.source_kind != (SELECT kind FROM memories WHERE id = NEW.memory_id)
|
|
82
|
+
THEN RAISE(ABORT, 'relations.source_kind must equal the referenced memory kind; the graph indexes consolidated state only (no raw)')
|
|
83
|
+
WHEN NEW.tenant_id != (SELECT tenant_id FROM memories WHERE id = NEW.memory_id)
|
|
84
|
+
THEN RAISE(ABORT, 'relations.tenant_id must match memories.tenant_id for the referenced memory')
|
|
85
|
+
WHEN NEW.tenant_id != (SELECT tenant_id FROM entities WHERE id = NEW.from_entity_id)
|
|
86
|
+
THEN RAISE(ABORT, 'relations.tenant_id must match the from_entity tenant (no cross-tenant edges)')
|
|
87
|
+
WHEN NEW.tenant_id != (SELECT tenant_id FROM entities WHERE id = NEW.to_entity_id)
|
|
88
|
+
THEN RAISE(ABORT, 'relations.tenant_id must match the to_entity tenant (no cross-tenant edges)')
|
|
89
|
+
END;
|
|
90
|
+
END
|
|
91
|
+
`;
|
|
92
|
+
const TRG_RELATIONS_CONSOLIDATED_ONLY_UPDATE = `
|
|
93
|
+
CREATE TRIGGER IF NOT EXISTS trg_relations_consolidated_only_update
|
|
94
|
+
BEFORE UPDATE ON relations
|
|
95
|
+
WHEN NEW.memory_id IS NOT OLD.memory_id
|
|
96
|
+
OR NEW.source_kind IS NOT OLD.source_kind
|
|
97
|
+
OR NEW.tenant_id IS NOT OLD.tenant_id
|
|
98
|
+
OR NEW.from_entity_id IS NOT OLD.from_entity_id
|
|
99
|
+
OR NEW.to_entity_id IS NOT OLD.to_entity_id
|
|
100
|
+
BEGIN
|
|
101
|
+
SELECT CASE
|
|
102
|
+
WHEN NEW.source_kind != (SELECT kind FROM memories WHERE id = NEW.memory_id)
|
|
103
|
+
THEN RAISE(ABORT, 'relations.source_kind must equal the referenced memory kind; the graph indexes consolidated state only (no raw)')
|
|
104
|
+
WHEN NEW.tenant_id != (SELECT tenant_id FROM memories WHERE id = NEW.memory_id)
|
|
105
|
+
THEN RAISE(ABORT, 'relations.tenant_id must match memories.tenant_id for the referenced memory')
|
|
106
|
+
WHEN NEW.tenant_id != (SELECT tenant_id FROM entities WHERE id = NEW.from_entity_id)
|
|
107
|
+
THEN RAISE(ABORT, 'relations.tenant_id must match the from_entity tenant (no cross-tenant edges)')
|
|
108
|
+
WHEN NEW.tenant_id != (SELECT tenant_id FROM entities WHERE id = NEW.to_entity_id)
|
|
109
|
+
THEN RAISE(ABORT, 'relations.tenant_id must match the to_entity tenant (no cross-tenant edges)')
|
|
110
|
+
END;
|
|
111
|
+
END
|
|
112
|
+
`;
|
|
113
|
+
// graph_extraction_queue guard: kind must equal the FK'd memory's actual kind
|
|
114
|
+
// (so a raw memory ABORTs), and tenant must match. INSERT and UPDATE.
|
|
115
|
+
const TRG_GRAPH_QUEUE_CONSOLIDATED_ONLY_INSERT = `
|
|
116
|
+
CREATE TRIGGER IF NOT EXISTS trg_graph_queue_consolidated_only_insert
|
|
117
|
+
BEFORE INSERT ON graph_extraction_queue
|
|
118
|
+
BEGIN
|
|
119
|
+
SELECT CASE
|
|
120
|
+
WHEN NEW.kind != (SELECT kind FROM memories WHERE id = NEW.memory_id)
|
|
121
|
+
THEN RAISE(ABORT, 'graph_extraction_queue.kind must equal the referenced memory kind; only consolidated memories are queued (no raw)')
|
|
122
|
+
WHEN NEW.tenant_id != (SELECT tenant_id FROM memories WHERE id = NEW.memory_id)
|
|
123
|
+
THEN RAISE(ABORT, 'graph_extraction_queue.tenant_id must match memories.tenant_id for the referenced memory')
|
|
124
|
+
END;
|
|
125
|
+
END
|
|
126
|
+
`;
|
|
127
|
+
const TRG_GRAPH_QUEUE_CONSOLIDATED_ONLY_UPDATE = `
|
|
128
|
+
CREATE TRIGGER IF NOT EXISTS trg_graph_queue_consolidated_only_update
|
|
129
|
+
BEFORE UPDATE ON graph_extraction_queue
|
|
130
|
+
WHEN NEW.memory_id IS NOT OLD.memory_id
|
|
131
|
+
OR NEW.kind IS NOT OLD.kind
|
|
132
|
+
OR NEW.tenant_id IS NOT OLD.tenant_id
|
|
133
|
+
BEGIN
|
|
134
|
+
SELECT CASE
|
|
135
|
+
WHEN NEW.kind != (SELECT kind FROM memories WHERE id = NEW.memory_id)
|
|
136
|
+
THEN RAISE(ABORT, 'graph_extraction_queue.kind must equal the referenced memory kind; only consolidated memories are queued (no raw)')
|
|
137
|
+
WHEN NEW.tenant_id != (SELECT tenant_id FROM memories WHERE id = NEW.memory_id)
|
|
138
|
+
THEN RAISE(ABORT, 'graph_extraction_queue.tenant_id must match memories.tenant_id for the referenced memory')
|
|
139
|
+
END;
|
|
140
|
+
END
|
|
141
|
+
`;
|
|
142
|
+
// Reverse guard (codex-review-critic 2026-06-01, P1): the graph-table triggers
|
|
143
|
+
// only fire on writes to the GRAPH tables. They do NOT fire when an
|
|
144
|
+
// already-indexed memory is later mutated. So 'UPDATE memories SET kind=raw'
|
|
145
|
+
// (or a tenant change) on a memory the graph references would silently leave
|
|
146
|
+
// entity/relation/queue rows pointing at a raw / cross-tenant memory while
|
|
147
|
+
// their source_kind stays 'distilled' - bypassing the central 'graph never
|
|
148
|
+
// indexes raw' invariant after insertion. This trigger closes that direction:
|
|
149
|
+
// a memory cannot be reclassified to raw, nor moved cross-tenant, WHILE the
|
|
150
|
+
// graph references it (rebuild/remove the graph rows first). Cheap: the EXISTS
|
|
151
|
+
// checks are only evaluated when kind actually becomes raw or tenant changes.
|
|
152
|
+
const TRG_MEMORIES_GRAPH_REFERENCED_GUARD = `
|
|
153
|
+
CREATE TRIGGER IF NOT EXISTS trg_memories_graph_referenced_guard
|
|
154
|
+
BEFORE UPDATE ON memories
|
|
155
|
+
WHEN (NEW.kind IS NOT OLD.kind OR NEW.tenant_id IS NOT OLD.tenant_id)
|
|
156
|
+
AND (
|
|
157
|
+
EXISTS (SELECT 1 FROM entities WHERE memory_id = OLD.id)
|
|
158
|
+
OR EXISTS (SELECT 1 FROM relations WHERE memory_id = OLD.id)
|
|
159
|
+
OR EXISTS (SELECT 1 FROM graph_extraction_queue WHERE memory_id = OLD.id)
|
|
160
|
+
)
|
|
161
|
+
BEGIN
|
|
162
|
+
SELECT RAISE(ABORT, 'cannot change the kind or tenant of a memory while the graph references it (E3.3 graph-on-consolidated guard); a graph-referenced memory is immutable in kind/tenant - rebuild/remove the graph rows first, or rebuild them after supersession');
|
|
163
|
+
END
|
|
164
|
+
`;
|
|
165
|
+
// Reverse guard #2 (codex-review-critic 2026-06-01 retry, P2): an entity that is
|
|
166
|
+
// a relation endpoint cannot be moved cross-tenant. The entity UPDATE trigger
|
|
167
|
+
// validates the entity against its source memory, but an existing relation
|
|
168
|
+
// pointing at the entity is NOT re-validated, so a raw 'UPDATE entities SET
|
|
169
|
+
// tenant_id=?, memory_id=?' to another tenant would leave a tenant-A relation
|
|
170
|
+
// pointing at a tenant-B entity. Block the tenant move while the entity is
|
|
171
|
+
// referenced by any relation (rebuild the relations first).
|
|
172
|
+
const TRG_ENTITIES_NO_TENANT_MOVE_WHEN_REFERENCED = `
|
|
173
|
+
CREATE TRIGGER IF NOT EXISTS trg_entities_no_tenant_move_when_referenced
|
|
174
|
+
BEFORE UPDATE ON entities
|
|
175
|
+
WHEN NEW.tenant_id IS NOT OLD.tenant_id
|
|
176
|
+
AND EXISTS (SELECT 1 FROM relations WHERE from_entity_id = OLD.id OR to_entity_id = OLD.id)
|
|
177
|
+
BEGIN
|
|
178
|
+
SELECT RAISE(ABORT, 'cannot move an entity cross-tenant while a relation references it as an endpoint (E3.3 graph-on-consolidated guard); rebuild/remove the relations first');
|
|
179
|
+
END
|
|
180
|
+
`;
|
|
181
|
+
export const v37 = {
|
|
182
|
+
version: 37,
|
|
183
|
+
up: (db) => {
|
|
184
|
+
// E3.3 graph-on-consolidated guard (docs/plans/2026-06-01-e3-graph-guard.md).
|
|
185
|
+
// The graph layer (entities + relations) sits ON TOP OF consolidated state and
|
|
186
|
+
// must NEVER index the raw layer. The substrate: entities + relations +
|
|
187
|
+
// graph_extraction_queue, each FK-ing to memories and guarded so they can only
|
|
188
|
+
// reference CONSOLIDATED memories (kind IN ('distilled','superseded')), never
|
|
189
|
+
// kind='raw'. New tables -> real CHECK constraints (unlike the ALTER'd memories,
|
|
190
|
+
// whose kind CHECK lives in triggers). The kind/source MATCH (source_kind ==
|
|
191
|
+
// the FK'd memory's actual kind) cannot be a CHECK (CHECK can't subquery), so it
|
|
192
|
+
// is a BEFORE INSERT *and* BEFORE UPDATE trigger (the subquery-capable pattern
|
|
193
|
+
// from the v30 decisions / predictions tenant-match triggers). Both INSERT and
|
|
194
|
+
// UPDATE are guarded: an INSERT-only guard is bypassable via a raw SQL UPDATE
|
|
195
|
+
// that moves a row onto a raw memory (plan-eng-critic 2026-06-01). All column
|
|
196
|
+
// names checked vs SQL reserved words (rule 10): rel_type avoids REFERENCES.
|
|
197
|
+
if (!tableExists(db, 'entities')) {
|
|
198
|
+
db.exec(ENTITIES_TABLE);
|
|
199
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_entities_tenant ON entities(tenant_id)`);
|
|
200
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_entities_memory ON entities(memory_id)`);
|
|
201
|
+
db.exec(RELATIONS_TABLE);
|
|
202
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_relations_tenant ON relations(tenant_id)`);
|
|
203
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_relations_from ON relations(from_entity_id)`);
|
|
204
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_relations_to ON relations(to_entity_id)`);
|
|
205
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_relations_memory ON relations(memory_id)`);
|
|
206
|
+
db.exec(GRAPH_EXTRACTION_QUEUE_TABLE);
|
|
207
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_graph_queue_status ON graph_extraction_queue(tenant_id, status)`);
|
|
208
|
+
db.exec(TRG_ENTITIES_CONSOLIDATED_ONLY_INSERT);
|
|
209
|
+
db.exec(TRG_ENTITIES_CONSOLIDATED_ONLY_UPDATE);
|
|
210
|
+
db.exec(TRG_RELATIONS_CONSOLIDATED_ONLY_INSERT);
|
|
211
|
+
db.exec(TRG_RELATIONS_CONSOLIDATED_ONLY_UPDATE);
|
|
212
|
+
db.exec(TRG_GRAPH_QUEUE_CONSOLIDATED_ONLY_INSERT);
|
|
213
|
+
db.exec(TRG_GRAPH_QUEUE_CONSOLIDATED_ONLY_UPDATE);
|
|
214
|
+
db.exec(TRG_MEMORIES_GRAPH_REFERENCED_GUARD);
|
|
215
|
+
db.exec(TRG_ENTITIES_NO_TENANT_MOVE_WHEN_REFERENCED);
|
|
216
|
+
}
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
//# sourceMappingURL=v37.js.map
|