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
package/dist/incidents.js
CHANGED
|
@@ -27,11 +27,12 @@
|
|
|
27
27
|
*/
|
|
28
28
|
import { BadRequestError, ConflictError, NotFoundError } from './api-errors.js';
|
|
29
29
|
import { openHippoDb, closeHippoDb } from './db.js';
|
|
30
|
-
import { writeEntry } from './store.js';
|
|
30
|
+
import { writeEntry } from './store/entry-writes.js';
|
|
31
31
|
import { assertTenantId } from './tenant.js';
|
|
32
32
|
import { createMemory, Layer } from './memory.js';
|
|
33
33
|
import { appendAuditEvent } from './audit.js';
|
|
34
34
|
import { objectHalfLifeDays } from './half-life-migration.js';
|
|
35
|
+
import { keysetAfter } from './keyset.js';
|
|
35
36
|
export const VALID_INCIDENT_STATES = new Set([
|
|
36
37
|
'open',
|
|
37
38
|
'resolved',
|
|
@@ -76,6 +77,50 @@ const INCIDENT_COLS = `
|
|
|
76
77
|
// ---------------------------------------------------------------------------
|
|
77
78
|
// Public API
|
|
78
79
|
// ---------------------------------------------------------------------------
|
|
80
|
+
// Validate every linked receipt BEFORE inserting the row. Each must be a
|
|
81
|
+
// memory in the SAME tenant; a cross-tenant or nonexistent id rejects the
|
|
82
|
+
// whole write rather than recording an unverifiable receipt.
|
|
83
|
+
function validateLinkedMemoryIds(db, tenantId, linkInput) {
|
|
84
|
+
const validated = [];
|
|
85
|
+
for (const linkId of linkInput) {
|
|
86
|
+
// SAFETY: row shape matches the single `id` column named in the SELECT above.
|
|
87
|
+
const exists = db.prepare(`SELECT id FROM memories WHERE id = ? AND tenant_id = ?`).get(linkId, tenantId);
|
|
88
|
+
if (!exists) {
|
|
89
|
+
throw new NotFoundError(`saveIncident: linked memory ${linkId} not found for tenant ${tenantId}`);
|
|
90
|
+
}
|
|
91
|
+
validated.push(linkId);
|
|
92
|
+
}
|
|
93
|
+
return validated;
|
|
94
|
+
}
|
|
95
|
+
/** The afterWrite body: link validation, INSERT, reload, open audit, all in one SAVEPOINT. */
|
|
96
|
+
function writeIncidentRow(db, memoryId, tenantId, opts, actor, now) {
|
|
97
|
+
const validated = validateLinkedMemoryIds(db, tenantId, opts.linkedMemoryIds ?? []);
|
|
98
|
+
const result = db.prepare(`
|
|
99
|
+
INSERT INTO incidents(
|
|
100
|
+
memory_id, tenant_id, incident_text, context,
|
|
101
|
+
status, resolution_text, resolved_at, closed_at, linked_memory_ids, created_at
|
|
102
|
+
) VALUES (?, ?, ?, ?, 'open', NULL, NULL, NULL, ?, ?)
|
|
103
|
+
`).run(memoryId, tenantId, opts.incidentText, opts.context ?? null, JSON.stringify(validated), now);
|
|
104
|
+
const incidentId = Number(result.lastInsertRowid ?? 0);
|
|
105
|
+
// SAFETY: row's shape matches the columns named in INCIDENT_COLS above.
|
|
106
|
+
const row = db.prepare(`SELECT ${INCIDENT_COLS} FROM incidents WHERE id = ?`)
|
|
107
|
+
.get(incidentId);
|
|
108
|
+
if (!row)
|
|
109
|
+
throw new Error('saveIncident: failed to reload saved incident row');
|
|
110
|
+
// GDPR-light metadata: id + flag only, no incident_text.
|
|
111
|
+
appendAuditEvent(db, {
|
|
112
|
+
tenantId,
|
|
113
|
+
actor,
|
|
114
|
+
op: 'incident_open',
|
|
115
|
+
targetId: String(incidentId),
|
|
116
|
+
metadata: {
|
|
117
|
+
incident_id: incidentId,
|
|
118
|
+
has_context: opts.context !== undefined && opts.context !== null && opts.context !== '',
|
|
119
|
+
linked_memory_count: validated.length,
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
return row;
|
|
123
|
+
}
|
|
79
124
|
/**
|
|
80
125
|
* Create an incident. Writes the memory mirror + the incidents row atomically
|
|
81
126
|
* inside writeEntry's SAVEPOINT 'write_entry'.
|
|
@@ -105,50 +150,13 @@ export function saveIncident(hippoRoot, tenantId, opts, actor = 'cli') {
|
|
|
105
150
|
baseHalfLifeDays: objectHalfLifeDays(hippoRoot),
|
|
106
151
|
tenantId,
|
|
107
152
|
});
|
|
108
|
-
const linkInput = opts.linkedMemoryIds ?? [];
|
|
109
153
|
// Populated inside afterWrite so the linked-id validation, the INSERT, and the
|
|
110
154
|
// memory write all share one SAVEPOINT.
|
|
111
155
|
let savedRow;
|
|
112
156
|
writeEntry(hippoRoot, mem, {
|
|
113
157
|
actor,
|
|
114
158
|
afterWrite: (db, memoryId) => {
|
|
115
|
-
|
|
116
|
-
// memory in the SAME tenant; a cross-tenant or nonexistent id rejects the
|
|
117
|
-
// whole write rather than recording an unverifiable receipt.
|
|
118
|
-
const validated = [];
|
|
119
|
-
for (const linkId of linkInput) {
|
|
120
|
-
// SAFETY: row shape matches the single `id` column named in the SELECT above.
|
|
121
|
-
const exists = db.prepare(`SELECT id FROM memories WHERE id = ? AND tenant_id = ?`).get(linkId, tenantId);
|
|
122
|
-
if (!exists) {
|
|
123
|
-
throw new NotFoundError(`saveIncident: linked memory ${linkId} not found for tenant ${tenantId}`);
|
|
124
|
-
}
|
|
125
|
-
validated.push(linkId);
|
|
126
|
-
}
|
|
127
|
-
const result = db.prepare(`
|
|
128
|
-
INSERT INTO incidents(
|
|
129
|
-
memory_id, tenant_id, incident_text, context,
|
|
130
|
-
status, resolution_text, resolved_at, closed_at, linked_memory_ids, created_at
|
|
131
|
-
) VALUES (?, ?, ?, ?, 'open', NULL, NULL, NULL, ?, ?)
|
|
132
|
-
`).run(memoryId, tenantId, opts.incidentText, opts.context ?? null, JSON.stringify(validated), now);
|
|
133
|
-
const incidentId = Number(result.lastInsertRowid ?? 0);
|
|
134
|
-
// SAFETY: row's shape matches the columns named in INCIDENT_COLS above.
|
|
135
|
-
const row = db.prepare(`SELECT ${INCIDENT_COLS} FROM incidents WHERE id = ?`)
|
|
136
|
-
.get(incidentId);
|
|
137
|
-
if (!row)
|
|
138
|
-
throw new Error('saveIncident: failed to reload saved incident row');
|
|
139
|
-
savedRow = row;
|
|
140
|
-
// GDPR-light metadata: id + flag only, no incident_text.
|
|
141
|
-
appendAuditEvent(db, {
|
|
142
|
-
tenantId,
|
|
143
|
-
actor,
|
|
144
|
-
op: 'incident_open',
|
|
145
|
-
targetId: String(incidentId),
|
|
146
|
-
metadata: {
|
|
147
|
-
incident_id: incidentId,
|
|
148
|
-
has_context: opts.context !== undefined && opts.context !== null && opts.context !== '',
|
|
149
|
-
linked_memory_count: validated.length,
|
|
150
|
-
},
|
|
151
|
-
});
|
|
159
|
+
savedRow = writeIncidentRow(db, memoryId, tenantId, opts, actor, now);
|
|
152
160
|
},
|
|
153
161
|
});
|
|
154
162
|
if (!savedRow) {
|
|
@@ -286,6 +294,7 @@ export function loadIncidentById(hippoRoot, tenantId, id) {
|
|
|
286
294
|
export function loadIncidents(hippoRoot, tenantId, opts = {}) {
|
|
287
295
|
assertTenantId('loadIncidents', tenantId);
|
|
288
296
|
const limit = opts.limit ?? 100;
|
|
297
|
+
const after = keysetAfter('created_at', 'id', opts.after);
|
|
289
298
|
const db = openHippoDb(hippoRoot);
|
|
290
299
|
try {
|
|
291
300
|
let rows;
|
|
@@ -296,19 +305,19 @@ export function loadIncidents(hippoRoot, tenantId, opts = {}) {
|
|
|
296
305
|
// SAFETY: rows' shape matches the columns named in INCIDENT_COLS above.
|
|
297
306
|
rows = db.prepare(`
|
|
298
307
|
SELECT ${INCIDENT_COLS} FROM incidents
|
|
299
|
-
WHERE tenant_id = ? AND status =
|
|
308
|
+
WHERE tenant_id = ? AND status = ?${after.sql}
|
|
300
309
|
ORDER BY created_at DESC, id DESC
|
|
301
310
|
LIMIT ?
|
|
302
|
-
`).all(tenantId, opts.status, limit);
|
|
311
|
+
`).all(tenantId, opts.status, ...after.params, limit);
|
|
303
312
|
}
|
|
304
313
|
else {
|
|
305
314
|
// SAFETY: rows' shape matches the columns named in INCIDENT_COLS above.
|
|
306
315
|
rows = db.prepare(`
|
|
307
316
|
SELECT ${INCIDENT_COLS} FROM incidents
|
|
308
|
-
WHERE tenant_id =
|
|
317
|
+
WHERE tenant_id = ?${after.sql}
|
|
309
318
|
ORDER BY created_at DESC, id DESC
|
|
310
319
|
LIMIT ?
|
|
311
|
-
`).all(tenantId, limit);
|
|
320
|
+
`).all(tenantId, ...after.params, limit);
|
|
312
321
|
}
|
|
313
322
|
return rows.map(rowToIncident);
|
|
314
323
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,22 +5,41 @@ import { type CreateMemoryOptions, type MemoryEntry } from './memory.js';
|
|
|
5
5
|
export { MemoryEntry, Layer, EmotionalValence, ConfidenceLevel, DecayOptions, calculateStrength, resolveConfidence, confidenceFacets, type ConfidenceFacets, applyOutcome, generateId, computeSchemaFit } from './memory.js';
|
|
6
6
|
/** Published signature, so `baseHalfLifeDays` stays optional here; hippo's own writers use the strict one in memory.ts. */
|
|
7
7
|
export declare function createMemory(content: string, options?: Partial<CreateMemoryOptions>): MemoryEntry;
|
|
8
|
-
export { search
|
|
9
|
-
export {
|
|
8
|
+
export { search } from './search/bm25-search.js';
|
|
9
|
+
export { hybridSearch } from './search/hybrid.js';
|
|
10
|
+
export { physicsSearch } from './search/physics-search.js';
|
|
11
|
+
export { explainMatch, MatchExplanation } from './search/explain.js';
|
|
12
|
+
export { detectTemporalDirection, temporalBoost, computeTemporalRange } from './search/temporal.js';
|
|
13
|
+
export { SearchResult } from './search/types.js';
|
|
14
|
+
export { estimateTokens } from './token-ledger.js';
|
|
15
|
+
export { tokenize, textOverlap } from './tokenize.js';
|
|
10
16
|
export { markRetrieved } from './memory.js';
|
|
11
17
|
export { multihopSearch } from './multihop.js';
|
|
12
18
|
export { graphExpandRecall, MAX_HOPS, DEFAULT_MAX_NEIGHBORS, type GraphExpandOpts } from './graph-recall.js';
|
|
13
|
-
export { initStore
|
|
19
|
+
export { initStore } from './store/open.js';
|
|
20
|
+
export { writeEntry } from './store/entry-writes.js';
|
|
21
|
+
export { loadAllEntries, readEntry } from './store/entry-reads.js';
|
|
22
|
+
export { deleteEntry } from './store/delete-and-batch.js';
|
|
23
|
+
export { loadSearchEntries, loadRecallSearchEntries } from './store/search-rows.js';
|
|
24
|
+
export { loadIndex, rebuildIndex, loadSessionDecayContext, SessionDecayContext } from './store/index-and-stats.js';
|
|
25
|
+
export { saveActiveTaskSnapshot, loadActiveTaskSnapshot, loadFreshActiveTaskSnapshot, SNAPSHOT_AMBIENT_MAX_AGE_MS, closeTaskSnapshotsForSession, clearActiveTaskSnapshot, appendSessionEvent, listSessionEvents, } from './store/sessions.js';
|
|
26
|
+
export { listMemoryConflicts, replaceDetectedConflicts, resolveConflict } from './store/conflicts.js';
|
|
27
|
+
export { saveSessionHandoff, loadLatestHandoff, loadHandoffById, stampHandoffOutcome, writeSessionEndHandoff, } from './store/handoffs.js';
|
|
14
28
|
export { createCard, loadCard, listCards, loadCardDeps, loadCardRuns, loadCardComments, claimCard, heartbeatCard, blockCard, reviewCard, completeCard, reclaimExpiredCards, addCardComment, loadLatestHandoffForCard, } from './store-cards.js';
|
|
15
29
|
export { SessionHandoff, HandoffOutcome, HandoffEvidence, isHandoffOutcome } from './handoff.js';
|
|
16
30
|
export { Card, CardStatus, CardRun, CardComment, CardTransitions, isCardStatus, CARD_TRANSITIONS, CARD_LEASE_MS } from './card.js';
|
|
17
|
-
export { consolidate
|
|
31
|
+
export { consolidate } from './consolidate/sleep.js';
|
|
32
|
+
export { ConsolidationResult } from './consolidate/run.js';
|
|
18
33
|
export { strengthBucket } from './dedupe.js';
|
|
19
|
-
export { isEmbeddingAvailable, getEmbedding
|
|
34
|
+
export { isEmbeddingAvailable, getEmbedding } from './local-embedding.js';
|
|
35
|
+
export { cosineSimilarity, loadEmbeddingIndex, saveEmbeddingIndex, embedMemory, embedAll, } from './embeddings.js';
|
|
20
36
|
export { captureError, extractLessons, partitionLessons, deduplicateLesson, runWatched, fetchGitLog, } from './autolearn.js';
|
|
21
37
|
export { getGlobalRoot, initGlobal, promoteToGlobal, searchBoth, searchBothHybrid, syncGlobalToLocal, HybridSearchOptions, transferScore, shareMemory, listPeers, autoShare, } from './shared.js';
|
|
22
38
|
export { wmPush, wmRead, wmClear, wmFlush, WorkingMemoryItem, WM_MAX_ENTRIES, } from './working-memory.js';
|
|
23
|
-
export { importChatGPT, importClaude, importCursor, importGenericFile,
|
|
39
|
+
export { importChatGPT, importClaude, importCursor, importGenericFile, } from './importers/sources.js';
|
|
40
|
+
export { importMarkdown } from './importers/markdown.js';
|
|
41
|
+
export { importVault } from './importers/vault.js';
|
|
42
|
+
export { importEntries, ImportResult, ImportOptions } from './importers/core.js';
|
|
24
43
|
export { runFeatureEval, formatResult, resultToBaseline, detectRegressions, buildSyntheticCorpus, } from './eval-suite.js';
|
|
25
44
|
export { computeSalience, SalienceDecision, SalienceResult, SalienceOptions, } from './salience.js';
|
|
26
45
|
export { computeAmbientState, renderAmbientSummary, formatAmbientVector, AmbientState, } from './ambient.js';
|
package/dist/index.js
CHANGED
|
@@ -7,22 +7,36 @@ export { Layer, calculateStrength, resolveConfidence, confidenceFacets, applyOut
|
|
|
7
7
|
export function createMemory(content, options = {}) {
|
|
8
8
|
return createStoreMemory(content, { ...options, baseHalfLifeDays: options.baseHalfLifeDays ?? DEFAULT_HALF_LIFE_DAYS });
|
|
9
9
|
}
|
|
10
|
-
export { search
|
|
11
|
-
export {
|
|
10
|
+
export { search } from './search/bm25-search.js';
|
|
11
|
+
export { hybridSearch } from './search/hybrid.js';
|
|
12
|
+
export { physicsSearch } from './search/physics-search.js';
|
|
13
|
+
export { explainMatch } from './search/explain.js';
|
|
14
|
+
export { detectTemporalDirection, temporalBoost, computeTemporalRange } from './search/temporal.js';
|
|
15
|
+
export { estimateTokens } from './token-ledger.js';
|
|
16
|
+
export { tokenize, textOverlap } from './tokenize.js';
|
|
12
17
|
export { markRetrieved } from './memory.js';
|
|
13
18
|
export { multihopSearch } from './multihop.js';
|
|
14
19
|
export { graphExpandRecall, MAX_HOPS, DEFAULT_MAX_NEIGHBORS } from './graph-recall.js';
|
|
15
|
-
export { initStore
|
|
20
|
+
export { initStore } from './store/open.js';
|
|
21
|
+
export { writeEntry } from './store/entry-writes.js';
|
|
22
|
+
export { loadAllEntries, readEntry } from './store/entry-reads.js';
|
|
23
|
+
export { deleteEntry } from './store/delete-and-batch.js';
|
|
24
|
+
export { loadSearchEntries, loadRecallSearchEntries } from './store/search-rows.js';
|
|
25
|
+
export { loadIndex, rebuildIndex, loadSessionDecayContext } from './store/index-and-stats.js';
|
|
26
|
+
export { saveActiveTaskSnapshot, loadActiveTaskSnapshot, loadFreshActiveTaskSnapshot, SNAPSHOT_AMBIENT_MAX_AGE_MS, closeTaskSnapshotsForSession, clearActiveTaskSnapshot, appendSessionEvent, listSessionEvents, } from './store/sessions.js';
|
|
27
|
+
export { listMemoryConflicts, replaceDetectedConflicts, resolveConflict } from './store/conflicts.js';
|
|
28
|
+
export { saveSessionHandoff, loadLatestHandoff, loadHandoffById, stampHandoffOutcome, writeSessionEndHandoff, } from './store/handoffs.js';
|
|
16
29
|
export { createCard, loadCard, listCards, loadCardDeps, loadCardRuns, loadCardComments, claimCard, heartbeatCard, blockCard, reviewCard, completeCard, reclaimExpiredCards, addCardComment, loadLatestHandoffForCard, } from './store-cards.js';
|
|
17
30
|
// Feature 5: Session handoff
|
|
18
31
|
export { isHandoffOutcome } from './handoff.js';
|
|
19
32
|
// W2a: work-queue cards
|
|
20
33
|
export { isCardStatus, CARD_TRANSITIONS, CARD_LEASE_MS } from './card.js';
|
|
21
|
-
export { consolidate } from './consolidate.js';
|
|
34
|
+
export { consolidate } from './consolidate/sleep.js';
|
|
22
35
|
// Announced public in CHANGELOG 1.26.3 but never re-exported; the rest of dedupe.js stays internal.
|
|
23
36
|
export { strengthBucket } from './dedupe.js';
|
|
24
37
|
// Feature 1: Embedding search
|
|
25
|
-
export { isEmbeddingAvailable, getEmbedding
|
|
38
|
+
export { isEmbeddingAvailable, getEmbedding } from './local-embedding.js';
|
|
39
|
+
export { cosineSimilarity, loadEmbeddingIndex, saveEmbeddingIndex, embedMemory, embedAll, } from './embeddings.js';
|
|
26
40
|
// Feature 2: Auto-learn from errors
|
|
27
41
|
export { captureError, extractLessons, partitionLessons, deduplicateLesson, runWatched, fetchGitLog, } from './autolearn.js';
|
|
28
42
|
// Feature 3: Cross-agent shared memory
|
|
@@ -30,7 +44,10 @@ export { getGlobalRoot, initGlobal, promoteToGlobal, searchBoth, searchBothHybri
|
|
|
30
44
|
// Feature 5: Working memory
|
|
31
45
|
export { wmPush, wmRead, wmClear, wmFlush, WM_MAX_ENTRIES, } from './working-memory.js';
|
|
32
46
|
// Feature 4: Memory importers
|
|
33
|
-
export { importChatGPT, importClaude, importCursor, importGenericFile,
|
|
47
|
+
export { importChatGPT, importClaude, importCursor, importGenericFile, } from './importers/sources.js';
|
|
48
|
+
export { importMarkdown } from './importers/markdown.js';
|
|
49
|
+
export { importVault } from './importers/vault.js';
|
|
50
|
+
export { importEntries } from './importers/core.js';
|
|
34
51
|
// Feature eval suite
|
|
35
52
|
export { runFeatureEval, formatResult, resultToBaseline, detectRegressions, buildSyntheticCorpus, } from './eval-suite.js';
|
|
36
53
|
// Pineal gland: salience gate
|
package/dist/invalidation.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { writeEntry } from './store/entry-writes.js';
|
|
2
|
+
import { loadAllEntries, readEntry } from './store/entry-reads.js';
|
|
2
3
|
import { openHippoDb, closeHippoDb } from './db.js';
|
|
3
4
|
import { CHURN_STALE_TAG } from './memory.js';
|
|
4
5
|
import { GitReadError, gitLsFilesAtHead, fetchChurnWindowLog, gitGrepPresence, resolveCommitBefore, packageScriptsAt, } from './churn-git.js';
|
package/dist/judgment.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/** Typed judgment over capture candidates via TypeSafe's Jev (System One).
|
|
2
2
|
* Regex picks WHAT is a candidate; it cannot say what is worth keeping, so
|
|
3
3
|
* every captured memory currently lands on a flat schema_fit of 0.5. */
|
|
4
|
+
import { envTypesafeApiKey } from './env.js';
|
|
4
5
|
import { fetchWithRetry } from './http-retry.js';
|
|
5
6
|
import { log } from './log.js';
|
|
6
7
|
const ENDPOINT = 'https://api.typesafe.ai/v1/systemone';
|
|
@@ -37,7 +38,7 @@ const KINDS = ['error', 'decision', 'convention', 'preference', 'trivia'];
|
|
|
37
38
|
const VALENCES = ['critical', 'negative', 'positive', 'neutral'];
|
|
38
39
|
/** Absent key means hippo keeps its pre-Jev behaviour and makes no HTTP call. */
|
|
39
40
|
export function judgmentApiKey() {
|
|
40
|
-
const key =
|
|
41
|
+
const key = envTypesafeApiKey()?.trim();
|
|
41
42
|
return key ? key : undefined;
|
|
42
43
|
}
|
|
43
44
|
function oneOf(value, allowed) {
|
package/dist/keyset.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** The sort key and id of the last row a page returned. */
|
|
2
|
+
export interface KeysetPosition {
|
|
3
|
+
readonly key: string | number;
|
|
4
|
+
readonly id: string | number;
|
|
5
|
+
}
|
|
6
|
+
/** A WHERE fragment and the params it binds. */
|
|
7
|
+
export interface KeysetClause {
|
|
8
|
+
sql: string;
|
|
9
|
+
params: Array<string | number>;
|
|
10
|
+
}
|
|
11
|
+
/** An ` AND ...` WHERE fragment and its params selecting rows strictly after `after`; empty when `after` is unset. */
|
|
12
|
+
export declare function keysetAfter(sortCol: string, idCol: string, after: KeysetPosition | undefined): KeysetClause;
|
|
13
|
+
//# sourceMappingURL=keyset.d.ts.map
|
package/dist/keyset.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// Keyset paging for list queries ordered by (sort key DESC, id DESC), so a page never skips or repeats a row when rows arrive between requests.
|
|
2
|
+
/** An ` AND ...` WHERE fragment and its params selecting rows strictly after `after`; empty when `after` is unset. */
|
|
3
|
+
export function keysetAfter(sortCol, idCol, after) {
|
|
4
|
+
if (!after)
|
|
5
|
+
return { sql: '', params: [] };
|
|
6
|
+
return { sql: ` AND (${sortCol}, ${idCol}) < (?, ?)`, params: [after.key, after.id] };
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=keyset.js.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const DEFAULT_EMBEDDING_MODEL = "Xenova/all-MiniLM-L6-v2";
|
|
2
|
+
/** BGE was trained with CLS pooling; everything else gets mean, the sentence-transformers default, since CLS degrades mean-trained models. */
|
|
3
|
+
export declare function poolingFor(model: string): 'cls' | 'mean';
|
|
4
|
+
/** `query` is search input, `passage` is a document being indexed; no role means no prefix on any model. */
|
|
5
|
+
export type EmbeddingRole = 'query' | 'passage';
|
|
6
|
+
/** e5 models only match a query to a passage when each side carries its trained prefix. */
|
|
7
|
+
export declare function prefixFor(model: string, role?: EmbeddingRole): string;
|
|
8
|
+
/** Check (synchronously) if @xenova/transformers or @huggingface/transformers is installed. */
|
|
9
|
+
export declare function isEmbeddingAvailable(): boolean;
|
|
10
|
+
export declare function resolveEmbeddingModel(hippoRoot: string, explicitModel?: string): string;
|
|
11
|
+
/** Embeds `text` with the local model, or returns `[]` when Transformers.js is missing or fails; `role` adds e5-style prefixes. */
|
|
12
|
+
export declare function getEmbedding(text: string, model?: string, role?: EmbeddingRole): Promise<number[]>;
|
|
13
|
+
//# sourceMappingURL=local-embedding.d.ts.map
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// The local Transformers.js embedder, a leaf so embedding-provider.ts can wrap it without importing embeddings.ts.
|
|
2
|
+
import { envModelCache } from './env.js';
|
|
3
|
+
import * as fs from 'fs';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import { createRequire } from 'module';
|
|
6
|
+
import { loadConfig } from './config.js';
|
|
7
|
+
import { log } from './log.js';
|
|
8
|
+
const _require = createRequire(import.meta.url);
|
|
9
|
+
let _embeddingAvailable = null;
|
|
10
|
+
// A pipeline is expensive to load, so one instance per model is kept for the process.
|
|
11
|
+
const _pipelineInstances = new Map();
|
|
12
|
+
const _pipelineLoading = new Map();
|
|
13
|
+
export const DEFAULT_EMBEDDING_MODEL = 'Xenova/all-MiniLM-L6-v2';
|
|
14
|
+
/** BGE was trained with CLS pooling; everything else gets mean, the sentence-transformers default, since CLS degrades mean-trained models. */
|
|
15
|
+
export function poolingFor(model) {
|
|
16
|
+
return /\bbge\b/i.test(model) ? 'cls' : 'mean';
|
|
17
|
+
}
|
|
18
|
+
/** e5 models only match a query to a passage when each side carries its trained prefix. */
|
|
19
|
+
export function prefixFor(model, role) {
|
|
20
|
+
if (!role)
|
|
21
|
+
return '';
|
|
22
|
+
if (/\be5\b/i.test(model)) {
|
|
23
|
+
return role === 'query' ? 'query: ' : 'passage: ';
|
|
24
|
+
}
|
|
25
|
+
return '';
|
|
26
|
+
}
|
|
27
|
+
// Use Function constructor to bypass TypeScript static module resolution
|
|
28
|
+
// for optional peer dependencies that may not be installed.
|
|
29
|
+
// SAFETY: `import(s)` always resolves to a module namespace object (or rejects);
|
|
30
|
+
// Promise<object> names that honestly without claiming a specific module shape.
|
|
31
|
+
const _dynImport = new Function('s', 'return import(s)');
|
|
32
|
+
/** Check (synchronously) if @xenova/transformers or @huggingface/transformers is installed. */
|
|
33
|
+
export function isEmbeddingAvailable() {
|
|
34
|
+
if (_embeddingAvailable !== null)
|
|
35
|
+
return _embeddingAvailable;
|
|
36
|
+
try {
|
|
37
|
+
_require.resolve('@xenova/transformers');
|
|
38
|
+
_embeddingAvailable = true;
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// fall through
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
_require.resolve('@huggingface/transformers');
|
|
46
|
+
_embeddingAvailable = true;
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// fall through
|
|
51
|
+
}
|
|
52
|
+
_embeddingAvailable = false;
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
// Importing both packages loads two incompatible onnxruntime-node builds whose finalizers can double-free on exit,
|
|
56
|
+
// so pick one first: the maintained package hippo ships, with Xenova only as a fallback a user installed.
|
|
57
|
+
function resolveTransformersPackage() {
|
|
58
|
+
try {
|
|
59
|
+
_require.resolve('@huggingface/transformers');
|
|
60
|
+
return '@huggingface/transformers';
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// fall through
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
_require.resolve('@xenova/transformers');
|
|
67
|
+
return '@xenova/transformers';
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return null; // neither optional package is installed; callers fall back to no local embeddings
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
74
|
+
async function loadPipeline(model) {
|
|
75
|
+
if (_pipelineInstances.has(model))
|
|
76
|
+
return _pipelineInstances.get(model);
|
|
77
|
+
if (_pipelineLoading.has(model))
|
|
78
|
+
return _pipelineLoading.get(model);
|
|
79
|
+
const loading = (async () => {
|
|
80
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
81
|
+
const pkg = resolveTransformersPackage();
|
|
82
|
+
if (!pkg)
|
|
83
|
+
return null;
|
|
84
|
+
let pipelineFn = null;
|
|
85
|
+
try {
|
|
86
|
+
// SAFETY: the resolved module's shape is untyped by design (optional peer
|
|
87
|
+
// dependency); pipelineFn/mod.env are read defensively below and any
|
|
88
|
+
// failure to find a usable pipeline falls through to `return null`.
|
|
89
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
90
|
+
const mod = await _dynImport(pkg);
|
|
91
|
+
if (envModelCache()) {
|
|
92
|
+
if (mod.env) {
|
|
93
|
+
mod.env.cacheDir = envModelCache();
|
|
94
|
+
mod.env.localModelPath = envModelCache();
|
|
95
|
+
mod.env.allowRemoteModels = false;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
pipelineFn = mod.pipeline ?? mod.default?.pipeline;
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
log.debug(`transformers import failed (${pkg}): ${err instanceof Error ? err.message : String(err)}`);
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
if (!pipelineFn)
|
|
105
|
+
return null;
|
|
106
|
+
// The offline bundle used in egress-blocked sandboxes ships only the FP32 model, so use whichever file is on disk.
|
|
107
|
+
const cacheRoot = envModelCache()?.trim();
|
|
108
|
+
const quantized = !cacheRoot
|
|
109
|
+
|| fs.existsSync(path.join(cacheRoot, model, 'onnx', 'model_quantized.onnx'));
|
|
110
|
+
try {
|
|
111
|
+
const instance = await pipelineFn('feature-extraction', model, { quantized });
|
|
112
|
+
_pipelineInstances.set(model, instance);
|
|
113
|
+
return instance;
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
log.debug(`embedding pipeline load failed (${model}): ${err instanceof Error ? err.message : String(err)}`);
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
finally {
|
|
120
|
+
_pipelineLoading.delete(model);
|
|
121
|
+
}
|
|
122
|
+
})();
|
|
123
|
+
_pipelineLoading.set(model, loading);
|
|
124
|
+
return loading;
|
|
125
|
+
}
|
|
126
|
+
export function resolveEmbeddingModel(hippoRoot, explicitModel) {
|
|
127
|
+
const direct = explicitModel?.trim();
|
|
128
|
+
if (direct)
|
|
129
|
+
return direct;
|
|
130
|
+
try {
|
|
131
|
+
const configured = loadConfig(hippoRoot).embeddings.model?.trim();
|
|
132
|
+
if (configured)
|
|
133
|
+
return configured;
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
// Fall back to the default model when config cannot be read.
|
|
137
|
+
}
|
|
138
|
+
return DEFAULT_EMBEDDING_MODEL;
|
|
139
|
+
}
|
|
140
|
+
/** Embeds `text` with the local model, or returns `[]` when Transformers.js is missing or fails; `role` adds e5-style prefixes. */
|
|
141
|
+
export async function getEmbedding(text, model = DEFAULT_EMBEDDING_MODEL, role) {
|
|
142
|
+
if (!isEmbeddingAvailable())
|
|
143
|
+
return [];
|
|
144
|
+
try {
|
|
145
|
+
const pipe = await loadPipeline(model);
|
|
146
|
+
if (!pipe)
|
|
147
|
+
return [];
|
|
148
|
+
const prefix = prefixFor(model, role);
|
|
149
|
+
const input = prefix ? `${prefix}${text}` : text;
|
|
150
|
+
// SAFETY: pipe() is a Transformers.js feature-extraction pipeline call;
|
|
151
|
+
// its untyped output is read defensively below (only `.data`, cast on
|
|
152
|
+
// the return line to the documented Float32Array tensor shape).
|
|
153
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
154
|
+
const output = await pipe(input, { pooling: poolingFor(model), normalize: true });
|
|
155
|
+
// SAFETY: output.data is a Float32Array per the feature-extraction
|
|
156
|
+
// pipeline's documented tensor output shape.
|
|
157
|
+
return Array.from(output.data);
|
|
158
|
+
}
|
|
159
|
+
catch (err) {
|
|
160
|
+
// The caller sees `[]` and names the memory; the reason only shows at debug.
|
|
161
|
+
log.debug(`local embedding failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
162
|
+
return [];
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=local-embedding.js.map
|
package/dist/log.d.ts
CHANGED
|
@@ -12,13 +12,20 @@ export declare function isLevelEnabled(level: LogLevel): boolean;
|
|
|
12
12
|
export declare function formatLogLine(level: LogLevel, message: string, fields?: LogFields): string;
|
|
13
13
|
/** Write `message` at `level` the first time `key` is seen in this process; later calls are dropped. */
|
|
14
14
|
declare function once(key: string, level: LogLevel, message: string, fields?: LogFields): void;
|
|
15
|
+
/** Warn the first time `key` is seen in this process, then log at debug, so a repeating failure stays findable without flooding stderr. */
|
|
16
|
+
declare function warnThenDebug(key: string, message: string, fields?: LogFields): void;
|
|
17
|
+
/** The class name and stack of a thrown value, as log fields; a non-Error throw has no stack. */
|
|
18
|
+
export declare function errorFields<E>(err: E): LogFields;
|
|
15
19
|
export declare const log: {
|
|
16
20
|
readonly error: (message: string, fields?: LogFields) => void;
|
|
17
21
|
readonly warn: (message: string, fields?: LogFields) => void;
|
|
18
22
|
readonly info: (message: string, fields?: LogFields) => void;
|
|
19
23
|
readonly debug: (message: string, fields?: LogFields) => void;
|
|
20
24
|
readonly once: typeof once;
|
|
25
|
+
readonly warnThenDebug: typeof warnThenDebug;
|
|
21
26
|
};
|
|
27
|
+
/** Message for a caught value of unknown shape. `cause` names the sanctioned unknown-input case (error-cause enrichment). */
|
|
28
|
+
export declare function errorMessage(cause: unknown): string;
|
|
22
29
|
/** Test hook: forget which once-keys have fired. */
|
|
23
30
|
export declare function resetLogOnce(): void;
|
|
24
31
|
export {};
|
package/dist/log.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
/** Leveled stderr logger. `HIPPO_LOG` picks the threshold (error, warn, info, debug); unset or unknown means warn. */
|
|
2
|
+
import { envLogLevel } from './env.js';
|
|
2
3
|
const RANK = { error: 0, warn: 1, info: 2, debug: 3 };
|
|
3
4
|
function isLogLevel(value) {
|
|
4
5
|
return Object.hasOwn(RANK, value);
|
|
5
6
|
}
|
|
6
7
|
/** The active threshold, read on every call so a test or a long-lived server can change it without a restart. */
|
|
7
8
|
export function logThreshold() {
|
|
8
|
-
const raw =
|
|
9
|
+
const raw = envLogLevel();
|
|
9
10
|
return isLogLevel(raw) ? raw : 'warn';
|
|
10
11
|
}
|
|
11
12
|
export function isLevelEnabled(level) {
|
|
@@ -34,13 +35,30 @@ function once(key, level, message, fields) {
|
|
|
34
35
|
onceKeys.add(key);
|
|
35
36
|
write(level, message, fields);
|
|
36
37
|
}
|
|
38
|
+
/** Warn the first time `key` is seen in this process, then log at debug, so a repeating failure stays findable without flooding stderr. */
|
|
39
|
+
function warnThenDebug(key, message, fields) {
|
|
40
|
+
const level = onceKeys.has(key) ? 'debug' : 'warn';
|
|
41
|
+
onceKeys.add(key);
|
|
42
|
+
write(level, message, fields);
|
|
43
|
+
}
|
|
44
|
+
/** The class name and stack of a thrown value, as log fields; a non-Error throw has no stack. */
|
|
45
|
+
export function errorFields(err) {
|
|
46
|
+
if (!(err instanceof Error))
|
|
47
|
+
return { errorClass: 'NonError' };
|
|
48
|
+
return { errorClass: err.constructor.name, stack: err.stack };
|
|
49
|
+
}
|
|
37
50
|
export const log = {
|
|
38
51
|
error: (message, fields) => write('error', message, fields),
|
|
39
52
|
warn: (message, fields) => write('warn', message, fields),
|
|
40
53
|
info: (message, fields) => write('info', message, fields),
|
|
41
54
|
debug: (message, fields) => write('debug', message, fields),
|
|
42
55
|
once,
|
|
56
|
+
warnThenDebug,
|
|
43
57
|
};
|
|
58
|
+
/** Message for a caught value of unknown shape. `cause` names the sanctioned unknown-input case (error-cause enrichment). */
|
|
59
|
+
export function errorMessage(cause) {
|
|
60
|
+
return cause instanceof Error ? cause.message : String(cause);
|
|
61
|
+
}
|
|
44
62
|
/** Test hook: forget which once-keys have fired. */
|
|
45
63
|
export function resetLogOnce() {
|
|
46
64
|
onceKeys.clear();
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ToolCall } from './protocol.js';
|
|
2
|
+
export declare function runPredictBaserateTool({ args, ctx, hippoRoot, tenantId }: ToolCall): string;
|
|
3
|
+
export declare function runStatusTool({ hippoRoot, config, tenantId }: ToolCall): string;
|
|
4
|
+
export declare function runConflictsTool({ hippoRoot, tenantId }: ToolCall): string;
|
|
5
|
+
export declare function runResolveTool({ args, ctx, hippoRoot, tenantId }: ToolCall): string;
|
|
6
|
+
export declare function runShareTool({ args, hippoRoot, tenantId }: ToolCall): string;
|
|
7
|
+
export declare function runPeersTool({ tenantId }: ToolCall): string;
|
|
8
|
+
//# sourceMappingURL=admin-tools.d.ts.map
|