hippo-memory 1.60.0 → 1.62.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 +29 -54
- package/dist/ablation.js +9 -27
- package/dist/agent-memories/apply.d.ts +1 -1
- package/dist/agent-memories/apply.js +4 -1
- package/dist/agent-memories/claude-code.d.ts +3 -1
- package/dist/agent-memories/claude-code.js +54 -10
- 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.d.ts +3 -3
- package/dist/agent-memories/sync.js +22 -9
- package/dist/agent-memories/types.d.ts +0 -2
- 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 +153 -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-select.d.ts +49 -0
- package/dist/api/context-select.js +344 -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 +378 -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 +126 -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 +192 -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 +499 -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 +256 -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 +453 -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 +376 -0
- package/dist/cli/continuity.d.ts +6 -0
- package/dist/cli/continuity.js +457 -0
- package/dist/cli/curate.d.ts +19 -0
- package/dist/cli/curate.js +556 -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 +156 -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 +190 -0
- package/dist/cli/playbooks.d.ts +4 -0
- package/dist/cli/playbooks.js +573 -0
- package/dist/cli/projects.js +9 -6
- package/dist/cli/recall.d.ts +7 -0
- package/dist/cli/recall.js +582 -0
- package/dist/cli/remember.d.ts +5 -0
- package/dist/cli/remember.js +485 -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 +647 -0
- package/dist/cli/setup.d.ts +4 -0
- package/dist/cli/setup.js +397 -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 +409 -0
- package/dist/cli/transfer.d.ts +10 -0
- package/dist/cli/transfer.js +424 -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.d.ts +0 -2
- package/dist/compaction-record.js +7 -5
- 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 +83 -72
- package/dist/dag.js +225 -188
- 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 +102 -83
- package/dist/dedupe.js +3 -2
- package/dist/delivery-recorder.js +4 -1
- package/dist/doctor.js +14 -10
- 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 +117 -86
- 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 +52 -43
- 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 +93 -74
- 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 +94 -76
- package/dist/project-briefs.d.ts +3 -0
- package/dist/project-briefs.js +142 -113
- package/dist/project-identity.js +3 -2
- package/dist/project-merge.d.ts +12 -4
- package/dist/project-merge.js +132 -45
- 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 +12 -1
- package/dist/shared.js +33 -27
- package/dist/skills.d.ts +3 -0
- package/dist/skills.js +88 -70
- 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 +260 -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
|
@@ -17,75 +17,17 @@
|
|
|
17
17
|
* enqueue-hook + E3.1 entity extraction will call. No operator surface (CLI/HTTP/SDK)
|
|
18
18
|
* until E3.2 multi-hop recall.
|
|
19
19
|
*/
|
|
20
|
-
import { openHippoDb, closeHippoDb } from '
|
|
21
|
-
import { assertTenantId } from '
|
|
22
|
-
import { log } from '
|
|
20
|
+
import { openHippoDb, closeHippoDb } from '../db.js';
|
|
21
|
+
import { assertTenantId } from '../tenant.js';
|
|
22
|
+
import { log } from '../log.js';
|
|
23
|
+
import { GRAPH_ENTITY_TYPES, GRAPH_RELATION_TYPES, MAX_ENTITY_NAME_LEN } from './types.js';
|
|
24
|
+
import { rowToEntity, rowToRelation, rowToQueueItem, ENTITY_COLS, RELATION_COLS, QUEUE_COLS } from './rows.js';
|
|
23
25
|
const SOURCE_OBJECT_TABLE = {
|
|
24
26
|
decision: 'decisions',
|
|
25
27
|
policy: 'policies',
|
|
26
28
|
customer: 'customer_notes',
|
|
27
29
|
project: 'project_briefs',
|
|
28
30
|
};
|
|
29
|
-
export const GRAPH_ENTITY_TYPES = new Set([
|
|
30
|
-
'person', 'project', 'customer', 'system', 'policy', 'decision',
|
|
31
|
-
]);
|
|
32
|
-
export const GRAPH_RELATION_TYPES = new Set([
|
|
33
|
-
'owns', 'supersedes', 'depends-on', 'blocked-by', 'references',
|
|
34
|
-
]);
|
|
35
|
-
export const VALID_QUEUE_STATES = new Set([
|
|
36
|
-
'pending', 'processed', 'skipped',
|
|
37
|
-
]);
|
|
38
|
-
export const MAX_ENTITY_NAME_LEN = 512;
|
|
39
|
-
function rowToEntity(row) {
|
|
40
|
-
// SAFETY: entity_type/source_kind/source_object_type are DB CHECK-constrained
|
|
41
|
-
// (see db.ts CREATE TABLE entities) to exactly the EntityType/SourceKind/
|
|
42
|
-
// SourceObjectType enum values, so the row's column values match those types.
|
|
43
|
-
return {
|
|
44
|
-
id: row.id,
|
|
45
|
-
tenantId: row.tenant_id,
|
|
46
|
-
entityType: row.entity_type,
|
|
47
|
-
name: row.name,
|
|
48
|
-
memoryId: row.memory_id,
|
|
49
|
-
sourceKind: row.source_kind,
|
|
50
|
-
sourceObjectType: row.source_object_type === null ? undefined : row.source_object_type,
|
|
51
|
-
sourceObjectId: row.source_object_id === null ? undefined : row.source_object_id,
|
|
52
|
-
createdAt: row.created_at,
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
function rowToRelation(row) {
|
|
56
|
-
// SAFETY: rel_type/source_kind/source_object_type are DB CHECK-constrained
|
|
57
|
-
// (see db.ts CREATE TABLE relations) to exactly the RelationType/SourceKind/
|
|
58
|
-
// SourceObjectType enum values, so the row's column values match those types.
|
|
59
|
-
return {
|
|
60
|
-
id: row.id,
|
|
61
|
-
tenantId: row.tenant_id,
|
|
62
|
-
fromEntityId: row.from_entity_id,
|
|
63
|
-
toEntityId: row.to_entity_id,
|
|
64
|
-
relType: row.rel_type,
|
|
65
|
-
memoryId: row.memory_id,
|
|
66
|
-
sourceKind: row.source_kind,
|
|
67
|
-
sourceObjectType: row.source_object_type === null ? undefined : row.source_object_type,
|
|
68
|
-
sourceObjectId: row.source_object_id === null ? undefined : row.source_object_id,
|
|
69
|
-
createdAt: row.created_at,
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
function rowToQueueItem(row) {
|
|
73
|
-
// SAFETY: kind/status are DB CHECK-constrained (see db.ts CREATE TABLE
|
|
74
|
-
// graph_extraction_queue) to exactly the SourceKind/GraphQueueStatus enum
|
|
75
|
-
// values, so the row's column values match those types.
|
|
76
|
-
return {
|
|
77
|
-
id: row.id,
|
|
78
|
-
tenantId: row.tenant_id,
|
|
79
|
-
memoryId: row.memory_id,
|
|
80
|
-
kind: row.kind,
|
|
81
|
-
status: row.status,
|
|
82
|
-
enqueuedAt: row.enqueued_at,
|
|
83
|
-
processedAt: row.processed_at,
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
const ENTITY_COLS = `id, tenant_id, entity_type, name, memory_id, source_kind, source_object_type, source_object_id, created_at`;
|
|
87
|
-
const RELATION_COLS = `id, tenant_id, from_entity_id, to_entity_id, rel_type, memory_id, source_kind, source_object_type, source_object_id, created_at`;
|
|
88
|
-
const QUEUE_COLS = `id, tenant_id, memory_id, kind, status, enqueued_at, processed_at`;
|
|
89
31
|
function resolveConsolidatedSource(db, tenantId, memoryId, sourceObject, label) {
|
|
90
32
|
let memKind = null;
|
|
91
33
|
let effectiveMemoryId = memoryId;
|
|
@@ -227,274 +169,6 @@ export function insertRelation(hippoRoot, tenantId, opts, txDb) {
|
|
|
227
169
|
closeHippoDb(ownDb);
|
|
228
170
|
}
|
|
229
171
|
}
|
|
230
|
-
export function loadEntityById(hippoRoot, tenantId, id) {
|
|
231
|
-
assertTenantId('loadEntityById', tenantId);
|
|
232
|
-
const db = openHippoDb(hippoRoot);
|
|
233
|
-
try {
|
|
234
|
-
// SAFETY: row's shape matches the columns named in ENTITY_COLS above.
|
|
235
|
-
const row = db.prepare(`SELECT ${ENTITY_COLS} FROM entities WHERE id = ? AND tenant_id = ?`)
|
|
236
|
-
.get(id, tenantId);
|
|
237
|
-
return row ? rowToEntity(row) : null;
|
|
238
|
-
}
|
|
239
|
-
finally {
|
|
240
|
-
closeHippoDb(db);
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
/** Entities with an exact `name` (read), bounded by `limit` in SQL with a
|
|
244
|
-
* deterministic order. Lets the graph-view focus query find the `--entity NAME`
|
|
245
|
-
* entity DIRECTLY (not from a globally-capped list) WITHOUT materializing every
|
|
246
|
-
* same-name row when a name maps to many entities. */
|
|
247
|
-
export function loadEntitiesByName(hippoRoot, tenantId, name, opts = {}, txDb) {
|
|
248
|
-
assertTenantId('loadEntitiesByName', tenantId);
|
|
249
|
-
const limit = opts.limit ?? 100;
|
|
250
|
-
if (!Number.isInteger(limit) || limit < 0) {
|
|
251
|
-
throw new Error(`loadEntitiesByName: limit must be a non-negative integer; got ${limit}`);
|
|
252
|
-
}
|
|
253
|
-
const ownDb = txDb ? null : openHippoDb(hippoRoot);
|
|
254
|
-
const db = txDb ?? ownDb;
|
|
255
|
-
try {
|
|
256
|
-
// SAFETY: rows' shape matches the columns named in ENTITY_COLS above.
|
|
257
|
-
const rows = db.prepare(`
|
|
258
|
-
SELECT ${ENTITY_COLS} FROM entities WHERE tenant_id = ? AND name = ?
|
|
259
|
-
ORDER BY id ASC LIMIT ?
|
|
260
|
-
`).all(tenantId, name, limit);
|
|
261
|
-
return rows.map(rowToEntity);
|
|
262
|
-
}
|
|
263
|
-
finally {
|
|
264
|
-
if (ownDb)
|
|
265
|
-
closeHippoDb(ownDb);
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
export function loadEntities(hippoRoot, tenantId, opts = {}, txDb) {
|
|
269
|
-
assertTenantId('loadEntities', tenantId);
|
|
270
|
-
const limit = opts.limit ?? 100;
|
|
271
|
-
if (opts.entityType && !GRAPH_ENTITY_TYPES.has(opts.entityType)) {
|
|
272
|
-
throw new Error(`loadEntities: entityType must be one of ${Array.from(GRAPH_ENTITY_TYPES).join('|')}; got ${opts.entityType}`);
|
|
273
|
-
}
|
|
274
|
-
const ownDb = txDb ? null : openHippoDb(hippoRoot);
|
|
275
|
-
const db = txDb ?? ownDb;
|
|
276
|
-
try {
|
|
277
|
-
const clauses = ['tenant_id = ?'];
|
|
278
|
-
const params = [tenantId];
|
|
279
|
-
if (opts.entityType) {
|
|
280
|
-
clauses.push('entity_type = ?');
|
|
281
|
-
params.push(opts.entityType);
|
|
282
|
-
}
|
|
283
|
-
params.push(limit);
|
|
284
|
-
// SAFETY: rows' shape matches the columns named in ENTITY_COLS above.
|
|
285
|
-
const rows = db.prepare(`
|
|
286
|
-
SELECT ${ENTITY_COLS} FROM entities
|
|
287
|
-
WHERE ${clauses.join(' AND ')}
|
|
288
|
-
ORDER BY created_at DESC, id DESC
|
|
289
|
-
LIMIT ?
|
|
290
|
-
`).all(...params);
|
|
291
|
-
return rows.map(rowToEntity);
|
|
292
|
-
}
|
|
293
|
-
finally {
|
|
294
|
-
if (ownDb)
|
|
295
|
-
closeHippoDb(ownDb);
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
export function loadRelations(hippoRoot, tenantId, opts = {}, txDb) {
|
|
299
|
-
assertTenantId('loadRelations', tenantId);
|
|
300
|
-
const limit = opts.limit ?? 100;
|
|
301
|
-
const ownDb = txDb ? null : openHippoDb(hippoRoot);
|
|
302
|
-
const db = txDb ?? ownDb;
|
|
303
|
-
try {
|
|
304
|
-
const clauses = ['tenant_id = ?'];
|
|
305
|
-
const params = [tenantId];
|
|
306
|
-
if (opts.fromEntityId !== undefined) {
|
|
307
|
-
clauses.push('from_entity_id = ?');
|
|
308
|
-
params.push(opts.fromEntityId);
|
|
309
|
-
}
|
|
310
|
-
params.push(limit);
|
|
311
|
-
// SAFETY: rows' shape matches the columns named in RELATION_COLS above.
|
|
312
|
-
const rows = db.prepare(`
|
|
313
|
-
SELECT ${RELATION_COLS} FROM relations
|
|
314
|
-
WHERE ${clauses.join(' AND ')}
|
|
315
|
-
ORDER BY created_at DESC, id DESC
|
|
316
|
-
LIMIT ?
|
|
317
|
-
`).all(...params);
|
|
318
|
-
return rows.map(rowToRelation);
|
|
319
|
-
}
|
|
320
|
-
finally {
|
|
321
|
-
if (ownDb)
|
|
322
|
-
closeHippoDb(ownDb);
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
// ---------------------------------------------------------------------------
|
|
326
|
-
// E3.2 multi-hop recall read helpers (SELECT-only; the check-graph-writes lint
|
|
327
|
-
// permits these here and in the read-only consumer src/graph-recall.ts).
|
|
328
|
-
// ---------------------------------------------------------------------------
|
|
329
|
-
/** Chunk size for IN-list queries: well under SQLite's 999-bound-variable default
|
|
330
|
-
* (leaves headroom for the tenant_id param + the doubled list in neighbour lookups). */
|
|
331
|
-
const IN_LIST_CHUNK = 400;
|
|
332
|
-
/**
|
|
333
|
-
* Map consolidated source memory ids -> their graph entities. The SEED step of E3.2
|
|
334
|
-
* multi-hop recall (recall result memory ids -> entities to traverse from). Tenant-
|
|
335
|
-
* scoped, read-only; chunks the IN-list under the SQLite variable cap.
|
|
336
|
-
*/
|
|
337
|
-
export function loadEntitiesByMemoryId(hippoRoot, tenantId, memoryIds) {
|
|
338
|
-
assertTenantId('loadEntitiesByMemoryId', tenantId);
|
|
339
|
-
if (memoryIds.length === 0)
|
|
340
|
-
return [];
|
|
341
|
-
const db = openHippoDb(hippoRoot);
|
|
342
|
-
try {
|
|
343
|
-
const out = [];
|
|
344
|
-
for (let i = 0; i < memoryIds.length; i += IN_LIST_CHUNK) {
|
|
345
|
-
const slice = memoryIds.slice(i, i + IN_LIST_CHUNK);
|
|
346
|
-
const ph = slice.map(() => '?').join(',');
|
|
347
|
-
// T2: no ORDER BY meant chunk-local scan order decided ties; id ASC
|
|
348
|
-
// makes it deterministic (entities.id is an autoincrement integer PK).
|
|
349
|
-
// SAFETY: rows' shape matches the columns named in ENTITY_COLS above.
|
|
350
|
-
const rows = db.prepare(`
|
|
351
|
-
SELECT ${ENTITY_COLS} FROM entities
|
|
352
|
-
WHERE tenant_id = ? AND memory_id IN (${ph})
|
|
353
|
-
ORDER BY id ASC
|
|
354
|
-
`).all(tenantId, ...slice);
|
|
355
|
-
out.push(...rows.map(rowToEntity));
|
|
356
|
-
}
|
|
357
|
-
return out;
|
|
358
|
-
}
|
|
359
|
-
finally {
|
|
360
|
-
closeHippoDb(db);
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
/**
|
|
364
|
-
* Load entities by their primary ids. Resolves the entity rows reached during the BFS
|
|
365
|
-
* (whose `memory_id` maps back to a recall result). Tenant-scoped, read-only.
|
|
366
|
-
*/
|
|
367
|
-
export function loadEntitiesByIds(hippoRoot, tenantId, ids, txDb) {
|
|
368
|
-
assertTenantId('loadEntitiesByIds', tenantId);
|
|
369
|
-
if (ids.length === 0)
|
|
370
|
-
return [];
|
|
371
|
-
const ownDb = txDb ? null : openHippoDb(hippoRoot);
|
|
372
|
-
const db = txDb ?? ownDb;
|
|
373
|
-
try {
|
|
374
|
-
const out = [];
|
|
375
|
-
for (let i = 0; i < ids.length; i += IN_LIST_CHUNK) {
|
|
376
|
-
const slice = ids.slice(i, i + IN_LIST_CHUNK);
|
|
377
|
-
const ph = slice.map(() => '?').join(',');
|
|
378
|
-
// SAFETY: rows' shape matches the columns named in ENTITY_COLS above.
|
|
379
|
-
const rows = db.prepare(`
|
|
380
|
-
SELECT ${ENTITY_COLS} FROM entities
|
|
381
|
-
WHERE tenant_id = ? AND id IN (${ph})
|
|
382
|
-
`).all(tenantId, ...slice);
|
|
383
|
-
out.push(...rows.map(rowToEntity));
|
|
384
|
-
}
|
|
385
|
-
return out;
|
|
386
|
-
}
|
|
387
|
-
finally {
|
|
388
|
-
if (ownDb)
|
|
389
|
-
closeHippoDb(ownDb);
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
/**
|
|
393
|
-
* All relations touching ANY of `entityIds` in EITHER direction (from OR to) — the
|
|
394
|
-
* per-hop neighbour query for E3.2 multi-hop traversal. ONE query for the whole frontier
|
|
395
|
-
* (not one per node): this is the bidirectional read `loadRelations` (from-only) lacks,
|
|
396
|
-
* and avoids an N+1 across BFS frontier nodes. `limit` caps rows for the frontier and
|
|
397
|
-
* must be a non-negative integer (the raw `LIMIT ?` rejects a fractional value).
|
|
398
|
-
*/
|
|
399
|
-
export function loadNeighborRelations(hippoRoot, tenantId, entityIds, opts = {}, txDb) {
|
|
400
|
-
assertTenantId('loadNeighborRelations', tenantId);
|
|
401
|
-
if (entityIds.length === 0)
|
|
402
|
-
return [];
|
|
403
|
-
const limit = opts.limit ?? 1000;
|
|
404
|
-
if (!Number.isInteger(limit) || limit < 0) {
|
|
405
|
-
throw new Error(`loadNeighborRelations: limit must be a non-negative integer; got ${limit}`);
|
|
406
|
-
}
|
|
407
|
-
const ownDb = txDb ? null : openHippoDb(hippoRoot);
|
|
408
|
-
const db = txDb ?? ownDb;
|
|
409
|
-
try {
|
|
410
|
-
// `limit` is applied PER CHUNK; a frontier spanning >IN_LIST_CHUNK ids could return
|
|
411
|
-
// up to limit*chunks rows before the by-id dedup below. Harmless for E3.2 (the
|
|
412
|
-
// frontier is bounded by maxNeighbors <= 200 << IN_LIST_CHUNK, so a single chunk,
|
|
413
|
-
// and the BFS re-enforces the per-hop fanout cap), but note the semantics if a
|
|
414
|
-
// tighter total cap is ever needed.
|
|
415
|
-
const byId = new Map();
|
|
416
|
-
for (let i = 0; i < entityIds.length; i += IN_LIST_CHUNK) {
|
|
417
|
-
const slice = entityIds.slice(i, i + IN_LIST_CHUNK);
|
|
418
|
-
const ph = slice.map(() => '?').join(',');
|
|
419
|
-
// SAFETY: rows' shape matches the columns named in RELATION_COLS above.
|
|
420
|
-
const rows = db.prepare(`
|
|
421
|
-
SELECT ${RELATION_COLS} FROM relations
|
|
422
|
-
WHERE tenant_id = ? AND (from_entity_id IN (${ph}) OR to_entity_id IN (${ph}))
|
|
423
|
-
ORDER BY created_at DESC, id DESC
|
|
424
|
-
LIMIT ?
|
|
425
|
-
`).all(tenantId, ...slice, ...slice, limit);
|
|
426
|
-
for (const r of rows)
|
|
427
|
-
byId.set(r.id, rowToRelation(r));
|
|
428
|
-
}
|
|
429
|
-
return Array.from(byId.values());
|
|
430
|
-
}
|
|
431
|
-
finally {
|
|
432
|
-
if (ownDb)
|
|
433
|
-
closeHippoDb(ownDb);
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
/**
|
|
437
|
-
* Relations with BOTH endpoints in `entityIds` (edges AMONG the set, not merely
|
|
438
|
-
* touching it). Read. Used by the graph-view focus subgraph so the displayed
|
|
439
|
-
* edges are exactly the intra-union edges: the `LIMIT` only caps genuinely-many
|
|
440
|
-
* intra-union edges — no out-of-union row can evict a valid in-set edge. The
|
|
441
|
-
* caller bounds `entityIds` (<= the view limit), so a single query is safe.
|
|
442
|
-
*/
|
|
443
|
-
export function loadRelationsAmong(hippoRoot, tenantId, entityIds, opts = {}, txDb) {
|
|
444
|
-
assertTenantId('loadRelationsAmong', tenantId);
|
|
445
|
-
if (entityIds.length === 0)
|
|
446
|
-
return [];
|
|
447
|
-
const limit = opts.limit ?? 1000;
|
|
448
|
-
if (!Number.isInteger(limit) || limit < 0) {
|
|
449
|
-
throw new Error(`loadRelationsAmong: limit must be a non-negative integer; got ${limit}`);
|
|
450
|
-
}
|
|
451
|
-
const ownDb = txDb ? null : openHippoDb(hippoRoot);
|
|
452
|
-
const db = txDb ?? ownDb;
|
|
453
|
-
try {
|
|
454
|
-
const ph = entityIds.map(() => '?').join(',');
|
|
455
|
-
// SAFETY: rows' shape matches the columns named in RELATION_COLS above.
|
|
456
|
-
const rows = db.prepare(`
|
|
457
|
-
SELECT ${RELATION_COLS} FROM relations
|
|
458
|
-
WHERE tenant_id = ? AND from_entity_id IN (${ph}) AND to_entity_id IN (${ph})
|
|
459
|
-
ORDER BY created_at DESC, id DESC
|
|
460
|
-
LIMIT ?
|
|
461
|
-
`).all(tenantId, ...entityIds, ...entityIds, limit);
|
|
462
|
-
return rows.map(rowToRelation);
|
|
463
|
-
}
|
|
464
|
-
finally {
|
|
465
|
-
if (ownDb)
|
|
466
|
-
closeHippoDb(ownDb);
|
|
467
|
-
}
|
|
468
|
-
}
|
|
469
|
-
/**
|
|
470
|
-
* Run `fn` inside ONE read transaction (a single WAL snapshot) so every graph read
|
|
471
|
-
* it performs — pass the supplied `txDb` to the `load*` functions — sees a consistent
|
|
472
|
-
* view, even if a `graph extract` / sleep-drain rebuild commits concurrently between
|
|
473
|
-
* reads (the rebuild clears + reinserts entities, so separate reads could otherwise
|
|
474
|
-
* mix old entity ids with new relation ids). Reads only; the connection is opened
|
|
475
|
-
* once and closed after.
|
|
476
|
-
*/
|
|
477
|
-
export function withGraphReadSnapshot(hippoRoot, fn) {
|
|
478
|
-
const db = openHippoDb(hippoRoot);
|
|
479
|
-
try {
|
|
480
|
-
db.exec('BEGIN');
|
|
481
|
-
try {
|
|
482
|
-
const out = fn(db);
|
|
483
|
-
db.exec('COMMIT');
|
|
484
|
-
return out;
|
|
485
|
-
}
|
|
486
|
-
catch (e) {
|
|
487
|
-
try {
|
|
488
|
-
db.exec('ROLLBACK');
|
|
489
|
-
}
|
|
490
|
-
catch { /* ignore */ }
|
|
491
|
-
throw e;
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
finally {
|
|
495
|
-
closeHippoDb(db);
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
172
|
// ---------------------------------------------------------------------------
|
|
499
173
|
// Extraction queue (the interface the deferred sleep enqueue-hook + E3.1 will use)
|
|
500
174
|
// ---------------------------------------------------------------------------
|
|
@@ -526,34 +200,6 @@ export function enqueueExtraction(hippoRoot, tenantId, memoryId) {
|
|
|
526
200
|
closeHippoDb(db);
|
|
527
201
|
}
|
|
528
202
|
}
|
|
529
|
-
export function loadExtractionQueue(hippoRoot, tenantId, opts = {}) {
|
|
530
|
-
assertTenantId('loadExtractionQueue', tenantId);
|
|
531
|
-
const limit = opts.limit ?? 100;
|
|
532
|
-
if (opts.status && !VALID_QUEUE_STATES.has(opts.status)) {
|
|
533
|
-
throw new Error(`loadExtractionQueue: status must be one of ${Array.from(VALID_QUEUE_STATES).join('|')}; got ${opts.status}`);
|
|
534
|
-
}
|
|
535
|
-
const db = openHippoDb(hippoRoot);
|
|
536
|
-
try {
|
|
537
|
-
const clauses = ['tenant_id = ?'];
|
|
538
|
-
const params = [tenantId];
|
|
539
|
-
if (opts.status) {
|
|
540
|
-
clauses.push('status = ?');
|
|
541
|
-
params.push(opts.status);
|
|
542
|
-
}
|
|
543
|
-
params.push(limit);
|
|
544
|
-
// SAFETY: rows' shape matches the columns named in QUEUE_COLS above.
|
|
545
|
-
const rows = db.prepare(`
|
|
546
|
-
SELECT ${QUEUE_COLS} FROM graph_extraction_queue
|
|
547
|
-
WHERE ${clauses.join(' AND ')}
|
|
548
|
-
ORDER BY enqueued_at ASC, id ASC
|
|
549
|
-
LIMIT ?
|
|
550
|
-
`).all(...params);
|
|
551
|
-
return rows.map(rowToQueueItem);
|
|
552
|
-
}
|
|
553
|
-
finally {
|
|
554
|
-
closeHippoDb(db);
|
|
555
|
-
}
|
|
556
|
-
}
|
|
557
203
|
/**
|
|
558
204
|
* Mark a queue item terminal (processed | skipped). Only `status`/`processed_at`
|
|
559
205
|
* change, so the consolidated-source guard trigger (which fires on
|
|
@@ -708,30 +354,6 @@ export function removeGraphEntitiesForObject(hippoRoot, tenantId, sourceObjectTy
|
|
|
708
354
|
log.warn(`removeGraphEntitiesForObject: failed for tenant=${tenantId} ${sourceObjectType}#${sourceObjectId}: ${err instanceof Error ? err.message : String(err)}`);
|
|
709
355
|
}
|
|
710
356
|
}
|
|
711
|
-
/**
|
|
712
|
-
* The dirty tenants awaiting graph re-extraction, each with the MAX pending
|
|
713
|
-
* queue id at read time (a watermark). The sleep drain rebuilds each tenant's
|
|
714
|
-
* graph, then marks only items at or below the watermark processed, so items
|
|
715
|
-
* enqueued DURING the rebuild stay pending for the next sleep (no lost-update
|
|
716
|
-
* race). Host-wide read (the queue is per-tenant but sleep is cross-tenant).
|
|
717
|
-
*/
|
|
718
|
-
export function loadPendingExtractionTenants(hippoRoot) {
|
|
719
|
-
const db = openHippoDb(hippoRoot);
|
|
720
|
-
try {
|
|
721
|
-
// SAFETY: rows' shape matches the two aliased columns (tenant_id, max_id)
|
|
722
|
-
// named in the SELECT above.
|
|
723
|
-
const rows = db.prepare(`
|
|
724
|
-
SELECT tenant_id AS tenant_id, MAX(id) AS max_id
|
|
725
|
-
FROM graph_extraction_queue
|
|
726
|
-
WHERE status = 'pending'
|
|
727
|
-
GROUP BY tenant_id
|
|
728
|
-
`).all();
|
|
729
|
-
return rows.map((r) => ({ tenantId: r.tenant_id, maxPendingId: Number(r.max_id) }));
|
|
730
|
-
}
|
|
731
|
-
finally {
|
|
732
|
-
closeHippoDb(db);
|
|
733
|
-
}
|
|
734
|
-
}
|
|
735
357
|
/**
|
|
736
358
|
* Mark every pending queue item for a tenant with `id <= maxId` processed, in
|
|
737
359
|
* one UPDATE. Status/processed_at only, so the consolidated-source guard trigger
|
|
@@ -754,4 +376,4 @@ export function markPendingProcessedUpTo(hippoRoot, tenantId, maxId) {
|
|
|
754
376
|
closeHippoDb(db);
|
|
755
377
|
}
|
|
756
378
|
}
|
|
757
|
-
//# sourceMappingURL=
|
|
379
|
+
//# sourceMappingURL=write.js.map
|
package/dist/graph-extract.js
CHANGED
|
@@ -20,7 +20,8 @@
|
|
|
20
20
|
* skill/incident/process entities (not in the entity_type enum - needs a migration); the
|
|
21
21
|
* `hippo sleep` enqueue-hook.
|
|
22
22
|
*/
|
|
23
|
-
import { clearGraph, insertEntity, insertRelation, runGraphRebuildTransaction
|
|
23
|
+
import { clearGraph, insertEntity, insertRelation, runGraphRebuildTransaction } from './graph/write.js';
|
|
24
|
+
import { MAX_ENTITY_NAME_LEN } from './graph/types.js';
|
|
24
25
|
import { loadDecisions } from './decisions.js';
|
|
25
26
|
import { loadPolicies } from './policies.js';
|
|
26
27
|
import { loadCustomerNotes } from './customer-notes.js';
|
package/dist/graph-recall.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ResultCost, SearchResult } from './search.js';
|
|
1
|
+
import type { ResultCost, SearchResult } from './search/types.js';
|
|
2
2
|
/** Hard cap on `--hops` (a higher value just walks more of a finite graph; this bounds
|
|
3
3
|
* worst-case work and keeps the flag honest). */
|
|
4
4
|
export declare const MAX_HOPS = 3;
|
package/dist/graph-recall.js
CHANGED
|
@@ -36,10 +36,10 @@
|
|
|
36
36
|
* No graph writes (only SELECTs via graph.ts read helpers + store reads), so the E3.3
|
|
37
37
|
* check-graph-writes lint permits this module living outside graph.ts.
|
|
38
38
|
*/
|
|
39
|
-
import { loadEntriesByIds } from './store.js';
|
|
39
|
+
import { loadEntriesByIds } from './store/entry-reads.js';
|
|
40
40
|
import { estimateTokens } from './token-ledger.js';
|
|
41
41
|
import { compareEntryIdentity } from './compare.js';
|
|
42
|
-
import { loadEntitiesByMemoryId, loadEntitiesByIds, loadNeighborRelations
|
|
42
|
+
import { loadEntitiesByMemoryId, loadEntitiesByIds, loadNeighborRelations } from './graph/read.js';
|
|
43
43
|
import { passesCliRecallScopeFilter, passesScopeFilterForRecall } from './recall-scope.js';
|
|
44
44
|
/** Hard cap on `--hops` (a higher value just walks more of a finite graph; this bounds
|
|
45
45
|
* worst-case work and keeps the flag honest). */
|
package/dist/graph-stream.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { loadEntitiesByMemoryId, loadEntitiesByIds, loadNeighborRelations
|
|
1
|
+
import { loadEntitiesByMemoryId, loadEntitiesByIds, loadNeighborRelations } from './graph/read.js';
|
|
2
2
|
import { MAX_HOPS, DEFAULT_MAX_NEIGHBORS } from './graph-recall.js';
|
|
3
3
|
/** Default hops expanded from each seed (MVP; hard cap MAX_HOPS=3 reused from graph-recall). */
|
|
4
4
|
export const DEFAULT_GRAPH_HOPS = 2;
|
package/dist/graph-view.d.ts
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* stays green. Used by the CLI (`hippo graph show` / `hippo graph view`) and the
|
|
8
8
|
* HTTP `GET /v1/graph` route, which all build the same `GraphModel`.
|
|
9
9
|
*/
|
|
10
|
-
import { type EntityType, type RelationType } from './graph.js';
|
|
10
|
+
import { type EntityType, type RelationType } from './graph/types.js';
|
|
11
11
|
export interface GraphNode {
|
|
12
12
|
id: number;
|
|
13
13
|
type: EntityType;
|
package/dist/graph-view.js
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* stays green. Used by the CLI (`hippo graph show` / `hippo graph view`) and the
|
|
8
8
|
* HTTP `GET /v1/graph` route, which all build the same `GraphModel`.
|
|
9
9
|
*/
|
|
10
|
-
import { loadEntities, loadEntitiesByName, loadEntitiesByIds, loadRelations, loadNeighborRelations, loadRelationsAmong, withGraphReadSnapshot, } from './graph.js';
|
|
10
|
+
import { loadEntities, loadEntitiesByName, loadEntitiesByIds, loadRelations, loadNeighborRelations, loadRelationsAmong, withGraphReadSnapshot, } from './graph/read.js';
|
|
11
11
|
/** Default bound for the CLI viewer / show so an unbounded set is never laid out. */
|
|
12
12
|
export const DEFAULT_VIEW_LIMIT = 500;
|
|
13
13
|
/**
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
* moves memories of live decisions, incidents and other objects off the flat 90 days they used to get.
|
|
22
22
|
*/
|
|
23
23
|
import { type MemoryEntry } from './memory.js';
|
|
24
|
-
import { HALF_LIFE_BASE_META_KEY } from './store.js';
|
|
24
|
+
import { HALF_LIFE_BASE_META_KEY } from './store/open.js';
|
|
25
25
|
/** The base every store used before the base was recorded. */
|
|
26
26
|
export declare const LEGACY_HALF_LIFE_BASE = 7;
|
|
27
27
|
/** The flat half-life the decision, incident and other object writers gave their memories before they took the default. */
|
|
@@ -21,7 +21,8 @@
|
|
|
21
21
|
* moves memories of live decisions, incidents and other objects off the flat 90 days they used to get.
|
|
22
22
|
*/
|
|
23
23
|
import { deriveHalfLife } from './memory.js';
|
|
24
|
-
import { openStore,
|
|
24
|
+
import { openStore, HALF_LIFE_BASE_META_KEY, TYPED_HALF_LIFE_META_KEY } from './store/open.js';
|
|
25
|
+
import { selectAllEntries } from './store/entry-reads.js';
|
|
25
26
|
import { openHippoDb, closeHippoDb, getMeta, setMeta } from './db.js';
|
|
26
27
|
import { appendAuditEvent } from './audit.js';
|
|
27
28
|
import { loadConfig } from './config.js';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface CodexSessionTranscriptOptions {
|
|
2
|
+
codexHome: string;
|
|
3
|
+
historyPath: string;
|
|
4
|
+
startOffsetBytes: number;
|
|
5
|
+
startedAtMs: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function resolveCodexSessionTranscript(options: CodexSessionTranscriptOptions): string | null;
|
|
8
|
+
//# sourceMappingURL=codex-session.d.ts.map
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { isJsonString } from './shared.js';
|
|
4
|
+
function collectFiles(dir) {
|
|
5
|
+
if (!fs.existsSync(dir))
|
|
6
|
+
return [];
|
|
7
|
+
const out = [];
|
|
8
|
+
const stack = [dir];
|
|
9
|
+
while (stack.length > 0) {
|
|
10
|
+
const current = stack.pop();
|
|
11
|
+
if (current === undefined)
|
|
12
|
+
break;
|
|
13
|
+
for (const entry of fs.readdirSync(current, { withFileTypes: true })) {
|
|
14
|
+
const full = path.join(current, entry.name);
|
|
15
|
+
if (entry.isDirectory()) {
|
|
16
|
+
stack.push(full);
|
|
17
|
+
}
|
|
18
|
+
else if (entry.isFile()) {
|
|
19
|
+
out.push(full);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return out;
|
|
24
|
+
}
|
|
25
|
+
function readCodexSessionIdsFromHistoryDelta(historyPath, startOffsetBytes) {
|
|
26
|
+
if (!fs.existsSync(historyPath))
|
|
27
|
+
return [];
|
|
28
|
+
const raw = fs.readFileSync(historyPath);
|
|
29
|
+
if (startOffsetBytes >= raw.length)
|
|
30
|
+
return [];
|
|
31
|
+
const delta = raw.subarray(startOffsetBytes).toString('utf8');
|
|
32
|
+
const seen = new Set();
|
|
33
|
+
const ordered = [];
|
|
34
|
+
for (const line of delta.split('\n')) {
|
|
35
|
+
if (!line.trim())
|
|
36
|
+
continue;
|
|
37
|
+
try {
|
|
38
|
+
const parsed = JSON.parse(line);
|
|
39
|
+
const sessionId = parsed.session_id;
|
|
40
|
+
if (isJsonString(sessionId) && sessionId && !seen.has(sessionId)) {
|
|
41
|
+
seen.add(sessionId);
|
|
42
|
+
ordered.push(sessionId);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// ignore malformed JSONL lines
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return ordered;
|
|
50
|
+
}
|
|
51
|
+
function findCodexTranscriptBySessionId(sessionsDir, sessionId) {
|
|
52
|
+
const matches = collectFiles(sessionsDir).filter((filePath) => filePath.endsWith('.jsonl') && filePath.includes(sessionId));
|
|
53
|
+
if (matches.length === 0)
|
|
54
|
+
return null;
|
|
55
|
+
matches.sort((a, b) => fs.statSync(b).mtimeMs - fs.statSync(a).mtimeMs);
|
|
56
|
+
return matches[0];
|
|
57
|
+
}
|
|
58
|
+
function findNewestCodexTranscriptSince(sessionsDir, startedAtMs) {
|
|
59
|
+
const matches = collectFiles(sessionsDir)
|
|
60
|
+
.filter((filePath) => filePath.endsWith('.jsonl'))
|
|
61
|
+
.map((filePath) => ({ filePath, mtimeMs: fs.statSync(filePath).mtimeMs }))
|
|
62
|
+
.filter((entry) => entry.mtimeMs >= startedAtMs)
|
|
63
|
+
.sort((a, b) => b.mtimeMs - a.mtimeMs);
|
|
64
|
+
return matches[0]?.filePath ?? null;
|
|
65
|
+
}
|
|
66
|
+
export function resolveCodexSessionTranscript(options) {
|
|
67
|
+
const { codexHome, historyPath, startOffsetBytes, startedAtMs } = options;
|
|
68
|
+
const sessionsDir = path.join(codexHome, 'sessions');
|
|
69
|
+
for (const sessionId of readCodexSessionIdsFromHistoryDelta(historyPath, startOffsetBytes).reverse()) {
|
|
70
|
+
const transcript = findCodexTranscriptBySessionId(sessionsDir, sessionId);
|
|
71
|
+
if (transcript)
|
|
72
|
+
return transcript;
|
|
73
|
+
}
|
|
74
|
+
return findNewestCodexTranscriptSince(sessionsDir, startedAtMs);
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=codex-session.js.map
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export interface CodexWrapperPaths {
|
|
2
|
+
wrapperDir: string;
|
|
3
|
+
metadataPath: string;
|
|
4
|
+
wrapperCmdPath: string;
|
|
5
|
+
wrapperPs1Path: string;
|
|
6
|
+
wrapperShPath: string;
|
|
7
|
+
logFile: string;
|
|
8
|
+
runsDir: string;
|
|
9
|
+
codexHome: string;
|
|
10
|
+
historyPath: string;
|
|
11
|
+
}
|
|
12
|
+
export interface CodexWrapperInstallResult {
|
|
13
|
+
installed: boolean;
|
|
14
|
+
metadataPath: string;
|
|
15
|
+
realCodexPath: string;
|
|
16
|
+
commandPath: string;
|
|
17
|
+
backupPath: string;
|
|
18
|
+
installMode: 'same-path' | 'cmd-shim';
|
|
19
|
+
}
|
|
20
|
+
export interface CodexWrapperMetadata {
|
|
21
|
+
originalCodexPath: string;
|
|
22
|
+
realCodexPath: string;
|
|
23
|
+
commandPath: string;
|
|
24
|
+
backupPath: string;
|
|
25
|
+
installMode: 'same-path' | 'cmd-shim';
|
|
26
|
+
logFile: string;
|
|
27
|
+
installedAt: string;
|
|
28
|
+
}
|
|
29
|
+
export interface EnsureCodexWrapperResult {
|
|
30
|
+
status: 'installed' | 'already-installed' | 'not-found' | 'source-checkout';
|
|
31
|
+
metadataPath?: string;
|
|
32
|
+
realCodexPath?: string;
|
|
33
|
+
commandPath?: string;
|
|
34
|
+
backupPath?: string;
|
|
35
|
+
}
|
|
36
|
+
export declare function resolveCodexWrapperPaths(): CodexWrapperPaths;
|
|
37
|
+
export declare function detectRealCodexPath(): string | null;
|
|
38
|
+
export declare function installCodexWrapper(realCodexPath?: string): CodexWrapperInstallResult;
|
|
39
|
+
export declare function uninstallCodexWrapper(): boolean;
|
|
40
|
+
export declare function ensureCodexWrapperInstalled(): EnsureCodexWrapperResult;
|
|
41
|
+
/**
|
|
42
|
+
* True if Codex wrapper metadata exists on this machine, i.e. the user opted
|
|
43
|
+
* in to the wrapper at some point (via `hippo hook install codex`).
|
|
44
|
+
*/
|
|
45
|
+
export declare function isCodexWrapperInstalled(): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Repair-only variant of `ensureCodexWrapperInstalled`: re-ensures the wrapper
|
|
48
|
+
* ONLY when wrapper metadata already exists — that metadata is the user's
|
|
49
|
+
* opt-in record. Never performs a first install. Replacing another vendor's
|
|
50
|
+
* binary must stay behind the explicit `hippo hook install codex` command;
|
|
51
|
+
* doing it from postinstall or routine commands is a consent violation and
|
|
52
|
+
* reads as binary hijacking to security scanners (issue #133).
|
|
53
|
+
*/
|
|
54
|
+
export declare function repairCodexWrapperIfInstalled(hippoCliPath?: string): EnsureCodexWrapperResult;
|
|
55
|
+
//# sourceMappingURL=codex-wrapper.d.ts.map
|