hippo-memory 1.70.0 → 1.71.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/agent-memories/claude-code.d.ts +4 -2
- package/dist/agent-memories/claude-code.js +14 -5
- package/dist/agent-memories/files.js +23 -12
- package/dist/agent-memories/markdown.d.ts +1 -3
- package/dist/agent-memories/markdown.js +1 -3
- package/dist/agent-memories/report.js +2 -1
- package/dist/agent-memories/sync.d.ts +4 -2
- package/dist/agent-memories/sync.js +10 -5
- package/dist/api/assemble.d.ts +7 -44
- package/dist/api/assemble.js +2 -22
- package/dist/api/audit.d.ts +5 -1
- package/dist/api/audit.js +9 -1
- package/dist/api/auth.d.ts +13 -22
- package/dist/api/auth.js +34 -24
- package/dist/api/auto-sleep.js +2 -2
- package/dist/api/availability.d.ts +2 -15
- package/dist/api/availability.js +2 -15
- package/dist/api/context-select.js +3 -4
- package/dist/api/context-types.d.ts +10 -35
- package/dist/api/context.d.ts +5 -22
- package/dist/api/context.js +21 -38
- package/dist/api/dormant.d.ts +5 -21
- package/dist/api/dormant.js +7 -26
- package/dist/api/drill-down.d.ts +7 -46
- package/dist/api/drill-down.js +5 -26
- package/dist/api/forget.d.ts +5 -24
- package/dist/api/forget.js +5 -28
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +2 -0
- package/dist/api/index.js +2 -0
- package/dist/api/instruction-detect.js +16 -5
- package/dist/api/ledger-db.d.ts +2 -1
- package/dist/api/ledger-db.js +5 -3
- package/dist/api/memories.d.ts +5 -0
- package/dist/api/memories.js +7 -0
- package/dist/api/objects.d.ts +9 -0
- package/dist/api/objects.js +11 -0
- package/dist/api/on-store.js +5 -3
- package/dist/api/predictions.d.ts +9 -0
- package/dist/api/predictions.js +18 -0
- package/dist/api/promote.d.ts +13 -17
- package/dist/api/promote.js +11 -19
- package/dist/api/prompt-hook.d.ts +4 -4
- package/dist/api/prompt-hook.js +10 -9
- package/dist/api/recall-cli.d.ts +55 -0
- package/dist/api/recall-cli.js +94 -0
- package/dist/api/recall-core.js +14 -6
- package/dist/api/recall-finish.d.ts +53 -0
- package/dist/api/recall-finish.js +30 -0
- package/dist/api/recall-history.d.ts +17 -84
- package/dist/api/recall-history.js +15 -88
- package/dist/api/recall-pipeline.d.ts +2 -3
- package/dist/api/recall-pipeline.js +16 -9
- package/dist/api/recall-types.d.ts +64 -304
- package/dist/api/recall.d.ts +5 -33
- package/dist/api/recall.js +59 -60
- package/dist/api/refine.d.ts +7 -0
- package/dist/api/refine.js +10 -0
- package/dist/api/remember-local.d.ts +57 -0
- package/dist/api/remember-local.js +90 -0
- package/dist/api/remember.d.ts +18 -1
- package/dist/api/remember.js +13 -1
- package/dist/api/sleep-run.d.ts +1 -3
- package/dist/api/sleep-run.js +17 -21
- package/dist/api/sleep.d.ts +9 -28
- package/dist/api/tokens.d.ts +3 -10
- package/dist/api/tokens.js +3 -10
- package/dist/api/types.d.ts +6 -29
- package/dist/api/types.js +4 -22
- package/dist/capture/command.d.ts +4 -12
- package/dist/capture/command.js +6 -22
- package/dist/capture/compact.d.ts +4 -15
- package/dist/capture/compact.js +16 -25
- package/dist/capture/compaction-record.js +101 -69
- package/dist/capture/compaction-spool.d.ts +1 -1
- package/dist/capture/compaction-spool.js +1 -1
- package/dist/capture/session-digest.d.ts +1 -1
- package/dist/capture/session-digest.js +13 -7
- package/dist/capture/transcript.d.ts +2 -10
- package/dist/capture/transcript.js +4 -18
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +6 -39
- package/dist/cli/audit-prune.js +6 -39
- package/dist/cli/audit.d.ts +1 -1
- package/dist/cli/audit.js +33 -34
- package/dist/cli/auth.d.ts +2 -2
- package/dist/cli/auth.js +57 -39
- package/dist/cli/briefs.d.ts +4 -4
- package/dist/cli/briefs.js +18 -22
- package/dist/cli/card.d.ts +2 -2
- package/dist/cli/card.js +31 -32
- package/dist/cli/client.d.ts +7 -27
- package/dist/cli/client.js +24 -43
- package/dist/cli/compact-resume-payload.js +3 -2
- package/dist/cli/context.d.ts +1 -2
- package/dist/cli/context.js +12 -8
- package/dist/cli/continuity.d.ts +6 -6
- package/dist/cli/continuity.js +62 -64
- package/dist/cli/correction-latency.d.ts +2 -14
- package/dist/cli/correction-latency.js +2 -14
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +68 -92
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +33 -27
- package/dist/cli/decisions.d.ts +4 -4
- package/dist/cli/decisions.js +33 -47
- package/dist/cli/eval.js +15 -13
- package/dist/cli/exit.d.ts +6 -0
- package/dist/cli/exit.js +11 -0
- package/dist/cli/explain.d.ts +1 -2
- package/dist/cli/explain.js +6 -4
- package/dist/cli/flag-values.d.ts +6 -1
- package/dist/cli/flag-values.js +27 -10
- package/dist/cli/flags.d.ts +1 -0
- package/dist/cli/flags.js +1 -1
- package/dist/cli/github.d.ts +14 -0
- package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
- package/dist/cli/goals.d.ts +2 -2
- package/dist/cli/goals.js +46 -50
- package/dist/cli/hook-runtime.d.ts +9 -27
- package/dist/cli/hook-runtime.js +15 -31
- package/dist/cli/init.d.ts +2 -2
- package/dist/cli/init.js +6 -12
- package/dist/cli/install-steps.js +3 -12
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +3 -0
- package/dist/cli/maintenance.d.ts +4 -4
- package/dist/cli/maintenance.js +14 -19
- package/dist/cli/object-verbs.js +4 -3
- package/dist/cli/owner-validation.d.ts +5 -28
- package/dist/cli/owner-validation.js +5 -28
- package/dist/cli/playbooks.d.ts +4 -4
- package/dist/cli/playbooks.js +23 -28
- package/dist/cli/print.d.ts +2 -5
- package/dist/cli/print.js +1 -4
- package/dist/cli/projects.d.ts +2 -2
- package/dist/cli/projects.js +1 -3
- package/dist/cli/provenance-coverage.d.ts +2 -6
- package/dist/cli/provenance-coverage.js +2 -6
- package/dist/cli/quality-repair-once.js +2 -2
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +55 -131
- package/dist/cli/refine-llm.d.ts +5 -31
- package/dist/cli/refine-llm.js +9 -36
- package/dist/cli/remember.d.ts +3 -3
- package/dist/cli/remember.js +122 -180
- package/dist/cli/scheduler.d.ts +2 -17
- package/dist/cli/scheduler.js +12 -18
- package/dist/cli/serve.js +21 -12
- package/dist/cli/session-hooks.d.ts +10 -18
- package/dist/cli/session-hooks.js +112 -113
- package/dist/cli/setup.d.ts +4 -4
- package/dist/cli/setup.js +19 -21
- package/dist/cli/shared.d.ts +9 -23
- package/dist/cli/shared.js +9 -32
- package/dist/cli/slack.d.ts +2 -2
- package/dist/cli/slack.js +19 -23
- package/dist/cli/sleep.d.ts +3 -2
- package/dist/cli/sleep.js +15 -16
- package/dist/cli/status.d.ts +9 -12
- package/dist/cli/status.js +55 -98
- package/dist/cli/stdin.d.ts +4 -6
- package/dist/cli/stdin.js +2 -3
- package/dist/cli/transfer.d.ts +9 -9
- package/dist/cli/transfer.js +66 -89
- package/dist/cli/usage.js +11 -5
- package/dist/cli.d.ts +66 -448
- package/dist/cli.js +87 -263
- package/dist/connectors/github/backfill.d.ts +5 -25
- package/dist/connectors/github/backfill.js +14 -49
- package/dist/connectors/github/deletion.d.ts +4 -18
- package/dist/connectors/github/deletion.js +2 -15
- package/dist/connectors/github/dlq.d.ts +8 -33
- package/dist/connectors/github/dlq.js +12 -29
- package/dist/connectors/github/ingest.d.ts +2 -6
- package/dist/connectors/github/ingest.js +4 -10
- package/dist/connectors/github/octokit-client.d.ts +4 -16
- package/dist/connectors/github/octokit-client.js +27 -24
- package/dist/connectors/github/ratelimit.d.ts +3 -14
- package/dist/connectors/github/ratelimit.js +3 -14
- package/dist/connectors/github/scope.d.ts +3 -5
- package/dist/connectors/github/scope.js +3 -5
- package/dist/connectors/github/signature.d.ts +4 -26
- package/dist/connectors/github/signature.js +4 -26
- package/dist/connectors/github/tenant-routing.d.ts +2 -24
- package/dist/connectors/github/tenant-routing.js +4 -26
- package/dist/connectors/github/transform.js +2 -16
- package/dist/connectors/github/types.d.ts +3 -15
- package/dist/connectors/github/types.js +2 -9
- package/dist/connectors/github/webhook.d.ts +2 -16
- package/dist/connectors/github/webhook.js +6 -22
- package/dist/connectors/slack/backfill.d.ts +4 -17
- package/dist/connectors/slack/backfill.js +4 -13
- package/dist/connectors/slack/dlq.d.ts +2 -19
- package/dist/connectors/slack/dlq.js +2 -19
- package/dist/connectors/slack/ingest.d.ts +2 -3
- package/dist/connectors/slack/ingest.js +2 -3
- package/dist/connectors/slack/scope.d.ts +2 -8
- package/dist/connectors/slack/scope.js +2 -8
- package/dist/connectors/slack/signature.d.ts +1 -6
- package/dist/connectors/slack/tenant-routing.d.ts +2 -19
- package/dist/connectors/slack/tenant-routing.js +2 -21
- package/dist/connectors/slack/transform.d.ts +2 -18
- package/dist/connectors/slack/transform.js +2 -18
- package/dist/connectors/slack/types.d.ts +3 -9
- package/dist/connectors/slack/types.js +2 -4
- package/dist/connectors/slack/web-client.js +33 -27
- package/dist/connectors/slack/webhook.d.ts +2 -19
- package/dist/connectors/slack/webhook.js +5 -26
- package/dist/connectors/slack/workspaces.d.ts +4 -24
- package/dist/connectors/slack/workspaces.js +4 -24
- package/dist/consolidate/conflicts.js +6 -14
- package/dist/consolidate/dag-summary.d.ts +8 -0
- package/dist/consolidate/dag-summary.js +41 -0
- package/dist/consolidate/dag.d.ts +5 -28
- package/dist/consolidate/dag.js +14 -75
- package/dist/consolidate/decay.js +7 -19
- package/dist/consolidate/dedupe.d.ts +6 -52
- package/dist/consolidate/dedupe.js +13 -71
- package/dist/consolidate/flush-units.d.ts +3 -4
- package/dist/consolidate/flush-units.js +3 -3
- package/dist/consolidate/half-life-migration.d.ts +3 -26
- package/dist/consolidate/half-life-migration.js +11 -28
- package/dist/consolidate/llm-passes.js +4 -21
- package/dist/consolidate/memory-value-weights.d.ts +2 -13
- package/dist/consolidate/memory-value-weights.js +2 -13
- package/dist/consolidate/memory-value.d.ts +11 -84
- package/dist/consolidate/memory-value.js +16 -104
- package/dist/consolidate/merge.js +10 -31
- package/dist/consolidate/merged-row.js +2 -1
- package/dist/consolidate/physics-pass.js +1 -3
- package/dist/consolidate/replay.d.ts +6 -38
- package/dist/consolidate/replay.js +14 -52
- package/dist/consolidate/run.js +1 -1
- package/dist/consolidate/sleep.d.ts +1 -8
- package/dist/consolidate/sleep.js +5 -17
- package/dist/consolidate/trace.d.ts +3 -18
- package/dist/consolidate/trace.js +3 -18
- package/dist/consolidate/traces.js +6 -22
- package/dist/core/ablation.d.ts +4 -91
- package/dist/core/ablation.js +4 -91
- package/dist/core/ambient.d.ts +1 -8
- package/dist/core/ambient.js +1 -8
- package/dist/core/capture-contract.d.ts +4 -2
- package/dist/core/capture-contract.js +4 -2
- package/dist/core/card.d.ts +4 -1
- package/dist/core/card.js +8 -0
- package/dist/core/compare.d.ts +11 -67
- package/dist/core/compare.js +9 -63
- package/dist/core/config.d.ts +10 -24
- package/dist/core/config.js +13 -14
- package/dist/core/handoff.d.ts +1 -7
- package/dist/core/handoff.js +1 -7
- package/dist/core/memory-quality.js +1 -1
- package/dist/core/memory.d.ts +41 -164
- package/dist/core/memory.js +51 -221
- package/dist/core/package-root.d.ts +3 -0
- package/dist/core/package-root.js +5 -0
- package/dist/core/physics-config.d.ts +1 -4
- package/dist/core/physics-config.js +3 -8
- package/dist/core/physics.d.ts +15 -61
- package/dist/core/physics.js +59 -122
- package/dist/core/project-identity.d.ts +17 -58
- package/dist/core/project-identity.js +17 -38
- package/dist/core/project-remote.js +13 -2
- package/dist/core/raw-append-only.d.ts +5 -0
- package/dist/core/raw-append-only.js +7 -0
- package/dist/core/salience.d.ts +1 -7
- package/dist/core/salience.js +1 -7
- package/dist/dashboard/dashboard-actions.js +2 -2
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
- package/dist/dashboard/dashboard-snapshot.js +11 -2
- package/dist/dashboard/dashboard-types.d.ts +2 -1
- package/dist/dashboard/dashboard.d.ts +1 -0
- package/dist/dashboard/dashboard.js +50 -4
- package/dist/db/busy.d.ts +1 -1
- package/dist/db/busy.js +17 -8
- package/dist/db/connect.d.ts +1 -0
- package/dist/db/connect.js +3 -3
- package/dist/db/migrate.js +3 -3
- package/dist/db/migrations/types.d.ts +2 -5
- package/dist/db/migrations/v14.js +2 -3
- package/dist/db/migrations/v15.js +2 -8
- package/dist/db/migrations/v16.js +2 -3
- package/dist/db/migrations/v17.js +2 -3
- package/dist/db/migrations/v19.js +2 -5
- package/dist/db/migrations/v20.js +2 -7
- package/dist/db/migrations/v22.js +4 -17
- package/dist/db/migrations/v23.js +3 -14
- package/dist/db/migrations/v24.js +2 -4
- package/dist/db/migrations/v25.js +3 -8
- package/dist/db/migrations/v26.js +2 -13
- package/dist/db/migrations/v27.js +3 -11
- package/dist/db/migrations/v28.js +2 -14
- package/dist/db/migrations/v29.js +4 -18
- package/dist/db/migrations/v30.js +4 -16
- package/dist/db/migrations/v31.js +2 -15
- package/dist/db/migrations/v32.js +4 -22
- package/dist/db/migrations/v33.js +2 -15
- package/dist/db/migrations/v34.js +2 -11
- package/dist/db/migrations/v35.js +2 -11
- package/dist/db/migrations/v36.js +2 -11
- package/dist/db/migrations/v37.js +8 -33
- package/dist/db/migrations/v38.js +5 -38
- package/dist/db/migrations/v39.js +9 -20
- package/dist/db/migrations/v40.js +2 -9
- package/dist/db/migrations/v41.js +2 -24
- package/dist/db/migrations/v43.js +1 -1
- package/dist/db/migrations/v44.js +2 -8
- package/dist/db/migrations/v45.js +2 -7
- package/dist/db/migrations/v47.js +2 -3
- package/dist/db/migrations/v51.js +1 -1
- package/dist/db/open.d.ts +2 -0
- package/dist/db/open.js +17 -1
- package/dist/db/physics-state.d.ts +6 -22
- package/dist/db/physics-state.js +25 -36
- package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
- package/dist/db/raw-archive-mirror-cleanup.js +2 -17
- package/dist/db/vector-store.d.ts +2 -0
- package/dist/db/vector-store.js +8 -1
- package/dist/doctor.js +74 -19
- package/dist/entry/session-text.js +2 -1
- package/dist/eval/eval-stats.d.ts +15 -53
- package/dist/eval/eval-stats.js +12 -42
- package/dist/eval/eval-suite.d.ts +2 -13
- package/dist/eval/eval-suite.js +74 -34
- package/dist/eval/eval.d.ts +6 -24
- package/dist/eval/eval.js +7 -34
- package/dist/eval/judgment.d.ts +0 -3
- package/dist/eval/judgment.js +19 -11
- package/dist/extensions/openclaw-plugin/index.js +1 -1
- package/dist/graph/extract.d.ts +5 -27
- package/dist/graph/extract.js +7 -33
- package/dist/graph/recall.d.ts +7 -20
- package/dist/graph/recall.js +14 -76
- package/dist/graph/stream.d.ts +7 -39
- package/dist/graph/stream.js +11 -34
- package/dist/graph/view.d.ts +9 -35
- package/dist/graph/view.js +11 -39
- package/dist/hooks/codex-wrapper.js +2 -2
- package/dist/hooks/copilot.js +2 -1
- package/dist/hooks/hook-blocks.d.ts +6 -2
- package/dist/hooks/hook-blocks.js +37 -124
- package/dist/hooks/json-hooks.d.ts +4 -36
- package/dist/hooks/json-hooks.js +18 -57
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +9 -76
- package/dist/hooks/shared.d.ts +8 -17
- package/dist/hooks/shared.js +29 -20
- package/dist/importers/core.d.ts +12 -37
- package/dist/importers/core.js +9 -27
- package/dist/importers/markdown-parse.d.ts +8 -22
- package/dist/importers/markdown-parse.js +8 -25
- package/dist/importers/markdown.js +3 -12
- package/dist/importers/sources.js +7 -35
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +25 -81
- package/dist/index.d.ts +6 -2
- package/dist/index.js +6 -2
- package/dist/learn/autolearn.d.ts +14 -41
- package/dist/learn/autolearn.js +14 -41
- package/dist/learn/extract.js +2 -4
- package/dist/learn/forward-claim-detector.d.ts +6 -30
- package/dist/learn/forward-claim-detector.js +14 -66
- package/dist/learn/invalidation.d.ts +6 -18
- package/dist/learn/invalidation.js +9 -26
- package/dist/mcp/admin-tools.js +3 -5
- package/dist/mcp/memory-tools.js +4 -9
- package/dist/mcp/protocol.d.ts +8 -26
- package/dist/mcp/protocol.js +3 -6
- package/dist/mcp/recall-tools.js +3 -3
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +10 -26
- package/dist/mcp/server.d.ts +3 -9
- package/dist/mcp/server.js +5 -16
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +5 -11
- package/dist/mcp/stdio.d.ts +2 -6
- package/dist/mcp/stdio.js +48 -12
- package/dist/mcp/tools.js +5 -3
- package/dist/objects/customer-notes.d.ts +7 -42
- package/dist/objects/customer-notes.js +7 -48
- package/dist/objects/decisions.d.ts +12 -50
- package/dist/objects/decisions.js +15 -53
- package/dist/objects/incidents.d.ts +7 -38
- package/dist/objects/incidents.js +7 -41
- package/dist/objects/policies.d.ts +11 -89
- package/dist/objects/policies.js +11 -98
- package/dist/objects/processes.d.ts +7 -52
- package/dist/objects/processes.js +7 -61
- package/dist/objects/project-briefs.d.ts +11 -55
- package/dist/objects/project-briefs.js +14 -75
- package/dist/objects/skills.d.ts +7 -42
- package/dist/objects/skills.js +8 -54
- package/dist/postinstall.js +6 -19
- package/dist/predictions/planning-fallacy.d.ts +11 -34
- package/dist/rerankers/clef.js +3 -31
- package/dist/rerankers/cross-encoder.js +4 -6
- package/dist/rerankers/jev.js +9 -6
- package/dist/rerankers/llm.d.ts +2 -11
- package/dist/rerankers/llm.js +14 -14
- package/dist/rerankers/outage-warning.d.ts +2 -1
- package/dist/rerankers/outage-warning.js +2 -1
- package/dist/rerankers/remote.d.ts +1 -0
- package/dist/rerankers/remote.js +2 -0
- package/dist/rerankers/types.d.ts +2 -14
- package/dist/search/boosts.d.ts +0 -2
- package/dist/search/boosts.js +2 -2
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +90 -0
- package/dist/search/hybrid.d.ts +2 -0
- package/dist/search/multihop.js +2 -3
- package/dist/search/path-context.d.ts +5 -18
- package/dist/search/path-context.js +5 -18
- package/dist/search/physics-search.js +11 -8
- package/dist/search/rrf.d.ts +7 -35
- package/dist/search/rrf.js +5 -30
- package/dist/search/vector.d.ts +7 -0
- package/dist/search/vector.js +35 -5
- package/dist/server/auth.d.ts +9 -28
- package/dist/server/auth.js +32 -25
- package/dist/server/boot.d.ts +2 -21
- package/dist/server/boot.js +63 -96
- package/dist/server/client-ip.d.ts +3 -19
- package/dist/server/client-ip.js +5 -28
- package/dist/server/defaults.d.ts +3 -0
- package/dist/server/defaults.js +4 -0
- package/dist/server/key-check-bounds.d.ts +2 -1
- package/dist/server/lifecycle.d.ts +5 -4
- package/dist/server/lifecycle.js +19 -4
- package/dist/server/mcp-http.js +10 -44
- package/dist/server/rate-limit.d.ts +5 -18
- package/dist/server/rate-limit.js +4 -13
- package/dist/server/request.d.ts +4 -8
- package/dist/server/request.js +9 -17
- package/dist/server/route-table.js +42 -49
- package/dist/server/routes/admin.js +22 -28
- package/dist/server/routes/customer-notes.js +7 -12
- package/dist/server/routes/decisions.js +10 -17
- package/dist/server/routes/incidents.js +12 -20
- package/dist/server/routes/memories.js +12 -32
- package/dist/server/routes/object-routes.d.ts +0 -5
- package/dist/server/routes/object-routes.js +7 -15
- package/dist/server/routes/policies.js +10 -18
- package/dist/server/routes/predictions.js +13 -25
- package/dist/server/routes/processes.js +16 -26
- package/dist/server/routes/project-briefs.js +9 -16
- package/dist/server/routes/recall.js +10 -35
- package/dist/server/routes/skills.js +8 -18
- package/dist/server/server-detect.d.ts +9 -53
- package/dist/server/server-detect.js +24 -90
- package/dist/server/sleep-offload.js +4 -1
- package/dist/server/types.d.ts +12 -10
- package/dist/server/validation.d.ts +3 -1
- package/dist/server/validation.js +10 -23
- package/dist/server.d.ts +2 -2
- package/dist/server.js +3 -2
- package/dist/sharing/global-store.d.ts +19 -0
- package/dist/sharing/global-store.js +75 -0
- package/dist/sharing/global-sync.d.ts +6 -0
- package/dist/sharing/global-sync.js +80 -0
- package/dist/sharing/project-merge.d.ts +4 -5
- package/dist/sharing/project-merge.js +9 -7
- package/dist/sharing/scope.d.ts +4 -11
- package/dist/sharing/scope.js +4 -11
- package/dist/sharing/search-both.d.ts +60 -0
- package/dist/sharing/search-both.js +138 -0
- package/dist/sharing/share.d.ts +38 -0
- package/dist/sharing/share.js +226 -0
- package/dist/store/ambient.js +4 -9
- package/dist/store/audit-event.d.ts +4 -12
- package/dist/store/audit-event.js +4 -12
- package/dist/store/audit.d.ts +2 -5
- package/dist/store/audit.js +4 -12
- package/dist/store/auth.d.ts +6 -6
- package/dist/store/auth.js +10 -9
- package/dist/store/candidates.d.ts +20 -3
- package/dist/store/candidates.js +77 -48
- package/dist/store/card-detail.d.ts +2 -1
- package/dist/store/card-detail.js +2 -1
- package/dist/store/cards.d.ts +14 -9
- package/dist/store/cards.js +72 -126
- package/dist/store/conflicts.d.ts +4 -21
- package/dist/store/conflicts.js +71 -150
- package/dist/store/connectors/github.d.ts +10 -10
- package/dist/store/connectors/github.js +10 -10
- package/dist/store/dashboard-reads.js +4 -8
- package/dist/store/delete-and-batch.d.ts +11 -31
- package/dist/store/delete-and-batch.js +48 -64
- package/dist/store/delivery-recorder.d.ts +8 -4
- package/dist/store/delivery-recorder.js +25 -15
- package/dist/store/diagnostics.js +6 -13
- package/dist/store/dormant.d.ts +7 -29
- package/dist/store/dormant.js +15 -56
- package/dist/store/embeddings/index.d.ts +11 -80
- package/dist/store/embeddings/index.js +71 -207
- package/dist/store/embeddings/local.js +15 -32
- package/dist/store/embeddings/provider.d.ts +16 -53
- package/dist/store/embeddings/provider.js +41 -69
- package/dist/store/entry-reads.d.ts +21 -57
- package/dist/store/entry-reads.js +65 -126
- package/dist/store/entry-row.d.ts +6 -35
- package/dist/store/entry-row.js +9 -37
- package/dist/store/entry-writes.d.ts +10 -16
- package/dist/store/entry-writes.js +17 -35
- package/dist/store/goals.d.ts +3 -40
- package/dist/store/goals.js +21 -160
- package/dist/store/graph-queue.d.ts +6 -22
- package/dist/store/graph-queue.js +14 -45
- package/dist/store/graph-reads.d.ts +11 -35
- package/dist/store/graph-reads.js +20 -58
- package/dist/store/graph-rows.d.ts +3 -6
- package/dist/store/graph-rows.js +6 -9
- package/dist/store/graph-view-rows.d.ts +2 -1
- package/dist/store/graph-view-rows.js +2 -1
- package/dist/store/graph-writes.d.ts +6 -31
- package/dist/store/graph-writes.js +13 -37
- package/dist/store/half-life.d.ts +2 -1
- package/dist/store/half-life.js +14 -16
- package/dist/store/handoffs.d.ts +5 -11
- package/dist/store/handoffs.js +16 -34
- package/dist/store/index-and-stats.d.ts +6 -19
- package/dist/store/index-and-stats.js +34 -82
- package/dist/store/markdown.d.ts +2 -6
- package/dist/store/markdown.js +21 -20
- package/dist/store/mirrors.d.ts +2 -6
- package/dist/store/mirrors.js +14 -23
- package/dist/store/open.js +6 -13
- package/dist/store/planning-fallacy-evidence.d.ts +2 -30
- package/dist/store/planning-fallacy-evidence.js +8 -37
- package/dist/store/port.d.ts +82 -79
- package/dist/store/predictions.d.ts +11 -51
- package/dist/store/predictions.js +38 -119
- package/dist/{cli → store}/quality-repair.js +15 -31
- package/dist/store/raw-archive.d.ts +4 -16
- package/dist/store/raw-archive.js +14 -29
- package/dist/store/recall-scope.d.ts +19 -79
- package/dist/store/recall-scope.js +21 -82
- package/dist/store/recall-trace.d.ts +10 -77
- package/dist/store/recall-trace.js +19 -95
- package/dist/store/rejected-values.js +7 -19
- package/dist/store/rejection.d.ts +12 -58
- package/dist/store/rejection.js +13 -65
- package/dist/store/report-reads.d.ts +6 -0
- package/dist/store/report-reads.js +29 -0
- package/dist/store/rows.d.ts +9 -19
- package/dist/store/rows.js +36 -34
- package/dist/store/rule-sql.d.ts +5 -0
- package/dist/store/rule-sql.js +37 -0
- package/dist/store/search-rows.d.ts +7 -38
- package/dist/store/search-rows.js +14 -50
- package/dist/store/sessions.d.ts +10 -47
- package/dist/store/sessions.js +17 -73
- package/dist/store/sqlite/connector-events-group.js +2 -2
- package/dist/store/sqlite/entry-writes-group.js +2 -2
- package/dist/store/sqlite/error-codec.js +4 -2
- package/dist/store/sqlite/executor.d.ts +2 -1
- package/dist/store/sqlite/executor.js +2 -1
- package/dist/store/sqlite/local.d.ts +3 -3
- package/dist/store/sqlite/local.js +1 -0
- package/dist/store/sqlite/object-rows.js +6 -3
- package/dist/store/sqlite/objects-group.js +4 -2
- package/dist/store/sqlite/quarantine-group.js +2 -2
- package/dist/store/sqlite/store.d.ts +1 -4
- package/dist/store/sqlite/store.js +2 -3
- package/dist/store/sqlite/vector-reads-group.js +2 -2
- package/dist/store/sqlite/worker-jobs.js +1 -1
- package/dist/store/sqlite/worker-ops.d.ts +13 -2
- package/dist/store/sqlite/worker-ops.js +13 -2
- package/dist/store/sqlite/worker-store.js +5 -2
- package/dist/store/summaries.d.ts +10 -62
- package/dist/store/summaries.js +34 -146
- package/dist/store/summary-dirty.js +1 -1
- package/dist/store/tenant-lookup.d.ts +6 -1
- package/dist/store/tenant-lookup.js +7 -0
- package/dist/store/tenant.d.ts +2 -16
- package/dist/store/tenant.js +4 -19
- package/dist/store/token-ledger.d.ts +13 -43
- package/dist/store/token-ledger.js +19 -50
- package/dist/store/usage-reports.js +5 -13
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +170 -0
- package/dist/store/working-memory.d.ts +6 -25
- package/dist/store/working-memory.js +18 -52
- package/dist/store/yaml.d.ts +1 -5
- package/dist/store/yaml.js +2 -6
- package/dist/support-bundle.js +7 -5
- package/dist/trust/reject-flow.js +1 -3
- package/dist/util/anthropic-messages.js +14 -2
- package/dist/util/atomic-write.d.ts +2 -1
- package/dist/util/atomic-write.js +35 -4
- package/dist/util/capped-json.d.ts +6 -0
- package/dist/util/capped-json.js +46 -0
- package/dist/util/crash-handlers.d.ts +8 -1
- package/dist/util/crash-handlers.js +52 -10
- package/dist/util/env.d.ts +13 -6
- package/dist/util/env.js +14 -7
- package/dist/util/home-path.d.ts +2 -1
- package/dist/util/home-path.js +4 -2
- package/dist/util/http-retry.d.ts +3 -1
- package/dist/util/http-retry.js +26 -5
- package/dist/util/log.d.ts +3 -2
- package/dist/util/log.js +25 -9
- package/dist/util/request-scope.d.ts +2 -1
- package/dist/util/request-scope.js +2 -1
- package/dist/util/secret-detect.d.ts +5 -30
- package/dist/util/secret-detect.js +13 -39
- package/dist/util/stored-json.d.ts +1 -1
- package/dist/util/stored-json.js +1 -1
- package/dist/util/token-text.d.ts +1 -4
- package/dist/util/token-text.js +1 -4
- package/dist/util/transcript-tail.d.ts +2 -0
- package/dist/util/transcript-tail.js +24 -23
- package/dist/util/version.d.ts +5 -20
- package/dist/util/version.js +5 -20
- package/extensions/openclaw-plugin/index.ts +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 +1 -1
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/sharing/shared.d.ts +0 -187
- package/dist/sharing/shared.js +0 -563
- package/dist/store/vector-writes.d.ts +0 -13
- package/dist/store/vector-writes.js +0 -89
- /package/dist/{cli → store}/quality-repair.d.ts +0 -0
package/dist/cli/decisions.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
// First-class object verbs for predictions, decisions and incidents.
|
|
2
|
-
import {
|
|
3
|
-
import { readEntry } from '../store/entry-reads.js';
|
|
2
|
+
import { getMemory } from '../api/memories.js';
|
|
4
3
|
import { extractPathTags } from '../search/path-context.js';
|
|
5
4
|
import * as predictionsModule from '../store/predictions.js';
|
|
6
5
|
import * as decisionsModule from '../objects/decisions.js';
|
|
7
6
|
import * as incidentsModule from '../objects/incidents.js';
|
|
8
|
-
import { resolveTenantId } from '../store/tenant.js';
|
|
9
7
|
import { printError } from './output.js';
|
|
10
|
-
import { nonEmptyStringFlag, parseListLimit, flagIsTrue, stringFlag } from './flag-values.js';
|
|
8
|
+
import { nonEmptyStringFlag, parseListLimit, flagIsTrue, isStringFlag, stringFlag } from './flag-values.js';
|
|
11
9
|
import { requireInit } from './shared.js';
|
|
10
|
+
import { cliApiContext } from './api-context.js';
|
|
12
11
|
import { closeObject, foundOrExit, idArgOrExit, listObjects, printLifecycleTail, requireStatus } from './object-verbs.js';
|
|
13
12
|
import { errorMessage } from '../util/log.js';
|
|
13
|
+
import { CliExit } from './exit.js';
|
|
14
14
|
const BASERATE_DECIMALS = 3;
|
|
15
15
|
const DECISION = { cmd: 'decide', noun: 'Decision', idLabel: 'decision' };
|
|
16
16
|
const INCIDENT = { cmd: 'incident', noun: 'Incident', idLabel: 'incident' };
|
|
@@ -20,28 +20,28 @@ function parseObjectId(idRaw, noun) {
|
|
|
20
20
|
const id = parseInt(String(idRaw), 10);
|
|
21
21
|
if (!Number.isFinite(id) || id <= 0) {
|
|
22
22
|
printError(`Invalid ${noun} id: "${idRaw}"`);
|
|
23
|
-
|
|
23
|
+
throw new CliExit(1);
|
|
24
24
|
}
|
|
25
25
|
return id;
|
|
26
26
|
}
|
|
27
|
-
// ---------------------------------------------------------------------------
|
|
28
27
|
// Prediction first-class object
|
|
29
|
-
// ---------------------------------------------------------------------------
|
|
30
28
|
function predictClose(hippoRoot, tenantId, args, flags) {
|
|
31
29
|
const id = idArgOrExit(args, 'Usage: hippo predict close <id> --state <closed|closed-unknown> [--actual <v>] [--note "..."]', 'prediction', parseObjectId);
|
|
32
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.
|
|
33
32
|
if (!predictionsModule.VALID_CLOSURE_STATES.has(stateRaw) || stateRaw === 'open') {
|
|
34
33
|
printError(`Invalid --state: "${stateRaw}". Must be one of: closed | closed-unknown.`);
|
|
35
|
-
|
|
34
|
+
throw new CliExit(1);
|
|
36
35
|
}
|
|
37
36
|
const actualRaw = flags['actual'];
|
|
38
37
|
const actualValue = actualRaw !== undefined ? Number(actualRaw) : undefined;
|
|
39
38
|
if (actualRaw !== undefined && !Number.isFinite(actualValue)) {
|
|
40
39
|
printError(`Invalid --actual: "${actualRaw}". Must be a number.`);
|
|
41
|
-
|
|
40
|
+
throw new CliExit(1);
|
|
42
41
|
}
|
|
43
42
|
const closureNote = stringFlag(flags, 'note');
|
|
44
43
|
const closed = predictionsModule.closePrediction(hippoRoot, tenantId, id, {
|
|
44
|
+
// SAFETY: the check above exits unless stateRaw is in VALID_CLOSURE_STATES.
|
|
45
45
|
closureState: stateRaw,
|
|
46
46
|
actualValue,
|
|
47
47
|
closureNote,
|
|
@@ -64,7 +64,7 @@ function loadPredictionList(hippoRoot, tenantId, status, classTag, limit) {
|
|
|
64
64
|
if (!classTag) {
|
|
65
65
|
// status filter without class — scan all classes is more complex; v1 requires --class for non-default status
|
|
66
66
|
printError('--status filter (non-open) requires --class to be set.');
|
|
67
|
-
|
|
67
|
+
throw new CliExit(1);
|
|
68
68
|
}
|
|
69
69
|
return predictionsModule.loadPredictionsByClass(hippoRoot, tenantId, classTag, {
|
|
70
70
|
closureState,
|
|
@@ -117,7 +117,7 @@ function predictBaserate(hippoRoot, tenantId, flags) {
|
|
|
117
117
|
const classTag = stringFlag(flags, 'class')?.trim();
|
|
118
118
|
if (!classTag) {
|
|
119
119
|
printError('Usage: hippo predict baserate --class <c>');
|
|
120
|
-
|
|
120
|
+
throw new CliExit(1);
|
|
121
121
|
}
|
|
122
122
|
const baserate = predictionsModule.computePredictionBaserate(hippoRoot, tenantId, classTag);
|
|
123
123
|
if (baserate.nClosed === 0) {
|
|
@@ -140,9 +140,8 @@ function predictBaserate(hippoRoot, tenantId, flags) {
|
|
|
140
140
|
if (baserate.mae !== null)
|
|
141
141
|
console.log(` mae: ${baserate.mae.toFixed(BASERATE_DECIMALS)}`);
|
|
142
142
|
}
|
|
143
|
-
export function
|
|
143
|
+
export function handlePredict({ hippoRoot, tenantId, args, flags }) {
|
|
144
144
|
requireInit(hippoRoot);
|
|
145
|
-
const tenantId = resolveTenantId({});
|
|
146
145
|
const subcommand = args[0] ?? '';
|
|
147
146
|
if (subcommand === 'close')
|
|
148
147
|
return predictClose(hippoRoot, tenantId, args, flags);
|
|
@@ -161,18 +160,18 @@ function predictCreate(hippoRoot, tenantId, claimText, flags) {
|
|
|
161
160
|
printError(' hippo predict close <id> --state <closed|closed-unknown> [--actual <v>] [--note "..."]');
|
|
162
161
|
printError(' hippo predict list [--class X] [--status open|closed|closed-unknown|all] [--limit N]');
|
|
163
162
|
printError(' hippo predict show <id>');
|
|
164
|
-
|
|
163
|
+
throw new CliExit(1);
|
|
165
164
|
}
|
|
166
165
|
const classTag = stringFlag(flags, 'class')?.trim();
|
|
167
166
|
if (!classTag) {
|
|
168
167
|
printError('--class is required for prediction creation.');
|
|
169
|
-
|
|
168
|
+
throw new CliExit(1);
|
|
170
169
|
}
|
|
171
170
|
const estimateRaw = flags['estimate'];
|
|
172
171
|
const estimateValue = estimateRaw !== undefined ? Number(estimateRaw) : undefined;
|
|
173
172
|
if (estimateRaw !== undefined && !Number.isFinite(estimateValue)) {
|
|
174
173
|
printError(`Invalid --estimate: "${estimateRaw}". Must be a number.`);
|
|
175
|
-
|
|
174
|
+
throw new CliExit(1);
|
|
176
175
|
}
|
|
177
176
|
const estimateUnit = stringFlag(flags, 'unit');
|
|
178
177
|
const targetDate = stringFlag(flags, 'target');
|
|
@@ -215,9 +214,8 @@ function decideGet(hippoRoot, tenantId, args) {
|
|
|
215
214
|
function decideClose(hippoRoot, tenantId, args) {
|
|
216
215
|
closeObject(args, DECISION, (id) => decisionsModule.closeDecision(hippoRoot, tenantId, id), parseObjectId);
|
|
217
216
|
}
|
|
218
|
-
export function
|
|
217
|
+
export async function handleDecide({ hippoRoot, tenantId, args, flags }) {
|
|
219
218
|
requireInit(hippoRoot);
|
|
220
|
-
const tenantId = resolveTenantId({});
|
|
221
219
|
const subcommand = args[0] ?? '';
|
|
222
220
|
if (subcommand === 'list')
|
|
223
221
|
return decideList(hippoRoot, tenantId, flags);
|
|
@@ -226,9 +224,9 @@ export function cmdDecide(hippoRoot, args, flags) {
|
|
|
226
224
|
if (subcommand === 'close')
|
|
227
225
|
return decideClose(hippoRoot, tenantId, args);
|
|
228
226
|
// Default subcommand: create. args[0] is the decision text.
|
|
229
|
-
decideCreate(hippoRoot, tenantId, subcommand, flags);
|
|
227
|
+
await decideCreate(hippoRoot, tenantId, subcommand, flags);
|
|
230
228
|
}
|
|
231
|
-
function decideCreate(hippoRoot, tenantId, decisionText, flags) {
|
|
229
|
+
async function decideCreate(hippoRoot, tenantId, decisionText, flags) {
|
|
232
230
|
if (!decisionText)
|
|
233
231
|
exitWithDecideUsage();
|
|
234
232
|
const context = nonEmptyStringFlag(flags, 'context');
|
|
@@ -236,21 +234,18 @@ function decideCreate(hippoRoot, tenantId, decisionText, flags) {
|
|
|
236
234
|
// than silently creating a non-superseding decision.
|
|
237
235
|
if (flagIsTrue(flags, 'supersedes')) {
|
|
238
236
|
printError('--supersedes requires a memory id, e.g. hippo decide "<text>" --supersedes mem_abc123.');
|
|
239
|
-
|
|
237
|
+
throw new CliExit(1);
|
|
240
238
|
}
|
|
241
239
|
const supersedesMemId = stringFlag(flags, 'supersedes') ?? null;
|
|
242
|
-
//
|
|
243
|
-
//
|
|
244
|
-
// canonical table create+supersede FIRST (inside saveDecision's SAVEPOINT),
|
|
245
|
-
// weaken the old memory LAST (best-effort) so a memory-write failure cannot
|
|
246
|
-
// leave the memory stale without the table reflecting the supersession.
|
|
240
|
+
// Commit the table create+supersede first (inside saveDecision's SAVEPOINT) and weaken the old memory last, best-effort,
|
|
241
|
+
// so a memory-write failure cannot leave the memory stale while the table shows the supersession.
|
|
247
242
|
let supersedesDecisionId;
|
|
248
243
|
let oldEntry = null;
|
|
249
244
|
if (supersedesMemId) {
|
|
250
|
-
oldEntry =
|
|
245
|
+
oldEntry = await getMemory(cliApiContext(hippoRoot, tenantId), supersedesMemId);
|
|
251
246
|
if (!oldEntry) {
|
|
252
247
|
printError(`Memory ${supersedesMemId} not found.`);
|
|
253
|
-
|
|
248
|
+
throw new CliExit(1);
|
|
254
249
|
}
|
|
255
250
|
supersedesDecisionId =
|
|
256
251
|
decisionsModule.resolveActiveDecisionIdByMemory(hippoRoot, tenantId, supersedesMemId) ?? undefined;
|
|
@@ -275,20 +270,13 @@ function exitWithDecideUsage() {
|
|
|
275
270
|
printError(' hippo decide list [--status active|superseded|closed|all] [--limit N]');
|
|
276
271
|
printError(' hippo decide get <id>');
|
|
277
272
|
printError(' hippo decide close <id>');
|
|
278
|
-
|
|
273
|
+
throw new CliExit(1);
|
|
279
274
|
}
|
|
280
275
|
function weakenSupersededMemory(hippoRoot, oldEntry, supersedesMemId) {
|
|
281
|
-
//
|
|
282
|
-
// 'superseded' tag. Preserves the exact pre-promotion behavior for the memory
|
|
283
|
-
// mirror; the canonical table supersession already committed above.
|
|
284
|
-
// Best-effort: saveDecision already committed. Failing here would make a retry find no active
|
|
276
|
+
// Best-effort and last: saveDecision already committed. Failing here would make a retry find no active
|
|
285
277
|
// decision for the old memory and create a duplicate active successor, so warn instead.
|
|
286
278
|
try {
|
|
287
|
-
|
|
288
|
-
oldEntry.confidence = 'stale';
|
|
289
|
-
if (!oldEntry.tags.includes('superseded'))
|
|
290
|
-
oldEntry.tags.push('superseded');
|
|
291
|
-
writeEntry(hippoRoot, oldEntry);
|
|
279
|
+
decisionsModule.weakenSupersededMemory(hippoRoot, oldEntry);
|
|
292
280
|
}
|
|
293
281
|
catch (e) {
|
|
294
282
|
printError(` warning: decision recorded and superseded, but failed to weaken the prior memory ${supersedesMemId}: ${errorMessage(e)}`);
|
|
@@ -341,7 +329,7 @@ function incidentResolve(hippoRoot, tenantId, args, flags) {
|
|
|
341
329
|
const resolutionRaw = stringFlag(flags, 'resolution');
|
|
342
330
|
if (!resolutionRaw?.trim()) {
|
|
343
331
|
printError('--resolution requires a non-empty value, e.g. hippo incident resolve <id> --resolution "root cause fixed".');
|
|
344
|
-
|
|
332
|
+
throw new CliExit(1);
|
|
345
333
|
}
|
|
346
334
|
const resolved = incidentsModule.resolveIncident(hippoRoot, tenantId, id, resolutionRaw);
|
|
347
335
|
console.log(`Incident #${resolved.id} resolved.`);
|
|
@@ -349,9 +337,8 @@ function incidentResolve(hippoRoot, tenantId, args, flags) {
|
|
|
349
337
|
function incidentClose(hippoRoot, tenantId, args) {
|
|
350
338
|
closeObject(args, INCIDENT, (id) => incidentsModule.closeIncident(hippoRoot, tenantId, id));
|
|
351
339
|
}
|
|
352
|
-
export function
|
|
340
|
+
export function handleIncident({ hippoRoot, tenantId, args, flags }) {
|
|
353
341
|
requireInit(hippoRoot);
|
|
354
|
-
const tenantId = resolveTenantId({});
|
|
355
342
|
const subcommand = args[0] ?? '';
|
|
356
343
|
if (subcommand === 'list')
|
|
357
344
|
return incidentList(hippoRoot, tenantId, flags);
|
|
@@ -361,9 +348,8 @@ export function cmdIncident(hippoRoot, args, flags) {
|
|
|
361
348
|
return incidentResolve(hippoRoot, tenantId, args, flags);
|
|
362
349
|
if (subcommand === 'close')
|
|
363
350
|
return incidentClose(hippoRoot, tenantId, args);
|
|
364
|
-
// Default subcommand
|
|
365
|
-
//
|
|
366
|
-
// `open` keyword the text is args[1], otherwise args[0] IS the text.
|
|
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.
|
|
367
353
|
incidentCreate(hippoRoot, tenantId, subcommand === 'open' ? (args[1] ?? '') : subcommand, flags);
|
|
368
354
|
}
|
|
369
355
|
function incidentCreate(hippoRoot, tenantId, incidentText, flags) {
|
|
@@ -373,7 +359,7 @@ function incidentCreate(hippoRoot, tenantId, incidentText, flags) {
|
|
|
373
359
|
printError(' hippo incident get <id>');
|
|
374
360
|
printError(' hippo incident resolve <id> --resolution "<text>"');
|
|
375
361
|
printError(' hippo incident close <id>');
|
|
376
|
-
|
|
362
|
+
throw new CliExit(1);
|
|
377
363
|
}
|
|
378
364
|
const context = nonEmptyStringFlag(flags, 'context');
|
|
379
365
|
// --link is a repeatable flag (collected into an array by parseArgs). A
|
|
@@ -383,12 +369,12 @@ function incidentCreate(hippoRoot, tenantId, incidentText, flags) {
|
|
|
383
369
|
if (Array.isArray(linkRaw)) {
|
|
384
370
|
linkedMemoryIds = linkRaw;
|
|
385
371
|
}
|
|
386
|
-
else if (
|
|
372
|
+
else if (isStringFlag(linkRaw)) {
|
|
387
373
|
linkedMemoryIds = [linkRaw];
|
|
388
374
|
}
|
|
389
375
|
else if (linkRaw === true) {
|
|
390
376
|
printError('--link requires a memory id, e.g. hippo incident "<text>" --link mem_abc123.');
|
|
391
|
-
|
|
377
|
+
throw new CliExit(1);
|
|
392
378
|
}
|
|
393
379
|
const incidentPathTags = extractPathTags(process.cwd());
|
|
394
380
|
const created = incidentsModule.saveIncident(hippoRoot, tenantId, {
|
package/dist/cli/eval.js
CHANGED
|
@@ -3,7 +3,7 @@ import * as path from 'path';
|
|
|
3
3
|
import * as fs from 'fs';
|
|
4
4
|
import { loadAllEntries } from '../store/entry-reads.js';
|
|
5
5
|
import { loadConfig } from '../core/config.js';
|
|
6
|
-
import { getGlobalRoot } from '../sharing/
|
|
6
|
+
import { getGlobalRoot } from '../sharing/global-store.js';
|
|
7
7
|
import { runEval, bootstrapCorpus, compareSummaries } from '../eval/eval.js';
|
|
8
8
|
import { runFeatureEval, formatResult, resultToBaseline, detectRegressions } from '../eval/eval-suite.js';
|
|
9
9
|
import { PACKAGE_VERSION } from '../util/version.js';
|
|
@@ -12,6 +12,7 @@ import { requireInit } from './shared.js';
|
|
|
12
12
|
import { fmt } from './print.js';
|
|
13
13
|
import { boolFlag } from './flag-values.js';
|
|
14
14
|
import { errorMessage } from '../util/log.js';
|
|
15
|
+
import { CliExit } from './exit.js';
|
|
15
16
|
const HIT_TOP_K = 10;
|
|
16
17
|
const MAX_FAILING_SHOWN = 10;
|
|
17
18
|
const TOP_IDS_SHOWN = 3;
|
|
@@ -44,7 +45,7 @@ async function cmdEval(hippoRoot, corpusPath, flags) {
|
|
|
44
45
|
}
|
|
45
46
|
if (minMrr !== null && summary.meanMrr < minMrr) {
|
|
46
47
|
printError(`MRR ${fmt(summary.meanMrr, 4)} below threshold ${minMrr}`);
|
|
47
|
-
|
|
48
|
+
throw new CliExit(1);
|
|
48
49
|
}
|
|
49
50
|
if (comparePath)
|
|
50
51
|
printEvalCompare(summary, comparePath, asJson);
|
|
@@ -85,11 +86,12 @@ function writeBootstrapCorpus(entries, flags) {
|
|
|
85
86
|
async function runEvalSuite(hippoRoot, flags, asJson, minMrr) {
|
|
86
87
|
const baselinePath = flags['baseline'] ? String(flags['baseline']) : path.join(hippoRoot, 'eval-baseline.json');
|
|
87
88
|
let baseline;
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
89
|
+
try {
|
|
90
|
+
baseline = JSON.parse(fs.readFileSync(baselinePath, 'utf8'));
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
// No baseline file is a first run and says nothing; a file that is there and cannot be used warns.
|
|
94
|
+
if (!(err instanceof Error && 'code' in err && err.code === 'ENOENT')) {
|
|
93
95
|
printError(`Warning: eval baseline ${baselinePath} is unreadable; running without it.`);
|
|
94
96
|
}
|
|
95
97
|
}
|
|
@@ -109,7 +111,7 @@ async function runEvalSuite(hippoRoot, flags, asJson, minMrr) {
|
|
|
109
111
|
if (baseline) {
|
|
110
112
|
const report = detectRegressions(baseline, result);
|
|
111
113
|
if (report.verdict === 'REGRESSION' && minMrr === null) {
|
|
112
|
-
|
|
114
|
+
throw new CliExit(1);
|
|
113
115
|
}
|
|
114
116
|
}
|
|
115
117
|
}
|
|
@@ -117,11 +119,11 @@ async function runEvalSuite(hippoRoot, flags, asJson, minMrr) {
|
|
|
117
119
|
function readCorpus(corpusPath) {
|
|
118
120
|
if (!corpusPath) {
|
|
119
121
|
printError('Usage: hippo eval <corpus.json> OR hippo eval --suite [--save-baseline] OR hippo eval --bootstrap');
|
|
120
|
-
|
|
122
|
+
throw new CliExit(1);
|
|
121
123
|
}
|
|
122
124
|
if (!fs.existsSync(corpusPath)) {
|
|
123
125
|
printError(`Corpus file not found: ${corpusPath}`);
|
|
124
|
-
|
|
126
|
+
throw new CliExit(1);
|
|
125
127
|
}
|
|
126
128
|
let cases;
|
|
127
129
|
try {
|
|
@@ -132,7 +134,7 @@ function readCorpus(corpusPath) {
|
|
|
132
134
|
}
|
|
133
135
|
catch (err) {
|
|
134
136
|
printError(`Failed to read corpus: ${errorMessage(err)}`);
|
|
135
|
-
|
|
137
|
+
throw new CliExit(1);
|
|
136
138
|
}
|
|
137
139
|
return cases;
|
|
138
140
|
}
|
|
@@ -176,7 +178,7 @@ function printEvalSummary(summary, showCases) {
|
|
|
176
178
|
function printEvalCompare(summary, comparePath, asJson) {
|
|
177
179
|
if (!fs.existsSync(comparePath)) {
|
|
178
180
|
printError(`Baseline file not found: ${comparePath}`);
|
|
179
|
-
|
|
181
|
+
throw new CliExit(1);
|
|
180
182
|
}
|
|
181
183
|
let baseline;
|
|
182
184
|
try {
|
|
@@ -184,7 +186,7 @@ function printEvalCompare(summary, comparePath, asJson) {
|
|
|
184
186
|
}
|
|
185
187
|
catch (err) {
|
|
186
188
|
printError(`Failed to parse baseline: ${errorMessage(err)}`);
|
|
187
|
-
|
|
189
|
+
throw new CliExit(1);
|
|
188
190
|
}
|
|
189
191
|
const cmp = compareSummaries(baseline, summary);
|
|
190
192
|
if (asJson) {
|
package/dist/cli/exit.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// The one error a CLI verb throws to stop its command; runCli is the one place that turns it into the process exit code.
|
|
2
|
+
/** Thrown after the verb has printed its own message, so it carries the exit code and nothing for the entry to print. */
|
|
3
|
+
export class CliExit extends Error {
|
|
4
|
+
code;
|
|
5
|
+
constructor(code) {
|
|
6
|
+
super(`hippo exits with code ${code}`);
|
|
7
|
+
this.name = 'CliExit';
|
|
8
|
+
this.code = code;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=exit.js.map
|
package/dist/cli/explain.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
export declare function cmdExplain(hippoRoot: string, query: string, flags: CliFlags): Promise<void>;
|
|
1
|
+
import { type CommandContext } from './flag-values.js';
|
|
3
2
|
export declare function handleExplain({ hippoRoot, args, flags }: CommandContext): Promise<void>;
|
|
4
3
|
//# sourceMappingURL=explain.d.ts.map
|
package/dist/cli/explain.js
CHANGED
|
@@ -7,14 +7,16 @@ import { DEFAULT_RECALL_BUDGET } from '../core/search-types.js';
|
|
|
7
7
|
import { loadConfig } from '../core/config.js';
|
|
8
8
|
import { dropHeldCopies } from '../util/same-text.js';
|
|
9
9
|
import { detectScope } from '../sharing/scope.js';
|
|
10
|
-
import { getGlobalRoot } from '../sharing/
|
|
10
|
+
import { getGlobalRoot } from '../sharing/global-store.js';
|
|
11
11
|
import * as api from '../api/index.js';
|
|
12
12
|
import { resolveTenantId } from '../store/tenant.js';
|
|
13
|
+
import { cliApiContext } from './api-context.js';
|
|
13
14
|
import { printedTokens } from '../api/context-render.js';
|
|
14
15
|
import { printError } from './output.js';
|
|
15
16
|
import { parseLimitFlag, parseBudgetFlag, parseAsOfFlag, engineFlags, boolFlag } from './flag-values.js';
|
|
16
17
|
import { requireInit } from './shared.js';
|
|
17
18
|
import { fmt, recallEntryText, recallHeading } from './print.js';
|
|
19
|
+
import { CliExit } from './exit.js';
|
|
18
20
|
const EXPLAIN_PREVIEW_CHARS = 48;
|
|
19
21
|
/** The SQL predicate drops denied rows before the window, so an unscoped probe counts what the policy hides. */
|
|
20
22
|
function noteScopeHidden(hippoRoot, globalRoot, query, tenantId, requested) {
|
|
@@ -28,7 +30,7 @@ function noteScopeHidden(hippoRoot, globalRoot, query, tenantId, requested) {
|
|
|
28
30
|
printError(`[note] ${hidden} candidate${hidden === 1 ? '' : 's'} hidden by recall scope policy (pass an explicit --scope to inspect).`);
|
|
29
31
|
}
|
|
30
32
|
}
|
|
31
|
-
|
|
33
|
+
async function cmdExplain(hippoRoot, query, flags) {
|
|
32
34
|
requireInit(hippoRoot);
|
|
33
35
|
const budget = parseBudgetFlag(flags['budget'], DEFAULT_RECALL_BUDGET);
|
|
34
36
|
const limit = parseLimitFlag(flags['limit']);
|
|
@@ -49,7 +51,7 @@ export async function cmdExplain(hippoRoot, query, flags) {
|
|
|
49
51
|
const cost = (r) => printedTokens(recallEntryText(r, query, false, explainGlobalOn && !explainIndex.entries[r.entry.id]));
|
|
50
52
|
const entryBudget = Math.max(0, budget - printedTokens(recallHeading(budget, budget, query)));
|
|
51
53
|
const slot = {};
|
|
52
|
-
await api.retrieve(
|
|
54
|
+
await api.retrieve(cliApiContext(hippoRoot, tenantId), {
|
|
53
55
|
query,
|
|
54
56
|
cliCore: {
|
|
55
57
|
rank: {
|
|
@@ -166,7 +168,7 @@ export async function handleExplain({ hippoRoot, args, flags }) {
|
|
|
166
168
|
const query = args.join(' ').trim();
|
|
167
169
|
if (!query) {
|
|
168
170
|
printError('Please provide a search query.');
|
|
169
|
-
|
|
171
|
+
throw new CliExit(1);
|
|
170
172
|
}
|
|
171
173
|
await cmdExplain(hippoRoot, query, flags);
|
|
172
174
|
}
|
|
@@ -1,19 +1,24 @@
|
|
|
1
1
|
import type { RecallSearchOpts } from '../api/recall-pipeline.js';
|
|
2
2
|
import type { HippoConfig } from '../core/config.js';
|
|
3
|
+
export declare function isBooleanFlag(value: string | boolean | string[] | undefined): value is boolean;
|
|
4
|
+
export declare function isStringFlag(value: string | boolean | string[] | undefined): value is string;
|
|
3
5
|
export declare function parseLimitFlag(value: string | boolean | string[] | undefined): number;
|
|
4
6
|
export declare function parseCountFlag(value: string | boolean | string[] | undefined): number;
|
|
5
7
|
export declare function parseBudgetFlag(value: string | boolean | string[] | undefined, fallback: number): number;
|
|
6
8
|
export type CliFlags = Record<string, string | boolean | string[]>;
|
|
7
|
-
export declare function parsePositiveId(idRaw:
|
|
9
|
+
export declare function parsePositiveId(idRaw: string | undefined, label: string): number;
|
|
8
10
|
export declare function parseListLimit(flags: CliFlags): number;
|
|
9
11
|
export declare function stringFlag(flags: CliFlags, name: string): string | undefined;
|
|
10
12
|
export declare function nonEmptyStringFlag(flags: CliFlags, name: string): string | undefined;
|
|
13
|
+
export declare function stringListFlag(flags: CliFlags, name: string): string[] | undefined;
|
|
14
|
+
export declare function isOneOf<T extends string>(allowed: readonly T[], value: string): value is T;
|
|
11
15
|
export declare function numberFlag(flags: CliFlags, name: string): number | undefined;
|
|
12
16
|
export declare function boolFlag(flags: CliFlags, name: string): boolean;
|
|
13
17
|
export declare function flagIsTrue(flags: CliFlags, name: string): boolean;
|
|
14
18
|
/** What the command table hands each verb's run(). */
|
|
15
19
|
export interface CommandContext {
|
|
16
20
|
readonly hippoRoot: string;
|
|
21
|
+
readonly tenantId: string;
|
|
17
22
|
readonly args: string[];
|
|
18
23
|
readonly flags: CliFlags;
|
|
19
24
|
}
|
package/dist/cli/flag-values.js
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
// Readers that turn parsed CLI flags into typed values, and the flag types they share.
|
|
2
2
|
import { printError } from './output.js';
|
|
3
|
+
import { CliExit } from './exit.js';
|
|
4
|
+
export function isBooleanFlag(value) {
|
|
5
|
+
return typeof value === 'boolean';
|
|
6
|
+
}
|
|
7
|
+
export function isStringFlag(value) {
|
|
8
|
+
return typeof value === 'string';
|
|
9
|
+
}
|
|
3
10
|
export function parseLimitFlag(value) {
|
|
4
11
|
if (!value)
|
|
5
12
|
return Infinity;
|
|
@@ -16,15 +23,15 @@ export function parseBudgetFlag(value, fallback) {
|
|
|
16
23
|
if (value === undefined)
|
|
17
24
|
return fallback;
|
|
18
25
|
// A value-less flag and a junk value are different typos; the --hops guard already splits them.
|
|
19
|
-
if (
|
|
26
|
+
if (!isStringFlag(value)) {
|
|
20
27
|
printError('--budget requires an integer value (e.g. --budget 1500).');
|
|
21
|
-
|
|
28
|
+
throw new CliExit(1);
|
|
22
29
|
}
|
|
23
30
|
// Number(), like the --hops guard: parseInt('12abc') is 12, silently accepting what this message rejects.
|
|
24
31
|
const parsed = Number(value);
|
|
25
32
|
if (!Number.isInteger(parsed) || parsed < 0) {
|
|
26
33
|
printError(`Invalid --budget: "${value}". Must be a non-negative integer.`);
|
|
27
|
-
|
|
34
|
+
throw new CliExit(1);
|
|
28
35
|
}
|
|
29
36
|
return parsed;
|
|
30
37
|
}
|
|
@@ -34,7 +41,7 @@ export function parsePositiveId(idRaw, label) {
|
|
|
34
41
|
const id = parseInt(s, 10);
|
|
35
42
|
if (!/^\d+$/.test(s) || id <= 0 || !Number.isSafeInteger(id)) {
|
|
36
43
|
printError(`Invalid ${label} id: "${idRaw}" (expected a positive integer).`);
|
|
37
|
-
|
|
44
|
+
throw new CliExit(1);
|
|
38
45
|
}
|
|
39
46
|
return id;
|
|
40
47
|
}
|
|
@@ -43,22 +50,32 @@ export function parseListLimit(flags) {
|
|
|
43
50
|
const limit = limitRaw !== undefined ? parseInt(String(limitRaw), 10) : 100;
|
|
44
51
|
if (!Number.isFinite(limit) || limit <= 0) {
|
|
45
52
|
printError(`Invalid --limit: "${limitRaw}". Must be a positive integer.`);
|
|
46
|
-
|
|
53
|
+
throw new CliExit(1);
|
|
47
54
|
}
|
|
48
55
|
return limit;
|
|
49
56
|
}
|
|
50
57
|
// A value-less flag is `true` and a repeated one is a string[]; only a string counts here.
|
|
51
58
|
export function stringFlag(flags, name) {
|
|
52
59
|
const v = flags[name];
|
|
53
|
-
return
|
|
60
|
+
return isStringFlag(v) ? v : undefined;
|
|
54
61
|
}
|
|
55
62
|
// An empty value reads as absent, so `--change ""` keeps the default.
|
|
56
63
|
export function nonEmptyStringFlag(flags, name) {
|
|
57
64
|
return stringFlag(flags, name) || undefined;
|
|
58
65
|
}
|
|
66
|
+
// A repeated flag is already a list; a single value is a comma-separated list.
|
|
67
|
+
export function stringListFlag(flags, name) {
|
|
68
|
+
const v = flags[name];
|
|
69
|
+
if (Array.isArray(v))
|
|
70
|
+
return v;
|
|
71
|
+
return isStringFlag(v) ? v.split(',').map((t) => t.trim()).filter(Boolean) : undefined;
|
|
72
|
+
}
|
|
73
|
+
export function isOneOf(allowed, value) {
|
|
74
|
+
return allowed.some((a) => a === value);
|
|
75
|
+
}
|
|
59
76
|
export function numberFlag(flags, name) {
|
|
60
77
|
const v = flags[name];
|
|
61
|
-
return
|
|
78
|
+
return isStringFlag(v) ? Number(v) : undefined;
|
|
62
79
|
}
|
|
63
80
|
// Any truthy value counts, so a string value is true too.
|
|
64
81
|
export function boolFlag(flags, name) {
|
|
@@ -72,7 +89,7 @@ export function parseAsOfFlag(flags) {
|
|
|
72
89
|
const asOf = stringFlag(flags, 'as-of');
|
|
73
90
|
if (asOf !== undefined && Number.isNaN(new Date(asOf).getTime())) {
|
|
74
91
|
printError(`Error: --as-of value "${asOf}" is not a valid ISO date (e.g. 2026-04-22 or 2026-04-22T12:00:00Z).`);
|
|
75
|
-
|
|
92
|
+
throw new CliExit(1);
|
|
76
93
|
}
|
|
77
94
|
return asOf;
|
|
78
95
|
}
|
|
@@ -89,14 +106,14 @@ export function engineFlags(flags, config) {
|
|
|
89
106
|
};
|
|
90
107
|
}
|
|
91
108
|
// parseArgs turns a value-less flag into `true`; refuse rather than silently
|
|
92
|
-
// stringifying it (String(true) === 'true'), mirroring
|
|
109
|
+
// stringifying it (String(true) === 'true'), mirroring handleHandoff's guard.
|
|
93
110
|
export function stringFlagOrExit(flags, key) {
|
|
94
111
|
const v = flags[key];
|
|
95
112
|
if (v === undefined)
|
|
96
113
|
return undefined;
|
|
97
114
|
if (v === true || v === false || Array.isArray(v)) {
|
|
98
115
|
printError(`--${key} requires a value`);
|
|
99
|
-
|
|
116
|
+
throw new CliExit(1);
|
|
100
117
|
}
|
|
101
118
|
return v.trim();
|
|
102
119
|
}
|
package/dist/cli/flags.d.ts
CHANGED
package/dist/cli/flags.js
CHANGED
|
@@ -48,7 +48,7 @@ export const VERB_FLAGS = {
|
|
|
48
48
|
'__codex-session-end-worker': { values: ['codex-home', 'history-path', 'log-file', 'start-offset', 'started-at'] },
|
|
49
49
|
dedup: { switches: ['dry-run'], numbers: ['threshold'] },
|
|
50
50
|
dag: { switches: ['stats'] },
|
|
51
|
-
auth: { switches: ['all', 'global', 'json'], values: ['label', 'role', 'tenant'] },
|
|
51
|
+
auth: { switches: ['all', 'global', 'json', 'no-expiry'], values: ['label', 'role', 'tenant'], numbers: ['ttl-days'] },
|
|
52
52
|
goal: {
|
|
53
53
|
switches: ['all', 'no-propagate'],
|
|
54
54
|
values: ['level', 'outcome', 'parent', 'policy', 'session-id', 'success', 'tenant-id'],
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** `hippo github` subcommands, split out of cli.ts so tests can import them without triggering main().
|
|
2
|
+
* The dispatcher in cli.ts re-exports handleGitHub. */
|
|
3
|
+
import { type GitHubFetcher } from '../connectors/github/octokit-client.js';
|
|
4
|
+
import type { CommandContext } from './flag-values.js';
|
|
5
|
+
type FlagValue = string | boolean | string[];
|
|
6
|
+
type Flags = Record<string, FlagValue>;
|
|
7
|
+
export declare function printGitHubBackfillUsage(): void;
|
|
8
|
+
/** `hippo github backfill`; the fetcher is injectable so tests avoid the network (default `realGitHubFetcher`). */
|
|
9
|
+
export declare function cmdGitHubBackfill(hippoRoot: string, tenantId: string, flags: Flags, fetcher?: GitHubFetcher): Promise<void>;
|
|
10
|
+
export declare function cmdGitHubDlqList(hippoRoot: string, tenantId: string, _flags: Flags): void;
|
|
11
|
+
export declare function cmdGitHubDlqReplay(hippoRoot: string, tenantId: string, args: string[], flags: Flags): Promise<void>;
|
|
12
|
+
export declare function handleGitHub({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=github.d.ts.map
|