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
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
// Store health and admin tool handlers: base rates, status, conflicts, resolve, share and peers.
|
|
2
|
+
import { calculateStrength } from '../memory.js';
|
|
3
|
+
import { evalNow } from '../ablation.js';
|
|
4
|
+
import { loadStrengthRows } from '../store/candidates.js';
|
|
5
|
+
import { listMemoryConflicts, resolveConflict } from '../store/conflicts.js';
|
|
6
|
+
import { shareMemory, listPeers } from '../shared.js';
|
|
7
|
+
import { computePredictionBaserate } from '../predictions/store.js';
|
|
8
|
+
import { isJsonString } from './protocol.js';
|
|
9
|
+
export function runPredictBaserateTool({ args, ctx, hippoRoot, tenantId }) {
|
|
10
|
+
// J3 reference-class / planning-fallacy detector. Reads from the E2
|
|
11
|
+
// predictions table; returns text-only response matching the existing
|
|
12
|
+
// MCP tool convention (no structured JSON over the wire). Direct call
|
|
13
|
+
// to computePredictionBaserate; helper opens its own db + emits audit
|
|
14
|
+
// (single source of truth, no caller-site drift).
|
|
15
|
+
const classTag = String(args.class_tag || '').trim();
|
|
16
|
+
if (!classTag)
|
|
17
|
+
return 'No class_tag provided. Usage: pass class_tag matching a class used in past predictions (e.g. "migration-effort").';
|
|
18
|
+
const baserate = computePredictionBaserate(hippoRoot, tenantId, classTag, ctx?.actor ?? 'mcp');
|
|
19
|
+
if (baserate.nClosed === 0) {
|
|
20
|
+
return `No closed predictions in class "${classTag}" yet. Create one via hippo_predict (or 'hippo predict ...' CLI) and close it with hippo_predict_close once the actual outcome is known. Base rates need closed predictions with numeric actual_value to compute.`;
|
|
21
|
+
}
|
|
22
|
+
const lines = [baserate.summary, ''];
|
|
23
|
+
lines.push(`n_closed: ${baserate.nClosed}`);
|
|
24
|
+
lines.push(`n_ratio_eligible: ${baserate.nRatioEligible}`);
|
|
25
|
+
if (baserate.meanEstimate !== null)
|
|
26
|
+
lines.push(`mean_estimate: ${baserate.meanEstimate.toFixed(3)}`);
|
|
27
|
+
if (baserate.meanActual !== null)
|
|
28
|
+
lines.push(`mean_actual: ${baserate.meanActual.toFixed(3)}`);
|
|
29
|
+
if (baserate.meanRatio !== null)
|
|
30
|
+
lines.push(`mean_ratio: ${baserate.meanRatio.toFixed(3)}x`);
|
|
31
|
+
if (baserate.p50Ratio !== null)
|
|
32
|
+
lines.push(`p50_ratio: ${baserate.p50Ratio.toFixed(3)}x`);
|
|
33
|
+
if (baserate.mae !== null)
|
|
34
|
+
lines.push(`mae: ${baserate.mae.toFixed(3)}`);
|
|
35
|
+
return lines.join('\n');
|
|
36
|
+
}
|
|
37
|
+
export function runStatusTool({ hippoRoot, config, tenantId }) {
|
|
38
|
+
// Every row counts toward the averages, so this scans the store, but without its text.
|
|
39
|
+
const entries = loadStrengthRows(hippoRoot, tenantId);
|
|
40
|
+
const now = evalNow(); // honors HIPPO_FAKE_NOW (eval-only; see ablation.ts)
|
|
41
|
+
let atRisk = 0;
|
|
42
|
+
let totalStrength = 0;
|
|
43
|
+
for (const e of entries) {
|
|
44
|
+
const s = calculateStrength(e, now);
|
|
45
|
+
totalStrength += s;
|
|
46
|
+
if (s < 0.1 && !e.pinned)
|
|
47
|
+
atRisk++;
|
|
48
|
+
}
|
|
49
|
+
const avgStrength = entries.length > 0 ? (totalStrength / entries.length).toFixed(2) : '0';
|
|
50
|
+
const pinned = entries.filter((e) => e.pinned).length;
|
|
51
|
+
const errors = entries.filter((e) => e.tags.includes('error')).length;
|
|
52
|
+
const conflicts = listMemoryConflicts(hippoRoot, 'open', tenantId).length;
|
|
53
|
+
return [
|
|
54
|
+
`Memories: ${entries.length} (${pinned} pinned, ${errors} errors)`,
|
|
55
|
+
`Avg strength: ${avgStrength}`,
|
|
56
|
+
`At risk (<0.1): ${atRisk}`,
|
|
57
|
+
`Open conflicts: ${conflicts}`,
|
|
58
|
+
`Half-life default: ${config.defaultHalfLifeDays}d`,
|
|
59
|
+
].join('\n');
|
|
60
|
+
}
|
|
61
|
+
export function runConflictsTool({ hippoRoot, tenantId }) {
|
|
62
|
+
const conflicts = listMemoryConflicts(hippoRoot, 'open', tenantId);
|
|
63
|
+
if (conflicts.length === 0)
|
|
64
|
+
return 'No open conflicts.';
|
|
65
|
+
return conflicts.map((c) => `conflict_${c.id}: ${c.memory_a_id} <-> ${c.memory_b_id} (score=${c.score.toFixed(2)}) — ${c.reason}`).join('\n');
|
|
66
|
+
}
|
|
67
|
+
export function runResolveTool({ args, ctx, hippoRoot, tenantId }) {
|
|
68
|
+
const conflictId = Number(args.conflict_id);
|
|
69
|
+
const keepId = String(args.keep || '');
|
|
70
|
+
const forget = Boolean(args.forget);
|
|
71
|
+
// AT1: optional rejectLoser + reason, threaded straight through to
|
|
72
|
+
// resolveConflict's opts (plan §5 — mirrors the CLI's --reject-loser).
|
|
73
|
+
const rejectLoser = Boolean(args.rejectLoser);
|
|
74
|
+
const reason = isJsonString(args.reason) ? args.reason : undefined;
|
|
75
|
+
if (isNaN(conflictId) || !keepId)
|
|
76
|
+
return 'Required: conflict_id and keep.';
|
|
77
|
+
const result = resolveConflict(hippoRoot, conflictId, keepId, forget, tenantId, {
|
|
78
|
+
rejectLoserValue: rejectLoser,
|
|
79
|
+
reason,
|
|
80
|
+
// P2 fix: resolveConflict's opts.rejectedBy defaults to 'cli' when
|
|
81
|
+
// omitted — this call site never passed it, so the tombstone's
|
|
82
|
+
// rejected_by AND the conflict_resolve audit's actor both landed as
|
|
83
|
+
// 'cli' even though the caller was MCP. ctx.actor carries the
|
|
84
|
+
// auth-resolved actor for HTTP-MCP (see McpContext above); stdio
|
|
85
|
+
// callers pass no ctx, so 'mcp' is the honest fallback there.
|
|
86
|
+
rejectedBy: ctx?.actor ?? 'mcp',
|
|
87
|
+
});
|
|
88
|
+
if (!result)
|
|
89
|
+
return 'Could not resolve. Check the conflict ID and --keep value.';
|
|
90
|
+
const action = rejectLoser ? 'rejected (tombstoned) and removed' : forget ? 'deleted' : 'weakened';
|
|
91
|
+
return `Resolved conflict ${conflictId}: kept ${keepId}, ${action} ${result.loserId}`;
|
|
92
|
+
}
|
|
93
|
+
export function runShareTool({ args, hippoRoot, tenantId }) {
|
|
94
|
+
const shareId = String(args.id || '');
|
|
95
|
+
if (!shareId)
|
|
96
|
+
return 'Required: id (memory ID to share).';
|
|
97
|
+
const force = Boolean(args.force);
|
|
98
|
+
// Pass tenantId so shareMemory's readEntry filters by tenant. Without
|
|
99
|
+
// this, a Bearer for tenant A could call hippo_share with tenant B's
|
|
100
|
+
// id and copy the row to the global store. The 'Memory not found'
|
|
101
|
+
// error matches the cross-tenant deny shape elsewhere in the code.
|
|
102
|
+
const shared = shareMemory(hippoRoot, shareId, { force, tenantId });
|
|
103
|
+
if (!shared)
|
|
104
|
+
return 'Transfer score too low. Use force=true to override.';
|
|
105
|
+
return `Shared [${shared.id}] to global store. Source: ${shared.source}`;
|
|
106
|
+
}
|
|
107
|
+
export function runPeersTool({ tenantId }) {
|
|
108
|
+
// D4 v1.12.10: tenant-scope the cross-project peer discovery.
|
|
109
|
+
// tenantId is the caller's tenant (matches hippo_share above);
|
|
110
|
+
// passing undefined would restore the pre-D4 host-wide behaviour.
|
|
111
|
+
const peers = listPeers(undefined, tenantId);
|
|
112
|
+
if (peers.length === 0)
|
|
113
|
+
return 'No peers found.';
|
|
114
|
+
return peers.map((p) => `${p.project}: ${p.count} memories (latest: ${p.latest.slice(0, 10)})`).join('\n');
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=admin-tools.js.map
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { SearchResult } from '../search/types.js';
|
|
2
|
+
import type { SessionEvent, TaskSnapshot } from '../store/rows.js';
|
|
3
|
+
import type { ContextCost, ContinuityBlock, RecallResult, RecallResultItem } from '../api.js';
|
|
4
|
+
import { type SessionHandoff } from '../handoff.js';
|
|
5
|
+
import { detectAnchoring } from '../recall-history.js';
|
|
6
|
+
import { detectAvailabilityBias } from '../availability.js';
|
|
7
|
+
export declare function formatContinuityBlock(block: ContinuityBlock): string;
|
|
8
|
+
export declare function formatMemories(results: ReadonlyArray<Pick<SearchResult, 'entry'>>): string;
|
|
9
|
+
export interface RenderedRecall {
|
|
10
|
+
anchoring: ReturnType<typeof detectAnchoring>;
|
|
11
|
+
availability: ReturnType<typeof detectAvailabilityBias>;
|
|
12
|
+
text: string;
|
|
13
|
+
list: SearchResult[];
|
|
14
|
+
}
|
|
15
|
+
export interface RenderSlot {
|
|
16
|
+
rendered?: RenderedRecall;
|
|
17
|
+
}
|
|
18
|
+
/** What a memory costs the budget: the text formatMemories prints for it. */
|
|
19
|
+
export declare const memoryCost: (r: Pick<SearchResult, "entry">) => number;
|
|
20
|
+
export declare function memoriesReserve(budget: number): number;
|
|
21
|
+
export declare function snapshotPiece(s: TaskSnapshot): string;
|
|
22
|
+
export declare function handoffPiece(h: SessionHandoff): string;
|
|
23
|
+
export declare function trailPiece(events: readonly SessionEvent[]): string;
|
|
24
|
+
export declare const contextCost: ContextCost;
|
|
25
|
+
export declare function tailSection(rows: RecallResultItem[]): string;
|
|
26
|
+
export declare function planningSection(r: RecallResult): string;
|
|
27
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
// Text the MCP recall and context tools print, and what each printed piece costs the token budget.
|
|
2
|
+
import { confidenceLabel } from '../memory.js';
|
|
3
|
+
import { formatHandoffEvidenceLine } from '../handoff.js';
|
|
4
|
+
import { printedTokens } from '../context-render.js';
|
|
5
|
+
import { estimateTokens } from '../token-ledger.js';
|
|
6
|
+
// ── Format helpers ──
|
|
7
|
+
function handoffLines(h) {
|
|
8
|
+
const lines = [`- Summary: ${h.summary}`];
|
|
9
|
+
if (h.nextAction)
|
|
10
|
+
lines.push(`- Next action: ${h.nextAction}`);
|
|
11
|
+
if ((h.artifacts ?? []).length > 0)
|
|
12
|
+
lines.push(`- Artifacts: ${(h.artifacts ?? []).join(', ')}`);
|
|
13
|
+
if (h.outcome)
|
|
14
|
+
lines.push(`- Outcome: ${h.outcome}`);
|
|
15
|
+
if (h.targetRuntime)
|
|
16
|
+
lines.push(`- Target runtime: ${h.targetRuntime}`);
|
|
17
|
+
if (h.cardId)
|
|
18
|
+
lines.push(`- Card: ${h.cardId}`);
|
|
19
|
+
if ((h.constraints ?? []).length > 0)
|
|
20
|
+
lines.push(`- Constraints: ${(h.constraints ?? []).join(', ')}`);
|
|
21
|
+
if (h.evidence)
|
|
22
|
+
lines.push(`- Evidence: ${formatHandoffEvidenceLine(h.evidence)}`);
|
|
23
|
+
return lines;
|
|
24
|
+
}
|
|
25
|
+
function trailLines(events) {
|
|
26
|
+
return events.map((e) => {
|
|
27
|
+
const preview = e.content.length > 200 ? e.content.slice(0, 200) + '…' : e.content;
|
|
28
|
+
return `- [${e.event_type}] ${preview}`;
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
export function formatContinuityBlock(block) {
|
|
32
|
+
const lines = ['## Continuity'];
|
|
33
|
+
if (block.activeSnapshot) {
|
|
34
|
+
lines.push('');
|
|
35
|
+
lines.push('### Active Task Snapshot');
|
|
36
|
+
lines.push(`- Task: ${block.activeSnapshot.task}`);
|
|
37
|
+
lines.push(`- Summary: ${block.activeSnapshot.summary}`);
|
|
38
|
+
lines.push(`- Next: ${block.activeSnapshot.next_step}`);
|
|
39
|
+
}
|
|
40
|
+
if (block.sessionHandoff) {
|
|
41
|
+
lines.push('');
|
|
42
|
+
lines.push('### Session Handoff');
|
|
43
|
+
lines.push(...handoffLines(block.sessionHandoff));
|
|
44
|
+
}
|
|
45
|
+
if (block.recentSessionEvents.length > 0) {
|
|
46
|
+
lines.push('');
|
|
47
|
+
lines.push('### Recent Session Trail');
|
|
48
|
+
lines.push(...trailLines(block.recentSessionEvents));
|
|
49
|
+
}
|
|
50
|
+
if (lines.length === 1) {
|
|
51
|
+
lines.push('');
|
|
52
|
+
lines.push('(no active task snapshot, handoff, or recent events for this tenant)');
|
|
53
|
+
}
|
|
54
|
+
return lines.join('\n');
|
|
55
|
+
}
|
|
56
|
+
const NO_MEMORIES = 'No relevant memories found.';
|
|
57
|
+
function memoriesHeading(count) {
|
|
58
|
+
return `Found ${count} memories:\n`;
|
|
59
|
+
}
|
|
60
|
+
function formatMemory(r) {
|
|
61
|
+
const conf = confidenceLabel(r.entry).text;
|
|
62
|
+
const tags = r.entry.tags.length > 0 ? ` tags: ${r.entry.tags.join(', ')}` : '';
|
|
63
|
+
return `[${conf}]${tags} (strength=${r.entry.strength.toFixed(2)})\n${r.entry.content}\n`;
|
|
64
|
+
}
|
|
65
|
+
export function formatMemories(results) {
|
|
66
|
+
if (results.length === 0)
|
|
67
|
+
return NO_MEMORIES;
|
|
68
|
+
return [memoriesHeading(results.length), ...results.map(formatMemory)].join('\n');
|
|
69
|
+
}
|
|
70
|
+
/** What a memory costs the budget: the text formatMemories prints for it. */
|
|
71
|
+
export const memoryCost = (r) => printedTokens(formatMemory(r));
|
|
72
|
+
// The widest heading or the empty-list line, whichever costs more, so either prints inside the budget.
|
|
73
|
+
export function memoriesReserve(budget) {
|
|
74
|
+
return Math.max(printedTokens(memoriesHeading(budget)), estimateTokens(NO_MEMORIES));
|
|
75
|
+
}
|
|
76
|
+
export function snapshotPiece(s) {
|
|
77
|
+
return [
|
|
78
|
+
'## Active Task Snapshot',
|
|
79
|
+
`- Task: ${s.task}`,
|
|
80
|
+
`- Status: ${s.status}`,
|
|
81
|
+
`- Updated: ${s.updated_at}`,
|
|
82
|
+
'',
|
|
83
|
+
'### Summary',
|
|
84
|
+
s.summary,
|
|
85
|
+
'',
|
|
86
|
+
'### Next step',
|
|
87
|
+
s.next_step,
|
|
88
|
+
'',
|
|
89
|
+
'',
|
|
90
|
+
].join('\n');
|
|
91
|
+
}
|
|
92
|
+
export function handoffPiece(h) {
|
|
93
|
+
return ['## Session Handoff', ...handoffLines(h), '', ''].join('\n');
|
|
94
|
+
}
|
|
95
|
+
export function trailPiece(events) {
|
|
96
|
+
return ['## Recent Session Trail', ...trailLines(events), '', ''].join('\n');
|
|
97
|
+
}
|
|
98
|
+
// Sections print ahead of the memories in hippo_context, so getContext pays for each as printed before any memory.
|
|
99
|
+
export const contextCost = {
|
|
100
|
+
entry: memoryCost,
|
|
101
|
+
fixed: (budget) => memoriesReserve(budget),
|
|
102
|
+
snapshot: (s) => estimateTokens(snapshotPiece(s)),
|
|
103
|
+
handoff: (h) => estimateTokens(handoffPiece(h)),
|
|
104
|
+
trail: (events) => estimateTokens(trailPiece(events)),
|
|
105
|
+
};
|
|
106
|
+
// Rows the ranked list already shows drop out of this section, so pricing every row bounds what it prints.
|
|
107
|
+
export function tailSection(rows) {
|
|
108
|
+
if (rows.length === 0)
|
|
109
|
+
return '';
|
|
110
|
+
const lines = ['', '## Fresh tail / substituted summaries'];
|
|
111
|
+
for (const r of rows) {
|
|
112
|
+
const tag = r.isSummary ? '[summary]' : '[tail]';
|
|
113
|
+
const head = r.content.length > 200 ? r.content.slice(0, 200) + '…' : r.content;
|
|
114
|
+
if (r.isSummary && r.substitutedFor && r.substitutedFor.length > 0) {
|
|
115
|
+
lines.push(`- ${tag} ${r.id} (covers ${r.substitutedFor.length} rows): ${head}`);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
lines.push(`- ${tag} ${r.id}: ${head}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return '\n' + lines.join('\n');
|
|
122
|
+
}
|
|
123
|
+
// J3.2: the hint depends on the query alone, so api.retrieve's copy is the one shown; JSON.stringify fences the phrase.
|
|
124
|
+
export function planningSection(r) {
|
|
125
|
+
if (r.planningFallacyHint) {
|
|
126
|
+
const h = r.planningFallacyHint;
|
|
127
|
+
return `## Planning fallacy hint\nClass: ${h.classTag}\n${h.baserateSummary}\n(detected: ${JSON.stringify(h.detectedPhrase)})\n\n---\n\n`;
|
|
128
|
+
}
|
|
129
|
+
if (r.planningFallacyWatching) {
|
|
130
|
+
const w = r.planningFallacyWatching;
|
|
131
|
+
return `## Planning fallacy watch\nReason: ${w.reason}\n${w.suggestion}\n(detected: ${JSON.stringify(w.detectedPhrase)})\n\n---\n\n`;
|
|
132
|
+
}
|
|
133
|
+
return '';
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type ToolCall } from './protocol.js';
|
|
2
|
+
export declare function runRememberTool({ args, ctx, hippoRoot, config, tenantId }: ToolCall): string;
|
|
3
|
+
export declare function runOutcomeTool({ args, ctx, hippoRoot, tenantId }: ToolCall): string;
|
|
4
|
+
export declare function runLearnTool({ args, ctx, hippoRoot, tenantId }: ToolCall): string;
|
|
5
|
+
//# sourceMappingURL=memory-tools.d.ts.map
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// Write-side tool handlers: hippo_remember, hippo_outcome and hippo_learn.
|
|
2
|
+
import { log } from '../log.js';
|
|
3
|
+
import { readEntry } from '../store/entry-reads.js';
|
|
4
|
+
import { countCreatedSinceLastSleep } from '../store/index-and-stats.js';
|
|
5
|
+
import { consolidate } from '../consolidate/sleep.js';
|
|
6
|
+
import { resolveTenantId } from '../tenant.js';
|
|
7
|
+
import { remember as apiRemember, outcome as apiOutcome, learn as apiLearn, MCP_LEARN } from '../api.js';
|
|
8
|
+
import { mcpActor } from './protocol.js';
|
|
9
|
+
import { lastRecalledIds, autoSleepInFlight, resolveClientKey } from './session-state.js';
|
|
10
|
+
export function runRememberTool({ args, ctx, hippoRoot, config, tenantId }) {
|
|
11
|
+
const text = String(args.text || '');
|
|
12
|
+
if (!text)
|
|
13
|
+
return 'No text provided.';
|
|
14
|
+
const tags = [];
|
|
15
|
+
if (args.error)
|
|
16
|
+
tags.push('error');
|
|
17
|
+
if (args.tag)
|
|
18
|
+
tags.push(String(args.tag));
|
|
19
|
+
// Route through api.ts so audit_log captures the caller identity
|
|
20
|
+
// uniformly with CLI/REST: the auth-resolved ctx.actor under HTTP-MCP,
|
|
21
|
+
// 'mcp' for stdio (no ctx). api.ts.remember writes the memory + audit
|
|
22
|
+
// row in one transaction-friendly path; we re-read the entry to surface
|
|
23
|
+
// the half-life used in the MCP human-readable response.
|
|
24
|
+
const apiCtx = {
|
|
25
|
+
hippoRoot,
|
|
26
|
+
tenantId,
|
|
27
|
+
actor: mcpActor(ctx),
|
|
28
|
+
};
|
|
29
|
+
const result = apiRemember(apiCtx, {
|
|
30
|
+
content: text,
|
|
31
|
+
tags,
|
|
32
|
+
});
|
|
33
|
+
const entry = readEntry(hippoRoot, result.id, tenantId);
|
|
34
|
+
// Auto-sleep: one run per store at a time, triggered by what arrived since the last one.
|
|
35
|
+
// Consolidation is host-wide, so only the host tenant's writes may start it.
|
|
36
|
+
if (config.autoSleep.enabled &&
|
|
37
|
+
tenantId === resolveTenantId({}) &&
|
|
38
|
+
!autoSleepInFlight.has(hippoRoot) &&
|
|
39
|
+
countCreatedSinceLastSleep(hippoRoot, tenantId) >= config.autoSleep.threshold) {
|
|
40
|
+
autoSleepInFlight.add(hippoRoot);
|
|
41
|
+
// Fire-and-forget (never block the response); an unhandled rejection would kill the server, so log it.
|
|
42
|
+
consolidate(hippoRoot)
|
|
43
|
+
.catch((err) => {
|
|
44
|
+
log.error(`auto-sleep consolidate failed (tenant ${tenantId}): ${err instanceof Error ? err.message : String(err)}`);
|
|
45
|
+
})
|
|
46
|
+
.finally(() => autoSleepInFlight.delete(hippoRoot));
|
|
47
|
+
}
|
|
48
|
+
const halfLife = entry?.half_life_days ?? config.defaultHalfLifeDays;
|
|
49
|
+
const tagStr = entry?.tags.join(', ') || tags.join(', ') || 'none';
|
|
50
|
+
const warnings = (result.warnings ?? []).map((w) => `\nWarning: ${w}`).join('');
|
|
51
|
+
return `Remembered [${result.id}] (half-life: ${halfLife}d, tags: ${tagStr})${warnings}`;
|
|
52
|
+
}
|
|
53
|
+
export function runOutcomeTool({ args, ctx, hippoRoot, tenantId }) {
|
|
54
|
+
const good = Boolean(args.good);
|
|
55
|
+
const clientKey = resolveClientKey(ctx);
|
|
56
|
+
const ids = lastRecalledIds.get(clientKey) ?? [];
|
|
57
|
+
if (ids.length === 0)
|
|
58
|
+
return 'No recent recalls to apply outcome to.';
|
|
59
|
+
// Route through src/api.ts so audit_log captures the caller identity
|
|
60
|
+
// (auth-resolved ctx.actor under HTTP-MCP, 'mcp' for stdio) and tenant
|
|
61
|
+
// scoping is enforced uniformly (same surface as recall/remember).
|
|
62
|
+
// outcome() also handles cross-tenant id skip silently.
|
|
63
|
+
const apiCtx = {
|
|
64
|
+
hippoRoot,
|
|
65
|
+
tenantId,
|
|
66
|
+
actor: mcpActor(ctx),
|
|
67
|
+
};
|
|
68
|
+
const { applied } = apiOutcome(apiCtx, ids, good);
|
|
69
|
+
return `Applied ${good ? 'positive' : 'negative'} outcome to ${applied} memories`;
|
|
70
|
+
}
|
|
71
|
+
export function runLearnTool({ args, ctx, hippoRoot, tenantId }) {
|
|
72
|
+
const days = Number(args.days) || 7;
|
|
73
|
+
const result = apiLearn({ hippoRoot, tenantId, actor: mcpActor(ctx) }, { repoPath: process.cwd(), days, profile: MCP_LEARN });
|
|
74
|
+
if (result.status === 'not-a-repo')
|
|
75
|
+
return 'No git history found.';
|
|
76
|
+
if (result.status === 'no-commits')
|
|
77
|
+
return 'No fix/revert/bug commits found in the specified period.';
|
|
78
|
+
const { added, skipped, rejected, lowInfo } = result;
|
|
79
|
+
const rejectedSuffix = rejected > 0 ? `, ${rejected} rejected values skipped` : '';
|
|
80
|
+
const lowInfoSuffix = lowInfo > 0 ? `, ${lowInfo} low-information subjects dropped` : '';
|
|
81
|
+
return `Git learn: ${added} new, ${skipped} duplicates skipped${rejectedSuffix}${lowInfoSuffix} (scanned ${days} days)`;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=memory-tools.js.map
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { loadConfig } from '../config.js';
|
|
2
|
+
import type { Actor as ApiActor } from '../api.js';
|
|
3
|
+
import { type ResolveProjectIdentityOpts } from '../project-identity.js';
|
|
4
|
+
/** Same bounded walk as the CLI (ends at home, so HIPPO_HOME wins over ~/.hippo); cwd/opts are the test seam. */
|
|
5
|
+
export declare function findHippoRoot(cwd?: string, opts?: ResolveProjectIdentityOpts): string | null;
|
|
6
|
+
interface McpRequest {
|
|
7
|
+
jsonrpc: '2.0';
|
|
8
|
+
id: number | string;
|
|
9
|
+
method: string;
|
|
10
|
+
params?: Record<string, JsonValue>;
|
|
11
|
+
}
|
|
12
|
+
interface McpResponse {
|
|
13
|
+
jsonrpc: '2.0';
|
|
14
|
+
id: number | string | null;
|
|
15
|
+
result?: unknown;
|
|
16
|
+
error?: {
|
|
17
|
+
code: number;
|
|
18
|
+
message: string;
|
|
19
|
+
data?: {
|
|
20
|
+
requestId: string;
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/** JSON-RPC reply for a request that threw: typed API errors keep their text; anything else is logged and answered generically. */
|
|
25
|
+
export declare function mcpErrorResponse<E>(id: McpResponse['id'], err: E, requestId?: string): McpResponse;
|
|
26
|
+
export type { McpRequest, McpResponse };
|
|
27
|
+
/**
|
|
28
|
+
* Optional execution context threaded from a non-stdio transport. When the
|
|
29
|
+
* HTTP transport in src/server.ts calls handleMcpRequest, it knows the
|
|
30
|
+
* server's bound hippoRoot and the auth-resolved tenantId/actor. Passing
|
|
31
|
+
* those through here lets executeTool skip the findHippoRoot() walk and
|
|
32
|
+
* the env-based resolveTenantId({}) fallback — both of which would
|
|
33
|
+
* otherwise produce the wrong store and the wrong tenant for HTTP callers.
|
|
34
|
+
*
|
|
35
|
+
* Stdio callers pass nothing; behavior stays unchanged for that path.
|
|
36
|
+
*/
|
|
37
|
+
export interface McpContext {
|
|
38
|
+
hippoRoot: string;
|
|
39
|
+
tenantId: string;
|
|
40
|
+
actor: string;
|
|
41
|
+
/**
|
|
42
|
+
* The caller's role from the HTTP transport's auth. Absent for stdio, which
|
|
43
|
+
* is the local operator and runs as admin. Tools must use this rather than
|
|
44
|
+
* assuming admin, or a member key over HTTP-MCP would act as admin.
|
|
45
|
+
*/
|
|
46
|
+
role?: 'admin' | 'member';
|
|
47
|
+
/** EI2: scope grants for the HTTP-MCP caller's key. Absent for stdio (admin, needs none). */
|
|
48
|
+
scopes?: readonly string[];
|
|
49
|
+
viaAuthResolver?: true;
|
|
50
|
+
/** Set by the HTTP transport for the host's operator; a context without a role is in-process and implies it. */
|
|
51
|
+
hostAdmin?: true;
|
|
52
|
+
/**
|
|
53
|
+
* Per-client key for state isolation under HTTP-MCP. For stdio: 'stdio-${pid}'
|
|
54
|
+
* (one process = one client). For HTTP-SSE / HTTP MCP: hash(bearer + remoteAddr)
|
|
55
|
+
* built by src/server.ts when constructing McpContext for the request.
|
|
56
|
+
* Optional for backwards compatibility; defaults to `${tenantId}:default`.
|
|
57
|
+
*/
|
|
58
|
+
clientKey?: string;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* The api-layer actor for a tool call. Stdio (no ctx) is the local operator
|
|
62
|
+
* and runs as admin; over HTTP the transport's authenticated role is used, so
|
|
63
|
+
* a member key never acts as admin through MCP.
|
|
64
|
+
*/
|
|
65
|
+
export declare function mcpActor(ctx: McpContext | undefined): ApiActor;
|
|
66
|
+
export type JsonValue = string | number | boolean | null | JsonValue[] | {
|
|
67
|
+
[key: string]: JsonValue;
|
|
68
|
+
};
|
|
69
|
+
export declare function isJsonString(v: JsonValue | undefined): v is string;
|
|
70
|
+
export declare function isJsonBoolean(v: JsonValue | undefined): v is boolean;
|
|
71
|
+
export declare function isJsonObjectRecord(v: JsonValue | undefined): v is {
|
|
72
|
+
[key: string]: JsonValue;
|
|
73
|
+
};
|
|
74
|
+
/** One tool call after the store, config and tenant are resolved; every handler reads the same four. */
|
|
75
|
+
export interface ToolCall {
|
|
76
|
+
args: Record<string, JsonValue>;
|
|
77
|
+
ctx?: McpContext;
|
|
78
|
+
hippoRoot: string;
|
|
79
|
+
config: ReturnType<typeof loadConfig>;
|
|
80
|
+
tenantId: string;
|
|
81
|
+
}
|
|
82
|
+
export type ToolHandler = (call: ToolCall) => string | Promise<string>;
|
|
83
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// MCP wire types, the caller context, and the JSON predicates every tool handler narrows its arguments with.
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import { randomUUID } from 'node:crypto';
|
|
4
|
+
import { INTERNAL_ERROR_MESSAGE, mapApiError } from '../http-util.js';
|
|
5
|
+
import { log } from '../log.js';
|
|
6
|
+
import { getGlobalRoot } from '../shared.js';
|
|
7
|
+
import { findHippoStoreDir } from '../project-identity.js';
|
|
8
|
+
import { isSqliteBusy, STORE_BUSY_MESSAGE } from '../db.js';
|
|
9
|
+
// ── Find hippo root ──
|
|
10
|
+
/** Same bounded walk as the CLI (ends at home, so HIPPO_HOME wins over ~/.hippo); cwd/opts are the test seam. */
|
|
11
|
+
export function findHippoRoot(cwd = process.cwd(), opts) {
|
|
12
|
+
const local = findHippoStoreDir(cwd, opts);
|
|
13
|
+
if (local !== null)
|
|
14
|
+
return local;
|
|
15
|
+
// Global fallback (respects $HIPPO_HOME / $XDG_DATA_HOME)
|
|
16
|
+
const global = getGlobalRoot();
|
|
17
|
+
return fs.existsSync(global) ? global : null;
|
|
18
|
+
}
|
|
19
|
+
/** JSON-RPC reply for a request that threw: typed API errors keep their text; anything else is logged and answered generically. */
|
|
20
|
+
export function mcpErrorResponse(id, err, requestId = randomUUID()) {
|
|
21
|
+
if (isSqliteBusy(err))
|
|
22
|
+
return { jsonrpc: '2.0', id, error: { code: -32603, message: STORE_BUSY_MESSAGE } };
|
|
23
|
+
const { status, message } = mapApiError(err);
|
|
24
|
+
if (status !== 500)
|
|
25
|
+
return { jsonrpc: '2.0', id, error: { code: -32603, message } };
|
|
26
|
+
log.error(`mcp request failed: ${err instanceof Error ? err.message : String(err)}`, { requestId });
|
|
27
|
+
return {
|
|
28
|
+
jsonrpc: '2.0',
|
|
29
|
+
id,
|
|
30
|
+
error: { code: -32603, message: `${INTERNAL_ERROR_MESSAGE} (request id ${requestId})`, data: { requestId } },
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* The api-layer actor for a tool call. Stdio (no ctx) is the local operator
|
|
35
|
+
* and runs as admin; over HTTP the transport's authenticated role is used, so
|
|
36
|
+
* a member key never acts as admin through MCP.
|
|
37
|
+
*/
|
|
38
|
+
export function mcpActor(ctx) {
|
|
39
|
+
const actor = { subject: ctx?.actor ?? 'mcp', role: ctx?.role ?? 'admin', scopes: ctx?.scopes };
|
|
40
|
+
if (ctx?.viaAuthResolver)
|
|
41
|
+
actor.viaAuthResolver = true;
|
|
42
|
+
if (ctx?.role === undefined || ctx.hostAdmin)
|
|
43
|
+
actor.hostAdmin = true;
|
|
44
|
+
return actor;
|
|
45
|
+
}
|
|
46
|
+
export function isJsonString(v) {
|
|
47
|
+
return typeof v === 'string';
|
|
48
|
+
}
|
|
49
|
+
export function isJsonBoolean(v) {
|
|
50
|
+
return typeof v === 'boolean';
|
|
51
|
+
}
|
|
52
|
+
export function isJsonObjectRecord(v) {
|
|
53
|
+
return v !== undefined && v !== null && typeof v === 'object' && !Array.isArray(v);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type ToolCall } from './protocol.js';
|
|
2
|
+
export declare function runRecallTool(call: ToolCall): Promise<string>;
|
|
3
|
+
export declare function runAssembleTool({ args, ctx, hippoRoot, tenantId }: ToolCall): string;
|
|
4
|
+
export declare function runDrillTool({ args, ctx, hippoRoot, tenantId }: ToolCall): string;
|
|
5
|
+
export declare function runContextTool({ args, ctx, hippoRoot, config, tenantId }: ToolCall): Promise<string>;
|
|
6
|
+
//# sourceMappingURL=recall-tools.d.ts.map
|