hippo-memory 1.71.0 → 2.0.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 +7 -5
- package/dist/agent-memories/apply.d.ts +0 -11
- package/dist/agent-memories/apply.js +11 -26
- package/dist/agent-memories/claude-code.js +1 -1
- package/dist/agent-memories/codex.js +1 -1
- package/dist/agent-memories/copilot.d.ts +1 -3
- package/dist/agent-memories/copilot.js +1 -17
- package/dist/agent-memories/project-folds.d.ts +10 -0
- package/dist/agent-memories/project-folds.js +34 -0
- package/dist/agent-memories/sync.js +8 -6
- package/dist/api/assemble.js +3 -2
- package/dist/api/audit.d.ts +30 -2
- package/dist/api/audit.js +48 -7
- package/dist/api/auth.d.ts +11 -9
- package/dist/api/auth.js +39 -40
- package/dist/api/auto-sleep.d.ts +5 -2
- package/dist/api/auto-sleep.js +7 -3
- package/dist/api/availability.js +2 -3
- package/dist/api/cards.d.ts +42 -0
- package/dist/api/cards.js +52 -0
- package/dist/api/conflicts.d.ts +28 -0
- package/dist/api/conflicts.js +61 -0
- package/dist/api/context-auto.js +4 -2
- package/dist/api/context-render.js +4 -3
- package/dist/api/context-select.js +15 -29
- package/dist/api/context.js +29 -18
- package/dist/api/continuity.d.ts +47 -0
- package/dist/api/continuity.js +66 -0
- package/dist/api/dormant.js +4 -2
- package/dist/api/drill-down.js +3 -2
- package/dist/api/embeddings.d.ts +17 -0
- package/dist/api/embeddings.js +28 -0
- package/dist/api/error-reply.d.ts +8 -0
- package/dist/api/error-reply.js +21 -0
- package/dist/api/forget.d.ts +7 -3
- package/dist/api/forget.js +24 -14
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +5 -9
- package/dist/api/graph.js +2 -1
- package/dist/api/index.d.ts +4 -2
- package/dist/api/index.js +4 -2
- package/dist/api/instruction-detect.js +5 -1
- package/dist/api/learn.d.ts +5 -1
- package/dist/api/learn.js +71 -44
- package/dist/api/ledger-db.d.ts +2 -6
- package/dist/api/ledger-db.js +4 -36
- package/dist/api/memories.d.ts +21 -1
- package/dist/api/memories.js +51 -1
- package/dist/api/objects.d.ts +1 -1
- package/dist/api/objects.js +2 -1
- package/dist/api/outcome.d.ts +5 -5
- package/dist/api/outcome.js +17 -16
- package/dist/api/pilot-arm.d.ts +1 -11
- package/dist/api/pilot-arm.js +5 -45
- package/dist/api/predictions.d.ts +3 -1
- package/dist/api/predictions.js +8 -1
- package/dist/api/projects.d.ts +21 -0
- package/dist/api/projects.js +24 -0
- package/dist/api/promote.d.ts +3 -3
- package/dist/api/promote.js +26 -28
- package/dist/api/prompt-hook.d.ts +17 -2
- package/dist/api/prompt-hook.js +45 -4
- package/dist/api/quarantine.js +2 -1
- package/dist/api/recall-cli.d.ts +3 -0
- package/dist/api/recall-cli.js +13 -4
- package/dist/api/recall-core.js +10 -5
- package/dist/api/recall-pipeline.js +23 -24
- package/dist/api/recall-request.js +1 -1
- package/dist/api/recall-types.d.ts +3 -1
- package/dist/api/recall.d.ts +0 -3
- package/dist/api/recall.js +51 -73
- package/dist/api/remember-local.d.ts +5 -2
- package/dist/api/remember-local.js +15 -7
- package/dist/api/remember.d.ts +7 -3
- package/dist/api/remember.js +19 -16
- package/dist/api/session-end.d.ts +46 -0
- package/dist/api/session-end.js +131 -0
- package/dist/api/sleep-run.d.ts +1 -1
- package/dist/api/sleep-run.js +16 -11
- package/dist/api/sleep.js +4 -3
- package/dist/api/status.d.ts +24 -0
- package/dist/api/status.js +40 -0
- package/dist/api/store-init.d.ts +4 -0
- package/dist/api/store-init.js +9 -0
- package/dist/api/tokens.js +2 -2
- package/dist/api/types.d.ts +3 -7
- package/dist/api/types.js +6 -1
- package/dist/capture/caller-session.d.ts +0 -3
- package/dist/capture/caller-session.js +1 -12
- package/dist/capture/capture-error.d.ts +2 -2
- package/dist/capture/capture-error.js +23 -18
- package/dist/capture/codex-patch.js +3 -1
- package/dist/capture/command.js +36 -95
- package/dist/capture/compact.js +10 -5
- package/dist/capture/compaction-items-caller.js +11 -20
- package/dist/capture/compaction-record.d.ts +7 -93
- package/dist/capture/compaction-record.js +29 -426
- package/dist/capture/compaction-spool.d.ts +7 -7
- package/dist/capture/compaction-spool.js +60 -51
- package/dist/capture/copilot-transcript.d.ts +2 -1
- package/dist/capture/copilot-transcript.js +2 -1
- package/dist/capture/extract.d.ts +5 -2
- package/dist/capture/extract.js +4 -3
- package/dist/capture/failure-caller.d.ts +1 -1
- package/dist/capture/failure-caller.js +21 -16
- package/dist/capture/failure-reading.d.ts +2 -1
- package/dist/capture/failure-reading.js +7 -9
- package/dist/capture/pre-compact-caller.js +5 -4
- package/dist/capture/session-digest.js +4 -3
- package/dist/capture/session-end-caller.js +3 -2
- package/dist/capture/session-worker.js +22 -10
- package/dist/capture/transcript.d.ts +2 -1
- package/dist/capture/transcript.js +6 -3
- package/dist/capture/working-state.d.ts +4 -2
- package/dist/capture/working-state.js +4 -2
- package/dist/cli/audit-prune.d.ts +0 -25
- package/dist/cli/audit-prune.js +1 -27
- package/dist/cli/audit.js +20 -20
- package/dist/cli/auth.d.ts +1 -1
- package/dist/cli/auth.js +16 -17
- package/dist/cli/briefs.d.ts +1 -4
- package/dist/cli/briefs.js +37 -292
- package/dist/cli/card.js +41 -33
- package/dist/cli/client.d.ts +6 -2
- package/dist/cli/client.js +37 -21
- package/dist/cli/compact-resume-payload.js +1 -1
- package/dist/cli/context.d.ts +1 -1
- package/dist/cli/context.js +13 -13
- package/dist/cli/continuity.d.ts +1 -1
- package/dist/cli/continuity.js +36 -39
- package/dist/cli/curate.d.ts +2 -2
- package/dist/cli/curate.js +32 -36
- package/dist/cli/dag.d.ts +1 -1
- package/dist/cli/dag.js +23 -8
- package/dist/cli/decisions.d.ts +0 -2
- package/dist/cli/decisions.js +7 -285
- package/dist/cli/eval.d.ts +1 -1
- package/dist/cli/eval.js +12 -13
- package/dist/cli/explain.d.ts +1 -1
- package/dist/cli/explain.js +21 -25
- package/dist/cli/flag-values.js +16 -6
- package/dist/cli/flags.d.ts +0 -289
- package/dist/cli/flags.js +3 -138
- package/dist/cli/graph.d.ts +3 -0
- package/dist/cli/graph.js +83 -0
- package/dist/cli/hook-runtime.d.ts +6 -6
- package/dist/cli/hook-runtime.js +9 -36
- package/dist/cli/incidents.d.ts +3 -0
- package/dist/cli/incidents.js +112 -0
- package/dist/cli/init.d.ts +1 -1
- package/dist/cli/init.js +28 -19
- package/dist/cli/install-steps.d.ts +2 -1
- package/dist/cli/install-steps.js +11 -3
- package/dist/cli/last-sleep.js +1 -1
- package/dist/cli/maintenance.d.ts +3 -3
- package/dist/cli/maintenance.js +29 -30
- package/dist/cli/notes.d.ts +2 -0
- package/dist/cli/notes.js +41 -0
- package/dist/cli/object-verbs.d.ts +2 -2
- package/dist/cli/object-verbs.js +4 -4
- package/dist/cli/open-browser.d.ts +14 -0
- package/dist/cli/open-browser.js +26 -0
- package/dist/cli/playbooks.d.ts +3 -4
- package/dist/cli/playbooks.js +126 -290
- package/dist/cli/predictions.d.ts +3 -0
- package/dist/cli/predictions.js +174 -0
- package/dist/cli/print.js +2 -1
- package/dist/cli/projects.js +30 -22
- package/dist/cli/quality-repair-once.d.ts +1 -1
- package/dist/cli/quality-repair-once.js +6 -5
- package/dist/cli/recall.js +13 -7
- package/dist/cli/refine-llm.js +18 -17
- package/dist/cli/remember.js +17 -17
- package/dist/cli/scheduler.js +2 -1
- package/dist/cli/serve.js +11 -6
- package/dist/cli/session-hooks.d.ts +1 -5
- package/dist/cli/session-hooks.js +89 -168
- package/dist/cli/setup.d.ts +1 -1
- package/dist/cli/setup.js +17 -10
- package/dist/cli/shared.d.ts +2 -6
- package/dist/cli/shared.js +9 -29
- package/dist/cli/sleep-render.js +6 -3
- package/dist/cli/sleep.js +6 -37
- package/dist/cli/status.d.ts +3 -3
- package/dist/cli/status.js +32 -35
- package/dist/cli/transfer.d.ts +3 -3
- package/dist/cli/transfer.js +64 -43
- package/dist/cli/usage.d.ts +1 -80
- package/dist/cli/usage.js +2 -696
- package/dist/cli/verb-row.d.ts +34 -0
- package/dist/cli/verb-row.js +6 -0
- package/dist/cli/verbs/health.d.ts +27 -0
- package/dist/cli/verbs/health.js +234 -0
- package/dist/cli/verbs/memory.d.ts +16 -0
- package/dist/cli/verbs/memory.js +236 -0
- package/dist/cli/verbs/objects.d.ts +20 -0
- package/dist/cli/verbs/objects.js +257 -0
- package/dist/cli/verbs/sessions.d.ts +31 -0
- package/dist/cli/verbs/sessions.js +314 -0
- package/dist/cli/verbs.d.ts +81 -0
- package/dist/cli/verbs.js +7 -0
- package/dist/cli/versioned-verbs.d.ts +51 -0
- package/dist/cli/versioned-verbs.js +79 -0
- package/dist/cli.d.ts +1 -272
- package/dist/cli.js +24 -315
- package/dist/connectors/dlq.d.ts +39 -3
- package/dist/connectors/dlq.js +39 -4
- package/dist/connectors/github/backfill.js +12 -3
- package/dist/connectors/github/deletion.js +2 -1
- package/dist/connectors/github/dlq.js +31 -73
- package/dist/connectors/github/ingest.d.ts +2 -6
- package/dist/connectors/github/ingest.js +5 -29
- package/dist/connectors/github/tenant-routing.js +2 -1
- package/dist/connectors/github/webhook.d.ts +2 -1
- package/dist/connectors/github/webhook.js +35 -2
- package/dist/connectors/ingest.d.ts +10 -0
- package/dist/connectors/ingest.js +29 -0
- package/dist/connectors/slack/deletion.js +2 -1
- package/dist/connectors/slack/dlq.js +49 -71
- package/dist/connectors/slack/ingest.d.ts +2 -6
- package/dist/connectors/slack/ingest.js +4 -28
- package/dist/connectors/slack/tenant-routing.js +2 -1
- package/dist/connectors/slack/webhook.d.ts +2 -1
- package/dist/connectors/slack/webhook.js +2 -1
- package/dist/consolidate/conflicts.js +2 -2
- package/dist/consolidate/dag.js +29 -18
- package/dist/consolidate/dedupe.d.ts +7 -0
- package/dist/consolidate/dedupe.js +6 -4
- package/dist/consolidate/llm-passes.js +45 -19
- package/dist/consolidate/memory-value.js +3 -2
- package/dist/consolidate/merge.js +8 -8
- package/dist/consolidate/physics-pass.d.ts +6 -1
- package/dist/consolidate/physics-pass.js +26 -6
- package/dist/consolidate/replay.js +11 -4
- package/dist/consolidate/sleep.js +9 -6
- package/dist/consolidate/traces.js +5 -5
- package/dist/core/ablation.d.ts +10 -0
- package/dist/core/ablation.js +12 -0
- package/dist/{sharing/scope.d.ts → core/active-scope.d.ts} +1 -1
- package/dist/{sharing/scope.js → core/active-scope.js} +1 -1
- package/dist/core/ambient.d.ts +4 -0
- package/dist/core/ambient.js +39 -18
- package/dist/core/api-errors.d.ts +16 -0
- package/dist/core/api-errors.js +20 -0
- package/dist/core/card.js +3 -1
- package/dist/core/compaction-timing.d.ts +7 -0
- package/dist/core/compaction-timing.js +9 -0
- package/dist/core/config.d.ts +1 -1
- package/dist/core/config.js +22 -18
- package/dist/core/cosine.d.ts +3 -0
- package/dist/core/cosine.js +19 -0
- package/dist/{store → core}/markdown.d.ts +1 -1
- package/dist/{store → core}/markdown.js +4 -4
- package/dist/core/memory-audit.d.ts +17 -0
- package/dist/core/memory-audit.js +54 -0
- package/dist/core/memory.d.ts +14 -8
- package/dist/core/memory.js +35 -23
- package/dist/{consolidate → core}/merged-row.d.ts +1 -1
- package/dist/{consolidate → core}/merged-row.js +1 -1
- package/dist/core/physics.d.ts +3 -1
- package/dist/core/physics.js +23 -18
- package/dist/core/prediction.d.ts +3 -0
- package/dist/core/prediction.js +6 -0
- package/dist/core/project-identity.d.ts +3 -0
- package/dist/core/project-identity.js +12 -2
- package/dist/{store → core}/recall-scope.d.ts +1 -10
- package/dist/{store → core}/recall-scope.js +2 -19
- package/dist/core/search-types.d.ts +1 -1
- package/dist/dashboard/dashboard-actions.d.ts +2 -2
- package/dist/dashboard/dashboard-actions.js +5 -5
- package/dist/dashboard/dashboard-queries.js +2 -7
- package/dist/dashboard/dashboard-snapshot.js +1 -3
- package/dist/dashboard/dashboard.js +16 -5
- package/dist/db/busy.d.ts +2 -7
- package/dist/db/busy.js +21 -26
- package/dist/db/connect.d.ts +2 -2
- package/dist/db/connect.js +7 -7
- package/dist/db/index.d.ts +3 -3
- package/dist/db/index.js +3 -3
- package/dist/db/migrate.js +14 -7
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/v11.js +1 -0
- package/dist/db/migrations/v14.js +1 -0
- package/dist/db/migrations/v55.d.ts +3 -0
- package/dist/db/migrations/v55.js +17 -0
- package/dist/db/open.d.ts +0 -2
- package/dist/db/open.js +6 -10
- package/dist/db/physics-state.d.ts +0 -4
- package/dist/db/physics-state.js +7 -33
- package/dist/db/request-stores.d.ts +1 -0
- package/dist/db/request-stores.js +2 -1
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -2
- package/dist/db/vector-store.js +19 -5
- package/dist/db/wal-checkpointer.js +2 -1
- package/dist/doctor.d.ts +3 -0
- package/dist/doctor.js +18 -15
- package/dist/embeddings/local.d.ts +62 -0
- package/dist/embeddings/local.js +146 -0
- package/dist/{store/embeddings → embeddings}/provider.d.ts +5 -2
- package/dist/{store/embeddings → embeddings}/provider.js +19 -25
- package/dist/embeddings/transformers.d.ts +26 -0
- package/dist/embeddings/transformers.js +89 -0
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +1 -1
- package/dist/entry/store-kit.d.ts +37 -0
- package/dist/entry/store-kit.js +25 -0
- package/dist/entry/testing.d.ts +6 -0
- package/dist/entry/testing.js +7 -0
- package/dist/eval/eval-suite.js +17 -11
- package/dist/eval/eval.js +1 -1
- package/dist/eval/judgment.js +12 -5
- package/dist/graph/extract.js +3 -3
- package/dist/graph/recall.js +1 -1
- package/dist/graph/view.js +13 -5
- package/dist/graph/write.d.ts +1 -1
- package/dist/graph/write.js +9 -9
- package/dist/hooks/codex-session.js +3 -2
- package/dist/hooks/codex-wrapper.js +2 -1
- package/dist/hooks/json-hooks.js +10 -4
- package/dist/hooks/opencode.js +8 -5
- package/dist/hooks/shared.d.ts +0 -6
- package/dist/hooks/shared.js +4 -15
- package/dist/importers/core.js +4 -4
- package/dist/importers/sources.js +5 -4
- package/dist/importers/vault.d.ts +1 -1
- package/dist/importers/vault.js +25 -23
- package/dist/index.d.ts +5 -4
- package/dist/index.js +4 -3
- package/dist/learn/autolearn.d.ts +15 -3
- package/dist/learn/autolearn.js +38 -16
- package/dist/learn/churn-git.js +13 -4
- package/dist/learn/extract.d.ts +3 -2
- package/dist/learn/extract.js +7 -5
- package/dist/learn/forward-claim-detector.js +4 -2
- package/dist/learn/invalidation.d.ts +2 -1
- package/dist/learn/invalidation.js +18 -9
- package/dist/mcp/admin-tools.d.ts +2 -2
- package/dist/mcp/admin-tools.js +27 -48
- package/dist/mcp/format.js +3 -2
- package/dist/mcp/framing.d.ts +1 -0
- package/dist/mcp/framing.js +1 -1
- package/dist/mcp/memory-tools.d.ts +1 -1
- package/dist/mcp/memory-tools.js +8 -9
- package/dist/mcp/protocol.d.ts +11 -7
- package/dist/mcp/protocol.js +25 -12
- package/dist/mcp/recall-tools.js +12 -9
- package/dist/mcp/request.js +22 -20
- package/dist/mcp/stdio.js +37 -16
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +44 -21
- package/dist/objects/customer-notes.d.ts +2 -2
- package/dist/objects/decisions.d.ts +2 -2
- package/dist/objects/descriptor.d.ts +1 -1
- package/dist/objects/incidents.d.ts +2 -2
- package/dist/objects/lifecycle.d.ts +1 -1
- package/dist/objects/lifecycle.js +2 -1
- package/dist/objects/policies.d.ts +2 -2
- package/dist/objects/policies.js +2 -1
- package/dist/objects/processes.d.ts +2 -2
- package/dist/objects/project-briefs.d.ts +2 -2
- package/dist/objects/project-briefs.js +2 -3
- package/dist/objects/skills.d.ts +2 -2
- package/dist/postinstall.js +1 -1
- package/dist/rerankers/clef.js +3 -6
- package/dist/rerankers/cross-encoder.d.ts +31 -2
- package/dist/rerankers/cross-encoder.js +71 -98
- package/dist/rerankers/index.js +5 -4
- package/dist/rerankers/jev.js +2 -4
- package/dist/rerankers/outage-warning.d.ts +3 -1
- package/dist/rerankers/outage-warning.js +5 -3
- package/dist/search/bm25-search.js +1 -1
- package/dist/search/boosts.js +1 -1
- package/dist/search/embed-memories.d.ts +12 -0
- package/dist/search/embed-memories.js +389 -0
- package/dist/search/engine.d.ts +8 -0
- package/dist/search/engine.js +10 -0
- package/dist/search/goal-boost.d.ts +1 -1
- package/dist/search/goal-boost.js +6 -3
- package/dist/search/hybrid.d.ts +9 -2
- package/dist/search/hybrid.js +9 -4
- package/dist/search/physics-search.d.ts +6 -3
- package/dist/search/physics-search.js +22 -15
- package/dist/search/rerank.js +1 -1
- package/dist/search/vector.d.ts +8 -6
- package/dist/search/vector.js +14 -17
- package/dist/server/auth.d.ts +3 -1
- package/dist/server/auth.js +24 -15
- package/dist/server/boot.d.ts +2 -1
- package/dist/server/boot.js +34 -84
- package/dist/server/client-ip.d.ts +9 -6
- package/dist/server/client-ip.js +36 -17
- package/dist/server/deadline.d.ts +0 -2
- package/dist/server/deadline.js +1 -7
- package/dist/server/defaults.d.ts +1 -0
- package/dist/server/defaults.js +1 -0
- package/dist/server/mcp-http.js +16 -11
- package/dist/server/request.js +7 -2
- package/dist/server/route-checks.d.ts +7 -0
- package/dist/server/route-checks.js +42 -0
- package/dist/server/route-table.d.ts +9 -8
- package/dist/server/route-table.js +127 -133
- package/dist/server/routes/admin.d.ts +8 -8
- package/dist/server/routes/admin.js +13 -21
- package/dist/server/routes/customer-notes.d.ts +6 -6
- package/dist/server/routes/customer-notes.js +1 -2
- package/dist/server/routes/decisions.d.ts +6 -6
- package/dist/server/routes/decisions.js +2 -4
- package/dist/server/routes/incidents.d.ts +6 -6
- package/dist/server/routes/incidents.js +2 -5
- package/dist/server/routes/memories.d.ts +9 -9
- package/dist/server/routes/memories.js +19 -40
- package/dist/server/routes/object-routes.d.ts +6 -6
- package/dist/server/routes/object-routes.js +4 -7
- package/dist/server/routes/policies.d.ts +7 -7
- package/dist/server/routes/policies.js +2 -4
- package/dist/server/routes/predictions.d.ts +6 -6
- package/dist/server/routes/predictions.js +9 -13
- package/dist/server/routes/processes.d.ts +6 -6
- package/dist/server/routes/processes.js +1 -2
- package/dist/server/routes/project-briefs.d.ts +7 -7
- package/dist/server/routes/project-briefs.js +2 -4
- package/dist/server/routes/recall.d.ts +5 -5
- package/dist/server/routes/recall.js +6 -10
- package/dist/server/routes/skills.d.ts +7 -7
- package/dist/server/routes/skills.js +2 -4
- package/dist/server/server-detect.d.ts +7 -1
- package/dist/server/server-detect.js +36 -11
- package/dist/server/sleep-child.js +26 -7
- package/dist/server/sleep-offload.d.ts +11 -5
- package/dist/server/sleep-offload.js +17 -11
- package/dist/server/tls.d.ts +7 -2
- package/dist/server/tls.js +17 -5
- package/dist/server/types.d.ts +29 -12
- package/dist/server/validation.d.ts +1 -2
- package/dist/server/validation.js +6 -11
- package/dist/server.d.ts +4 -40
- package/dist/server.js +3 -29
- package/dist/sharing/global-store.d.ts +4 -5
- package/dist/sharing/global-store.js +8 -13
- package/dist/sharing/global-sync.js +38 -45
- package/dist/sharing/project-merge.d.ts +7 -14
- package/dist/sharing/project-merge.js +57 -121
- package/dist/sharing/search-both.js +10 -3
- package/dist/sharing/share.d.ts +2 -0
- package/dist/sharing/share.js +39 -38
- package/dist/store/ambient.js +7 -7
- package/dist/store/audit-event.d.ts +1 -1
- package/dist/store/audit.d.ts +0 -16
- package/dist/store/audit.js +4 -55
- package/dist/store/auth.d.ts +4 -2
- package/dist/store/auth.js +7 -3
- package/dist/store/candidates.d.ts +3 -2
- package/dist/store/candidates.js +59 -30
- package/dist/store/capture-write.d.ts +17 -0
- package/dist/store/capture-write.js +35 -0
- package/dist/store/cards.js +6 -5
- package/dist/store/compaction-caller.d.ts +18 -0
- package/dist/store/compaction-caller.js +29 -0
- package/dist/store/compactions-record.d.ts +115 -0
- package/dist/store/compactions-record.js +418 -0
- package/dist/store/compactions.js +6 -4
- package/dist/store/conflicts.d.ts +7 -1
- package/dist/store/conflicts.js +13 -9
- package/dist/store/connectors/dlq.d.ts +10 -0
- package/dist/store/connectors/dlq.js +33 -0
- package/dist/store/connectors/event-log.d.ts +13 -0
- package/dist/store/connectors/event-log.js +24 -0
- package/dist/store/connectors/github.d.ts +7 -9
- package/dist/store/connectors/github.js +35 -60
- package/dist/store/connectors/slack.d.ts +2 -11
- package/dist/store/connectors/slack.js +24 -57
- package/dist/store/dashboard-reads.js +8 -6
- package/dist/store/delete-and-batch.d.ts +6 -0
- package/dist/store/delete-and-batch.js +40 -6
- package/dist/store/delivery-recorder.d.ts +12 -5
- package/dist/store/delivery-recorder.js +13 -11
- package/dist/store/descendant-page.js +8 -4
- package/dist/store/dormant.d.ts +1 -1
- package/dist/store/dormant.js +10 -4
- package/dist/store/embeddings/index.d.ts +2 -12
- package/dist/store/embeddings/index.js +5 -374
- package/dist/store/entry-reads.d.ts +35 -4
- package/dist/store/entry-reads.js +86 -19
- package/dist/store/entry-row.js +9 -2
- package/dist/store/entry-writes.d.ts +15 -12
- package/dist/store/entry-writes.js +54 -22
- package/dist/store/failure-log-at.d.ts +8 -0
- package/dist/store/failure-log-at.js +16 -0
- package/dist/store/failure-log.d.ts +2 -2
- package/dist/store/failure-log.js +5 -3
- package/dist/{trust → store}/gated-write.d.ts +3 -1
- package/dist/{trust → store}/gated-write.js +7 -5
- package/dist/store/goals.js +22 -19
- package/dist/store/graph-reads.js +9 -6
- package/dist/store/graph-view-rows.js +2 -1
- package/dist/store/graph-writes.d.ts +6 -6
- package/dist/store/graph-writes.js +48 -71
- package/dist/store/half-life.js +2 -2
- package/dist/store/handoffs.d.ts +10 -4
- package/dist/store/handoffs.js +10 -9
- package/dist/store/index-and-stats.js +2 -2
- package/dist/store/index.d.ts +2 -2
- package/dist/store/index.js +1 -1
- package/dist/store/key-writes.js +1 -1
- package/dist/store/ledger-turn.d.ts +9 -0
- package/dist/store/ledger-turn.js +38 -0
- package/dist/store/mirrors.js +19 -10
- package/dist/store/open.d.ts +2 -5
- package/dist/store/open.js +42 -54
- package/dist/store/pilot-arm.d.ts +12 -0
- package/dist/store/pilot-arm.js +42 -0
- package/dist/store/port.d.ts +68 -6
- package/dist/store/port.js +8 -0
- package/dist/store/predictions.d.ts +1 -2
- package/dist/store/predictions.js +3 -6
- package/dist/store/project-tags.d.ts +62 -0
- package/dist/store/project-tags.js +67 -0
- package/dist/store/quality-repair.js +1 -1
- package/dist/store/quarantine.js +2 -1
- package/dist/store/recall-trace.d.ts +2 -0
- package/dist/store/recall-trace.js +20 -3
- package/dist/store/rejected-values.js +16 -10
- package/dist/store/rejection-probe.d.ts +4 -0
- package/dist/store/rejection-probe.js +19 -0
- package/dist/store/rejection.d.ts +0 -17
- package/dist/store/rejection.js +1 -21
- package/dist/store/rows.js +2 -2
- package/dist/store/rule-sql.d.ts +11 -0
- package/dist/store/rule-sql.js +31 -6
- package/dist/store/search-rows.d.ts +5 -5
- package/dist/store/search-rows.js +18 -16
- package/dist/store/sessions.js +4 -2
- package/dist/store/set-aside.d.ts +14 -0
- package/dist/store/set-aside.js +23 -0
- package/dist/store/sqlite/busy.d.ts +3 -0
- package/dist/store/sqlite/busy.js +8 -0
- package/dist/store/sqlite/connector-events-group.js +4 -7
- package/dist/store/sqlite/connector-writes-group.js +6 -4
- package/dist/store/sqlite/entry-writes-group.d.ts +3 -3
- package/dist/store/sqlite/entry-writes-group.js +3 -3
- package/dist/store/sqlite/error-codec.js +4 -3
- package/dist/store/sqlite/executor.js +10 -4
- package/dist/store/sqlite/graph-reads-group.js +1 -1
- package/dist/store/sqlite/held-connection.d.ts +11 -0
- package/dist/store/sqlite/held-connection.js +41 -0
- package/dist/store/sqlite/last-recall-group.d.ts +13 -0
- package/dist/store/sqlite/last-recall-group.js +57 -0
- package/dist/store/sqlite/local.d.ts +0 -17
- package/dist/store/sqlite/local.js +0 -31
- package/dist/store/sqlite/maintenance-groups.d.ts +6 -0
- package/dist/store/sqlite/maintenance-groups.js +60 -0
- package/dist/store/sqlite/object-rows.d.ts +1 -1
- package/dist/store/sqlite/objects-group.d.ts +1 -1
- package/dist/store/sqlite/objects-group.js +15 -7
- package/dist/store/sqlite/store.d.ts +1 -8
- package/dist/store/sqlite/store.js +13 -22
- package/dist/store/summaries.d.ts +10 -3
- package/dist/store/summaries.js +54 -11
- package/dist/store/token-ledger-rows.js +3 -2
- package/dist/store/token-ledger.d.ts +0 -7
- package/dist/store/token-ledger.js +0 -35
- package/dist/store/vector-index.js +8 -4
- package/dist/support-bundle.js +2 -3
- package/dist/trust/reject-flow.js +2 -2
- package/dist/util/agent-homes.d.ts +15 -0
- package/dist/util/agent-homes.js +34 -0
- package/dist/util/anthropic-messages.d.ts +6 -1
- package/dist/util/anthropic-messages.js +26 -7
- package/dist/util/atomic-write.d.ts +5 -2
- package/dist/util/atomic-write.js +12 -8
- package/dist/util/chunked.d.ts +3 -0
- package/dist/util/chunked.js +10 -0
- package/dist/util/ellipsize.d.ts +3 -0
- package/dist/util/ellipsize.js +5 -0
- package/dist/util/env.d.ts +12 -2
- package/dist/util/env.js +12 -2
- package/dist/util/format.d.ts +5 -0
- package/dist/util/format.js +10 -0
- package/dist/util/hook-payload.d.ts +8 -0
- package/dist/util/hook-payload.js +37 -0
- package/dist/util/http-retry.d.ts +6 -0
- package/dist/util/http-retry.js +43 -5
- package/dist/util/http-util.d.ts +0 -8
- package/dist/util/http-util.js +10 -21
- package/dist/util/limits.d.ts +7 -0
- package/dist/util/limits.js +14 -0
- package/dist/util/log.d.ts +4 -0
- package/dist/util/log.js +9 -0
- package/dist/util/request-scope.d.ts +9 -3
- package/dist/util/request-scope.js +18 -9
- package/dist/util/secret-detect.js +6 -1
- package/dist/util/spawn-argv.d.ts +9 -0
- package/dist/util/spawn-argv.js +57 -0
- package/dist/util/sql.d.ts +3 -0
- package/dist/util/sql.js +6 -0
- package/dist/util/sqlite-blocked.d.ts +2 -0
- package/dist/util/sqlite-blocked.js +5 -0
- package/dist/util/stream-tee.d.ts +3 -0
- package/dist/util/stream-tee.js +35 -0
- package/dist/util/time.d.ts +4 -0
- package/dist/util/time.js +4 -0
- package/dist/util/vector-codec.d.ts +4 -0
- package/dist/util/vector-codec.js +15 -0
- package/dist/util/version.d.ts +1 -1
- package/dist/util/version.js +1 -1
- 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 +4 -2
- package/dist/api/on-store.d.ts +0 -16
- package/dist/api/on-store.js +0 -38
- package/dist/store/embeddings/local.d.ts +0 -15
- package/dist/store/embeddings/local.js +0 -175
- /package/dist/{cli → api}/correction-latency.d.ts +0 -0
- /package/dist/{cli → api}/correction-latency.js +0 -0
- /package/dist/{cli → api}/provenance-coverage.d.ts +0 -0
- /package/dist/{cli → api}/provenance-coverage.js +0 -0
- /package/dist/{store → core}/object-types.d.ts +0 -0
- /package/dist/{store → core}/object-types.js +0 -0
- /package/dist/{capture → util}/compaction-items.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.js +0 -0
- /package/dist/{store → util}/yaml.d.ts +0 -0
- /package/dist/{store → util}/yaml.js +0 -0
package/dist/cli/curate.js
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
// Verbs that weaken, suppress or retire memories: outcome, forget, conflicts, reject, dormant, quarantine, invalidate.
|
|
2
|
+
import { truncateWithEllipsis } from '../util/ellipsize.js';
|
|
2
3
|
import * as path from 'path';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { RejectedValueError } from '../store/rejection.js';
|
|
4
|
+
import { unrejectValue, listRejectionsForTenant } from '../trust/reject-flow.js';
|
|
5
|
+
import { RejectedValueError } from '../core/api-errors.js';
|
|
6
6
|
import { loadConfig } from '../core/config.js';
|
|
7
7
|
import { RawAppendOnlyError } from '../core/raw-append-only.js';
|
|
8
8
|
import { isGitRepo } from '../learn/autolearn.js';
|
|
9
|
-
import { invalidateMatching } from '../learn/invalidation.js';
|
|
10
9
|
import * as api from '../api/index.js';
|
|
11
10
|
import { getMemory } from '../api/memories.js';
|
|
12
11
|
import * as client from './client.js';
|
|
@@ -22,7 +21,7 @@ const CONFLICT_PREVIEW_CHARS = 120;
|
|
|
22
21
|
const REJECTED_DIGEST_LIST_CHARS = 16;
|
|
23
22
|
const DORMANT_PREVIEW_CHARS = 100;
|
|
24
23
|
const STRENGTH_DECIMALS = 3;
|
|
25
|
-
export function handleOutcome({ hippoRoot, tenantId, flags }) {
|
|
24
|
+
export async function handleOutcome({ hippoRoot, tenantId, flags }) {
|
|
26
25
|
requireInit(hippoRoot);
|
|
27
26
|
const good = boolFlag(flags, 'good');
|
|
28
27
|
const bad = boolFlag(flags, 'bad');
|
|
@@ -35,10 +34,10 @@ export function handleOutcome({ hippoRoot, tenantId, flags }) {
|
|
|
35
34
|
const specificId = flags['id'] ? String(flags['id']) : null;
|
|
36
35
|
let updated;
|
|
37
36
|
if (specificId) {
|
|
38
|
-
updated = api.outcome(ctx, [specificId], good).applied;
|
|
37
|
+
updated = (await api.outcome(ctx, [specificId], good)).applied;
|
|
39
38
|
}
|
|
40
39
|
else {
|
|
41
|
-
const r = api.outcomeForLastRecall(ctx, good);
|
|
40
|
+
const r = await api.outcomeForLastRecall(ctx, good);
|
|
42
41
|
if (r.ids.length === 0) {
|
|
43
42
|
console.log('No recent recall to apply outcome to. Use --id <id> to target a specific memory.');
|
|
44
43
|
return;
|
|
@@ -49,17 +48,17 @@ export function handleOutcome({ hippoRoot, tenantId, flags }) {
|
|
|
49
48
|
}
|
|
50
49
|
// Shared between the forget dispatch and cmdForget so the message can't drift.
|
|
51
50
|
const ARCHIVE_REASON_REQUIRED = 'hippo forget --archive requires --reason "<why>" (recorded on the archive).';
|
|
52
|
-
function cmdForget(hippoRoot, tenantId, id, flags) {
|
|
51
|
+
async function cmdForget(hippoRoot, tenantId, id, flags) {
|
|
53
52
|
requireInit(hippoRoot);
|
|
54
53
|
const ctx = cliApiContext(hippoRoot, tenantId);
|
|
55
54
|
// Raw memories (connector ingestion) are append-only: a BEFORE-DELETE trigger aborts any delete,
|
|
56
55
|
// so archiveRaw is the sanctioned removal path and records ctx.actor as the archiver.
|
|
57
56
|
if (flagIsTrue(flags, 'archive')) {
|
|
58
|
-
archiveForgottenRaw(ctx, id, stringFlag(flags, 'reason') ?? null);
|
|
57
|
+
await archiveForgottenRaw(ctx, id, stringFlag(flags, 'reason') ?? null);
|
|
59
58
|
return;
|
|
60
59
|
}
|
|
61
60
|
try {
|
|
62
|
-
api.forget(ctx, id);
|
|
61
|
+
await api.forget(ctx, id);
|
|
63
62
|
console.log(`Forgot ${id}`);
|
|
64
63
|
}
|
|
65
64
|
catch (err) {
|
|
@@ -67,13 +66,13 @@ function cmdForget(hippoRoot, tenantId, id, flags) {
|
|
|
67
66
|
throw new CliExit(1);
|
|
68
67
|
}
|
|
69
68
|
}
|
|
70
|
-
function archiveForgottenRaw(ctx, id, reason) {
|
|
69
|
+
async function archiveForgottenRaw(ctx, id, reason) {
|
|
71
70
|
if (!reason) {
|
|
72
71
|
printError(ARCHIVE_REASON_REQUIRED);
|
|
73
72
|
throw new CliExit(1);
|
|
74
73
|
}
|
|
75
74
|
try {
|
|
76
|
-
api.archiveRaw(ctx, id, reason);
|
|
75
|
+
await api.archiveRaw(ctx, id, reason);
|
|
77
76
|
console.log(`Archived ${id}`);
|
|
78
77
|
}
|
|
79
78
|
catch (err) {
|
|
@@ -116,12 +115,12 @@ async function previewForget(hippoRoot, tenantId, id, archive) {
|
|
|
116
115
|
printError(`Could not archive ${id}: memory ${id} is not raw (kind=${entry.kind})`);
|
|
117
116
|
throw new CliExit(1);
|
|
118
117
|
}
|
|
119
|
-
const snippet = entry.content
|
|
118
|
+
const snippet = truncateWithEllipsis(entry.content, CONTENT_PREVIEW_CHARS);
|
|
120
119
|
console.log(`Would ${archive ? 'archive' : 'forget'} ${id} (dry run, nothing changed): "${snippet}"`);
|
|
121
120
|
}
|
|
122
|
-
export function handleConflicts({ hippoRoot, flags }) {
|
|
121
|
+
export function handleConflicts({ hippoRoot, tenantId, flags }) {
|
|
123
122
|
requireInit(hippoRoot);
|
|
124
|
-
const conflicts =
|
|
123
|
+
const conflicts = api.listConflicts(cliApiContext(hippoRoot, tenantId), String(flags['status'] ?? 'open'), { everyTenant: true });
|
|
125
124
|
if (flags['json']) {
|
|
126
125
|
console.log(JSON.stringify({ conflicts }, null, 2));
|
|
127
126
|
return;
|
|
@@ -140,7 +139,7 @@ export function handleConflicts({ hippoRoot, flags }) {
|
|
|
140
139
|
}
|
|
141
140
|
/** Shown when --keep is missing, to help the user decide. */
|
|
142
141
|
async function showConflictForResolve(hippoRoot, conflictId, tenantId) {
|
|
143
|
-
const conflicts =
|
|
142
|
+
const conflicts = api.listConflicts(cliApiContext(hippoRoot, tenantId), 'open');
|
|
144
143
|
const conflict = conflicts.find((c) => c.id === conflictId);
|
|
145
144
|
if (!conflict) {
|
|
146
145
|
printError(`Conflict ${conflictId} not found or already resolved.`);
|
|
@@ -155,11 +154,11 @@ async function showConflictForResolve(hippoRoot, conflictId, tenantId) {
|
|
|
155
154
|
const entryB = await getMemory(ctx, conflict.memory_b_id);
|
|
156
155
|
if (entryA) {
|
|
157
156
|
console.log(` [A] ${conflict.memory_a_id}:`);
|
|
158
|
-
console.log(` ${entryA.content
|
|
157
|
+
console.log(` ${truncateWithEllipsis(entryA.content, CONFLICT_PREVIEW_CHARS)}`);
|
|
159
158
|
}
|
|
160
159
|
if (entryB) {
|
|
161
160
|
console.log(` [B] ${conflict.memory_b_id}:`);
|
|
162
|
-
console.log(` ${entryB.content
|
|
161
|
+
console.log(` ${truncateWithEllipsis(entryB.content, CONFLICT_PREVIEW_CHARS)}`);
|
|
163
162
|
}
|
|
164
163
|
console.log('');
|
|
165
164
|
console.log(`Resolve with: hippo resolve ${conflictId} --keep <memory_id> [--forget] [--reject-loser [--reason "<why>"]]`);
|
|
@@ -183,14 +182,12 @@ export async function handleResolve({ hippoRoot, tenantId, args, flags }) {
|
|
|
183
182
|
// --reason is optional here, unlike `hippo reject`: resolve already has the conflict id and keepId.
|
|
184
183
|
const rejectLoser = boolFlag(flags, 'reject-loser');
|
|
185
184
|
const reasonFlag = stringFlag(flags, 'reason');
|
|
186
|
-
const result =
|
|
187
|
-
|
|
185
|
+
const result = api.resolveMemoryConflict(cliApiContext(hippoRoot, tenantId), conflictId, {
|
|
186
|
+
keepId,
|
|
187
|
+
forget: forgetLoser,
|
|
188
|
+
rejectLoser,
|
|
188
189
|
reason: reasonFlag,
|
|
189
190
|
});
|
|
190
|
-
if (!result) {
|
|
191
|
-
printError(`Could not resolve conflict ${conflictId}. Check the ID and --keep value.`);
|
|
192
|
-
throw new CliExit(1);
|
|
193
|
-
}
|
|
194
191
|
const action = rejectLoser
|
|
195
192
|
? 'rejected (tombstoned) and removed'
|
|
196
193
|
: forgetLoser
|
|
@@ -222,10 +219,7 @@ export function handleReject({ hippoRoot, tenantId, args, flags }) {
|
|
|
222
219
|
throw new CliExit(1);
|
|
223
220
|
}
|
|
224
221
|
try {
|
|
225
|
-
const result =
|
|
226
|
-
hippoRoot: root,
|
|
227
|
-
tenantId,
|
|
228
|
-
actor: 'cli',
|
|
222
|
+
const result = api.rejectOnHost(cliApiContext(root, tenantId), {
|
|
229
223
|
reason,
|
|
230
224
|
memoryId: valueFlag === undefined ? memoryId : undefined,
|
|
231
225
|
value: valueFlag,
|
|
@@ -239,7 +233,7 @@ export function handleReject({ hippoRoot, tenantId, args, flags }) {
|
|
|
239
233
|
}
|
|
240
234
|
function printRejected(result, reason) {
|
|
241
235
|
const digestPrefix = result.digest.slice(0, DIGEST_DISPLAY_CHARS);
|
|
242
|
-
const preview = result.content
|
|
236
|
+
const preview = truncateWithEllipsis(result.content, CONTENT_PREVIEW_CHARS);
|
|
243
237
|
console.log(`Rejected [${digestPrefix}...]: "${preview}"`);
|
|
244
238
|
console.log(` Reason: ${reason}`);
|
|
245
239
|
if (result.removedIds.length > 0) {
|
|
@@ -357,10 +351,12 @@ function printDormantRows(rows, hasQuery, root) {
|
|
|
357
351
|
}
|
|
358
352
|
console.log(`${rows.length} dormant memor${rows.length === 1 ? 'y' : 'ies'}${hasQuery ? ' matching' : ''} (newest first):\n`);
|
|
359
353
|
for (const row of rows) {
|
|
360
|
-
const preview = row.content
|
|
354
|
+
const preview = truncateWithEllipsis(row.content, DORMANT_PREVIEW_CHARS);
|
|
361
355
|
console.log(`--- ${row.id}`);
|
|
362
356
|
console.log(` ${preview}`);
|
|
363
|
-
console.log(` Dormant since ${row.dormantAt.slice(0, DATE_PREFIX_CHARS)}
|
|
357
|
+
console.log(` Dormant since ${row.dormantAt.slice(0, DATE_PREFIX_CHARS)} ` +
|
|
358
|
+
`(${row.reason}, strength ${row.strength.toFixed(STRENGTH_DECIMALS)})` +
|
|
359
|
+
`${row.tags.length > 0 ? ` tags: ${row.tags.join(', ')}` : ''}`);
|
|
364
360
|
console.log('');
|
|
365
361
|
}
|
|
366
362
|
console.log('Bring one back: hippo dormant restore <id> Delete for good: hippo dormant forget <id>');
|
|
@@ -457,9 +453,9 @@ export async function handleForget({ hippoRoot, tenantId, args, flags }) {
|
|
|
457
453
|
});
|
|
458
454
|
if (routed)
|
|
459
455
|
return;
|
|
460
|
-
cmdForget(hippoRoot, tenantId, id, flags);
|
|
456
|
+
await cmdForget(hippoRoot, tenantId, id, flags);
|
|
461
457
|
}
|
|
462
|
-
function invalidateChurn(hippoRoot, args, flags) {
|
|
458
|
+
function invalidateChurn(hippoRoot, tenantId, args, flags) {
|
|
463
459
|
if (args[0] || flags['id'] !== undefined) {
|
|
464
460
|
printError('Usage: hippo invalidate --churn [--dry-run]');
|
|
465
461
|
printError('--churn takes no pattern or --id.');
|
|
@@ -471,7 +467,7 @@ function invalidateChurn(hippoRoot, args, flags) {
|
|
|
471
467
|
}
|
|
472
468
|
const churnDryRun = flagIsTrue(flags, 'dry-run');
|
|
473
469
|
let churnFailed = false;
|
|
474
|
-
for (const { root, result } of runChurnStaleForRepo(hippoRoot, churnDryRun)) {
|
|
470
|
+
for (const { root, result } of runChurnStaleForRepo(hippoRoot, tenantId, churnDryRun)) {
|
|
475
471
|
if (result.error) {
|
|
476
472
|
printError(`Churn-staleness check failed for ${root}: ${result.error}`);
|
|
477
473
|
churnFailed = true;
|
|
@@ -497,7 +493,7 @@ function invalidateChurn(hippoRoot, args, flags) {
|
|
|
497
493
|
export function handleInvalidate({ hippoRoot, tenantId, args, flags }) {
|
|
498
494
|
requireInit(hippoRoot);
|
|
499
495
|
if (flagIsTrue(flags, 'churn'))
|
|
500
|
-
return invalidateChurn(hippoRoot, args, flags);
|
|
496
|
+
return invalidateChurn(hippoRoot, tenantId, args, flags);
|
|
501
497
|
const target = args[0];
|
|
502
498
|
if (flagIsTrue(flags, 'id')) {
|
|
503
499
|
// Value-less --id must never silently fall through to pattern mode
|
|
@@ -519,7 +515,7 @@ export function handleInvalidate({ hippoRoot, tenantId, args, flags }) {
|
|
|
519
515
|
to: reason,
|
|
520
516
|
type: 'migration',
|
|
521
517
|
};
|
|
522
|
-
const result =
|
|
518
|
+
const result = api.invalidateMemories(cliApiContext(hippoRoot, tenantId), invTarget, { dryRun, onlyId });
|
|
523
519
|
const label = target ? `"${target}"` : `--id ${onlyId}`;
|
|
524
520
|
if (result.dryRun) {
|
|
525
521
|
if (result.invalidated === 0) {
|
package/dist/cli/dag.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type CommandContext } from './flag-values.js';
|
|
2
|
-
export declare function handleDag({ hippoRoot, flags }: CommandContext): void;
|
|
2
|
+
export declare function handleDag({ hippoRoot, tenantId, flags }: CommandContext): void;
|
|
3
3
|
export declare function handleDrill({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
|
|
4
4
|
export declare function handleAssemble({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
|
|
5
5
|
//# sourceMappingURL=dag.d.ts.map
|
package/dist/cli/dag.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
// DAG summary verbs: `hippo dag`, `hippo assemble` and `hippo drill`.
|
|
2
|
-
import {
|
|
2
|
+
import { truncateWithEllipsis } from '../util/ellipsize.js';
|
|
3
3
|
import * as api from '../api/index.js';
|
|
4
4
|
import { assembleCost, assembleHeading, drillCost, settleTokens } from '../api/context-render.js';
|
|
5
|
+
import { listMemories } from '../api/memories.js';
|
|
6
|
+
import { cliApiContext } from './api-context.js';
|
|
5
7
|
import { printError } from './output.js';
|
|
6
8
|
import { parseBudgetFlag, flagIsTrue, stringFlag, numberFlag } from './flag-values.js';
|
|
7
9
|
import { requireInit } from './shared.js';
|
|
@@ -13,9 +15,9 @@ const TREE_LEAF_PREVIEW_CHARS = 60;
|
|
|
13
15
|
const DAG_HEAD_CHARS = 120;
|
|
14
16
|
const DAG_SUMMARY_PREVIEW_CHARS = 200;
|
|
15
17
|
const DAG_CHILD_PREVIEW_CHARS = 100;
|
|
16
|
-
export function handleDag({ hippoRoot, flags }) {
|
|
18
|
+
export function handleDag({ hippoRoot, tenantId, flags }) {
|
|
17
19
|
requireInit(hippoRoot);
|
|
18
|
-
const entries =
|
|
20
|
+
const entries = listMemories(cliApiContext(hippoRoot, tenantId), { everyTenant: true });
|
|
19
21
|
const isStats = flagIsTrue(flags, 'stats');
|
|
20
22
|
const byLevel = new Map();
|
|
21
23
|
let unlinked = 0;
|
|
@@ -39,6 +41,17 @@ function printDagStats(byLevel, unlinked) {
|
|
|
39
41
|
console.log(` Level 0 (raw memories): ${byLevel.get(0) ?? 0}`);
|
|
40
42
|
console.log(` Unlinked facts: ${unlinked}`);
|
|
41
43
|
}
|
|
44
|
+
function groupByParent(entries) {
|
|
45
|
+
const byParent = new Map();
|
|
46
|
+
for (const e of entries) {
|
|
47
|
+
if (!e.dag_parent_id)
|
|
48
|
+
continue;
|
|
49
|
+
const list = byParent.get(e.dag_parent_id) ?? [];
|
|
50
|
+
list.push(e);
|
|
51
|
+
byParent.set(e.dag_parent_id, list);
|
|
52
|
+
}
|
|
53
|
+
return byParent;
|
|
54
|
+
}
|
|
42
55
|
function printDagTree(entries) {
|
|
43
56
|
// Tree view: L3 entity profiles as roots with L2 children indented, then orphan L2 summaries at top level.
|
|
44
57
|
const profiles = entries.filter((e) => e.dag_level === 3);
|
|
@@ -52,6 +65,7 @@ function printDagTree(entries) {
|
|
|
52
65
|
list.push(l2);
|
|
53
66
|
childL2ByProfile.set(l2.dag_parent_id, list);
|
|
54
67
|
}
|
|
68
|
+
const childrenByParent = groupByParent(entries);
|
|
55
69
|
if (profiles.length === 0 && orphanL2.length === 0) {
|
|
56
70
|
console.log('No DAG summaries yet. Run `hippo sleep` with ANTHROPIC_API_KEY set.');
|
|
57
71
|
return;
|
|
@@ -68,7 +82,7 @@ function printDagTree(entries) {
|
|
|
68
82
|
console.log(` └─ 📌 ${l2.content.slice(0, TREE_CHILD_PREVIEW_CHARS)}`);
|
|
69
83
|
if (l2Tags)
|
|
70
84
|
console.log(` [${l2Tags}]`);
|
|
71
|
-
const facts =
|
|
85
|
+
const facts = childrenByParent.get(l2.id) ?? [];
|
|
72
86
|
for (const f of facts) {
|
|
73
87
|
console.log(` └─ ${f.content.slice(0, TREE_LEAF_PREVIEW_CHARS)}`);
|
|
74
88
|
}
|
|
@@ -80,7 +94,7 @@ function printDagTree(entries) {
|
|
|
80
94
|
console.log(`\n📌 ${summary.content.slice(0, CONTENT_PREVIEW_CHARS)}`);
|
|
81
95
|
if (summaryTags)
|
|
82
96
|
console.log(` [${summaryTags}]`);
|
|
83
|
-
const children =
|
|
97
|
+
const children = childrenByParent.get(summary.id) ?? [];
|
|
84
98
|
for (const child of children) {
|
|
85
99
|
console.log(` └─ ${child.content.slice(0, TREE_CHILD_PREVIEW_CHARS)}`);
|
|
86
100
|
}
|
|
@@ -165,11 +179,12 @@ async function cmdDrillDown(hippoRoot, tenantId, summaryId, flags) {
|
|
|
165
179
|
console.log(JSON.stringify(r, null, 2));
|
|
166
180
|
return;
|
|
167
181
|
}
|
|
168
|
-
console.log(`Summary ${r.summary.id} — ${r.summary.descendantCount} descendants
|
|
169
|
-
|
|
182
|
+
console.log(`Summary ${r.summary.id} — ${r.summary.descendantCount} descendants` +
|
|
183
|
+
`${r.summary.earliestAt ? ` (${r.summary.earliestAt} → ${r.summary.latestAt})` : ''}`);
|
|
184
|
+
console.log(` ${truncateWithEllipsis(r.summary.content, DAG_SUMMARY_PREVIEW_CHARS, '…')}`);
|
|
170
185
|
console.log(`\nChildren (${r.children.length}/${r.totalChildren}${r.truncated ? ', truncated' : ''}):`);
|
|
171
186
|
for (const c of r.children) {
|
|
172
|
-
console.log(` [L${c.dagLevel}] ${c.id} — ${c.content
|
|
187
|
+
console.log(` [L${c.dagLevel}] ${c.id} — ${truncateWithEllipsis(c.content, DAG_CHILD_PREVIEW_CHARS, '…')}`);
|
|
173
188
|
}
|
|
174
189
|
}
|
|
175
190
|
export async function handleDrill({ hippoRoot, tenantId, args, flags }) {
|
package/dist/cli/decisions.d.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
1
|
import { type CommandContext } from './flag-values.js';
|
|
2
|
-
export declare function handlePredict({ hippoRoot, tenantId, args, flags }: CommandContext): void;
|
|
3
2
|
export declare function handleDecide({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
|
|
4
|
-
export declare function handleIncident({ hippoRoot, tenantId, args, flags }: CommandContext): void;
|
|
5
3
|
//# sourceMappingURL=decisions.d.ts.map
|
package/dist/cli/decisions.js
CHANGED
|
@@ -1,191 +1,15 @@
|
|
|
1
|
-
// First-class object verbs for
|
|
1
|
+
// First-class object verbs for decisions: record one (optionally superseding an older one's memory), list, get, close.
|
|
2
2
|
import { getMemory } from '../api/memories.js';
|
|
3
3
|
import { extractPathTags } from '../search/path-context.js';
|
|
4
|
-
import * as predictionsModule from '../store/predictions.js';
|
|
5
4
|
import * as decisionsModule from '../objects/decisions.js';
|
|
6
|
-
import * as incidentsModule from '../objects/incidents.js';
|
|
7
5
|
import { printError } from './output.js';
|
|
8
|
-
import { nonEmptyStringFlag,
|
|
6
|
+
import { nonEmptyStringFlag, flagIsTrue, stringFlag } from './flag-values.js';
|
|
9
7
|
import { requireInit } from './shared.js';
|
|
10
8
|
import { cliApiContext } from './api-context.js';
|
|
11
|
-
import { closeObject, foundOrExit, idArgOrExit, listObjects, printLifecycleTail
|
|
9
|
+
import { closeObject, foundOrExit, idArgOrExit, listObjects, printLifecycleTail } from './object-verbs.js';
|
|
12
10
|
import { errorMessage } from '../util/log.js';
|
|
13
11
|
import { CliExit } from './exit.js';
|
|
14
|
-
const BASERATE_DECIMALS = 3;
|
|
15
12
|
const DECISION = { cmd: 'decide', noun: 'Decision', idLabel: 'decision' };
|
|
16
|
-
const INCIDENT = { cmd: 'incident', noun: 'Incident', idLabel: 'incident' };
|
|
17
|
-
const PREDICTION_NOUN = 'Prediction';
|
|
18
|
-
// Lenient on purpose (parseInt reads "1abc" as 1) until the next major version; incidents use the strict parser.
|
|
19
|
-
function parseObjectId(idRaw, noun) {
|
|
20
|
-
const id = parseInt(String(idRaw), 10);
|
|
21
|
-
if (!Number.isFinite(id) || id <= 0) {
|
|
22
|
-
printError(`Invalid ${noun} id: "${idRaw}"`);
|
|
23
|
-
throw new CliExit(1);
|
|
24
|
-
}
|
|
25
|
-
return id;
|
|
26
|
-
}
|
|
27
|
-
// Prediction first-class object
|
|
28
|
-
function predictClose(hippoRoot, tenantId, args, flags) {
|
|
29
|
-
const id = idArgOrExit(args, 'Usage: hippo predict close <id> --state <closed|closed-unknown> [--actual <v>] [--note "..."]', 'prediction', parseObjectId);
|
|
30
|
-
const stateRaw = (stringFlag(flags, 'state') ?? '').trim();
|
|
31
|
-
// SAFETY: Set.has only compares by value, so a string outside the closure states is a plain miss.
|
|
32
|
-
if (!predictionsModule.VALID_CLOSURE_STATES.has(stateRaw) || stateRaw === 'open') {
|
|
33
|
-
printError(`Invalid --state: "${stateRaw}". Must be one of: closed | closed-unknown.`);
|
|
34
|
-
throw new CliExit(1);
|
|
35
|
-
}
|
|
36
|
-
const actualRaw = flags['actual'];
|
|
37
|
-
const actualValue = actualRaw !== undefined ? Number(actualRaw) : undefined;
|
|
38
|
-
if (actualRaw !== undefined && !Number.isFinite(actualValue)) {
|
|
39
|
-
printError(`Invalid --actual: "${actualRaw}". Must be a number.`);
|
|
40
|
-
throw new CliExit(1);
|
|
41
|
-
}
|
|
42
|
-
const closureNote = stringFlag(flags, 'note');
|
|
43
|
-
const closed = predictionsModule.closePrediction(hippoRoot, tenantId, id, {
|
|
44
|
-
// SAFETY: the check above exits unless stateRaw is in VALID_CLOSURE_STATES.
|
|
45
|
-
closureState: stateRaw,
|
|
46
|
-
actualValue,
|
|
47
|
-
closureNote,
|
|
48
|
-
});
|
|
49
|
-
console.log(`Prediction ${closed.id} closed: state=${closed.closureState}${closed.actualValue !== null ? ` actual=${closed.actualValue}` : ''}`);
|
|
50
|
-
}
|
|
51
|
-
function loadPredictionList(hippoRoot, tenantId, status, classTag, limit) {
|
|
52
|
-
if (status === 'open') {
|
|
53
|
-
return predictionsModule.loadOpenPredictions(hippoRoot, tenantId, {
|
|
54
|
-
classTag: classTag || undefined,
|
|
55
|
-
limit,
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
if (status === 'all') {
|
|
59
|
-
return classTag
|
|
60
|
-
? predictionsModule.loadPredictionsByClass(hippoRoot, tenantId, classTag, { limit })
|
|
61
|
-
: predictionsModule.loadAllPredictions(hippoRoot, tenantId, { limit });
|
|
62
|
-
}
|
|
63
|
-
const closureState = requireStatus(status, predictionsModule.VALID_CLOSURE_STATES);
|
|
64
|
-
if (!classTag) {
|
|
65
|
-
// status filter without class — scan all classes is more complex; v1 requires --class for non-default status
|
|
66
|
-
printError('--status filter (non-open) requires --class to be set.');
|
|
67
|
-
throw new CliExit(1);
|
|
68
|
-
}
|
|
69
|
-
return predictionsModule.loadPredictionsByClass(hippoRoot, tenantId, classTag, {
|
|
70
|
-
closureState,
|
|
71
|
-
limit,
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
function predictList(hippoRoot, tenantId, flags) {
|
|
75
|
-
const classTag = stringFlag(flags, 'class')?.trim() ?? '';
|
|
76
|
-
const status = stringFlag(flags, 'status')?.trim() ?? 'all';
|
|
77
|
-
const limit = parseListLimit(flags);
|
|
78
|
-
const results = loadPredictionList(hippoRoot, tenantId, status, classTag, limit);
|
|
79
|
-
if (results.length === 0) {
|
|
80
|
-
console.log(classTag ? `No predictions in class "${classTag}".` : 'No predictions.');
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
console.log(`Found ${results.length} predictions:\n`);
|
|
84
|
-
for (const p of results) {
|
|
85
|
-
const estPart = p.estimateValue !== null ? ` estimate=${p.estimateValue}${p.estimateUnit ? ` ${p.estimateUnit}` : ''}` : '';
|
|
86
|
-
const actPart = p.actualValue !== null ? ` actual=${p.actualValue}` : '';
|
|
87
|
-
const tgtPart = p.targetDate ? ` target=${p.targetDate}` : '';
|
|
88
|
-
console.log(`#${p.id} [${p.closureState}] class=${p.classTag}${estPart}${actPart}${tgtPart}`);
|
|
89
|
-
console.log(` ${p.claimText}`);
|
|
90
|
-
if (p.closureNote)
|
|
91
|
-
console.log(` note: ${p.closureNote}`);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
function predictShow(hippoRoot, tenantId, args) {
|
|
95
|
-
const id = idArgOrExit(args, 'Usage: hippo predict show <id>', 'prediction', parseObjectId);
|
|
96
|
-
const pred = foundOrExit(predictionsModule.loadPredictionById(hippoRoot, tenantId, id), PREDICTION_NOUN, id);
|
|
97
|
-
console.log(`Prediction #${pred.id}`);
|
|
98
|
-
console.log(` class: ${pred.classTag}`);
|
|
99
|
-
console.log(` claim: ${pred.claimText}`);
|
|
100
|
-
console.log(` state: ${pred.closureState}`);
|
|
101
|
-
if (pred.estimateValue !== null)
|
|
102
|
-
console.log(` estimate: ${pred.estimateValue}${pred.estimateUnit ? ' ' + pred.estimateUnit : ''}`);
|
|
103
|
-
if (pred.targetDate)
|
|
104
|
-
console.log(` target: ${pred.targetDate}`);
|
|
105
|
-
if (pred.actualValue !== null)
|
|
106
|
-
console.log(` actual: ${pred.actualValue}`);
|
|
107
|
-
if (pred.closedAt)
|
|
108
|
-
console.log(` closed: ${pred.closedAt}`);
|
|
109
|
-
if (pred.closureNote)
|
|
110
|
-
console.log(` note: ${pred.closureNote}`);
|
|
111
|
-
if (pred.memoryId)
|
|
112
|
-
console.log(` memory: ${pred.memoryId}`);
|
|
113
|
-
console.log(` created: ${pred.createdAt}`);
|
|
114
|
-
}
|
|
115
|
-
function predictBaserate(hippoRoot, tenantId, flags) {
|
|
116
|
-
// Reference-class / planning-fallacy detector
|
|
117
|
-
const classTag = stringFlag(flags, 'class')?.trim();
|
|
118
|
-
if (!classTag) {
|
|
119
|
-
printError('Usage: hippo predict baserate --class <c>');
|
|
120
|
-
throw new CliExit(1);
|
|
121
|
-
}
|
|
122
|
-
const baserate = predictionsModule.computePredictionBaserate(hippoRoot, tenantId, classTag);
|
|
123
|
-
if (baserate.nClosed === 0) {
|
|
124
|
-
console.log(`No closed predictions in class "${baserate.classTag}" yet.`);
|
|
125
|
-
console.log(` Create one with: hippo predict "<claim>" --class ${baserate.classTag} --estimate N`);
|
|
126
|
-
console.log(` Close it later: hippo predict close <id> --state closed --actual N`);
|
|
127
|
-
return;
|
|
128
|
-
}
|
|
129
|
-
console.log(baserate.summary);
|
|
130
|
-
console.log(` n_closed: ${baserate.nClosed}`);
|
|
131
|
-
console.log(` n_ratio_eligible: ${baserate.nRatioEligible}`);
|
|
132
|
-
if (baserate.meanEstimate !== null)
|
|
133
|
-
console.log(` mean_estimate: ${baserate.meanEstimate.toFixed(BASERATE_DECIMALS)}`);
|
|
134
|
-
if (baserate.meanActual !== null)
|
|
135
|
-
console.log(` mean_actual: ${baserate.meanActual.toFixed(BASERATE_DECIMALS)}`);
|
|
136
|
-
if (baserate.meanRatio !== null)
|
|
137
|
-
console.log(` mean_ratio: ${baserate.meanRatio.toFixed(BASERATE_DECIMALS)}x`);
|
|
138
|
-
if (baserate.p50Ratio !== null)
|
|
139
|
-
console.log(` p50_ratio: ${baserate.p50Ratio.toFixed(BASERATE_DECIMALS)}x`);
|
|
140
|
-
if (baserate.mae !== null)
|
|
141
|
-
console.log(` mae: ${baserate.mae.toFixed(BASERATE_DECIMALS)}`);
|
|
142
|
-
}
|
|
143
|
-
export function handlePredict({ hippoRoot, tenantId, args, flags }) {
|
|
144
|
-
requireInit(hippoRoot);
|
|
145
|
-
const subcommand = args[0] ?? '';
|
|
146
|
-
if (subcommand === 'close')
|
|
147
|
-
return predictClose(hippoRoot, tenantId, args, flags);
|
|
148
|
-
if (subcommand === 'list')
|
|
149
|
-
return predictList(hippoRoot, tenantId, flags);
|
|
150
|
-
if (subcommand === 'show')
|
|
151
|
-
return predictShow(hippoRoot, tenantId, args);
|
|
152
|
-
if (subcommand === 'baserate')
|
|
153
|
-
return predictBaserate(hippoRoot, tenantId, flags);
|
|
154
|
-
// Default subcommand: create. args[0] is the claim text.
|
|
155
|
-
predictCreate(hippoRoot, tenantId, subcommand, flags);
|
|
156
|
-
}
|
|
157
|
-
function predictCreate(hippoRoot, tenantId, claimText, flags) {
|
|
158
|
-
if (!claimText) {
|
|
159
|
-
printError('Usage: hippo predict "<claim>" --class <c> [--estimate <v>] [--unit <u>] [--target <YYYY-MM-DD>]');
|
|
160
|
-
printError(' hippo predict close <id> --state <closed|closed-unknown> [--actual <v>] [--note "..."]');
|
|
161
|
-
printError(' hippo predict list [--class X] [--status open|closed|closed-unknown|all] [--limit N]');
|
|
162
|
-
printError(' hippo predict show <id>');
|
|
163
|
-
throw new CliExit(1);
|
|
164
|
-
}
|
|
165
|
-
const classTag = stringFlag(flags, 'class')?.trim();
|
|
166
|
-
if (!classTag) {
|
|
167
|
-
printError('--class is required for prediction creation.');
|
|
168
|
-
throw new CliExit(1);
|
|
169
|
-
}
|
|
170
|
-
const estimateRaw = flags['estimate'];
|
|
171
|
-
const estimateValue = estimateRaw !== undefined ? Number(estimateRaw) : undefined;
|
|
172
|
-
if (estimateRaw !== undefined && !Number.isFinite(estimateValue)) {
|
|
173
|
-
printError(`Invalid --estimate: "${estimateRaw}". Must be a number.`);
|
|
174
|
-
throw new CliExit(1);
|
|
175
|
-
}
|
|
176
|
-
const estimateUnit = stringFlag(flags, 'unit');
|
|
177
|
-
const targetDate = stringFlag(flags, 'target');
|
|
178
|
-
const created = predictionsModule.savePrediction(hippoRoot, tenantId, {
|
|
179
|
-
classTag,
|
|
180
|
-
claimText,
|
|
181
|
-
estimateValue,
|
|
182
|
-
estimateUnit,
|
|
183
|
-
targetDate,
|
|
184
|
-
});
|
|
185
|
-
console.log(`Prediction recorded: #${created.id} class=${created.classTag}`);
|
|
186
|
-
if (created.memoryId)
|
|
187
|
-
console.log(` memory: ${created.memoryId}`);
|
|
188
|
-
}
|
|
189
13
|
function printDecisionRow(d) {
|
|
190
14
|
const supPart = d.supersededBy !== null ? ` superseded_by=#${d.supersededBy}` : '';
|
|
191
15
|
console.log(`#${d.id} [${d.status}]${supPart} memory=${d.memoryId ?? '-'}`);
|
|
@@ -202,7 +26,7 @@ function decideList(hippoRoot, tenantId, flags) {
|
|
|
202
26
|
});
|
|
203
27
|
}
|
|
204
28
|
function decideGet(hippoRoot, tenantId, args) {
|
|
205
|
-
const id = idArgOrExit(args, 'Usage: hippo decide get <id>', DECISION.idLabel
|
|
29
|
+
const id = idArgOrExit(args, 'Usage: hippo decide get <id>', DECISION.idLabel);
|
|
206
30
|
const decision = foundOrExit(decisionsModule.loadDecisionById(hippoRoot, tenantId, id), DECISION.noun, id);
|
|
207
31
|
console.log(`Decision #${decision.id}`);
|
|
208
32
|
console.log(` status: ${decision.status}`);
|
|
@@ -212,7 +36,7 @@ function decideGet(hippoRoot, tenantId, args) {
|
|
|
212
36
|
printLifecycleTail(decision);
|
|
213
37
|
}
|
|
214
38
|
function decideClose(hippoRoot, tenantId, args) {
|
|
215
|
-
closeObject(args, DECISION, (id) => decisionsModule.closeDecision(hippoRoot, tenantId, id)
|
|
39
|
+
closeObject(args, DECISION, (id) => decisionsModule.closeDecision(hippoRoot, tenantId, id));
|
|
216
40
|
}
|
|
217
41
|
export async function handleDecide({ hippoRoot, tenantId, args, flags }) {
|
|
218
42
|
requireInit(hippoRoot);
|
|
@@ -258,7 +82,7 @@ async function decideCreate(hippoRoot, tenantId, decisionText, flags) {
|
|
|
258
82
|
extraTags: decisionPathTags,
|
|
259
83
|
});
|
|
260
84
|
if (oldEntry)
|
|
261
|
-
|
|
85
|
+
weakenOrWarn(hippoRoot, oldEntry, supersedesMemId);
|
|
262
86
|
console.log(`Decision recorded: #${created.id}`);
|
|
263
87
|
if (created.memoryId)
|
|
264
88
|
console.log(` memory: ${created.memoryId}`);
|
|
@@ -272,7 +96,7 @@ function exitWithDecideUsage() {
|
|
|
272
96
|
printError(' hippo decide close <id>');
|
|
273
97
|
throw new CliExit(1);
|
|
274
98
|
}
|
|
275
|
-
function
|
|
99
|
+
function weakenOrWarn(hippoRoot, oldEntry, supersedesMemId) {
|
|
276
100
|
// Best-effort and last: saveDecision already committed. Failing here would make a retry find no active
|
|
277
101
|
// decision for the old memory and create a duplicate active successor, so warn instead.
|
|
278
102
|
try {
|
|
@@ -288,106 +112,4 @@ function printSupersedes(supersedesMemId, supersedesDecisionId) {
|
|
|
288
112
|
: ' (no active decision row; memory weakened only)';
|
|
289
113
|
console.log(` supersedes memory: ${supersedesMemId}${tail}`);
|
|
290
114
|
}
|
|
291
|
-
function printIncidentRow(inc) {
|
|
292
|
-
const linkPart = inc.linkedMemoryIds.length > 0 ? ` links=${inc.linkedMemoryIds.length}` : '';
|
|
293
|
-
console.log(`#${inc.id} [${inc.status}]${linkPart} memory=${inc.memoryId ?? '-'}`);
|
|
294
|
-
console.log(` ${inc.incidentText}`);
|
|
295
|
-
if (inc.context)
|
|
296
|
-
console.log(` context: ${inc.context}`);
|
|
297
|
-
}
|
|
298
|
-
function incidentList(hippoRoot, tenantId, flags) {
|
|
299
|
-
listObjects(flags, {
|
|
300
|
-
plural: 'incidents',
|
|
301
|
-
states: incidentsModule.VALID_INCIDENT_STATES,
|
|
302
|
-
load: (opts) => incidentsModule.loadIncidents(hippoRoot, tenantId, opts),
|
|
303
|
-
printRow: printIncidentRow,
|
|
304
|
-
});
|
|
305
|
-
}
|
|
306
|
-
function incidentGet(hippoRoot, tenantId, args) {
|
|
307
|
-
const id = idArgOrExit(args, 'Usage: hippo incident get <id>', INCIDENT.idLabel);
|
|
308
|
-
const incident = foundOrExit(incidentsModule.loadIncidentById(hippoRoot, tenantId, id), INCIDENT.noun, id);
|
|
309
|
-
console.log(`Incident #${incident.id}`);
|
|
310
|
-
console.log(` status: ${incident.status}`);
|
|
311
|
-
console.log(` text: ${incident.incidentText}`);
|
|
312
|
-
if (incident.context)
|
|
313
|
-
console.log(` context: ${incident.context}`);
|
|
314
|
-
if (incident.resolutionText)
|
|
315
|
-
console.log(` resolution: ${incident.resolutionText}`);
|
|
316
|
-
if (incident.resolvedAt)
|
|
317
|
-
console.log(` resolved_at: ${incident.resolvedAt}`);
|
|
318
|
-
if (incident.closedAt)
|
|
319
|
-
console.log(` closed_at: ${incident.closedAt}`);
|
|
320
|
-
if (incident.linkedMemoryIds.length > 0) {
|
|
321
|
-
console.log(` linked memories: ${incident.linkedMemoryIds.join(', ')}`);
|
|
322
|
-
}
|
|
323
|
-
if (incident.memoryId)
|
|
324
|
-
console.log(` memory: ${incident.memoryId}`);
|
|
325
|
-
console.log(` created: ${incident.createdAt}`);
|
|
326
|
-
}
|
|
327
|
-
function incidentResolve(hippoRoot, tenantId, args, flags) {
|
|
328
|
-
const id = idArgOrExit(args, 'Usage: hippo incident resolve <id> --resolution "<text>"', INCIDENT.idLabel);
|
|
329
|
-
const resolutionRaw = stringFlag(flags, 'resolution');
|
|
330
|
-
if (!resolutionRaw?.trim()) {
|
|
331
|
-
printError('--resolution requires a non-empty value, e.g. hippo incident resolve <id> --resolution "root cause fixed".');
|
|
332
|
-
throw new CliExit(1);
|
|
333
|
-
}
|
|
334
|
-
const resolved = incidentsModule.resolveIncident(hippoRoot, tenantId, id, resolutionRaw);
|
|
335
|
-
console.log(`Incident #${resolved.id} resolved.`);
|
|
336
|
-
}
|
|
337
|
-
function incidentClose(hippoRoot, tenantId, args) {
|
|
338
|
-
closeObject(args, INCIDENT, (id) => incidentsModule.closeIncident(hippoRoot, tenantId, id));
|
|
339
|
-
}
|
|
340
|
-
export function handleIncident({ hippoRoot, tenantId, args, flags }) {
|
|
341
|
-
requireInit(hippoRoot);
|
|
342
|
-
const subcommand = args[0] ?? '';
|
|
343
|
-
if (subcommand === 'list')
|
|
344
|
-
return incidentList(hippoRoot, tenantId, flags);
|
|
345
|
-
if (subcommand === 'get')
|
|
346
|
-
return incidentGet(hippoRoot, tenantId, args);
|
|
347
|
-
if (subcommand === 'resolve')
|
|
348
|
-
return incidentResolve(hippoRoot, tenantId, args, flags);
|
|
349
|
-
if (subcommand === 'close')
|
|
350
|
-
return incidentClose(hippoRoot, tenantId, args);
|
|
351
|
-
// Default subcommand is open (create): accept both `incident open "<text>"` and bare `incident "<text>"`;
|
|
352
|
-
// for the `open` keyword the text is args[1], otherwise args[0] is the text.
|
|
353
|
-
incidentCreate(hippoRoot, tenantId, subcommand === 'open' ? (args[1] ?? '') : subcommand, flags);
|
|
354
|
-
}
|
|
355
|
-
function incidentCreate(hippoRoot, tenantId, incidentText, flags) {
|
|
356
|
-
if (!incidentText) {
|
|
357
|
-
printError('Usage: hippo incident "<incident>" [--context "<details>"] [--link <memory-id>]...');
|
|
358
|
-
printError(' hippo incident list [--status open|resolved|closed|all] [--limit N]');
|
|
359
|
-
printError(' hippo incident get <id>');
|
|
360
|
-
printError(' hippo incident resolve <id> --resolution "<text>"');
|
|
361
|
-
printError(' hippo incident close <id>');
|
|
362
|
-
throw new CliExit(1);
|
|
363
|
-
}
|
|
364
|
-
const context = nonEmptyStringFlag(flags, 'context');
|
|
365
|
-
// --link is a repeatable flag (collected into an array by parseArgs). A
|
|
366
|
-
// single --link <id> yields a string; normalize both to string[].
|
|
367
|
-
const linkRaw = flags['link'];
|
|
368
|
-
let linkedMemoryIds;
|
|
369
|
-
if (Array.isArray(linkRaw)) {
|
|
370
|
-
linkedMemoryIds = linkRaw;
|
|
371
|
-
}
|
|
372
|
-
else if (isStringFlag(linkRaw)) {
|
|
373
|
-
linkedMemoryIds = [linkRaw];
|
|
374
|
-
}
|
|
375
|
-
else if (linkRaw === true) {
|
|
376
|
-
printError('--link requires a memory id, e.g. hippo incident "<text>" --link mem_abc123.');
|
|
377
|
-
throw new CliExit(1);
|
|
378
|
-
}
|
|
379
|
-
const incidentPathTags = extractPathTags(process.cwd());
|
|
380
|
-
const created = incidentsModule.saveIncident(hippoRoot, tenantId, {
|
|
381
|
-
incidentText,
|
|
382
|
-
context,
|
|
383
|
-
linkedMemoryIds,
|
|
384
|
-
extraTags: incidentPathTags,
|
|
385
|
-
});
|
|
386
|
-
console.log(`Incident recorded: #${created.id}`);
|
|
387
|
-
if (created.memoryId)
|
|
388
|
-
console.log(` memory: ${created.memoryId}`);
|
|
389
|
-
if (created.linkedMemoryIds.length > 0) {
|
|
390
|
-
console.log(` linked memories: ${created.linkedMemoryIds.join(', ')}`);
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
115
|
//# sourceMappingURL=decisions.js.map
|
package/dist/cli/eval.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { type CommandContext } from './flag-values.js';
|
|
2
|
-
export declare function handleEval({ hippoRoot, args, flags }: CommandContext): Promise<void>;
|
|
2
|
+
export declare function handleEval({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
|
|
3
3
|
//# sourceMappingURL=eval.d.ts.map
|