hippo-memory 1.60.0 → 1.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/ablation.js +9 -27
- package/dist/agent-memories/apply.js +4 -1
- package/dist/agent-memories/claude-code.js +1 -1
- package/dist/agent-memories/codex.js +1 -1
- package/dist/agent-memories/gemini.js +1 -1
- package/dist/agent-memories/legacy.js +1 -1
- package/dist/agent-memories/source.js +1 -1
- package/dist/agent-memories/sync.js +8 -3
- package/dist/ambient-store.d.ts +14 -0
- package/dist/ambient-store.js +90 -0
- package/dist/ambient.d.ts +23 -0
- package/dist/ambient.js +72 -50
- package/dist/api/assemble.d.ts +93 -0
- package/dist/api/assemble.js +152 -0
- package/dist/api/audit.d.ts +17 -0
- package/dist/api/audit.js +23 -0
- package/dist/api/auth.d.ts +79 -0
- package/dist/api/auth.js +178 -0
- package/dist/api/context-types.d.ts +105 -0
- package/dist/api/context-types.js +3 -0
- package/dist/api/context.d.ts +31 -0
- package/dist/api/context.js +705 -0
- package/dist/api/dormant.d.ts +30 -0
- package/dist/api/dormant.js +140 -0
- package/dist/api/drill-down.d.ts +84 -0
- package/dist/api/drill-down.js +123 -0
- package/dist/api/forget.d.ts +57 -0
- package/dist/api/forget.js +87 -0
- package/dist/api/goals.d.ts +18 -0
- package/dist/api/goals.js +33 -0
- package/dist/api/learn.d.ts +31 -0
- package/dist/api/learn.js +88 -0
- package/dist/api/outcome.d.ts +61 -0
- package/dist/api/outcome.js +66 -0
- package/dist/api/promote.d.ts +54 -0
- package/dist/api/promote.js +203 -0
- package/dist/api/quarantine.d.ts +24 -0
- package/dist/api/quarantine.js +121 -0
- package/dist/api/recall-types.d.ts +390 -0
- package/dist/api/recall-types.js +3 -0
- package/dist/api/recall.d.ts +36 -0
- package/dist/api/recall.js +634 -0
- package/dist/api/remember.d.ts +35 -0
- package/dist/api/remember.js +43 -0
- package/dist/api/sleep.d.ts +136 -0
- package/dist/api/sleep.js +271 -0
- package/dist/api/tokens.d.ts +26 -0
- package/dist/api/tokens.js +60 -0
- package/dist/api/types.d.ts +56 -0
- package/dist/api/types.js +38 -0
- package/dist/api.d.ts +20 -1262
- package/dist/api.js +25 -2727
- package/dist/audit.d.ts +3 -0
- package/dist/audit.js +6 -3
- package/dist/auth.d.ts +45 -4
- package/dist/auth.js +125 -48
- package/dist/autolearn.js +2 -2
- package/dist/capture/command.d.ts +33 -0
- package/dist/capture/command.js +264 -0
- package/dist/capture/compact.d.ts +44 -0
- package/dist/capture/compact.js +354 -0
- package/dist/capture/extract.d.ts +21 -0
- package/dist/capture/extract.js +464 -0
- package/dist/capture/transcript.d.ts +40 -0
- package/dist/capture/transcript.js +193 -0
- package/dist/capture-error.js +2 -1
- package/dist/churn-git.js +4 -2
- package/dist/cli/audit.d.ts +3 -0
- package/dist/cli/audit.js +159 -0
- package/dist/cli/auth.d.ts +2 -0
- package/dist/cli/auth.js +171 -0
- package/dist/cli/briefs.d.ts +4 -0
- package/dist/cli/briefs.js +435 -0
- package/dist/cli/card.d.ts +3 -0
- package/dist/cli/card.js +333 -0
- package/dist/cli/context.d.ts +15 -0
- package/dist/cli/context.js +366 -0
- package/dist/cli/continuity.d.ts +6 -0
- package/dist/cli/continuity.js +445 -0
- package/dist/cli/curate.d.ts +19 -0
- package/dist/cli/curate.js +555 -0
- package/dist/cli/dag.d.ts +5 -0
- package/dist/cli/dag.js +177 -0
- package/dist/cli/decisions.d.ts +4 -0
- package/dist/cli/decisions.js +528 -0
- package/dist/cli/eval.d.ts +5 -0
- package/dist/cli/eval.js +213 -0
- package/dist/cli/explain.d.ts +4 -0
- package/dist/cli/explain.js +150 -0
- package/dist/cli/goals.d.ts +2 -0
- package/dist/cli/goals.js +196 -0
- package/dist/cli/hook-blocks.d.ts +18 -0
- package/dist/cli/hook-blocks.js +233 -0
- package/dist/cli/init.d.ts +2 -0
- package/dist/cli/init.js +305 -0
- package/dist/cli/maintenance.d.ts +4 -0
- package/dist/cli/maintenance.js +179 -0
- package/dist/cli/playbooks.d.ts +4 -0
- package/dist/cli/playbooks.js +556 -0
- package/dist/cli/projects.js +1 -1
- package/dist/cli/recall.d.ts +7 -0
- package/dist/cli/recall.js +597 -0
- package/dist/cli/remember.d.ts +5 -0
- package/dist/cli/remember.js +442 -0
- package/dist/cli/serve.d.ts +5 -0
- package/dist/cli/serve.js +40 -0
- package/dist/cli/session-hooks.d.ts +29 -0
- package/dist/cli/session-hooks.js +637 -0
- package/dist/cli/setup.d.ts +4 -0
- package/dist/cli/setup.js +376 -0
- package/dist/cli/shared.d.ts +15 -19
- package/dist/cli/shared.js +50 -341
- package/dist/cli/slack.d.ts +2 -0
- package/dist/cli/slack.js +171 -0
- package/dist/cli/status.d.ts +18 -0
- package/dist/cli/status.js +400 -0
- package/dist/cli/transfer.d.ts +10 -0
- package/dist/cli/transfer.js +438 -0
- package/dist/cli/usage.d.ts +85 -0
- package/dist/cli/usage.js +741 -0
- package/dist/cli.d.ts +71 -120
- package/dist/cli.js +170 -8469
- package/dist/client.js +15 -8
- package/dist/compaction-record.js +6 -4
- package/dist/connectors/github/backfill.js +94 -87
- package/dist/connectors/github/cli-impl.js +4 -3
- package/dist/connectors/github/dlq.js +67 -54
- package/dist/connectors/github/ingest.js +34 -35
- package/dist/connectors/github/tenant-routing.js +3 -2
- package/dist/connectors/github/webhook.js +135 -216
- package/dist/connectors/slack/dlq.js +49 -61
- package/dist/connectors/slack/ingest.js +55 -48
- package/dist/connectors/slack/tenant-routing.js +4 -3
- package/dist/connectors/slack/webhook.js +72 -74
- package/dist/consolidate/conflicts.d.ts +10 -0
- package/dist/consolidate/conflicts.js +178 -0
- package/dist/consolidate/decay.d.ts +12 -0
- package/dist/consolidate/decay.js +145 -0
- package/dist/consolidate/llm-passes.d.ts +3 -0
- package/dist/consolidate/llm-passes.js +141 -0
- package/dist/consolidate/merge.d.ts +7 -0
- package/dist/consolidate/merge.js +251 -0
- package/dist/consolidate/physics-pass.d.ts +3 -0
- package/dist/consolidate/physics-pass.js +60 -0
- package/dist/consolidate/run.d.ts +69 -0
- package/dist/consolidate/run.js +76 -0
- package/dist/consolidate/sleep.d.ts +18 -0
- package/dist/consolidate/sleep.js +209 -0
- package/dist/consolidate/traces.d.ts +4 -0
- package/dist/consolidate/traces.js +178 -0
- package/dist/context-auto.js +7 -11
- package/dist/context-render.d.ts +1 -1
- package/dist/context-render.js +1 -1
- package/dist/customer-notes.d.ts +3 -0
- package/dist/customer-notes.js +6 -4
- package/dist/dag.js +6 -5
- package/dist/dashboard-actions.d.ts +20 -0
- package/dist/dashboard-actions.js +88 -0
- package/dist/dashboard-params.d.ts +45 -0
- package/dist/dashboard-params.js +127 -0
- package/dist/dashboard-queries.d.ts +15 -0
- package/dist/dashboard-queries.js +355 -0
- package/dist/dashboard-snapshot.d.ts +138 -0
- package/dist/dashboard-snapshot.js +308 -0
- package/dist/dashboard-types.d.ts +163 -0
- package/dist/dashboard-types.js +3 -0
- package/dist/dashboard.d.ts +6 -7
- package/dist/dashboard.js +228 -202
- package/dist/db/busy.d.ts +5 -0
- package/dist/db/busy.js +24 -0
- package/dist/db/continuity.d.ts +5 -0
- package/dist/db/continuity.js +145 -0
- package/dist/db/meta.d.ts +8 -0
- package/dist/db/meta.js +35 -0
- package/dist/db/migrate.d.ts +9 -0
- package/dist/db/migrate.js +138 -0
- package/dist/db/migrations/index.d.ts +5 -0
- package/dist/db/migrations/index.js +109 -0
- package/dist/db/migrations/types.d.ts +14 -0
- package/dist/db/migrations/types.js +2 -0
- package/dist/db/migrations/v01.d.ts +3 -0
- package/dist/db/migrations/v01.js +38 -0
- package/dist/db/migrations/v02.d.ts +3 -0
- package/dist/db/migrations/v02.js +21 -0
- package/dist/db/migrations/v03.d.ts +3 -0
- package/dist/db/migrations/v03.js +22 -0
- package/dist/db/migrations/v04.d.ts +3 -0
- package/dist/db/migrations/v04.js +28 -0
- package/dist/db/migrations/v05.d.ts +3 -0
- package/dist/db/migrations/v05.js +21 -0
- package/dist/db/migrations/v06.d.ts +3 -0
- package/dist/db/migrations/v06.js +25 -0
- package/dist/db/migrations/v07.d.ts +3 -0
- package/dist/db/migrations/v07.js +13 -0
- package/dist/db/migrations/v08.d.ts +3 -0
- package/dist/db/migrations/v08.js +8 -0
- package/dist/db/migrations/v09.d.ts +3 -0
- package/dist/db/migrations/v09.js +13 -0
- package/dist/db/migrations/v10.d.ts +3 -0
- package/dist/db/migrations/v10.js +17 -0
- package/dist/db/migrations/v11.d.ts +3 -0
- package/dist/db/migrations/v11.js +15 -0
- package/dist/db/migrations/v12.d.ts +3 -0
- package/dist/db/migrations/v12.js +11 -0
- package/dist/db/migrations/v13.d.ts +3 -0
- package/dist/db/migrations/v13.js +15 -0
- package/dist/db/migrations/v14.d.ts +3 -0
- package/dist/db/migrations/v14.js +66 -0
- package/dist/db/migrations/v15.d.ts +3 -0
- package/dist/db/migrations/v15.js +42 -0
- package/dist/db/migrations/v16.d.ts +3 -0
- package/dist/db/migrations/v16.js +61 -0
- package/dist/db/migrations/v17.d.ts +3 -0
- package/dist/db/migrations/v17.js +46 -0
- package/dist/db/migrations/v18.d.ts +3 -0
- package/dist/db/migrations/v18.js +60 -0
- package/dist/db/migrations/v19.d.ts +3 -0
- package/dist/db/migrations/v19.js +28 -0
- package/dist/db/migrations/v20.d.ts +3 -0
- package/dist/db/migrations/v20.js +42 -0
- package/dist/db/migrations/v21.d.ts +3 -0
- package/dist/db/migrations/v21.js +16 -0
- package/dist/db/migrations/v22.d.ts +3 -0
- package/dist/db/migrations/v22.js +82 -0
- package/dist/db/migrations/v23.d.ts +3 -0
- package/dist/db/migrations/v23.js +48 -0
- package/dist/db/migrations/v24.d.ts +3 -0
- package/dist/db/migrations/v24.js +72 -0
- package/dist/db/migrations/v25.d.ts +3 -0
- package/dist/db/migrations/v25.js +46 -0
- package/dist/db/migrations/v26.d.ts +3 -0
- package/dist/db/migrations/v26.js +23 -0
- package/dist/db/migrations/v27.d.ts +3 -0
- package/dist/db/migrations/v27.js +57 -0
- package/dist/db/migrations/v28.d.ts +3 -0
- package/dist/db/migrations/v28.js +38 -0
- package/dist/db/migrations/v29.d.ts +3 -0
- package/dist/db/migrations/v29.js +78 -0
- package/dist/db/migrations/v30.d.ts +3 -0
- package/dist/db/migrations/v30.js +92 -0
- package/dist/db/migrations/v31.d.ts +3 -0
- package/dist/db/migrations/v31.js +74 -0
- package/dist/db/migrations/v32.d.ts +3 -0
- package/dist/db/migrations/v32.js +102 -0
- package/dist/db/migrations/v33.d.ts +3 -0
- package/dist/db/migrations/v33.js +104 -0
- package/dist/db/migrations/v34.d.ts +3 -0
- package/dist/db/migrations/v34.js +93 -0
- package/dist/db/migrations/v35.d.ts +3 -0
- package/dist/db/migrations/v35.js +98 -0
- package/dist/db/migrations/v36.d.ts +3 -0
- package/dist/db/migrations/v36.js +98 -0
- package/dist/db/migrations/v37.d.ts +3 -0
- package/dist/db/migrations/v37.js +219 -0
- package/dist/db/migrations/v38.d.ts +3 -0
- package/dist/db/migrations/v38.js +277 -0
- package/dist/db/migrations/v39.d.ts +3 -0
- package/dist/db/migrations/v39.js +59 -0
- package/dist/db/migrations/v40.d.ts +3 -0
- package/dist/db/migrations/v40.js +74 -0
- package/dist/db/migrations/v41.d.ts +3 -0
- package/dist/db/migrations/v41.js +43 -0
- package/dist/db/migrations/v42.d.ts +3 -0
- package/dist/db/migrations/v42.js +41 -0
- package/dist/db/migrations/v43.d.ts +3 -0
- package/dist/db/migrations/v43.js +67 -0
- package/dist/db/migrations/v44.d.ts +3 -0
- package/dist/db/migrations/v44.js +28 -0
- package/dist/db/migrations/v45.d.ts +3 -0
- package/dist/db/migrations/v45.js +30 -0
- package/dist/db/migrations/v46.d.ts +3 -0
- package/dist/db/migrations/v46.js +25 -0
- package/dist/db/migrations/v47.d.ts +3 -0
- package/dist/db/migrations/v47.js +17 -0
- package/dist/db/migrations/v48.d.ts +3 -0
- package/dist/db/migrations/v48.js +10 -0
- package/dist/db/migrations/v49.d.ts +3 -0
- package/dist/db/migrations/v49.js +31 -0
- package/dist/db/migrations/v50.d.ts +3 -0
- package/dist/db/migrations/v50.js +67 -0
- package/dist/db/migrations/v51.d.ts +3 -0
- package/dist/db/migrations/v51.js +14 -0
- package/dist/db/migrations/v52.d.ts +3 -0
- package/dist/db/migrations/v52.js +7 -0
- package/dist/db/open.d.ts +23 -0
- package/dist/db/open.js +146 -0
- package/dist/db/sqlite.d.ts +21 -0
- package/dist/db/sqlite.js +8 -0
- package/dist/db/tables.d.ts +7 -0
- package/dist/db/tables.js +38 -0
- package/dist/db.d.ts +6 -46
- package/dist/db.js +5 -3049
- package/dist/decisions.d.ts +4 -1
- package/dist/decisions.js +9 -7
- package/dist/dedupe.js +3 -2
- package/dist/delivery-recorder.js +4 -1
- package/dist/doctor.js +3 -3
- package/dist/embedding-provider.d.ts +1 -1
- package/dist/embedding-provider.js +4 -3
- package/dist/embeddings.d.ts +9 -52
- package/dist/embeddings.js +43 -297
- package/dist/env.d.ts +75 -0
- package/dist/env.js +119 -0
- package/dist/eval-suite.js +1 -1
- package/dist/eval.js +2 -2
- package/dist/extract.js +1 -1
- package/dist/gated-write.js +3 -1
- package/dist/goals.d.ts +3 -1
- package/dist/goals.js +18 -0
- package/dist/graph/read.d.ts +73 -0
- package/dist/graph/read.js +325 -0
- package/dist/graph/rows.d.ts +45 -0
- package/dist/graph/rows.js +51 -0
- package/dist/graph/types.d.ts +83 -0
- package/dist/graph/types.js +11 -0
- package/dist/graph/write.d.ts +93 -0
- package/dist/{graph.js → graph/write.js} +6 -384
- package/dist/graph-extract.js +2 -1
- package/dist/graph-recall.d.ts +1 -1
- package/dist/graph-recall.js +2 -2
- package/dist/graph-stream.js +1 -1
- package/dist/graph-view.d.ts +1 -1
- package/dist/graph-view.js +1 -1
- package/dist/half-life-migration.d.ts +1 -1
- package/dist/half-life-migration.js +2 -1
- package/dist/hooks/codex-session.d.ts +8 -0
- package/dist/hooks/codex-session.js +76 -0
- package/dist/hooks/codex-wrapper.d.ts +55 -0
- package/dist/hooks/codex-wrapper.js +288 -0
- package/dist/hooks/json-hooks.d.ts +63 -0
- package/dist/hooks/json-hooks.js +356 -0
- package/dist/hooks/opencode.d.ts +50 -0
- package/dist/hooks/opencode.js +202 -0
- package/dist/hooks/shared.d.ts +54 -0
- package/dist/hooks/shared.js +77 -0
- package/dist/http-retry.d.ts +2 -0
- package/dist/http-retry.js +4 -3
- package/dist/http-util.d.ts +3 -0
- package/dist/http-util.js +10 -0
- package/dist/{importers.d.ts → importers/core.d.ts} +13 -17
- package/dist/importers/core.js +141 -0
- package/dist/importers/markdown-parse.d.ts +41 -0
- package/dist/importers/markdown-parse.js +132 -0
- package/dist/importers/markdown.d.ts +3 -0
- package/dist/importers/markdown.js +92 -0
- package/dist/importers/sources.d.ts +7 -0
- package/dist/importers/sources.js +229 -0
- package/dist/importers/vault.d.ts +11 -0
- package/dist/importers/vault.js +352 -0
- package/dist/incidents.d.ts +3 -0
- package/dist/incidents.js +7 -5
- package/dist/index.d.ts +25 -6
- package/dist/index.js +23 -6
- package/dist/invalidation.js +2 -1
- package/dist/judgment.js +2 -1
- package/dist/keyset.d.ts +13 -0
- package/dist/keyset.js +8 -0
- package/dist/local-embedding.d.ts +13 -0
- package/dist/local-embedding.js +165 -0
- package/dist/log.d.ts +7 -0
- package/dist/log.js +19 -1
- package/dist/mcp/admin-tools.d.ts +8 -0
- package/dist/mcp/admin-tools.js +116 -0
- package/dist/mcp/format.d.ts +27 -0
- package/dist/mcp/format.js +135 -0
- package/dist/mcp/memory-tools.d.ts +5 -0
- package/dist/mcp/memory-tools.js +83 -0
- package/dist/mcp/protocol.d.ts +83 -0
- package/dist/mcp/protocol.js +55 -0
- package/dist/mcp/recall-tools.d.ts +6 -0
- package/dist/mcp/recall-tools.js +320 -0
- package/dist/mcp/request.d.ts +10 -0
- package/dist/mcp/request.js +163 -0
- package/dist/mcp/server.d.ts +4 -75
- package/dist/mcp/server.js +7 -1190
- package/dist/mcp/session-state.d.ts +11 -0
- package/dist/mcp/session-state.js +28 -0
- package/dist/mcp/stdio.d.ts +8 -0
- package/dist/mcp/stdio.js +79 -0
- package/dist/mcp/tools.d.ts +11 -0
- package/dist/mcp/tools.js +247 -0
- package/dist/memory.d.ts +3 -0
- package/dist/memory.js +27 -1
- package/dist/multihop.d.ts +1 -1
- package/dist/multihop.js +2 -1
- package/dist/owner-validation.js +2 -1
- package/dist/physics-state.js +10 -7
- package/dist/policies.d.ts +3 -0
- package/dist/policies.js +8 -6
- package/dist/postinstall.js +3 -2
- package/dist/predictions/planning-fallacy.d.ts +100 -0
- package/dist/predictions/planning-fallacy.js +190 -0
- package/dist/{predictions.d.ts → predictions/store.d.ts} +7 -102
- package/dist/predictions/store.js +434 -0
- package/dist/processes.d.ts +3 -0
- package/dist/processes.js +7 -5
- package/dist/project-briefs.d.ts +3 -0
- package/dist/project-briefs.js +7 -5
- package/dist/project-identity.js +3 -2
- package/dist/project-merge.js +3 -1
- package/dist/quarantine.d.ts +2 -1
- package/dist/quarantine.js +8 -5
- package/dist/raw-archive.js +1 -1
- package/dist/recall-history.js +3 -2
- package/dist/recall-pipeline.d.ts +2 -2
- package/dist/recall-pipeline.js +16 -8
- package/dist/recall-scope.js +1 -1
- package/dist/recall-trace.d.ts +1 -1
- package/dist/refine-llm.js +2 -1
- package/dist/reject-flow.js +6 -1
- package/dist/rerankers/clef.js +6 -5
- package/dist/rerankers/jev.d.ts +1 -1
- package/dist/rerankers/jev.js +4 -4
- package/dist/rerankers/llm.d.ts +4 -2
- package/dist/rerankers/llm.js +58 -38
- package/dist/rerankers/types.d.ts +1 -1
- package/dist/salience.js +1 -1
- package/dist/scheduler.d.ts +1 -0
- package/dist/scheduler.js +26 -4
- package/dist/scope.js +4 -3
- package/dist/search/as-of.d.ts +10 -0
- package/dist/search/as-of.js +22 -0
- package/dist/search/bm25-search.d.ts +14 -0
- package/dist/search/bm25-search.js +43 -0
- package/dist/search/bm25.d.ts +15 -0
- package/dist/search/bm25.js +54 -0
- package/dist/search/boosts.d.ts +54 -0
- package/dist/search/boosts.js +94 -0
- package/dist/search/breakdown.d.ts +7 -0
- package/dist/search/breakdown.js +20 -0
- package/dist/search/explain.d.ts +25 -0
- package/dist/search/explain.js +31 -0
- package/dist/search/finalize.d.ts +8 -0
- package/dist/search/finalize.js +52 -0
- package/dist/search/fusion.d.ts +27 -0
- package/dist/search/fusion.js +42 -0
- package/dist/search/hybrid-score.d.ts +20 -0
- package/dist/search/hybrid-score.js +73 -0
- package/dist/search/hybrid.d.ts +46 -0
- package/dist/search/hybrid.js +64 -0
- package/dist/search/physics-search.d.ts +29 -0
- package/dist/search/physics-search.js +162 -0
- package/dist/search/rerank.d.ts +10 -0
- package/dist/search/rerank.js +72 -0
- package/dist/search/temporal.d.ts +15 -0
- package/dist/search/temporal.js +45 -0
- package/dist/search/types.d.ts +91 -0
- package/dist/search/types.js +2 -0
- package/dist/search/vector.d.ts +30 -0
- package/dist/search/vector.js +71 -0
- package/dist/secret-detect.d.ts +2 -0
- package/dist/secret-detect.js +2 -1
- package/dist/server/auth.d.ts +52 -0
- package/dist/server/auth.js +221 -0
- package/dist/server/client-ip.d.ts +25 -0
- package/dist/server/client-ip.js +92 -0
- package/dist/server/cursor.d.ts +23 -0
- package/dist/server/cursor.js +58 -0
- package/dist/server/lifecycle.d.ts +7 -0
- package/dist/server/lifecycle.js +29 -0
- package/dist/server/mcp-http.d.ts +5 -0
- package/dist/server/mcp-http.js +199 -0
- package/dist/server/request.d.ts +33 -0
- package/dist/server/request.js +103 -0
- package/dist/server/routes/admin.d.ts +9 -0
- package/dist/server/routes/admin.js +158 -0
- package/dist/server/routes/customer-notes.d.ts +7 -0
- package/dist/server/routes/customer-notes.js +112 -0
- package/dist/server/routes/decisions.d.ts +7 -0
- package/dist/server/routes/decisions.js +133 -0
- package/dist/server/routes/incidents.d.ts +7 -0
- package/dist/server/routes/incidents.js +126 -0
- package/dist/server/routes/memories.d.ts +10 -0
- package/dist/server/routes/memories.js +179 -0
- package/dist/server/routes/policies.d.ts +8 -0
- package/dist/server/routes/policies.js +151 -0
- package/dist/server/routes/predictions.d.ts +7 -0
- package/dist/server/routes/predictions.js +164 -0
- package/dist/server/routes/processes.d.ts +7 -0
- package/dist/server/routes/processes.js +161 -0
- package/dist/server/routes/project-briefs.d.ts +8 -0
- package/dist/server/routes/project-briefs.js +136 -0
- package/dist/server/routes/recall.d.ts +8 -0
- package/dist/server/routes/recall.js +340 -0
- package/dist/server/routes/skills.d.ts +8 -0
- package/dist/server/routes/skills.js +150 -0
- package/dist/server/types.d.ts +56 -0
- package/dist/server/types.js +2 -0
- package/dist/server/validation.d.ts +14 -0
- package/dist/server/validation.js +91 -0
- package/dist/server.d.ts +7 -61
- package/dist/server.js +69 -2362
- package/dist/session-digest.d.ts +1 -1
- package/dist/session-digest.js +9 -2
- package/dist/shared.d.ts +3 -1
- package/dist/shared.js +26 -22
- package/dist/skills.d.ts +3 -0
- package/dist/skills.js +7 -5
- package/dist/stdin.js +2 -2
- package/dist/store/audit-event.d.ts +19 -0
- package/dist/store/audit-event.js +33 -0
- package/dist/store/candidates.d.ts +42 -0
- package/dist/store/candidates.js +152 -0
- package/dist/store/conflicts.d.ts +44 -0
- package/dist/store/conflicts.js +444 -0
- package/dist/store/delete-and-batch.d.ts +63 -0
- package/dist/store/delete-and-batch.js +310 -0
- package/dist/store/entry-reads.d.ts +92 -0
- package/dist/store/entry-reads.js +255 -0
- package/dist/store/entry-row.d.ts +67 -0
- package/dist/store/entry-row.js +208 -0
- package/dist/store/entry-writes.d.ts +46 -0
- package/dist/store/entry-writes.js +148 -0
- package/dist/store/handoffs.d.ts +26 -0
- package/dist/store/handoffs.js +184 -0
- package/dist/store/index-and-stats.d.ts +52 -0
- package/dist/store/index-and-stats.js +214 -0
- package/dist/store/markdown.d.ts +10 -0
- package/dist/store/markdown.js +108 -0
- package/dist/store/mirrors.d.ts +49 -0
- package/dist/store/mirrors.js +312 -0
- package/dist/store/open.d.ts +15 -0
- package/dist/store/open.js +223 -0
- package/dist/store/rows.d.ts +178 -0
- package/dist/store/rows.js +158 -0
- package/dist/store/search-rows.d.ts +86 -0
- package/dist/store/search-rows.js +254 -0
- package/dist/store/sessions.d.ts +83 -0
- package/dist/store/sessions.js +272 -0
- package/dist/store/summaries.d.ts +94 -0
- package/dist/store/summaries.js +377 -0
- package/dist/store/tenant-lookup.d.ts +12 -0
- package/dist/store/tenant-lookup.js +16 -0
- package/dist/store-cards.js +2 -1
- package/dist/summary-dirty.d.ts +4 -0
- package/dist/summary-dirty.js +32 -0
- package/dist/support-bundle.js +4 -3
- package/dist/tenant.js +2 -2
- package/dist/tokenize.d.ts +2 -0
- package/dist/tokenize.js +16 -0
- package/dist/transcript-tail.d.ts +7 -0
- package/dist/transcript-tail.js +48 -0
- package/dist/vector-store.d.ts +27 -0
- package/dist/vector-store.js +210 -0
- package/dist/version.d.ts +2 -2
- package/dist/version.js +2 -2
- package/dist/working-memory.js +1 -1
- package/dist/yaml.js +36 -11
- package/dist-ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
- package/dist-ui/assets/index-DPN7cP19.js +33 -0
- package/dist-ui/assets/index-dFloKRVr.css +1 -0
- package/dist-ui/index.html +3 -25
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
- package/dist/capture.d.ts +0 -155
- package/dist/capture.js +0 -1295
- package/dist/consolidate.d.ts +0 -58
- package/dist/consolidate.js +0 -1124
- package/dist/graph.d.ts +0 -245
- package/dist/hooks.d.ts +0 -208
- package/dist/hooks.js +0 -1076
- package/dist/importers.js +0 -900
- package/dist/predictions.js +0 -620
- package/dist/search.d.ts +0 -320
- package/dist/search.js +0 -970
- package/dist/store.d.ts +0 -776
- package/dist/store.js +0 -3473
- package/dist-ui/assets/d3-BiWEKnn4.js +0 -1
- package/dist-ui/assets/index-BhT8RvO6.js +0 -61
- package/dist-ui/assets/index-RoXXJ5dq.css +0 -1
- package/dist-ui/assets/three-BDgTxR1l.js +0 -4112
|
@@ -0,0 +1,528 @@
|
|
|
1
|
+
// First-class object verbs for predictions, decisions and incidents.
|
|
2
|
+
import { writeEntry } from '../store/entry-writes.js';
|
|
3
|
+
import { readEntry } from '../store/entry-reads.js';
|
|
4
|
+
import { extractPathTags } from '../path-context.js';
|
|
5
|
+
import * as predictionsModule from '../predictions/store.js';
|
|
6
|
+
import * as decisionsModule from '../decisions.js';
|
|
7
|
+
import * as incidentsModule from '../incidents.js';
|
|
8
|
+
import { resolveTenantId } from '../tenant.js';
|
|
9
|
+
import { printError } from './output.js';
|
|
10
|
+
import { requireInit } from './shared.js';
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// E2 prediction first-class object (v0.31)
|
|
13
|
+
// docs/plans/2026-05-26-e2-prediction-object.md
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
export function cmdPredict(hippoRoot, args, flags) {
|
|
16
|
+
requireInit(hippoRoot);
|
|
17
|
+
const tenantId = resolveTenantId({});
|
|
18
|
+
const subcommand = args[0] ?? '';
|
|
19
|
+
if (subcommand === 'close') {
|
|
20
|
+
const idRaw = args[1];
|
|
21
|
+
if (!idRaw) {
|
|
22
|
+
printError('Usage: hippo predict close <id> --state <closed|closed-unknown> [--actual <v>] [--note "..."]');
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
const id = parseInt(String(idRaw), 10);
|
|
26
|
+
if (!Number.isFinite(id) || id <= 0) {
|
|
27
|
+
printError(`Invalid prediction id: "${idRaw}"`);
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
const stateRaw = typeof flags['state'] === 'string' ? flags['state'].trim() : '';
|
|
31
|
+
if (!predictionsModule.VALID_CLOSURE_STATES.has(stateRaw) || stateRaw === 'open') {
|
|
32
|
+
printError(`Invalid --state: "${stateRaw}". Must be one of: closed | closed-unknown.`);
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
const actualRaw = flags['actual'];
|
|
36
|
+
const actualValue = actualRaw !== undefined ? Number(actualRaw) : undefined;
|
|
37
|
+
if (actualRaw !== undefined && !Number.isFinite(actualValue)) {
|
|
38
|
+
printError(`Invalid --actual: "${actualRaw}". Must be a number.`);
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
const noteRaw = flags['note'];
|
|
42
|
+
const closureNote = typeof noteRaw === 'string' ? noteRaw : undefined;
|
|
43
|
+
const closed = predictionsModule.closePrediction(hippoRoot, tenantId, id, {
|
|
44
|
+
closureState: stateRaw,
|
|
45
|
+
actualValue,
|
|
46
|
+
closureNote,
|
|
47
|
+
});
|
|
48
|
+
console.log(`Prediction ${closed.id} closed: state=${closed.closureState}${closed.actualValue !== null ? ` actual=${closed.actualValue}` : ''}`);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (subcommand === 'list') {
|
|
52
|
+
const classTagRaw = flags['class'];
|
|
53
|
+
const classTag = typeof classTagRaw === 'string' ? classTagRaw.trim() : '';
|
|
54
|
+
const statusRaw = flags['status'];
|
|
55
|
+
const status = typeof statusRaw === 'string' ? statusRaw.trim() : 'all';
|
|
56
|
+
const limitRaw = flags['limit'];
|
|
57
|
+
const limit = limitRaw !== undefined ? parseInt(String(limitRaw), 10) : 100;
|
|
58
|
+
if (!Number.isFinite(limit) || limit <= 0) {
|
|
59
|
+
printError(`Invalid --limit: "${limitRaw}". Must be a positive integer.`);
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
let results;
|
|
63
|
+
if (status === 'open') {
|
|
64
|
+
results = predictionsModule.loadOpenPredictions(hippoRoot, tenantId, {
|
|
65
|
+
classTag: classTag || undefined,
|
|
66
|
+
limit,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
else if (status === 'all') {
|
|
70
|
+
// No closure-state filter; pull both via loadPredictionsByClass if class given
|
|
71
|
+
if (classTag) {
|
|
72
|
+
results = predictionsModule.loadPredictionsByClass(hippoRoot, tenantId, classTag, { limit });
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
// No class filter + status=all = pull open + closed across all classes
|
|
76
|
+
// (kept simple: report open via loadOpenPredictions; closed via two
|
|
77
|
+
// class scans isn't symmetrical. v1 callers typically pass --class.)
|
|
78
|
+
results = predictionsModule.loadOpenPredictions(hippoRoot, tenantId, { limit });
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
if (!predictionsModule.VALID_CLOSURE_STATES.has(status)) {
|
|
83
|
+
printError(`Invalid --status: "${status}". Must be one of: open | closed | closed-unknown | all.`);
|
|
84
|
+
process.exit(1);
|
|
85
|
+
}
|
|
86
|
+
if (classTag) {
|
|
87
|
+
results = predictionsModule.loadPredictionsByClass(hippoRoot, tenantId, classTag, {
|
|
88
|
+
closureState: status,
|
|
89
|
+
limit,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
// status filter without class — scan all classes is more complex; v1 requires --class for non-default status
|
|
94
|
+
printError('--status filter (non-open) requires --class to be set.');
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (results.length === 0) {
|
|
99
|
+
console.log(classTag ? `No predictions in class "${classTag}".` : 'No predictions.');
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
console.log(`Found ${results.length} predictions:\n`);
|
|
103
|
+
for (const p of results) {
|
|
104
|
+
const estPart = p.estimateValue !== null ? ` estimate=${p.estimateValue}${p.estimateUnit ? ` ${p.estimateUnit}` : ''}` : '';
|
|
105
|
+
const actPart = p.actualValue !== null ? ` actual=${p.actualValue}` : '';
|
|
106
|
+
const tgtPart = p.targetDate ? ` target=${p.targetDate}` : '';
|
|
107
|
+
console.log(`#${p.id} [${p.closureState}] class=${p.classTag}${estPart}${actPart}${tgtPart}`);
|
|
108
|
+
console.log(` ${p.claimText}`);
|
|
109
|
+
if (p.closureNote)
|
|
110
|
+
console.log(` note: ${p.closureNote}`);
|
|
111
|
+
}
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
if (subcommand === 'show') {
|
|
115
|
+
const idRaw = args[1];
|
|
116
|
+
if (!idRaw) {
|
|
117
|
+
printError('Usage: hippo predict show <id>');
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
120
|
+
const id = parseInt(String(idRaw), 10);
|
|
121
|
+
if (!Number.isFinite(id) || id <= 0) {
|
|
122
|
+
printError(`Invalid prediction id: "${idRaw}"`);
|
|
123
|
+
process.exit(1);
|
|
124
|
+
}
|
|
125
|
+
const pred = predictionsModule.loadPredictionById(hippoRoot, tenantId, id);
|
|
126
|
+
if (!pred) {
|
|
127
|
+
printError(`Prediction ${id} not found.`);
|
|
128
|
+
process.exit(1);
|
|
129
|
+
}
|
|
130
|
+
console.log(`Prediction #${pred.id}`);
|
|
131
|
+
console.log(` class: ${pred.classTag}`);
|
|
132
|
+
console.log(` claim: ${pred.claimText}`);
|
|
133
|
+
console.log(` state: ${pred.closureState}`);
|
|
134
|
+
if (pred.estimateValue !== null)
|
|
135
|
+
console.log(` estimate: ${pred.estimateValue}${pred.estimateUnit ? ' ' + pred.estimateUnit : ''}`);
|
|
136
|
+
if (pred.targetDate)
|
|
137
|
+
console.log(` target: ${pred.targetDate}`);
|
|
138
|
+
if (pred.actualValue !== null)
|
|
139
|
+
console.log(` actual: ${pred.actualValue}`);
|
|
140
|
+
if (pred.closedAt)
|
|
141
|
+
console.log(` closed: ${pred.closedAt}`);
|
|
142
|
+
if (pred.closureNote)
|
|
143
|
+
console.log(` note: ${pred.closureNote}`);
|
|
144
|
+
if (pred.memoryId)
|
|
145
|
+
console.log(` memory: ${pred.memoryId}`);
|
|
146
|
+
console.log(` created: ${pred.createdAt}`);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (subcommand === 'baserate') {
|
|
150
|
+
// J3 reference-class / planning-fallacy detector
|
|
151
|
+
const classTagRaw = flags['class'];
|
|
152
|
+
if (typeof classTagRaw !== 'string' || !classTagRaw.trim()) {
|
|
153
|
+
printError('Usage: hippo predict baserate --class <c>');
|
|
154
|
+
process.exit(1);
|
|
155
|
+
}
|
|
156
|
+
const baserate = predictionsModule.computePredictionBaserate(hippoRoot, tenantId, classTagRaw.trim());
|
|
157
|
+
if (baserate.nClosed === 0) {
|
|
158
|
+
console.log(`No closed predictions in class "${baserate.classTag}" yet.`);
|
|
159
|
+
console.log(` Create one with: hippo predict "<claim>" --class ${baserate.classTag} --estimate N`);
|
|
160
|
+
console.log(` Close it later: hippo predict close <id> --state closed --actual N`);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
console.log(baserate.summary);
|
|
164
|
+
console.log(` n_closed: ${baserate.nClosed}`);
|
|
165
|
+
console.log(` n_ratio_eligible: ${baserate.nRatioEligible}`);
|
|
166
|
+
if (baserate.meanEstimate !== null)
|
|
167
|
+
console.log(` mean_estimate: ${baserate.meanEstimate.toFixed(3)}`);
|
|
168
|
+
if (baserate.meanActual !== null)
|
|
169
|
+
console.log(` mean_actual: ${baserate.meanActual.toFixed(3)}`);
|
|
170
|
+
if (baserate.meanRatio !== null)
|
|
171
|
+
console.log(` mean_ratio: ${baserate.meanRatio.toFixed(3)}x`);
|
|
172
|
+
if (baserate.p50Ratio !== null)
|
|
173
|
+
console.log(` p50_ratio: ${baserate.p50Ratio.toFixed(3)}x`);
|
|
174
|
+
if (baserate.mae !== null)
|
|
175
|
+
console.log(` mae: ${baserate.mae.toFixed(3)}`);
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
// Default subcommand: create. args[0] is the claim text.
|
|
179
|
+
const claimText = subcommand;
|
|
180
|
+
if (!claimText) {
|
|
181
|
+
printError('Usage: hippo predict "<claim>" --class <c> [--estimate <v>] [--unit <u>] [--target <YYYY-MM-DD>]');
|
|
182
|
+
printError(' hippo predict close <id> --state <closed|closed-unknown> [--actual <v>] [--note "..."]');
|
|
183
|
+
printError(' hippo predict list [--class X] [--status open|closed|closed-unknown|all] [--limit N]');
|
|
184
|
+
printError(' hippo predict show <id>');
|
|
185
|
+
process.exit(1);
|
|
186
|
+
}
|
|
187
|
+
const classTagRaw = flags['class'];
|
|
188
|
+
if (typeof classTagRaw !== 'string' || !classTagRaw.trim()) {
|
|
189
|
+
printError('--class is required for prediction creation.');
|
|
190
|
+
process.exit(1);
|
|
191
|
+
}
|
|
192
|
+
const classTag = classTagRaw.trim();
|
|
193
|
+
const estimateRaw = flags['estimate'];
|
|
194
|
+
const estimateValue = estimateRaw !== undefined ? Number(estimateRaw) : undefined;
|
|
195
|
+
if (estimateRaw !== undefined && !Number.isFinite(estimateValue)) {
|
|
196
|
+
printError(`Invalid --estimate: "${estimateRaw}". Must be a number.`);
|
|
197
|
+
process.exit(1);
|
|
198
|
+
}
|
|
199
|
+
const unitRaw = flags['unit'];
|
|
200
|
+
const estimateUnit = typeof unitRaw === 'string' ? unitRaw : undefined;
|
|
201
|
+
const targetRaw = flags['target'];
|
|
202
|
+
const targetDate = typeof targetRaw === 'string' ? targetRaw : undefined;
|
|
203
|
+
const created = predictionsModule.savePrediction(hippoRoot, tenantId, {
|
|
204
|
+
classTag,
|
|
205
|
+
claimText,
|
|
206
|
+
estimateValue,
|
|
207
|
+
estimateUnit,
|
|
208
|
+
targetDate,
|
|
209
|
+
});
|
|
210
|
+
console.log(`Prediction recorded: #${created.id} class=${created.classTag}`);
|
|
211
|
+
if (created.memoryId)
|
|
212
|
+
console.log(` memory: ${created.memoryId}`);
|
|
213
|
+
}
|
|
214
|
+
export function cmdDecide(hippoRoot, args, flags) {
|
|
215
|
+
requireInit(hippoRoot);
|
|
216
|
+
const tenantId = resolveTenantId({});
|
|
217
|
+
const subcommand = args[0] ?? '';
|
|
218
|
+
if (subcommand === 'list') {
|
|
219
|
+
const statusRaw = flags['status'];
|
|
220
|
+
const status = typeof statusRaw === 'string' ? statusRaw.trim() : 'all';
|
|
221
|
+
const limitRaw = flags['limit'];
|
|
222
|
+
const limit = limitRaw !== undefined ? parseInt(String(limitRaw), 10) : 100;
|
|
223
|
+
if (!Number.isFinite(limit) || limit <= 0) {
|
|
224
|
+
printError(`Invalid --limit: "${limitRaw}". Must be a positive integer.`);
|
|
225
|
+
process.exit(1);
|
|
226
|
+
}
|
|
227
|
+
let results;
|
|
228
|
+
if (status === 'all') {
|
|
229
|
+
results = decisionsModule.loadDecisions(hippoRoot, tenantId, { limit });
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
if (!decisionsModule.VALID_DECISION_STATES.has(status)) {
|
|
233
|
+
printError(`Invalid --status: "${status}". Must be one of: active | superseded | closed | all.`);
|
|
234
|
+
process.exit(1);
|
|
235
|
+
}
|
|
236
|
+
results = decisionsModule.loadDecisions(hippoRoot, tenantId, {
|
|
237
|
+
status: status,
|
|
238
|
+
limit,
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
if (results.length === 0) {
|
|
242
|
+
console.log('No decisions.');
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
console.log(`Found ${results.length} decisions:\n`);
|
|
246
|
+
for (const d of results) {
|
|
247
|
+
const supPart = d.supersededBy !== null ? ` superseded_by=#${d.supersededBy}` : '';
|
|
248
|
+
console.log(`#${d.id} [${d.status}]${supPart} memory=${d.memoryId ?? '-'}`);
|
|
249
|
+
console.log(` ${d.decisionText}`);
|
|
250
|
+
if (d.context)
|
|
251
|
+
console.log(` context: ${d.context}`);
|
|
252
|
+
}
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
if (subcommand === 'get') {
|
|
256
|
+
const idRaw = args[1];
|
|
257
|
+
if (!idRaw) {
|
|
258
|
+
printError('Usage: hippo decide get <id>');
|
|
259
|
+
process.exit(1);
|
|
260
|
+
}
|
|
261
|
+
const id = parseInt(String(idRaw), 10);
|
|
262
|
+
if (!Number.isFinite(id) || id <= 0) {
|
|
263
|
+
printError(`Invalid decision id: "${idRaw}"`);
|
|
264
|
+
process.exit(1);
|
|
265
|
+
}
|
|
266
|
+
const decision = decisionsModule.loadDecisionById(hippoRoot, tenantId, id);
|
|
267
|
+
if (!decision) {
|
|
268
|
+
printError(`Decision ${id} not found.`);
|
|
269
|
+
process.exit(1);
|
|
270
|
+
}
|
|
271
|
+
console.log(`Decision #${decision.id}`);
|
|
272
|
+
console.log(` status: ${decision.status}`);
|
|
273
|
+
console.log(` text: ${decision.decisionText}`);
|
|
274
|
+
if (decision.context)
|
|
275
|
+
console.log(` context: ${decision.context}`);
|
|
276
|
+
if (decision.supersededBy !== null)
|
|
277
|
+
console.log(` superseded_by: #${decision.supersededBy}`);
|
|
278
|
+
if (decision.supersededAt)
|
|
279
|
+
console.log(` superseded_at: ${decision.supersededAt}`);
|
|
280
|
+
if (decision.closedAt)
|
|
281
|
+
console.log(` closed_at: ${decision.closedAt}`);
|
|
282
|
+
if (decision.memoryId)
|
|
283
|
+
console.log(` memory: ${decision.memoryId}`);
|
|
284
|
+
console.log(` created: ${decision.createdAt}`);
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
if (subcommand === 'close') {
|
|
288
|
+
const idRaw = args[1];
|
|
289
|
+
if (!idRaw) {
|
|
290
|
+
printError('Usage: hippo decide close <id>');
|
|
291
|
+
process.exit(1);
|
|
292
|
+
}
|
|
293
|
+
const id = parseInt(String(idRaw), 10);
|
|
294
|
+
if (!Number.isFinite(id) || id <= 0) {
|
|
295
|
+
printError(`Invalid decision id: "${idRaw}"`);
|
|
296
|
+
process.exit(1);
|
|
297
|
+
}
|
|
298
|
+
const closed = decisionsModule.closeDecision(hippoRoot, tenantId, id);
|
|
299
|
+
console.log(`Decision #${closed.id} closed.`);
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
// Default subcommand: create. args[0] is the decision text.
|
|
303
|
+
const decisionText = subcommand;
|
|
304
|
+
if (!decisionText) {
|
|
305
|
+
printError('Usage: hippo decide "<decision>" [--context "<why>"] [--supersedes <memory-id>]');
|
|
306
|
+
printError(' hippo decide list [--status active|superseded|closed|all] [--limit N]');
|
|
307
|
+
printError(' hippo decide get <id>');
|
|
308
|
+
printError(' hippo decide close <id>');
|
|
309
|
+
process.exit(1);
|
|
310
|
+
}
|
|
311
|
+
const contextRaw = flags['context'];
|
|
312
|
+
const context = typeof contextRaw === 'string' && contextRaw ? contextRaw : undefined;
|
|
313
|
+
// A value-less `--supersedes` (parseArgs stores boolean true) is a malformed
|
|
314
|
+
// request: the user asked to supersede but gave no memory id. Reject it rather
|
|
315
|
+
// than silently creating a non-superseding decision (codex review 2026-05-28).
|
|
316
|
+
if (flags['supersedes'] === true) {
|
|
317
|
+
printError('--supersedes requires a memory id, e.g. hippo decide "<text>" --supersedes mem_abc123.');
|
|
318
|
+
process.exit(1);
|
|
319
|
+
}
|
|
320
|
+
const supersedesMemId = typeof flags['supersedes'] === 'string' ? flags['supersedes'] : null;
|
|
321
|
+
// Backward-compat: --supersedes takes a MEMORY id. Validate it exists and
|
|
322
|
+
// resolve it to the active decision row (if any). Grill fix: commit the
|
|
323
|
+
// canonical table create+supersede FIRST (inside saveDecision's SAVEPOINT),
|
|
324
|
+
// weaken the old memory LAST (best-effort) so a memory-write failure cannot
|
|
325
|
+
// leave the memory stale without the table reflecting the supersession.
|
|
326
|
+
let supersedesDecisionId;
|
|
327
|
+
let oldEntry = null;
|
|
328
|
+
if (supersedesMemId) {
|
|
329
|
+
oldEntry = readEntry(hippoRoot, supersedesMemId, tenantId) ?? null;
|
|
330
|
+
if (!oldEntry) {
|
|
331
|
+
printError(`Memory ${supersedesMemId} not found.`);
|
|
332
|
+
process.exit(1);
|
|
333
|
+
}
|
|
334
|
+
supersedesDecisionId =
|
|
335
|
+
decisionsModule.resolveActiveDecisionIdByMemory(hippoRoot, tenantId, supersedesMemId) ?? undefined;
|
|
336
|
+
}
|
|
337
|
+
const decisionPathTags = extractPathTags(process.cwd());
|
|
338
|
+
const created = decisionsModule.saveDecision(hippoRoot, tenantId, {
|
|
339
|
+
decisionText,
|
|
340
|
+
context,
|
|
341
|
+
supersedesDecisionId,
|
|
342
|
+
extraTags: decisionPathTags,
|
|
343
|
+
});
|
|
344
|
+
// Legacy memory-weaken (best-effort, LAST): half-life halved, marked stale +
|
|
345
|
+
// 'superseded' tag. Preserves the exact pre-promotion behavior for the memory
|
|
346
|
+
// mirror; the canonical table supersession already committed above.
|
|
347
|
+
if (oldEntry) {
|
|
348
|
+
// Best-effort: saveDecision already committed the canonical mutation (new
|
|
349
|
+
// decision created + old row superseded). If this legacy memory-weaken
|
|
350
|
+
// throws, do NOT fail the command — a retry would find no active decision
|
|
351
|
+
// for the old memory and create a duplicate active successor. Warn instead
|
|
352
|
+
// (codex review 2026-05-28).
|
|
353
|
+
try {
|
|
354
|
+
oldEntry.half_life_days = Math.max(1, Math.floor(oldEntry.half_life_days / 2));
|
|
355
|
+
oldEntry.confidence = 'stale';
|
|
356
|
+
if (!oldEntry.tags.includes('superseded'))
|
|
357
|
+
oldEntry.tags.push('superseded');
|
|
358
|
+
writeEntry(hippoRoot, oldEntry);
|
|
359
|
+
}
|
|
360
|
+
catch (e) {
|
|
361
|
+
printError(` warning: decision recorded and superseded, but failed to weaken the prior memory ${supersedesMemId}: ${e.message}`);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
console.log(`Decision recorded: #${created.id}`);
|
|
365
|
+
if (created.memoryId)
|
|
366
|
+
console.log(` memory: ${created.memoryId}`);
|
|
367
|
+
if (supersedesMemId) {
|
|
368
|
+
const tail = supersedesDecisionId !== undefined
|
|
369
|
+
? ` (decision #${supersedesDecisionId} superseded)`
|
|
370
|
+
: ' (no active decision row; memory weakened only)';
|
|
371
|
+
console.log(` supersedes memory: ${supersedesMemId}${tail}`);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
// Strict positive-integer parse for incident id args. parseInt() alone accepts
|
|
375
|
+
// trailing junk ("1abc" -> 1), which would let a mutating subcommand (close/
|
|
376
|
+
// resolve) silently hit the wrong row; require the whole arg to be digits.
|
|
377
|
+
// (codex P2, 2026-05-29.)
|
|
378
|
+
function parsePositiveIncidentId(idRaw) {
|
|
379
|
+
const s = String(idRaw ?? '').trim();
|
|
380
|
+
const id = parseInt(s, 10);
|
|
381
|
+
if (!/^\d+$/.test(s) || id <= 0) {
|
|
382
|
+
printError(`Invalid incident id: "${idRaw}" (expected a positive integer).`);
|
|
383
|
+
process.exit(1);
|
|
384
|
+
}
|
|
385
|
+
return id;
|
|
386
|
+
}
|
|
387
|
+
export function cmdIncident(hippoRoot, args, flags) {
|
|
388
|
+
requireInit(hippoRoot);
|
|
389
|
+
const tenantId = resolveTenantId({});
|
|
390
|
+
const subcommand = args[0] ?? '';
|
|
391
|
+
if (subcommand === 'list') {
|
|
392
|
+
const statusRaw = flags['status'];
|
|
393
|
+
const status = typeof statusRaw === 'string' ? statusRaw.trim() : 'all';
|
|
394
|
+
const limitRaw = flags['limit'];
|
|
395
|
+
const limit = limitRaw !== undefined ? parseInt(String(limitRaw), 10) : 100;
|
|
396
|
+
if (!Number.isFinite(limit) || limit <= 0) {
|
|
397
|
+
printError(`Invalid --limit: "${limitRaw}". Must be a positive integer.`);
|
|
398
|
+
process.exit(1);
|
|
399
|
+
}
|
|
400
|
+
let results;
|
|
401
|
+
if (status === 'all') {
|
|
402
|
+
results = incidentsModule.loadIncidents(hippoRoot, tenantId, { limit });
|
|
403
|
+
}
|
|
404
|
+
else {
|
|
405
|
+
if (!incidentsModule.VALID_INCIDENT_STATES.has(status)) {
|
|
406
|
+
printError(`Invalid --status: "${status}". Must be one of: open | resolved | closed | all.`);
|
|
407
|
+
process.exit(1);
|
|
408
|
+
}
|
|
409
|
+
results = incidentsModule.loadIncidents(hippoRoot, tenantId, {
|
|
410
|
+
status: status,
|
|
411
|
+
limit,
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
if (results.length === 0) {
|
|
415
|
+
console.log('No incidents.');
|
|
416
|
+
return;
|
|
417
|
+
}
|
|
418
|
+
console.log(`Found ${results.length} incidents:\n`);
|
|
419
|
+
for (const inc of results) {
|
|
420
|
+
const linkPart = inc.linkedMemoryIds.length > 0 ? ` links=${inc.linkedMemoryIds.length}` : '';
|
|
421
|
+
console.log(`#${inc.id} [${inc.status}]${linkPart} memory=${inc.memoryId ?? '-'}`);
|
|
422
|
+
console.log(` ${inc.incidentText}`);
|
|
423
|
+
if (inc.context)
|
|
424
|
+
console.log(` context: ${inc.context}`);
|
|
425
|
+
}
|
|
426
|
+
return;
|
|
427
|
+
}
|
|
428
|
+
if (subcommand === 'get') {
|
|
429
|
+
const idRaw = args[1];
|
|
430
|
+
if (!idRaw) {
|
|
431
|
+
printError('Usage: hippo incident get <id>');
|
|
432
|
+
process.exit(1);
|
|
433
|
+
}
|
|
434
|
+
const id = parsePositiveIncidentId(idRaw);
|
|
435
|
+
const incident = incidentsModule.loadIncidentById(hippoRoot, tenantId, id);
|
|
436
|
+
if (!incident) {
|
|
437
|
+
printError(`Incident ${id} not found.`);
|
|
438
|
+
process.exit(1);
|
|
439
|
+
}
|
|
440
|
+
console.log(`Incident #${incident.id}`);
|
|
441
|
+
console.log(` status: ${incident.status}`);
|
|
442
|
+
console.log(` text: ${incident.incidentText}`);
|
|
443
|
+
if (incident.context)
|
|
444
|
+
console.log(` context: ${incident.context}`);
|
|
445
|
+
if (incident.resolutionText)
|
|
446
|
+
console.log(` resolution: ${incident.resolutionText}`);
|
|
447
|
+
if (incident.resolvedAt)
|
|
448
|
+
console.log(` resolved_at: ${incident.resolvedAt}`);
|
|
449
|
+
if (incident.closedAt)
|
|
450
|
+
console.log(` closed_at: ${incident.closedAt}`);
|
|
451
|
+
if (incident.linkedMemoryIds.length > 0) {
|
|
452
|
+
console.log(` linked memories: ${incident.linkedMemoryIds.join(', ')}`);
|
|
453
|
+
}
|
|
454
|
+
if (incident.memoryId)
|
|
455
|
+
console.log(` memory: ${incident.memoryId}`);
|
|
456
|
+
console.log(` created: ${incident.createdAt}`);
|
|
457
|
+
return;
|
|
458
|
+
}
|
|
459
|
+
if (subcommand === 'resolve') {
|
|
460
|
+
const idRaw = args[1];
|
|
461
|
+
if (!idRaw) {
|
|
462
|
+
printError('Usage: hippo incident resolve <id> --resolution "<text>"');
|
|
463
|
+
process.exit(1);
|
|
464
|
+
}
|
|
465
|
+
const id = parsePositiveIncidentId(idRaw);
|
|
466
|
+
const resolutionRaw = flags['resolution'];
|
|
467
|
+
if (typeof resolutionRaw !== 'string' || !resolutionRaw.trim()) {
|
|
468
|
+
printError('--resolution requires a non-empty value, e.g. hippo incident resolve <id> --resolution "root cause fixed".');
|
|
469
|
+
process.exit(1);
|
|
470
|
+
}
|
|
471
|
+
const resolved = incidentsModule.resolveIncident(hippoRoot, tenantId, id, resolutionRaw);
|
|
472
|
+
console.log(`Incident #${resolved.id} resolved.`);
|
|
473
|
+
return;
|
|
474
|
+
}
|
|
475
|
+
if (subcommand === 'close') {
|
|
476
|
+
const idRaw = args[1];
|
|
477
|
+
if (!idRaw) {
|
|
478
|
+
printError('Usage: hippo incident close <id>');
|
|
479
|
+
process.exit(1);
|
|
480
|
+
}
|
|
481
|
+
const id = parsePositiveIncidentId(idRaw);
|
|
482
|
+
const closed = incidentsModule.closeIncident(hippoRoot, tenantId, id);
|
|
483
|
+
console.log(`Incident #${closed.id} closed.`);
|
|
484
|
+
return;
|
|
485
|
+
}
|
|
486
|
+
// Default subcommand: open (create). Accept both the documented
|
|
487
|
+
// `incident open "<text>"` form and the bare `incident "<text>"` form: for the
|
|
488
|
+
// `open` keyword the text is args[1], otherwise args[0] IS the text.
|
|
489
|
+
const incidentText = subcommand === 'open' ? (args[1] ?? '') : subcommand;
|
|
490
|
+
if (!incidentText) {
|
|
491
|
+
printError('Usage: hippo incident "<incident>" [--context "<details>"] [--link <memory-id>]...');
|
|
492
|
+
printError(' hippo incident list [--status open|resolved|closed|all] [--limit N]');
|
|
493
|
+
printError(' hippo incident get <id>');
|
|
494
|
+
printError(' hippo incident resolve <id> --resolution "<text>"');
|
|
495
|
+
printError(' hippo incident close <id>');
|
|
496
|
+
process.exit(1);
|
|
497
|
+
}
|
|
498
|
+
const contextRaw = flags['context'];
|
|
499
|
+
const context = typeof contextRaw === 'string' && contextRaw ? contextRaw : undefined;
|
|
500
|
+
// --link is a repeatable flag (collected into an array by parseArgs). A
|
|
501
|
+
// single --link <id> yields a string; normalize both to string[].
|
|
502
|
+
const linkRaw = flags['link'];
|
|
503
|
+
let linkedMemoryIds;
|
|
504
|
+
if (Array.isArray(linkRaw)) {
|
|
505
|
+
linkedMemoryIds = linkRaw;
|
|
506
|
+
}
|
|
507
|
+
else if (typeof linkRaw === 'string') {
|
|
508
|
+
linkedMemoryIds = [linkRaw];
|
|
509
|
+
}
|
|
510
|
+
else if (linkRaw === true) {
|
|
511
|
+
printError('--link requires a memory id, e.g. hippo incident "<text>" --link mem_abc123.');
|
|
512
|
+
process.exit(1);
|
|
513
|
+
}
|
|
514
|
+
const incidentPathTags = extractPathTags(process.cwd());
|
|
515
|
+
const created = incidentsModule.saveIncident(hippoRoot, tenantId, {
|
|
516
|
+
incidentText,
|
|
517
|
+
context,
|
|
518
|
+
linkedMemoryIds,
|
|
519
|
+
extraTags: incidentPathTags,
|
|
520
|
+
});
|
|
521
|
+
console.log(`Incident recorded: #${created.id}`);
|
|
522
|
+
if (created.memoryId)
|
|
523
|
+
console.log(` memory: ${created.memoryId}`);
|
|
524
|
+
if (created.linkedMemoryIds.length > 0) {
|
|
525
|
+
console.log(` linked memories: ${created.linkedMemoryIds.join(', ')}`);
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
//# sourceMappingURL=decisions.js.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type CommandContext } from './shared.js';
|
|
2
|
+
/** Runs `hippo eval`: --bootstrap writes a corpus, --suite runs the built-in feature eval, else it scores a corpus file. */
|
|
3
|
+
export declare function cmdEval(hippoRoot: string, corpusPath: string | null, flags: Record<string, string | boolean | string[]>): Promise<void>;
|
|
4
|
+
export declare function handleEval({ hippoRoot, args, flags }: CommandContext): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=eval.d.ts.map
|