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,556 @@
|
|
|
1
|
+
// Verbs that weaken, suppress or retire memories: outcome, forget, conflicts, reject, dormant, quarantine, invalidate.
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { readEntry } from '../store/entry-reads.js';
|
|
4
|
+
import { listMemoryConflicts, resolveConflict } from '../store/conflicts.js';
|
|
5
|
+
import { rejectValue, unrejectValue, listRejectionsForTenant } from '../reject-flow.js';
|
|
6
|
+
import { RejectedValueError } from '../rejection.js';
|
|
7
|
+
import { loadConfig } from '../config.js';
|
|
8
|
+
import { isGitRepo } from '../autolearn.js';
|
|
9
|
+
import { invalidateMatching } from '../invalidation.js';
|
|
10
|
+
import * as api from '../api.js';
|
|
11
|
+
import * as client from '../client.js';
|
|
12
|
+
import { resolveTenantId } from '../tenant.js';
|
|
13
|
+
import { printError } from './output.js';
|
|
14
|
+
import { parseCountFlag, requireInit, runChurnStaleForRepo, runViaServerIfAvailable, fmt, resolveAuthRoot, } from './shared.js';
|
|
15
|
+
export function cmdOutcome(hippoRoot, flags) {
|
|
16
|
+
requireInit(hippoRoot);
|
|
17
|
+
const good = Boolean(flags['good']);
|
|
18
|
+
const bad = Boolean(flags['bad']);
|
|
19
|
+
if (!good && !bad) {
|
|
20
|
+
printError('Specify --good or --bad');
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
// Behavior fix (v1.11.3): cmdOutcome used to bypass api.outcome and do its
|
|
24
|
+
// own readEntry/writeEntry inline, which silently skipped the audit_log
|
|
25
|
+
// emission that the MCP outcome path already has via api.outcome. T6
|
|
26
|
+
// rewires through api.outcome so every successful CLI 'outcome' call now
|
|
27
|
+
// writes one audit_log row per affected id, matching MCP parity.
|
|
28
|
+
const ctx = {
|
|
29
|
+
hippoRoot,
|
|
30
|
+
tenantId: resolveTenantId({}),
|
|
31
|
+
actor: api.adminActor('cli'),
|
|
32
|
+
};
|
|
33
|
+
const specificId = flags['id'] ? String(flags['id']) : null;
|
|
34
|
+
let updated;
|
|
35
|
+
if (specificId) {
|
|
36
|
+
updated = api.outcome(ctx, [specificId], good).applied;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
const r = api.outcomeForLastRecall(ctx, good);
|
|
40
|
+
if (r.ids.length === 0) {
|
|
41
|
+
console.log('No recent recall to apply outcome to. Use --id <id> to target a specific memory.');
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
updated = r.applied;
|
|
45
|
+
}
|
|
46
|
+
console.log(`Applied ${good ? 'positive' : 'negative'} outcome to ${updated} memor${updated === 1 ? 'y' : 'ies'}`);
|
|
47
|
+
}
|
|
48
|
+
// Shared between the forget dispatch and cmdForget so the message can't drift.
|
|
49
|
+
const ARCHIVE_REASON_REQUIRED = 'hippo forget --archive requires --reason "<why>" (recorded on the archive).';
|
|
50
|
+
function cmdForget(hippoRoot, id, flags) {
|
|
51
|
+
requireInit(hippoRoot);
|
|
52
|
+
const ctx = {
|
|
53
|
+
hippoRoot,
|
|
54
|
+
tenantId: resolveTenantId({}),
|
|
55
|
+
actor: api.adminActor('cli'),
|
|
56
|
+
};
|
|
57
|
+
// A3: raw memories (Slack / GitHub connector ingestion) are append-only — a
|
|
58
|
+
// BEFORE-DELETE trigger aborts any delete. archiveRaw is the sanctioned
|
|
59
|
+
// removal path; it records ctx.actor as the archiver for provenance.
|
|
60
|
+
if (flags['archive'] === true) {
|
|
61
|
+
const reason = typeof flags['reason'] === 'string' ? flags['reason'] : null;
|
|
62
|
+
if (!reason) {
|
|
63
|
+
printError(ARCHIVE_REASON_REQUIRED);
|
|
64
|
+
process.exit(1);
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
api.archiveRaw(ctx, id, reason);
|
|
68
|
+
console.log(`Archived ${id}`);
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
printError(`Could not archive ${id}: ${err instanceof Error ? err.message : String(err)}`);
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
api.forget(ctx, id);
|
|
78
|
+
console.log(`Forgot ${id}`);
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
82
|
+
if (/append-only/i.test(msg)) {
|
|
83
|
+
// The delete was refused by the append-only trigger — this is a raw
|
|
84
|
+
// memory, not a missing one. Point the user at the archive path.
|
|
85
|
+
printError(rawForgetRefusal(id));
|
|
86
|
+
}
|
|
87
|
+
else if (api.isDormant(ctx, id)) {
|
|
88
|
+
// Sleep moved it to the dormant store: it is not in active memory, so
|
|
89
|
+
// point at the command that owns it.
|
|
90
|
+
printError(`${id} is dormant, not in active memory. Delete it for good: hippo dormant forget ${id} ` +
|
|
91
|
+
`(or bring it back: hippo dormant restore ${id})`);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
printError(`Memory not found: ${id}`);
|
|
95
|
+
}
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function rawForgetRefusal(id) {
|
|
100
|
+
return `Cannot forget ${id}: it is a raw, append-only memory. Archive it instead: hippo forget ${id} --archive --reason "<why>"`;
|
|
101
|
+
}
|
|
102
|
+
// Refuses exactly where the real run would, so "Would forget" is a promise, not a guess.
|
|
103
|
+
function previewForget(hippoRoot, id, archive) {
|
|
104
|
+
requireInit(hippoRoot);
|
|
105
|
+
const entry = readEntry(hippoRoot, id, resolveTenantId({}));
|
|
106
|
+
if (!entry) {
|
|
107
|
+
printError(`Memory not found: ${id}`);
|
|
108
|
+
process.exit(1);
|
|
109
|
+
}
|
|
110
|
+
if (!archive && entry.kind === 'raw') {
|
|
111
|
+
printError(rawForgetRefusal(id));
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
if (archive && entry.kind !== 'raw') {
|
|
115
|
+
printError(`Could not archive ${id}: memory ${id} is not raw (kind=${entry.kind})`);
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
const snippet = entry.content.length > 80 ? `${entry.content.slice(0, 80)}...` : entry.content;
|
|
119
|
+
console.log(`Would ${archive ? 'archive' : 'forget'} ${id} (dry run, nothing changed): "${snippet}"`);
|
|
120
|
+
}
|
|
121
|
+
export function cmdConflicts(hippoRoot, flags) {
|
|
122
|
+
requireInit(hippoRoot);
|
|
123
|
+
const conflicts = listMemoryConflicts(hippoRoot, String(flags['status'] ?? 'open'));
|
|
124
|
+
if (flags['json']) {
|
|
125
|
+
console.log(JSON.stringify({ conflicts }, null, 2));
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
if (conflicts.length === 0) {
|
|
129
|
+
console.log('No memory conflicts found.');
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
console.log(`Found ${conflicts.length} memory conflict${conflicts.length === 1 ? '' : 's'}\n`);
|
|
133
|
+
for (const conflict of conflicts) {
|
|
134
|
+
console.log(`--- conflict_${conflict.id} score=${fmt(conflict.score, 3)} status=${conflict.status}`);
|
|
135
|
+
console.log(` ${conflict.memory_a_id} <-> ${conflict.memory_b_id}`);
|
|
136
|
+
console.log(` reason: ${conflict.reason}`);
|
|
137
|
+
console.log('');
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
export function cmdResolve(hippoRoot, args, flags) {
|
|
141
|
+
requireInit(hippoRoot);
|
|
142
|
+
const rawId = args[0] ?? '';
|
|
143
|
+
// Accept "42" or "conflict_42"
|
|
144
|
+
const conflictId = parseInt(rawId.replace(/^conflict_/, ''), 10);
|
|
145
|
+
if (isNaN(conflictId)) {
|
|
146
|
+
printError('Usage: hippo resolve <conflict_id> --keep <memory_id> [--forget]');
|
|
147
|
+
process.exit(1);
|
|
148
|
+
}
|
|
149
|
+
const tenantId = resolveTenantId({});
|
|
150
|
+
const keepId = String(flags['keep'] ?? '').trim();
|
|
151
|
+
if (!keepId) {
|
|
152
|
+
// Show the conflict details to help the user decide
|
|
153
|
+
const conflicts = listMemoryConflicts(hippoRoot, 'open', tenantId);
|
|
154
|
+
const conflict = conflicts.find((c) => c.id === conflictId);
|
|
155
|
+
if (!conflict) {
|
|
156
|
+
printError(`Conflict ${conflictId} not found or already resolved.`);
|
|
157
|
+
process.exit(1);
|
|
158
|
+
}
|
|
159
|
+
console.log(`Conflict ${conflictId}:`);
|
|
160
|
+
console.log(` ${conflict.memory_a_id} <-> ${conflict.memory_b_id}`);
|
|
161
|
+
console.log(` Reason: ${conflict.reason}`);
|
|
162
|
+
console.log('');
|
|
163
|
+
const entryA = readEntry(hippoRoot, conflict.memory_a_id, tenantId);
|
|
164
|
+
const entryB = readEntry(hippoRoot, conflict.memory_b_id, tenantId);
|
|
165
|
+
if (entryA) {
|
|
166
|
+
console.log(` [A] ${conflict.memory_a_id}:`);
|
|
167
|
+
console.log(` ${entryA.content.slice(0, 120)}${entryA.content.length > 120 ? '...' : ''}`);
|
|
168
|
+
}
|
|
169
|
+
if (entryB) {
|
|
170
|
+
console.log(` [B] ${conflict.memory_b_id}:`);
|
|
171
|
+
console.log(` ${entryB.content.slice(0, 120)}${entryB.content.length > 120 ? '...' : ''}`);
|
|
172
|
+
}
|
|
173
|
+
console.log('');
|
|
174
|
+
console.log(`Resolve with: hippo resolve ${conflictId} --keep <memory_id> [--forget] [--reject-loser [--reason "<why>"]]`);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
const forgetLoser = Boolean(flags['forget']);
|
|
178
|
+
// AT1: --reject-loser tombstones the loser's normalized digest so it
|
|
179
|
+
// cannot be re-asserted later, in addition to removing it (kind-aware).
|
|
180
|
+
// --reason defaults to a conflict-context string when omitted (resolve
|
|
181
|
+
// already has the conflict id + keepId; unlike `hippo reject`, a reason
|
|
182
|
+
// is not strictly required here).
|
|
183
|
+
const rejectLoser = Boolean(flags['reject-loser']);
|
|
184
|
+
const reasonFlag = typeof flags['reason'] === 'string' ? flags['reason'] : undefined;
|
|
185
|
+
const result = resolveConflict(hippoRoot, conflictId, keepId, forgetLoser, tenantId, {
|
|
186
|
+
rejectLoserValue: rejectLoser,
|
|
187
|
+
reason: reasonFlag,
|
|
188
|
+
});
|
|
189
|
+
if (!result) {
|
|
190
|
+
printError(`Could not resolve conflict ${conflictId}. Check the ID and --keep value.`);
|
|
191
|
+
process.exit(1);
|
|
192
|
+
}
|
|
193
|
+
const action = rejectLoser
|
|
194
|
+
? 'rejected (tombstoned) and removed'
|
|
195
|
+
: forgetLoser
|
|
196
|
+
? 'deleted'
|
|
197
|
+
: 'weakened (half-life halved)';
|
|
198
|
+
console.log(`Resolved conflict ${conflictId}: kept ${keepId}, ${action} ${result.loserId}`);
|
|
199
|
+
}
|
|
200
|
+
// ---------------------------------------------------------------------------
|
|
201
|
+
// AT1: reject / rejections / unreject
|
|
202
|
+
// docs/plans/2026-08-15-at1-rejected-value-tombstone.md §4
|
|
203
|
+
// ---------------------------------------------------------------------------
|
|
204
|
+
export function cmdReject(hippoRoot, args, flags) {
|
|
205
|
+
// Store resolution mirrors `hippo remember`: --global writes to the
|
|
206
|
+
// global store, otherwise the local store (requireInit'd via resolveAuthRoot).
|
|
207
|
+
const root = resolveAuthRoot(hippoRoot, flags);
|
|
208
|
+
const tenantId = resolveTenantId({});
|
|
209
|
+
// --reason is REQUIRED (plan §4, grill issue 4): the tombstone stores no
|
|
210
|
+
// content, so reason is its only human-readable identity.
|
|
211
|
+
const reason = typeof flags['reason'] === 'string' ? flags['reason'].trim() : '';
|
|
212
|
+
if (!reason) {
|
|
213
|
+
printError('hippo reject requires --reason "<why>" (the tombstone stores no content; reason is its only identity).');
|
|
214
|
+
process.exit(1);
|
|
215
|
+
}
|
|
216
|
+
const valueFlag = typeof flags['value'] === 'string' ? flags['value'] : undefined;
|
|
217
|
+
const memoryId = args[0];
|
|
218
|
+
if (!memoryId && valueFlag === undefined) {
|
|
219
|
+
printError('Usage: hippo reject <memory-id> --reason "<why>"');
|
|
220
|
+
printError(' or: hippo reject --value "<text>" --reason "<why>"');
|
|
221
|
+
process.exit(1);
|
|
222
|
+
}
|
|
223
|
+
if (memoryId && valueFlag !== undefined) {
|
|
224
|
+
// Ambiguous ask: silently preferring one form would ignore the other
|
|
225
|
+
// without feedback (code-review round-1 low).
|
|
226
|
+
printError('hippo reject takes EITHER a memory id OR --value, not both.');
|
|
227
|
+
process.exit(1);
|
|
228
|
+
}
|
|
229
|
+
try {
|
|
230
|
+
const result = rejectValue({
|
|
231
|
+
hippoRoot: root,
|
|
232
|
+
tenantId,
|
|
233
|
+
actor: 'cli',
|
|
234
|
+
reason,
|
|
235
|
+
memoryId: valueFlag === undefined ? memoryId : undefined,
|
|
236
|
+
value: valueFlag,
|
|
237
|
+
});
|
|
238
|
+
const digestPrefix = result.digest.slice(0, 12);
|
|
239
|
+
const preview = result.content.length > 80 ? `${result.content.slice(0, 80)}...` : result.content;
|
|
240
|
+
console.log(`Rejected [${digestPrefix}...]: "${preview}"`);
|
|
241
|
+
console.log(` Reason: ${reason}`);
|
|
242
|
+
if (result.removedIds.length > 0) {
|
|
243
|
+
console.log(` Removed ${result.removedIds.length} matching row(s): ${result.removedIds.join(', ')}`);
|
|
244
|
+
if (result.successorIds.length > 0) {
|
|
245
|
+
console.log(` Merged rows that held it keep their other texts in: ${result.successorIds.join(', ')}`);
|
|
246
|
+
}
|
|
247
|
+
if (result.dormantSuccessorIds.length > 0) {
|
|
248
|
+
console.log(` Dormant merged rows that held it keep their other texts in: ${result.dormantSuccessorIds.join(', ')}`);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
console.log(' No live rows matched (pre-emptive tombstone).');
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
catch (err) {
|
|
256
|
+
printError(`Could not reject: ${err instanceof Error ? err.message : String(err)}`);
|
|
257
|
+
process.exit(1);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
export function cmdRejections(hippoRoot, flags) {
|
|
261
|
+
const root = resolveAuthRoot(hippoRoot, flags);
|
|
262
|
+
const tenantId = resolveTenantId({});
|
|
263
|
+
const rows = listRejectionsForTenant(root, tenantId);
|
|
264
|
+
if (flags['json']) {
|
|
265
|
+
console.log(JSON.stringify({ rejections: rows }, null, 2));
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
if (rows.length === 0) {
|
|
269
|
+
console.log('No rejected values.');
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
console.log(`${rows.length} rejected value(s):\n`);
|
|
273
|
+
for (const row of rows) {
|
|
274
|
+
console.log(`--- ${row.digest.slice(0, 12)}...`);
|
|
275
|
+
console.log(` Reason: ${row.reason ?? 'none given'}`);
|
|
276
|
+
console.log(` Rejected by: ${row.rejectedBy ?? 'unknown'}`);
|
|
277
|
+
console.log(` Rejected at: ${row.rejectedAt}`);
|
|
278
|
+
if (row.sourceMemoryId)
|
|
279
|
+
console.log(` Source id: ${row.sourceMemoryId}`);
|
|
280
|
+
if (row.normalizedChars !== null)
|
|
281
|
+
console.log(` Chars: ${row.normalizedChars}`);
|
|
282
|
+
console.log('');
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
export function cmdUnreject(hippoRoot, args, flags) {
|
|
286
|
+
const root = resolveAuthRoot(hippoRoot, flags);
|
|
287
|
+
const tenantId = resolveTenantId({});
|
|
288
|
+
const digestOrPrefix = (args[0] ?? '').trim();
|
|
289
|
+
if (!digestOrPrefix) {
|
|
290
|
+
printError('Usage: hippo unreject <digest-or-prefix>');
|
|
291
|
+
process.exit(1);
|
|
292
|
+
}
|
|
293
|
+
const outcome = unrejectValue(root, tenantId, digestOrPrefix, 'cli');
|
|
294
|
+
if (outcome.status === 'not_found') {
|
|
295
|
+
printError(`No rejected value matches "${digestOrPrefix}". Run \`hippo rejections\` to list tombstones.`);
|
|
296
|
+
process.exit(1);
|
|
297
|
+
}
|
|
298
|
+
if (outcome.status === 'ambiguous') {
|
|
299
|
+
printError(`"${digestOrPrefix}" matches ${outcome.candidates.length} tombstones. Use a longer prefix:`);
|
|
300
|
+
for (const c of outcome.candidates) {
|
|
301
|
+
printError(` ${c.digest.slice(0, 16)}... ${c.reason ?? 'none given'}`);
|
|
302
|
+
}
|
|
303
|
+
process.exit(1);
|
|
304
|
+
}
|
|
305
|
+
console.log(`Unrejected [${outcome.digest.slice(0, 12)}...] (was: ${outcome.reason ?? 'none given'})`);
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* `hippo dormant [list] [<query>...] [--limit <n>] [--json] [--global]`,
|
|
309
|
+
* `hippo dormant restore <id>`, `hippo dormant forget <id>`.
|
|
310
|
+
* Dormant memories are what sleep keeps instead of deleting (on by default;
|
|
311
|
+
* `"dormant": { "enabled": false }` in .hippo/config.json deletes instead).
|
|
312
|
+
*/
|
|
313
|
+
export function cmdDormant(hippoRoot, args, flags) {
|
|
314
|
+
const root = resolveAuthRoot(hippoRoot, flags);
|
|
315
|
+
const ctx = {
|
|
316
|
+
hippoRoot: root,
|
|
317
|
+
tenantId: resolveTenantId({}),
|
|
318
|
+
actor: api.adminActor('cli'),
|
|
319
|
+
};
|
|
320
|
+
const sub = args[0];
|
|
321
|
+
if (sub === 'restore' || sub === 'forget') {
|
|
322
|
+
const id = (args[1] ?? '').trim();
|
|
323
|
+
if (!id) {
|
|
324
|
+
printError(`Usage: hippo dormant ${sub} <id>`);
|
|
325
|
+
process.exit(1);
|
|
326
|
+
}
|
|
327
|
+
try {
|
|
328
|
+
if (sub === 'restore') {
|
|
329
|
+
api.restoreDormant(ctx, id);
|
|
330
|
+
console.log(`Restored ${id} to active memory.`);
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
api.forgetDormant(ctx, id);
|
|
334
|
+
console.log(`Forgot dormant memory ${id} permanently.`);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
catch (err) {
|
|
338
|
+
if (err instanceof RejectedValueError) {
|
|
339
|
+
printError(`Cannot restore ${id}: its value was rejected (${err.reason ?? 'no reason given'}). Run \`hippo unreject\` first to allow it.`);
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
printError(`Could not ${sub} ${id}: ${err instanceof Error ? err.message : String(err)}`);
|
|
343
|
+
}
|
|
344
|
+
process.exit(1);
|
|
345
|
+
}
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
348
|
+
const queryArgs = sub === 'list' ? args.slice(1) : args;
|
|
349
|
+
const limit = parseCountFlag(flags['limit']);
|
|
350
|
+
const rows = api.listDormant(ctx, {
|
|
351
|
+
query: queryArgs.join(' '),
|
|
352
|
+
limit: limit > 0 ? limit : undefined,
|
|
353
|
+
});
|
|
354
|
+
if (flags['json']) {
|
|
355
|
+
console.log(JSON.stringify({ dormant: rows }, null, 2));
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
if (rows.length === 0) {
|
|
359
|
+
console.log(queryArgs.length > 0 ? 'No dormant memories match.' : 'No dormant memories.');
|
|
360
|
+
if (!loadConfig(root).dormant.enabled) {
|
|
361
|
+
console.log(`Sleep deletes faded memories. To keep them dormant instead, set "dormant": { "enabled": true } in ${path.join(root, 'config.json')}.`);
|
|
362
|
+
}
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
console.log(`${rows.length} dormant memor${rows.length === 1 ? 'y' : 'ies'}${queryArgs.length > 0 ? ' matching' : ''} (newest first):\n`);
|
|
366
|
+
for (const row of rows) {
|
|
367
|
+
const preview = row.content.length > 100 ? `${row.content.slice(0, 100)}...` : row.content;
|
|
368
|
+
console.log(`--- ${row.id}`);
|
|
369
|
+
console.log(` ${preview}`);
|
|
370
|
+
console.log(` Dormant since ${row.dormantAt.slice(0, 10)} (${row.reason}, strength ${row.strength.toFixed(3)})${row.tags.length > 0 ? ` tags: ${row.tags.join(', ')}` : ''}`);
|
|
371
|
+
console.log('');
|
|
372
|
+
}
|
|
373
|
+
console.log('Bring one back: hippo dormant restore <id> Delete for good: hippo dormant forget <id>');
|
|
374
|
+
}
|
|
375
|
+
/** `hippo quarantine [list] [--all] [--json] [--global]`, `quarantine approve <id>`, `quarantine reject <id>` (CD5 poisoning defence). */
|
|
376
|
+
export function cmdQuarantine(hippoRoot, args, flags) {
|
|
377
|
+
const root = resolveAuthRoot(hippoRoot, flags);
|
|
378
|
+
const ctx = {
|
|
379
|
+
hippoRoot: root,
|
|
380
|
+
tenantId: resolveTenantId({}),
|
|
381
|
+
actor: api.adminActor('cli'),
|
|
382
|
+
};
|
|
383
|
+
const sub = args[0];
|
|
384
|
+
if (sub === 'approve' || sub === 'reject') {
|
|
385
|
+
const id = (args[1] ?? '').trim();
|
|
386
|
+
if (!id) {
|
|
387
|
+
printError(`Usage: hippo quarantine ${sub} <id>`);
|
|
388
|
+
process.exit(1);
|
|
389
|
+
}
|
|
390
|
+
try {
|
|
391
|
+
if (sub === 'approve') {
|
|
392
|
+
api.quarantineApprove(ctx, id);
|
|
393
|
+
console.log(`Approved ${id}: restored to its original scope.`);
|
|
394
|
+
}
|
|
395
|
+
else {
|
|
396
|
+
api.quarantineReject(ctx, id);
|
|
397
|
+
console.log(`Rejected ${id}: stays quarantined.`);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
catch (err) {
|
|
401
|
+
printError(`Could not ${sub} ${id}: ${err instanceof Error ? err.message : String(err)}`);
|
|
402
|
+
process.exit(1);
|
|
403
|
+
}
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
const status = flags['all'] ? 'all' : 'pending';
|
|
407
|
+
const rows = api.quarantineList(ctx, { status });
|
|
408
|
+
if (flags['json']) {
|
|
409
|
+
console.log(JSON.stringify({ quarantine: rows }, null, 2));
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
412
|
+
if (rows.length === 0) {
|
|
413
|
+
console.log(status === 'all' ? 'No quarantined memories.' : 'No pending quarantined memories.');
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
416
|
+
console.log(`${rows.length} quarantined memor${rows.length === 1 ? 'y' : 'ies'} (newest first):\n`);
|
|
417
|
+
for (const row of rows) {
|
|
418
|
+
console.log(`--- ${row.id} [${row.status}]`);
|
|
419
|
+
console.log(` ${row.contentPreview}`);
|
|
420
|
+
console.log(` ${row.reason}, original scope ${row.originalScope ?? '(none)'}, quarantined ${row.quarantinedAt.slice(0, 10)}`);
|
|
421
|
+
console.log('');
|
|
422
|
+
}
|
|
423
|
+
console.log('Approve: hippo quarantine approve <id> Reject: hippo quarantine reject <id>');
|
|
424
|
+
}
|
|
425
|
+
export async function handleForget({ hippoRoot, args, flags }) {
|
|
426
|
+
const id = args[0];
|
|
427
|
+
if (!id) {
|
|
428
|
+
printError('Please provide a memory ID.');
|
|
429
|
+
process.exit(1);
|
|
430
|
+
}
|
|
431
|
+
// Archive has its own HTTP route (POST /v1/memories/:id/archive); route
|
|
432
|
+
// both branches the same way the direct path does.
|
|
433
|
+
const archive = flags['archive'] === true;
|
|
434
|
+
const reason = typeof flags['reason'] === 'string' ? flags['reason'] : null;
|
|
435
|
+
if (archive && !reason) {
|
|
436
|
+
printError(ARCHIVE_REASON_REQUIRED);
|
|
437
|
+
process.exit(1);
|
|
438
|
+
}
|
|
439
|
+
if (flags['dry-run'] === true) {
|
|
440
|
+
previewForget(hippoRoot, id, archive);
|
|
441
|
+
return;
|
|
442
|
+
}
|
|
443
|
+
const routed = await runViaServerIfAvailable(hippoRoot, async (info, apiKey) => {
|
|
444
|
+
try {
|
|
445
|
+
if (archive) {
|
|
446
|
+
await client.archiveRaw(info.url, apiKey, id, reason);
|
|
447
|
+
console.log(`Archived ${id}`);
|
|
448
|
+
}
|
|
449
|
+
else {
|
|
450
|
+
await client.forget(info.url, apiKey, id);
|
|
451
|
+
console.log(`Forgot ${id}`);
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
catch (err) {
|
|
455
|
+
// A server that died after the health probe is the caller's transport
|
|
456
|
+
// fallback to handle, not an error to report to the user.
|
|
457
|
+
if (client.classifyTransportFailure(err) !== 'none')
|
|
458
|
+
throw err;
|
|
459
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
460
|
+
printError(archive ? `Could not archive ${id}: ${msg}` : msg);
|
|
461
|
+
process.exit(1);
|
|
462
|
+
}
|
|
463
|
+
});
|
|
464
|
+
if (routed)
|
|
465
|
+
return;
|
|
466
|
+
cmdForget(hippoRoot, id, flags);
|
|
467
|
+
}
|
|
468
|
+
function invalidateChurn(hippoRoot, args, flags) {
|
|
469
|
+
if (args[0] || flags['id'] !== undefined) {
|
|
470
|
+
printError('Usage: hippo invalidate --churn [--dry-run]');
|
|
471
|
+
printError('--churn takes no pattern or --id.');
|
|
472
|
+
process.exit(1);
|
|
473
|
+
}
|
|
474
|
+
if (!isGitRepo(process.cwd())) {
|
|
475
|
+
printError('hippo invalidate --churn must run inside a git repository.');
|
|
476
|
+
process.exit(1);
|
|
477
|
+
}
|
|
478
|
+
const churnDryRun = flags['dry-run'] === true;
|
|
479
|
+
let churnFailed = false;
|
|
480
|
+
for (const { root, result } of runChurnStaleForRepo(hippoRoot, churnDryRun)) {
|
|
481
|
+
if (result.error) {
|
|
482
|
+
printError(`Churn-staleness check failed for ${root}: ${result.error}`);
|
|
483
|
+
churnFailed = true;
|
|
484
|
+
continue;
|
|
485
|
+
}
|
|
486
|
+
if (result.preview.length === 0) {
|
|
487
|
+
console.log(`No churn-stale candidates in ${root}.`);
|
|
488
|
+
}
|
|
489
|
+
else if (churnDryRun) {
|
|
490
|
+
console.log(`DRY RUN - ${result.marked} memories in ${root} WOULD be tagged churn-stale (${result.alreadyMarked} already tagged):`);
|
|
491
|
+
}
|
|
492
|
+
else {
|
|
493
|
+
console.log(`Tagged ${result.marked} memories churn-stale in ${root} (${result.alreadyMarked} already tagged):`);
|
|
494
|
+
}
|
|
495
|
+
result.preview.forEach(p => console.log(` ${p.id} ${p.evidence} ${p.already ? '(already) ' : ''}${p.headline}`));
|
|
496
|
+
if (result.skippedPinned.length > 0) {
|
|
497
|
+
console.log(`Skipped ${result.skippedPinned.length} pinned: ${result.skippedPinned.join(', ')}`);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
if (churnFailed)
|
|
501
|
+
process.exit(1);
|
|
502
|
+
}
|
|
503
|
+
export function handleInvalidate({ hippoRoot, args, flags }) {
|
|
504
|
+
requireInit(hippoRoot);
|
|
505
|
+
if (flags['churn'] === true)
|
|
506
|
+
return invalidateChurn(hippoRoot, args, flags);
|
|
507
|
+
const target = args[0];
|
|
508
|
+
if (flags['id'] === true) {
|
|
509
|
+
// Value-less --id must never silently fall through to pattern mode
|
|
510
|
+
// (pattern mode writes broadly; an ignored --id reverses user intent).
|
|
511
|
+
printError('--id requires a memory id');
|
|
512
|
+
process.exit(1);
|
|
513
|
+
}
|
|
514
|
+
const onlyId = typeof flags['id'] === 'string' ? flags['id'] : undefined;
|
|
515
|
+
if (typeof flags['dry-run'] === 'string') {
|
|
516
|
+
// Dead: the earlier global BOOLEAN_FLAGS guard now exits first on any --dry-run=<v>.
|
|
517
|
+
// Kept as defence in depth on a destructive command.
|
|
518
|
+
printError('--dry-run takes no value');
|
|
519
|
+
process.exit(1);
|
|
520
|
+
}
|
|
521
|
+
const dryRun = flags['dry-run'] === true;
|
|
522
|
+
if ((target && onlyId) || (!target && !onlyId)) {
|
|
523
|
+
printError('Usage: hippo invalidate "<old pattern>" [--dry-run] [--reason "<why>"]');
|
|
524
|
+
printError(' hippo invalidate --id <memory-id> [--dry-run] [--reason "<why>"]');
|
|
525
|
+
printError('Pass a pattern OR --id, not both. Tag matching is EXACT: the full pattern must equal a tag.');
|
|
526
|
+
process.exit(1);
|
|
527
|
+
}
|
|
528
|
+
const reason = flags['reason'] || null;
|
|
529
|
+
const invTarget = {
|
|
530
|
+
from: target ?? `id:${onlyId}`,
|
|
531
|
+
to: reason,
|
|
532
|
+
type: 'migration',
|
|
533
|
+
};
|
|
534
|
+
const result = invalidateMatching(hippoRoot, invTarget, resolveTenantId({}), { dryRun, onlyId });
|
|
535
|
+
const label = target ? `"${target}"` : `--id ${onlyId}`;
|
|
536
|
+
if (result.dryRun) {
|
|
537
|
+
if (result.invalidated === 0) {
|
|
538
|
+
console.log(`DRY RUN - no memories would match ${label}.`);
|
|
539
|
+
}
|
|
540
|
+
else {
|
|
541
|
+
console.log(`DRY RUN - ${result.invalidated} memories WOULD be invalidated:`);
|
|
542
|
+
result.preview.forEach(p => console.log(` ${p.id} ${p.headline}`));
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
else if (result.invalidated === 0) {
|
|
546
|
+
console.log(`No memories matched ${label}.`);
|
|
547
|
+
}
|
|
548
|
+
else {
|
|
549
|
+
console.log(`Invalidated ${result.invalidated} memories referencing ${label}.`);
|
|
550
|
+
result.targets.forEach(id => console.log(` ${id}`));
|
|
551
|
+
}
|
|
552
|
+
if (result.skippedPinned.length > 0) {
|
|
553
|
+
console.log(`Skipped ${result.skippedPinned.length} pinned: ${result.skippedPinned.join(', ')}`);
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
//# sourceMappingURL=curate.js.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type CommandContext } from './shared.js';
|
|
2
|
+
export declare function cmdDag(hippoRoot: string, flags: Record<string, string | boolean | string[]>): void;
|
|
3
|
+
export declare function handleDrill({ hippoRoot, args, flags }: CommandContext): void;
|
|
4
|
+
export declare function handleAssemble({ hippoRoot, args, flags }: CommandContext): void;
|
|
5
|
+
//# sourceMappingURL=dag.d.ts.map
|