hippo-memory 1.69.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 +5 -2
- package/dist/agent-memories/apply.d.ts +3 -3
- package/dist/agent-memories/apply.js +16 -31
- package/dist/agent-memories/claude-code.d.ts +5 -5
- package/dist/agent-memories/claude-code.js +25 -12
- package/dist/agent-memories/copilot.js +3 -2
- package/dist/agent-memories/files.js +26 -14
- package/dist/agent-memories/gemini.js +6 -5
- package/dist/agent-memories/keys.js +3 -2
- package/dist/agent-memories/legacy.d.ts +2 -2
- package/dist/agent-memories/legacy.js +2 -2
- package/dist/agent-memories/markdown.d.ts +1 -3
- package/dist/agent-memories/markdown.js +1 -3
- package/dist/agent-memories/report.d.ts +1 -1
- package/dist/agent-memories/report.js +3 -2
- package/dist/agent-memories/source.d.ts +1 -1
- package/dist/agent-memories/source.js +6 -5
- package/dist/agent-memories/sync.d.ts +5 -3
- package/dist/agent-memories/sync.js +34 -38
- package/dist/agent-memories/types.d.ts +1 -1
- package/dist/api/assemble.d.ts +9 -46
- package/dist/api/assemble.js +44 -54
- package/dist/api/audit.d.ts +8 -7
- package/dist/api/audit.js +15 -21
- package/dist/api/auth.d.ts +17 -39
- package/dist/api/auth.js +76 -216
- package/dist/api/auto-sleep.d.ts +13 -0
- package/dist/api/auto-sleep.js +32 -0
- package/dist/{availability.d.ts → api/availability.d.ts} +4 -17
- package/dist/{availability.js → api/availability.js} +14 -44
- package/dist/{context-auto.js → api/context-auto.js} +2 -1
- package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
- package/dist/{context-render.js → api/context-render.js} +7 -6
- package/dist/api/context-select.d.ts +5 -5
- package/dist/api/context-select.js +39 -48
- package/dist/api/context-types.d.ts +15 -40
- package/dist/api/context.d.ts +7 -26
- package/dist/api/context.js +67 -97
- package/dist/api/dormant.d.ts +7 -23
- package/dist/api/dormant.js +40 -128
- package/dist/api/drill-down.d.ts +9 -48
- package/dist/api/drill-down.js +41 -90
- package/dist/api/forget.d.ts +5 -33
- package/dist/api/forget.js +17 -73
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +2 -2
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +28 -0
- package/dist/api/index.js +31 -0
- package/dist/api/instruction-detect.js +85 -0
- package/dist/api/learn.js +63 -55
- package/dist/api/ledger-db.d.ts +21 -0
- package/dist/api/ledger-db.js +81 -0
- 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.d.ts +16 -0
- package/dist/api/on-store.js +38 -0
- package/dist/api/outcome.d.ts +5 -42
- package/dist/api/outcome.js +15 -80
- package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
- package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
- package/dist/api/predictions.d.ts +9 -0
- package/dist/api/predictions.js +18 -0
- package/dist/api/promote.d.ts +16 -31
- package/dist/api/promote.js +38 -123
- package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +11 -11
- package/dist/{prompt-hook.js → api/prompt-hook.js} +42 -60
- package/dist/api/quarantine.d.ts +5 -5
- package/dist/api/quarantine.js +30 -106
- package/dist/api/recall-cli.d.ts +55 -0
- package/dist/api/recall-cli.js +94 -0
- package/dist/api/recall-core.d.ts +4 -0
- package/dist/api/recall-core.js +120 -0
- package/dist/api/recall-finish.d.ts +53 -0
- package/dist/api/recall-finish.js +30 -0
- package/dist/api/recall-history.d.ts +64 -0
- package/dist/api/recall-history.js +159 -0
- package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +7 -8
- package/dist/{recall-pipeline.js → api/recall-pipeline.js} +60 -48
- package/dist/api/recall-record.d.ts +10 -13
- package/dist/api/recall-record.js +10 -30
- package/dist/api/recall-request.d.ts +2 -2
- package/dist/api/recall-request.js +3 -3
- package/dist/api/recall-types.d.ts +101 -316
- package/dist/api/recall.d.ts +5 -33
- package/dist/api/recall.js +92 -91
- 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 +27 -12
- package/dist/api/remember.js +42 -46
- package/dist/api/session-owners.d.ts +4 -0
- package/dist/api/session-owners.js +17 -0
- package/dist/api/sleep-run.d.ts +7 -9
- package/dist/api/sleep-run.js +78 -94
- package/dist/api/sleep.d.ts +10 -29
- package/dist/api/tokens.d.ts +5 -12
- package/dist/api/tokens.js +12 -31
- package/dist/api/types.d.ts +8 -31
- package/dist/api/types.js +5 -23
- package/dist/capture/caller-session.d.ts +2 -2
- package/dist/capture/caller-session.js +8 -8
- package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
- package/dist/{capture-error.js → capture/capture-error.js} +7 -7
- package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
- package/dist/capture/command.d.ts +5 -13
- package/dist/capture/command.js +57 -60
- package/dist/capture/compact-resume-caller.d.ts +1 -1
- package/dist/capture/compact-resume-caller.js +7 -7
- package/dist/capture/compact.d.ts +8 -16
- package/dist/capture/compact.js +56 -47
- package/dist/capture/compaction-items-caller.d.ts +1 -1
- package/dist/capture/compaction-items-caller.js +7 -5
- package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
- package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
- package/dist/{compaction-record.js → capture/compaction-record.js} +143 -157
- package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +1 -1
- package/dist/{compaction-spool.js → capture/compaction-spool.js} +18 -14
- package/dist/capture/copilot-transcript.js +1 -1
- package/dist/capture/extract.js +2 -2
- package/dist/capture/failure-caller.d.ts +2 -2
- package/dist/capture/failure-caller.js +6 -6
- package/dist/capture/failure-reading.d.ts +2 -5
- package/dist/capture/failure-reading.js +11 -12
- package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
- package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
- package/dist/capture/pre-compact-caller.d.ts +1 -1
- package/dist/capture/pre-compact-caller.js +2 -2
- package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +2 -6
- package/dist/{session-digest.js → capture/session-digest.js} +29 -29
- package/dist/capture/session-end-caller.d.ts +2 -2
- package/dist/capture/session-end-caller.js +1 -1
- package/dist/capture/session-texts.d.ts +1 -1
- package/dist/capture/session-texts.js +5 -5
- package/dist/capture/session-worker.js +6 -4
- package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
- package/dist/capture/transcript.d.ts +2 -10
- package/dist/capture/transcript.js +72 -92
- package/dist/capture/working-state.d.ts +0 -3
- package/dist/capture/working-state.js +7 -7
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +28 -0
- package/dist/cli/audit-prune.js +40 -0
- package/dist/cli/audit.d.ts +2 -2
- package/dist/cli/audit.js +92 -88
- package/dist/cli/auth.d.ts +2 -1
- package/dist/cli/auth.js +69 -53
- package/dist/cli/briefs.d.ts +4 -3
- package/dist/cli/briefs.js +76 -202
- package/dist/cli/card.d.ts +2 -1
- package/dist/cli/card.js +55 -54
- package/dist/cli/client.d.ts +28 -0
- package/dist/{client.js → cli/client.js} +25 -44
- package/dist/cli/compact-resume-payload.d.ts +8 -0
- package/dist/cli/compact-resume-payload.js +40 -0
- package/dist/cli/context.d.ts +1 -13
- package/dist/cli/context.js +51 -77
- package/dist/cli/continuity.d.ts +6 -5
- package/dist/cli/continuity.js +153 -145
- package/dist/cli/correction-latency.d.ts +24 -0
- package/dist/{correction-latency.js → cli/correction-latency.js} +2 -14
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +226 -222
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +70 -52
- package/dist/cli/decisions.d.ts +4 -3
- package/dist/cli/decisions.js +129 -253
- package/dist/cli/eval.d.ts +1 -3
- package/dist/cli/eval.js +56 -42
- 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 +39 -21
- package/dist/cli/flag-values.d.ts +30 -0
- package/dist/cli/flag-values.js +120 -0
- package/dist/cli/flags.d.ts +304 -0
- package/dist/cli/flags.js +169 -0
- package/dist/cli/github.d.ts +14 -0
- package/dist/cli/github.js +184 -0
- package/dist/cli/goals.d.ts +2 -1
- package/dist/cli/goals.js +76 -75
- package/dist/cli/hook-runtime.d.ts +31 -0
- package/dist/cli/hook-runtime.js +139 -0
- package/dist/cli/init.d.ts +2 -1
- package/dist/cli/init.js +153 -126
- package/dist/cli/install-steps.d.ts +7 -0
- package/dist/cli/install-steps.js +101 -0
- package/dist/cli/last-sleep.d.ts +3 -1
- package/dist/cli/last-sleep.js +12 -7
- package/dist/cli/maintenance.d.ts +5 -4
- package/dist/cli/maintenance.js +41 -42
- package/dist/cli/object-verbs.d.ts +40 -0
- package/dist/cli/object-verbs.js +66 -0
- package/dist/cli/owner-validation.d.ts +18 -0
- package/dist/cli/owner-validation.js +33 -0
- package/dist/cli/playbooks.d.ts +4 -3
- package/dist/cli/playbooks.js +98 -306
- package/dist/cli/print.d.ts +15 -0
- package/dist/cli/print.js +82 -0
- package/dist/cli/projects.d.ts +2 -3
- package/dist/cli/projects.js +56 -51
- package/dist/cli/provenance-coverage.d.ts +14 -0
- package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +2 -6
- package/dist/cli/quality-repair-once.js +4 -4
- package/dist/cli/recall.d.ts +2 -6
- package/dist/cli/recall.js +128 -253
- package/dist/cli/refine-llm.d.ts +35 -0
- package/dist/cli/refine-llm.js +128 -0
- package/dist/cli/remember.d.ts +4 -6
- package/dist/cli/remember.js +193 -230
- package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +4 -17
- package/dist/{scheduler.js → cli/scheduler.js} +22 -22
- package/dist/cli/serve.d.ts +1 -1
- package/dist/cli/serve.js +46 -7
- package/dist/cli/session-hooks.d.ts +11 -19
- package/dist/cli/session-hooks.js +263 -258
- package/dist/cli/setup.d.ts +4 -3
- package/dist/cli/setup.js +55 -37
- package/dist/cli/shared.d.ts +14 -118
- package/dist/cli/shared.js +26 -400
- package/dist/cli/slack.d.ts +2 -1
- package/dist/cli/slack.js +46 -74
- package/dist/cli/sleep-render.d.ts +4 -0
- package/dist/cli/sleep-render.js +61 -0
- package/dist/cli/sleep.d.ts +3 -8
- package/dist/cli/sleep.js +34 -91
- package/dist/cli/status.d.ts +9 -12
- package/dist/cli/status.js +86 -131
- package/dist/{stdin.d.ts → cli/stdin.d.ts} +4 -6
- package/dist/{stdin.js → cli/stdin.js} +8 -9
- package/dist/cli/transfer.d.ts +9 -9
- package/dist/cli/transfer.js +125 -122
- package/dist/cli/usage.js +13 -5
- package/dist/cli.d.ts +69 -167
- package/dist/cli.js +187 -296
- package/dist/connectors/dlq.d.ts +44 -0
- package/dist/connectors/dlq.js +30 -0
- package/dist/connectors/github/backfill.d.ts +6 -26
- package/dist/connectors/github/backfill.js +42 -114
- package/dist/connectors/github/deletion.d.ts +6 -21
- package/dist/connectors/github/deletion.js +17 -64
- package/dist/connectors/github/dlq.d.ts +12 -91
- package/dist/connectors/github/dlq.js +23 -140
- package/dist/connectors/github/ingest.d.ts +4 -37
- package/dist/connectors/github/ingest.js +24 -93
- package/dist/connectors/github/octokit-client.d.ts +5 -17
- package/dist/connectors/github/octokit-client.js +29 -25
- 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 +4 -26
- package/dist/connectors/github/tenant-routing.js +13 -61
- package/dist/connectors/github/transform.d.ts +1 -1
- package/dist/connectors/github/transform.js +2 -16
- package/dist/connectors/github/types.d.ts +4 -16
- package/dist/connectors/github/types.js +17 -27
- package/dist/connectors/github/webhook.d.ts +5 -18
- package/dist/connectors/github/webhook.js +86 -105
- package/dist/connectors/slack/backfill.d.ts +5 -18
- package/dist/connectors/slack/backfill.js +9 -42
- package/dist/connectors/slack/deletion.d.ts +4 -7
- package/dist/connectors/slack/deletion.js +20 -49
- package/dist/connectors/slack/dlq.d.ts +9 -68
- package/dist/connectors/slack/dlq.js +26 -136
- package/dist/connectors/slack/ingest.d.ts +4 -18
- package/dist/connectors/slack/ingest.js +26 -91
- 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/signature.js +2 -1
- package/dist/connectors/slack/tenant-routing.d.ts +4 -18
- package/dist/connectors/slack/tenant-routing.js +11 -31
- package/dist/connectors/slack/transform.d.ts +3 -19
- package/dist/connectors/slack/transform.js +2 -18
- package/dist/connectors/slack/types.d.ts +4 -10
- package/dist/connectors/slack/types.js +5 -16
- package/dist/connectors/slack/web-client.js +34 -28
- package/dist/connectors/slack/webhook.d.ts +5 -21
- package/dist/connectors/slack/webhook.js +80 -108
- package/dist/connectors/slack/workspaces.d.ts +8 -41
- package/dist/connectors/slack/workspaces.js +8 -58
- package/dist/consolidate/conflicts.d.ts +1 -1
- package/dist/consolidate/conflicts.js +10 -18
- package/dist/consolidate/dag-summary.d.ts +8 -0
- package/dist/consolidate/dag-summary.js +41 -0
- package/dist/{dag.d.ts → consolidate/dag.d.ts} +6 -29
- package/dist/{dag.js → consolidate/dag.js} +49 -131
- package/dist/consolidate/decay.d.ts +2 -2
- package/dist/consolidate/decay.js +35 -41
- package/dist/consolidate/dedupe.d.ts +29 -0
- package/dist/consolidate/dedupe.js +103 -0
- package/dist/consolidate/flush-units.d.ts +5 -6
- package/dist/consolidate/flush-units.js +3 -3
- package/dist/consolidate/half-life-migration.d.ts +34 -0
- package/dist/consolidate/half-life-migration.js +89 -0
- package/dist/consolidate/llm-passes.js +12 -29
- package/dist/consolidate/memory-value-weights.d.ts +8 -0
- package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +2 -13
- package/dist/consolidate/memory-value.d.ts +45 -0
- package/dist/consolidate/memory-value.js +164 -0
- package/dist/consolidate/merge.js +65 -83
- package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
- package/dist/{merged-row.js → consolidate/merged-row.js} +4 -3
- package/dist/consolidate/physics-pass.js +46 -48
- package/dist/consolidate/replay.d.ts +9 -0
- package/dist/consolidate/replay.js +84 -0
- package/dist/consolidate/run.d.ts +7 -13
- package/dist/consolidate/run.js +6 -37
- package/dist/consolidate/sleep.d.ts +2 -9
- package/dist/consolidate/sleep.js +69 -151
- package/dist/consolidate/trace.d.ts +19 -0
- package/dist/{trace.js → consolidate/trace.js} +7 -24
- package/dist/consolidate/traces.js +40 -51
- package/dist/core/ablation.d.ts +15 -0
- package/dist/core/ablation.js +49 -0
- package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
- package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
- package/dist/{ambient.d.ts → core/ambient.d.ts} +1 -8
- package/dist/{ambient.js → core/ambient.js} +13 -18
- package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +16 -3
- package/dist/{capture-contract.js → core/capture-contract.js} +67 -1
- package/dist/{card.d.ts → core/card.d.ts} +4 -1
- package/dist/{card.js → core/card.js} +8 -0
- package/dist/core/compare.d.ts +32 -0
- package/dist/core/compare.js +70 -0
- package/dist/{config.d.ts → core/config.d.ts} +14 -28
- package/dist/{config.js → core/config.js} +101 -75
- package/dist/{handoff.d.ts → core/handoff.d.ts} +1 -7
- package/dist/core/handoff.js +81 -0
- package/dist/{memory-quality.js → core/memory-quality.js} +2 -2
- package/dist/core/memory.d.ts +183 -0
- package/dist/core/memory.js +380 -0
- package/dist/core/package-root.d.ts +3 -0
- package/dist/core/package-root.js +5 -0
- package/dist/{physics-config.d.ts → core/physics-config.d.ts} +1 -4
- package/dist/{physics-config.js → core/physics-config.js} +3 -8
- package/dist/{physics.d.ts → core/physics.d.ts} +16 -62
- package/dist/{physics.js → core/physics.js} +60 -122
- package/dist/{project-identity.d.ts → core/project-identity.d.ts} +17 -63
- package/dist/{project-identity.js → core/project-identity.js} +22 -55
- package/dist/{project-remote.js → core/project-remote.js} +17 -6
- package/dist/{prompt-recall.js → core/prompt-recall.js} +1 -1
- package/dist/core/raw-append-only.d.ts +5 -0
- package/dist/core/raw-append-only.js +7 -0
- package/dist/{salience.d.ts → core/salience.d.ts} +1 -7
- package/dist/{salience.js → core/salience.js} +36 -27
- package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
- package/dist/{search/types.js → core/search-types.js} +1 -1
- package/dist/core/session-digest-row.d.ts +5 -0
- package/dist/core/session-digest-row.js +6 -0
- package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
- package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +7 -7
- package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
- package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
- package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +11 -10
- package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +110 -104
- package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +2 -1
- package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +1 -0
- package/dist/{dashboard.js → dashboard/dashboard.js} +172 -55
- package/dist/db/backup.js +1 -1
- package/dist/db/busy.d.ts +19 -2
- package/dist/db/busy.js +88 -14
- package/dist/db/connect.d.ts +11 -2
- package/dist/db/connect.js +43 -10
- package/dist/db/index.d.ts +9 -0
- package/dist/db/index.js +8 -0
- package/dist/db/meta.d.ts +4 -0
- package/dist/db/meta.js +11 -1
- package/dist/db/migrate.d.ts +8 -1
- package/dist/db/migrate.js +28 -33
- package/dist/db/migrations/types.d.ts +2 -5
- package/dist/db/migrations/v08.js +1 -1
- package/dist/db/migrations/v14.js +39 -36
- package/dist/db/migrations/v15.js +2 -8
- package/dist/db/migrations/v16.js +31 -29
- package/dist/db/migrations/v17.js +2 -3
- package/dist/db/migrations/v18.js +6 -5
- package/dist/db/migrations/v19.js +2 -5
- package/dist/db/migrations/v20.js +5 -8
- package/dist/db/migrations/v22.js +28 -38
- package/dist/db/migrations/v23.js +3 -14
- package/dist/db/migrations/v24.js +25 -22
- 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 +23 -32
- package/dist/db/migrations/v30.js +4 -16
- package/dist/db/migrations/v31.js +23 -31
- 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 +10 -21
- package/dist/db/migrations/v40.js +8 -14
- package/dist/db/migrations/v41.js +2 -24
- package/dist/db/migrations/v43.js +7 -6
- package/dist/db/migrations/v44.js +2 -8
- package/dist/db/migrations/v45.js +2 -7
- package/dist/db/migrations/v46.js +1 -1
- package/dist/db/migrations/v47.js +2 -3
- package/dist/db/migrations/v48.js +1 -1
- package/dist/db/migrations/v49.js +1 -1
- package/dist/db/migrations/v50.js +8 -7
- package/dist/db/migrations/v51.js +1 -1
- package/dist/db/migrations/v52.js +1 -1
- package/dist/db/open.d.ts +11 -1
- package/dist/db/open.js +37 -4
- package/dist/db/physics-state.d.ts +23 -0
- package/dist/{physics-state.js → db/physics-state.js} +34 -52
- package/dist/db/raw-archive-mirror-cleanup.d.ts +5 -0
- package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +10 -20
- package/dist/db/request-stores.d.ts +15 -2
- package/dist/db/request-stores.js +37 -15
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -0
- package/dist/{vector-store.d.ts → db/vector-store.d.ts} +6 -2
- package/dist/{vector-store.js → db/vector-store.js} +83 -51
- package/dist/db/wal-checkpointer.d.ts +11 -0
- package/dist/db/wal-checkpointer.js +92 -0
- package/dist/doctor.js +176 -152
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.d.ts +1 -1
- package/dist/entry/project-identity.js +1 -1
- package/dist/entry/session-text.d.ts +3 -3
- package/dist/entry/session-text.js +5 -4
- package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +15 -53
- package/dist/{eval-stats.js → eval/eval-stats.js} +24 -51
- package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +3 -14
- package/dist/{eval-suite.js → eval/eval-suite.js} +99 -57
- package/dist/{eval.d.ts → eval/eval.d.ts} +7 -25
- package/dist/{eval.js → eval/eval.js} +35 -55
- package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -6
- package/dist/{judgment.js → eval/judgment.js} +23 -20
- package/dist/extensions/openclaw-plugin/index.js +2 -3
- package/dist/graph/delta.d.ts +3 -2
- package/dist/graph/delta.js +9 -23
- package/dist/{graph-extract.d.ts → graph/extract.d.ts} +10 -32
- package/dist/{graph-extract.js → graph/extract.js} +40 -81
- package/dist/{graph-recall.d.ts → graph/recall.d.ts} +9 -22
- package/dist/{graph-recall.js → graph/recall.js} +65 -108
- package/dist/graph/stream.d.ts +38 -0
- package/dist/{graph-stream.js → graph/stream.js} +20 -41
- package/dist/graph/view.d.ts +50 -0
- package/dist/graph/view.js +265 -0
- package/dist/graph/write.d.ts +4 -76
- package/dist/graph/write.js +13 -397
- package/dist/hooks/codex-session.js +1 -1
- package/dist/hooks/codex-wrapper.js +16 -17
- package/dist/hooks/copilot.d.ts +1 -8
- package/dist/hooks/copilot.js +16 -16
- package/dist/{cli → hooks}/hook-blocks.d.ts +6 -2
- package/dist/{cli → hooks}/hook-blocks.js +38 -125
- package/dist/hooks/json-hooks.d.ts +5 -37
- package/dist/hooks/json-hooks.js +49 -179
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +44 -103
- package/dist/hooks/shared.d.ts +8 -21
- package/dist/hooks/shared.js +30 -25
- package/dist/importers/core.d.ts +13 -42
- package/dist/importers/core.js +48 -64
- package/dist/importers/markdown-parse.d.ts +9 -32
- package/dist/importers/markdown-parse.js +10 -44
- package/dist/importers/markdown.js +5 -13
- package/dist/importers/sources.js +57 -81
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +95 -172
- package/dist/index.d.ts +26 -22
- package/dist/index.js +25 -21
- package/dist/learn/autolearn.d.ts +29 -0
- package/dist/{autolearn.js → learn/autolearn.js} +26 -51
- package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
- package/dist/{churn-git.js → learn/churn-git.js} +6 -4
- package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
- package/dist/learn/extract.js +123 -0
- package/dist/learn/forward-claim-detector.d.ts +12 -0
- package/dist/learn/forward-claim-detector.js +60 -0
- package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +10 -18
- package/dist/{invalidation.js → learn/invalidation.js} +92 -125
- package/dist/mcp/admin-tools.d.ts +1 -1
- package/dist/mcp/admin-tools.js +39 -64
- package/dist/mcp/format.d.ts +5 -5
- package/dist/mcp/format.js +7 -6
- package/dist/mcp/framing.d.ts +6 -0
- package/dist/mcp/framing.js +11 -3
- package/dist/mcp/memory-tools.js +10 -35
- package/dist/mcp/protocol.d.ts +14 -36
- package/dist/mcp/protocol.js +10 -19
- package/dist/mcp/recall-tools.d.ts +2 -2
- package/dist/mcp/recall-tools.js +70 -52
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +71 -85
- package/dist/mcp/server.d.ts +3 -9
- package/dist/mcp/server.js +6 -17
- package/dist/mcp/session-state.d.ts +2 -3
- package/dist/mcp/session-state.js +7 -13
- package/dist/mcp/shared-gate.js +1 -1
- package/dist/mcp/stdio.d.ts +2 -6
- package/dist/mcp/stdio.js +112 -38
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +7 -5
- package/dist/objects/customer-notes.d.ts +44 -0
- package/dist/objects/customer-notes.js +71 -0
- package/dist/objects/decisions.d.ts +41 -0
- package/dist/objects/decisions.js +63 -0
- package/dist/objects/descriptor.d.ts +52 -0
- package/dist/objects/descriptor.js +4 -0
- package/dist/objects/fields.d.ts +15 -0
- package/dist/objects/fields.js +21 -0
- package/dist/objects/incidents.d.ts +45 -0
- package/dist/objects/incidents.js +96 -0
- package/dist/objects/lifecycle.d.ts +27 -0
- package/dist/objects/lifecycle.js +96 -0
- package/dist/objects/policies.d.ts +60 -0
- package/dist/objects/policies.js +102 -0
- package/dist/objects/processes.d.ts +43 -0
- package/dist/objects/processes.js +92 -0
- package/dist/objects/project-briefs.d.ts +63 -0
- package/dist/objects/project-briefs.js +194 -0
- package/dist/objects/skills.d.ts +51 -0
- package/dist/objects/skills.js +110 -0
- package/dist/postinstall.js +10 -21
- package/dist/predictions/planning-fallacy.d.ts +14 -109
- package/dist/predictions/planning-fallacy.js +4 -129
- package/dist/rerankers/clef.d.ts +2 -6
- package/dist/rerankers/clef.js +28 -76
- package/dist/rerankers/cross-encoder.d.ts +0 -7
- package/dist/rerankers/cross-encoder.js +18 -28
- package/dist/rerankers/index.js +8 -7
- package/dist/rerankers/jev.d.ts +1 -4
- package/dist/rerankers/jev.js +36 -52
- package/dist/rerankers/llm.d.ts +2 -13
- package/dist/rerankers/llm.js +42 -59
- package/dist/rerankers/outage-warning.d.ts +8 -0
- package/dist/rerankers/outage-warning.js +32 -0
- package/dist/rerankers/remote.d.ts +4 -0
- package/dist/rerankers/remote.js +25 -0
- package/dist/rerankers/types.d.ts +3 -15
- package/dist/search/as-of.d.ts +1 -1
- package/dist/search/bm25-search.d.ts +2 -2
- package/dist/search/bm25-search.js +7 -7
- package/dist/search/bm25.d.ts +1 -1
- package/dist/search/bm25.js +1 -1
- package/dist/search/boosts.d.ts +5 -3
- package/dist/search/boosts.js +36 -15
- package/dist/search/breakdown.d.ts +2 -2
- package/dist/search/breakdown.js +2 -1
- package/dist/search/explain.d.ts +1 -1
- package/dist/search/explain.js +3 -2
- package/dist/search/finalize.d.ts +2 -2
- package/dist/search/finalize.js +4 -3
- package/dist/search/fusion.d.ts +1 -1
- package/dist/search/fusion.js +3 -3
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +90 -0
- package/dist/search/hybrid-score.d.ts +2 -2
- package/dist/search/hybrid-score.js +1 -1
- package/dist/search/hybrid.d.ts +6 -4
- package/dist/search/hybrid.js +11 -8
- package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
- package/dist/{multihop.js → search/multihop.js} +9 -8
- package/dist/search/path-context.d.ts +11 -0
- package/dist/{path-context.js → search/path-context.js} +8 -19
- package/dist/search/physics-search.d.ts +4 -4
- package/dist/search/physics-search.js +25 -22
- package/dist/search/rerank.d.ts +3 -3
- package/dist/search/rerank.js +4 -3
- package/dist/search/rrf.d.ts +15 -0
- package/dist/search/rrf.js +36 -0
- package/dist/search/temporal.d.ts +1 -1
- package/dist/search/temporal.js +5 -2
- package/dist/search/vector.d.ts +10 -3
- package/dist/search/vector.js +51 -15
- package/dist/server/auth.d.ts +10 -29
- package/dist/server/auth.js +57 -42
- package/dist/server/boot.d.ts +5 -0
- package/dist/server/boot.js +432 -0
- package/dist/server/client-ip.d.ts +8 -20
- package/dist/server/client-ip.js +23 -34
- package/dist/server/cursor.d.ts +1 -1
- package/dist/server/cursor.js +2 -3
- package/dist/server/deadline.d.ts +13 -0
- package/dist/server/deadline.js +45 -0
- package/dist/server/defaults.d.ts +3 -0
- package/dist/server/defaults.js +4 -0
- package/dist/server/key-check-bounds.d.ts +9 -0
- package/dist/server/key-check-bounds.js +46 -0
- package/dist/server/lifecycle.d.ts +5 -4
- package/dist/server/lifecycle.js +20 -5
- package/dist/server/mcp-http.d.ts +1 -4
- package/dist/server/mcp-http.js +44 -68
- package/dist/server/rate-limit.d.ts +21 -0
- package/dist/{rate-limit.js → server/rate-limit.js} +4 -13
- package/dist/server/ready.d.ts +7 -0
- package/dist/server/ready.js +38 -0
- package/dist/server/request.d.ts +14 -12
- package/dist/server/request.js +71 -28
- package/dist/server/route-table.d.ts +15 -0
- package/dist/server/route-table.js +202 -0
- package/dist/server/routes/admin.js +29 -30
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +35 -105
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +45 -115
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +44 -105
- package/dist/server/routes/memories.js +21 -43
- package/dist/server/routes/object-routes.d.ts +35 -0
- package/dist/server/routes/object-routes.js +72 -0
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +42 -134
- package/dist/server/routes/predictions.js +35 -63
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +44 -134
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +41 -120
- package/dist/server/routes/recall.js +21 -44
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +40 -138
- package/dist/server/server-detect.d.ts +28 -0
- package/dist/server/server-detect.js +156 -0
- package/dist/server/sleep-child.d.ts +2 -0
- package/dist/server/sleep-child.js +19 -0
- package/dist/server/sleep-offload.d.ts +20 -0
- package/dist/server/sleep-offload.js +73 -0
- package/dist/server/tls.d.ts +6 -0
- package/dist/server/tls.js +24 -0
- package/dist/server/types.d.ts +35 -14
- package/dist/server/validation.d.ts +6 -5
- package/dist/server/validation.js +16 -34
- package/dist/server.d.ts +39 -61
- package/dist/server.js +26 -569
- 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/{project-merge.d.ts → sharing/project-merge.d.ts} +5 -6
- package/dist/{project-merge.js → sharing/project-merge.js} +34 -51
- package/dist/sharing/scope.d.ts +7 -0
- package/dist/{scope.js → sharing/scope.js} +5 -12
- 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/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
- package/dist/{ambient-store.js → store/ambient.js} +11 -16
- package/dist/store/audit-event.d.ts +15 -17
- package/dist/store/audit-event.js +9 -16
- package/dist/{audit.d.ts → store/audit.d.ts} +29 -8
- package/dist/{audit.js → store/audit.js} +95 -18
- package/dist/{auth.d.ts → store/auth.d.ts} +19 -36
- package/dist/{auth.js → store/auth.js} +108 -99
- package/dist/store/candidates.d.ts +41 -13
- package/dist/store/candidates.js +141 -60
- package/dist/{card-detail.d.ts → store/card-detail.d.ts} +5 -4
- package/dist/{card-detail.js → store/card-detail.js} +3 -2
- package/dist/{store-cards.d.ts → store/cards.d.ts} +26 -16
- package/dist/{store-cards.js → store/cards.js} +133 -248
- package/dist/store/compactions.d.ts +78 -0
- package/dist/store/compactions.js +93 -0
- package/dist/store/conflicts.d.ts +26 -26
- package/dist/store/conflicts.js +194 -222
- package/dist/store/connectors/github.d.ts +84 -0
- package/dist/store/connectors/github.js +180 -0
- package/dist/store/connectors/slack.d.ts +69 -0
- package/dist/store/connectors/slack.js +177 -0
- package/dist/store/dashboard-reads.d.ts +27 -0
- package/dist/store/dashboard-reads.js +88 -0
- package/dist/store/delete-and-batch.d.ts +27 -51
- package/dist/store/delete-and-batch.js +100 -92
- package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +16 -5
- package/dist/{delivery-recorder.js → store/delivery-recorder.js} +60 -38
- package/dist/store/descendant-page.d.ts +12 -0
- package/dist/store/descendant-page.js +99 -0
- package/dist/store/diagnostics.d.ts +47 -0
- package/dist/store/diagnostics.js +44 -0
- package/dist/store/doctor-reads.d.ts +16 -0
- package/dist/store/doctor-reads.js +19 -0
- package/dist/store/dormant.d.ts +105 -0
- package/dist/store/dormant.js +241 -0
- package/dist/store/embeddings/index.d.ts +36 -0
- package/dist/{embeddings.js → store/embeddings/index.js} +104 -224
- package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
- package/dist/{local-embedding.js → store/embeddings/local.js} +69 -75
- package/dist/store/embeddings/provider.d.ts +40 -0
- package/dist/{embedding-provider.js → store/embeddings/provider.js} +78 -91
- package/dist/store/entry-reads.d.ts +66 -63
- package/dist/store/entry-reads.js +159 -121
- package/dist/store/entry-row.d.ts +14 -37
- package/dist/store/entry-row.js +37 -45
- package/dist/store/entry-writes.d.ts +40 -17
- package/dist/store/entry-writes.js +105 -41
- package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
- package/dist/{failure-log.js → store/failure-log.js} +9 -2
- package/dist/store/goals.d.ts +96 -0
- package/dist/store/goals.js +260 -0
- package/dist/store/graph-queue.d.ts +13 -0
- package/dist/store/graph-queue.js +70 -0
- package/dist/store/graph-reads.d.ts +41 -0
- package/dist/{graph/read.js → store/graph-reads.js} +72 -162
- package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +71 -14
- package/dist/{graph/rows.js → store/graph-rows.js} +20 -12
- package/dist/store/graph-view-rows.d.ts +13 -0
- package/dist/store/graph-view-rows.js +68 -0
- package/dist/store/graph-writes.d.ts +33 -0
- package/dist/store/graph-writes.js +232 -0
- package/dist/store/half-life.d.ts +35 -0
- package/dist/store/half-life.js +75 -0
- package/dist/store/handoffs.d.ts +6 -12
- package/dist/store/handoffs.js +54 -63
- package/dist/store/index-and-stats.d.ts +14 -20
- package/dist/store/index-and-stats.js +74 -119
- package/dist/store/index.d.ts +4 -0
- package/dist/store/index.js +3 -0
- package/dist/store/key-audit.d.ts +2 -2
- package/dist/store/key-audit.js +4 -4
- package/dist/store/key-writes.d.ts +12 -5
- package/dist/store/key-writes.js +30 -4
- package/dist/store/ledger-turn.d.ts +17 -0
- package/dist/store/ledger-turn.js +27 -0
- package/dist/store/markdown.d.ts +3 -7
- package/dist/store/markdown.js +25 -23
- package/dist/store/mirrors.d.ts +7 -13
- package/dist/store/mirrors.js +52 -47
- package/dist/store/object-types.d.ts +189 -0
- package/dist/store/object-types.js +4 -0
- package/dist/store/open.d.ts +6 -4
- package/dist/store/open.js +30 -36
- package/dist/store/planning-fallacy-evidence.d.ts +14 -0
- package/dist/store/planning-fallacy-evidence.js +52 -0
- package/dist/store/port.d.ts +649 -0
- package/dist/store/port.js +17 -0
- package/dist/{predictions/store.d.ts → store/predictions.d.ts} +25 -52
- package/dist/{predictions/store.js → store/predictions.js} +88 -184
- package/dist/{quality-repair.js → store/quality-repair.js} +27 -57
- package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
- package/dist/{quarantine.js → store/quarantine.js} +64 -22
- package/dist/store/raw-archive.d.ts +14 -0
- package/dist/{raw-archive.js → store/raw-archive.js} +20 -31
- package/dist/store/recall-scope.d.ts +78 -0
- package/dist/{recall-scope.js → store/recall-scope.js} +23 -84
- package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -81
- package/dist/{recall-trace.js → store/recall-trace.js} +41 -122
- package/dist/store/rejected-values.d.ts +55 -0
- package/dist/store/rejected-values.js +150 -0
- package/dist/store/rejection.d.ts +54 -0
- package/dist/{rejection.js → store/rejection.js} +16 -67
- package/dist/store/report-reads.d.ts +6 -0
- package/dist/store/report-reads.js +29 -0
- package/dist/store/rows.d.ts +11 -22
- package/dist/store/rows.js +52 -43
- package/dist/store/rule-sql.d.ts +5 -0
- package/dist/store/rule-sql.js +37 -0
- package/dist/store/search-rows.d.ts +22 -42
- package/dist/store/search-rows.js +55 -78
- package/dist/store/sessions.d.ts +23 -49
- package/dist/store/sessions.js +96 -118
- package/dist/store/sqlite/commit-watch.d.ts +4 -0
- package/dist/store/sqlite/commit-watch.js +29 -0
- package/dist/store/sqlite/connector-events-group.d.ts +5 -0
- package/dist/store/sqlite/connector-events-group.js +50 -0
- package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
- package/dist/store/sqlite/connector-writes-group.js +65 -0
- package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
- package/dist/store/sqlite/dag-reads-group.js +45 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
- package/dist/store/{entry-writes-group.js → sqlite/entry-writes-group.js} +73 -60
- package/dist/store/sqlite/error-codec.d.ts +17 -0
- package/dist/store/sqlite/error-codec.js +61 -0
- package/dist/store/sqlite/executor-counts.d.ts +10 -0
- package/dist/store/sqlite/executor-counts.js +11 -0
- package/dist/store/sqlite/executor.d.ts +29 -0
- package/dist/store/sqlite/executor.js +287 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
- package/dist/store/sqlite/graph-reads-group.js +18 -0
- package/dist/store/sqlite/local.d.ts +21 -0
- package/dist/store/sqlite/local.js +39 -0
- package/dist/store/sqlite/object-rows.d.ts +102 -0
- package/dist/store/sqlite/object-rows.js +221 -0
- package/dist/store/sqlite/objects-group.d.ts +20 -0
- package/dist/store/sqlite/objects-group.js +316 -0
- package/dist/store/sqlite/predictions-group.d.ts +5 -0
- package/dist/store/sqlite/predictions-group.js +28 -0
- package/dist/store/sqlite/quarantine-group.d.ts +5 -0
- package/dist/store/sqlite/quarantine-group.js +38 -0
- package/dist/store/sqlite/store.d.ts +23 -0
- package/dist/store/sqlite/store.js +294 -0
- package/dist/store/sqlite/vector-pack.d.ts +18 -0
- package/dist/store/sqlite/vector-pack.js +46 -0
- package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
- package/dist/store/sqlite/vector-reads-group.js +23 -0
- package/dist/store/sqlite/worker-entry.d.ts +2 -0
- package/dist/store/sqlite/worker-entry.js +8 -0
- package/dist/store/sqlite/worker-jobs.d.ts +5 -0
- package/dist/store/sqlite/worker-jobs.js +116 -0
- package/dist/store/sqlite/worker-ops.d.ts +135 -0
- package/dist/store/sqlite/worker-ops.js +93 -0
- package/dist/store/sqlite/worker-store.d.ts +8 -0
- package/dist/store/sqlite/worker-store.js +79 -0
- package/dist/store/summaries.d.ts +11 -72
- package/dist/store/summaries.js +47 -186
- package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
- package/dist/{summary-dirty.js → 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 +11 -0
- package/dist/store/tenant.js +28 -0
- package/dist/store/token-ledger-rows.d.ts +61 -0
- package/dist/store/token-ledger-rows.js +68 -0
- package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +14 -51
- package/dist/{token-ledger.js → store/token-ledger.js} +51 -129
- package/dist/store/tombstone-checks.d.ts +12 -0
- package/dist/store/tombstone-checks.js +31 -0
- package/dist/store/usage-reports.d.ts +7 -0
- package/dist/store/usage-reports.js +18 -0
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +170 -0
- package/dist/{working-memory.d.ts → store/working-memory.d.ts} +11 -26
- package/dist/store/working-memory.js +118 -0
- package/dist/{yaml.d.ts → store/yaml.d.ts} +1 -5
- package/dist/{yaml.js → store/yaml.js} +2 -6
- package/dist/support-bundle.d.ts +1 -1
- package/dist/support-bundle.js +19 -37
- package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
- package/dist/{gated-write.js → trust/gated-write.js} +6 -6
- package/dist/trust/quarantine.d.ts +4 -0
- package/dist/trust/quarantine.js +8 -0
- package/dist/trust/reject-flow.d.ts +23 -0
- package/dist/trust/reject-flow.js +65 -0
- package/dist/util/anthropic-messages.d.ts +31 -0
- package/dist/util/anthropic-messages.js +58 -0
- package/dist/util/atomic-write.d.ts +4 -0
- package/dist/util/atomic-write.js +138 -0
- package/dist/util/capped-json.d.ts +6 -0
- package/dist/util/capped-json.js +46 -0
- package/dist/util/crash-handlers.d.ts +12 -0
- package/dist/util/crash-handlers.js +72 -0
- package/dist/{env.d.ts → util/env.d.ts} +27 -7
- package/dist/{env.js → util/env.js} +33 -8
- package/dist/{home-path.d.ts → util/home-path.d.ts} +2 -1
- package/dist/util/home-path.js +69 -0
- package/dist/{http-retry.d.ts → util/http-retry.d.ts} +8 -2
- package/dist/util/http-retry.js +103 -0
- package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
- package/dist/{http-util.js → util/http-util.js} +31 -11
- package/dist/util/json.d.ts +17 -0
- package/dist/util/json.js +25 -0
- package/dist/{log.d.ts → util/log.d.ts} +7 -3
- package/dist/{log.js → util/log.js} +36 -11
- package/dist/util/real-path.d.ts +3 -0
- package/dist/util/real-path.js +15 -0
- package/dist/util/request-scope.d.ts +28 -0
- package/dist/util/request-scope.js +48 -0
- package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
- package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +5 -30
- package/dist/{secret-detect.js → util/secret-detect.js} +17 -42
- package/dist/util/stored-json.d.ts +9 -0
- package/dist/util/stored-json.js +8 -0
- package/dist/util/time.d.ts +2 -0
- package/dist/util/time.js +3 -0
- package/dist/util/token-text.d.ts +15 -0
- package/dist/util/token-text.js +20 -0
- package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +2 -0
- package/dist/util/transcript-tail.js +49 -0
- package/dist/util/version.d.ts +11 -0
- package/dist/util/version.js +26 -0
- package/extensions/openclaw-plugin/index.ts +2 -6
- 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 +2 -2
- package/dist/ablation.d.ts +0 -102
- package/dist/ablation.js +0 -136
- package/dist/api.d.ts +0 -26
- package/dist/api.js +0 -29
- package/dist/audit-prune.d.ts +0 -62
- package/dist/audit-prune.js +0 -107
- package/dist/autolearn.d.ts +0 -56
- package/dist/client.d.ts +0 -48
- package/dist/compare.d.ts +0 -86
- package/dist/compare.js +0 -117
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/connectors/github/cli-impl.js +0 -227
- package/dist/connectors/github/idempotency.d.ts +0 -19
- package/dist/connectors/github/idempotency.js +0 -27
- package/dist/connectors/slack/idempotency.d.ts +0 -17
- package/dist/connectors/slack/idempotency.js +0 -31
- package/dist/correction-latency.d.ts +0 -36
- package/dist/customer-notes.d.ts +0 -96
- package/dist/customer-notes.js +0 -336
- package/dist/db.d.ts +0 -9
- package/dist/db.js +0 -8
- package/dist/decisions.d.ts +0 -94
- package/dist/decisions.js +0 -326
- package/dist/dedupe.d.ts +0 -75
- package/dist/dedupe.js +0 -169
- package/dist/dormant.d.ts +0 -93
- package/dist/dormant.js +0 -137
- package/dist/embedding-provider.d.ts +0 -77
- package/dist/embeddings.d.ts +0 -101
- package/dist/extract.js +0 -133
- package/dist/forward-claim-detector.d.ts +0 -36
- package/dist/forward-claim-detector.js +0 -112
- package/dist/goals.d.ts +0 -173
- package/dist/goals.js +0 -448
- package/dist/graph/read.d.ts +0 -73
- package/dist/graph/rows.d.ts +0 -45
- package/dist/graph/types.js +0 -11
- package/dist/graph-stream.d.ts +0 -70
- package/dist/graph-view.d.ts +0 -73
- package/dist/graph-view.js +0 -333
- package/dist/half-life-migration.d.ts +0 -63
- package/dist/half-life-migration.js +0 -182
- package/dist/handoff.js +0 -68
- package/dist/home-path.js +0 -24
- package/dist/http-retry.js +0 -51
- package/dist/incidents.d.ts +0 -103
- package/dist/incidents.js +0 -349
- package/dist/instruction-detect.js +0 -27
- package/dist/json.d.ts +0 -7
- package/dist/json.js +0 -11
- package/dist/ledger-db.d.ts +0 -10
- package/dist/ledger-db.js +0 -42
- package/dist/memory-value-weights.d.ts +0 -19
- package/dist/memory-value.d.ts +0 -113
- package/dist/memory-value.js +0 -250
- package/dist/memory.d.ts +0 -294
- package/dist/memory.js +0 -522
- package/dist/owner-validation.d.ts +0 -42
- package/dist/owner-validation.js +0 -56
- package/dist/path-context.d.ts +0 -24
- package/dist/physics-state.d.ts +0 -39
- package/dist/policies.d.ts +0 -151
- package/dist/policies.js +0 -434
- package/dist/processes.d.ts +0 -108
- package/dist/processes.js +0 -371
- package/dist/project-briefs.d.ts +0 -128
- package/dist/project-briefs.js +0 -523
- package/dist/provenance-coverage.d.ts +0 -18
- package/dist/rate-limit.d.ts +0 -34
- package/dist/raw-archive-mirror-cleanup.d.ts +0 -20
- package/dist/raw-archive.d.ts +0 -24
- package/dist/recall-history.d.ts +0 -131
- package/dist/recall-history.js +0 -227
- package/dist/recall-scope.d.ts +0 -138
- package/dist/refine-llm.d.ts +0 -61
- package/dist/refine-llm.js +0 -167
- package/dist/reject-flow.d.ts +0 -69
- package/dist/reject-flow.js +0 -260
- package/dist/rejection.d.ts +0 -100
- package/dist/replay.d.ts +0 -41
- package/dist/replay.js +0 -122
- package/dist/rrf.d.ts +0 -43
- package/dist/rrf.js +0 -61
- package/dist/scope.d.ts +0 -14
- package/dist/server-detect.d.ts +0 -72
- package/dist/server-detect.js +0 -222
- package/dist/session-owners.d.ts +0 -7
- package/dist/session-owners.js +0 -54
- package/dist/shared.d.ts +0 -186
- package/dist/shared.js +0 -540
- package/dist/skills.d.ts +0 -101
- package/dist/skills.js +0 -367
- package/dist/store/entry-writes-group.d.ts +0 -9
- package/dist/store/vector-writes.d.ts +0 -6
- package/dist/store/vector-writes.js +0 -59
- package/dist/store-port.d.ts +0 -262
- package/dist/store-port.js +0 -178
- package/dist/tenant.d.ts +0 -25
- package/dist/tenant.js +0 -43
- package/dist/trace.d.ts +0 -34
- package/dist/transcript-tail.js +0 -48
- package/dist/version.d.ts +0 -26
- package/dist/version.js +0 -41
- package/dist/working-memory.js +0 -154
- /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
- /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
- /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
- /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
- /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
- /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
- /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
- /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
- /package/dist/{api-errors.js → core/api-errors.js} +0 -0
- /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
- /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
- /package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +0 -0
- /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
- /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
- /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
- /package/dist/{quality-repair.d.ts → store/quality-repair.d.ts} +0 -0
- /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
- /package/dist/{escape.js → util/escape.js} +0 -0
- /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
- /package/dist/{keyset.js → util/keyset.js} +0 -0
- /package/dist/{same-text.js → util/same-text.js} +0 -0
- /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
- /package/dist/{db → util}/sqlite-blocked.js +0 -0
- /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
- /package/dist/{tokenize.js → util/tokenize.js} +0 -0
- /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
- /package/dist/{write-budget.js → util/write-budget.js} +0 -0
package/dist/cli/curate.js
CHANGED
|
@@ -1,31 +1,37 @@
|
|
|
1
1
|
// Verbs that weaken, suppress or retire memories: outcome, forget, conflicts, reject, dormant, quarantine, invalidate.
|
|
2
2
|
import * as path from 'path';
|
|
3
|
-
import { readEntry } from '../store/entry-reads.js';
|
|
4
3
|
import { listMemoryConflicts, resolveConflict } from '../store/conflicts.js';
|
|
5
|
-
import { rejectValue, unrejectValue, listRejectionsForTenant } from '../reject-flow.js';
|
|
6
|
-
import { RejectedValueError } from '../rejection.js';
|
|
7
|
-
import { loadConfig } from '../config.js';
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import
|
|
11
|
-
import * as
|
|
12
|
-
import {
|
|
4
|
+
import { rejectValue, unrejectValue, listRejectionsForTenant } from '../trust/reject-flow.js';
|
|
5
|
+
import { RejectedValueError } from '../store/rejection.js';
|
|
6
|
+
import { loadConfig } from '../core/config.js';
|
|
7
|
+
import { RawAppendOnlyError } from '../core/raw-append-only.js';
|
|
8
|
+
import { isGitRepo } from '../learn/autolearn.js';
|
|
9
|
+
import { invalidateMatching } from '../learn/invalidation.js';
|
|
10
|
+
import * as api from '../api/index.js';
|
|
11
|
+
import { getMemory } from '../api/memories.js';
|
|
12
|
+
import * as client from './client.js';
|
|
13
|
+
import { cliApiContext } from './api-context.js';
|
|
13
14
|
import { printError } from './output.js';
|
|
14
|
-
import { parseCountFlag,
|
|
15
|
-
|
|
15
|
+
import { parseCountFlag, boolFlag, flagIsTrue, nonEmptyStringFlag, stringFlag } from './flag-values.js';
|
|
16
|
+
import { requireInit, runChurnStaleForRepo, runViaServerIfAvailable, resolveAuthRoot } from './shared.js';
|
|
17
|
+
import { fmt } from './print.js';
|
|
18
|
+
import { errorMessage } from '../util/log.js';
|
|
19
|
+
import { DIGEST_DISPLAY_CHARS, CONTENT_PREVIEW_CHARS, DATE_PREFIX_CHARS } from '../util/token-text.js';
|
|
20
|
+
import { CliExit } from './exit.js';
|
|
21
|
+
const CONFLICT_PREVIEW_CHARS = 120;
|
|
22
|
+
const REJECTED_DIGEST_LIST_CHARS = 16;
|
|
23
|
+
const DORMANT_PREVIEW_CHARS = 100;
|
|
24
|
+
const STRENGTH_DECIMALS = 3;
|
|
25
|
+
export function handleOutcome({ hippoRoot, tenantId, flags }) {
|
|
16
26
|
requireInit(hippoRoot);
|
|
17
|
-
const good =
|
|
18
|
-
const bad =
|
|
27
|
+
const good = boolFlag(flags, 'good');
|
|
28
|
+
const bad = boolFlag(flags, 'bad');
|
|
19
29
|
if (!good && !bad) {
|
|
20
30
|
printError('Specify --good or --bad');
|
|
21
|
-
|
|
31
|
+
throw new CliExit(1);
|
|
22
32
|
}
|
|
23
33
|
// Through api.outcome so every CLI outcome writes one audit_log row per id, as the MCP path does.
|
|
24
|
-
const ctx =
|
|
25
|
-
hippoRoot,
|
|
26
|
-
tenantId: resolveTenantId({}),
|
|
27
|
-
actor: api.adminActor('cli'),
|
|
28
|
-
};
|
|
34
|
+
const ctx = cliApiContext(hippoRoot, tenantId);
|
|
29
35
|
const specificId = flags['id'] ? String(flags['id']) : null;
|
|
30
36
|
let updated;
|
|
31
37
|
if (specificId) {
|
|
@@ -43,30 +49,13 @@ export function cmdOutcome(hippoRoot, flags) {
|
|
|
43
49
|
}
|
|
44
50
|
// Shared between the forget dispatch and cmdForget so the message can't drift.
|
|
45
51
|
const ARCHIVE_REASON_REQUIRED = 'hippo forget --archive requires --reason "<why>" (recorded on the archive).';
|
|
46
|
-
function cmdForget(hippoRoot, id, flags) {
|
|
52
|
+
function cmdForget(hippoRoot, tenantId, id, flags) {
|
|
47
53
|
requireInit(hippoRoot);
|
|
48
|
-
const ctx =
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
// Raw memories (Slack / GitHub connector ingestion) are append-only: a
|
|
54
|
-
// BEFORE-DELETE trigger aborts any delete. archiveRaw is the sanctioned
|
|
55
|
-
// removal path; it records ctx.actor as the archiver for provenance.
|
|
56
|
-
if (flags['archive'] === true) {
|
|
57
|
-
const reason = typeof flags['reason'] === 'string' ? flags['reason'] : null;
|
|
58
|
-
if (!reason) {
|
|
59
|
-
printError(ARCHIVE_REASON_REQUIRED);
|
|
60
|
-
process.exit(1);
|
|
61
|
-
}
|
|
62
|
-
try {
|
|
63
|
-
api.archiveRaw(ctx, id, reason);
|
|
64
|
-
console.log(`Archived ${id}`);
|
|
65
|
-
}
|
|
66
|
-
catch (err) {
|
|
67
|
-
printError(`Could not archive ${id}: ${err instanceof Error ? err.message : String(err)}`);
|
|
68
|
-
process.exit(1);
|
|
69
|
-
}
|
|
54
|
+
const ctx = cliApiContext(hippoRoot, tenantId);
|
|
55
|
+
// Raw memories (connector ingestion) are append-only: a BEFORE-DELETE trigger aborts any delete,
|
|
56
|
+
// so archiveRaw is the sanctioned removal path and records ctx.actor as the archiver.
|
|
57
|
+
if (flagIsTrue(flags, 'archive')) {
|
|
58
|
+
archiveForgottenRaw(ctx, id, stringFlag(flags, 'reason') ?? null);
|
|
70
59
|
return;
|
|
71
60
|
}
|
|
72
61
|
try {
|
|
@@ -74,47 +63,63 @@ function cmdForget(hippoRoot, id, flags) {
|
|
|
74
63
|
console.log(`Forgot ${id}`);
|
|
75
64
|
}
|
|
76
65
|
catch (err) {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
}
|
|
92
|
-
|
|
66
|
+
reportForgetFailure(ctx, id, err);
|
|
67
|
+
throw new CliExit(1);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function archiveForgottenRaw(ctx, id, reason) {
|
|
71
|
+
if (!reason) {
|
|
72
|
+
printError(ARCHIVE_REASON_REQUIRED);
|
|
73
|
+
throw new CliExit(1);
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
api.archiveRaw(ctx, id, reason);
|
|
77
|
+
console.log(`Archived ${id}`);
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
printError(`Could not archive ${id}: ${errorMessage(err)}`);
|
|
81
|
+
throw new CliExit(1);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function reportForgetFailure(ctx, id, cause) {
|
|
85
|
+
if (cause instanceof RawAppendOnlyError) {
|
|
86
|
+
// The delete was refused by the append-only trigger — this is a raw
|
|
87
|
+
// memory, not a missing one. Point the user at the archive path.
|
|
88
|
+
printError(rawForgetRefusal(id));
|
|
89
|
+
}
|
|
90
|
+
else if (api.isDormant(ctx, id)) {
|
|
91
|
+
// Sleep moved it to the dormant store: it is not in active memory, so
|
|
92
|
+
// point at the command that owns it.
|
|
93
|
+
printError(`${id} is dormant, not in active memory. Delete it for good: hippo dormant forget ${id} ` +
|
|
94
|
+
`(or bring it back: hippo dormant restore ${id})`);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
printError(`Memory not found: ${id}`);
|
|
93
98
|
}
|
|
94
99
|
}
|
|
95
100
|
function rawForgetRefusal(id) {
|
|
96
101
|
return `Cannot forget ${id}: it is a raw, append-only memory. Archive it instead: hippo forget ${id} --archive --reason "<why>"`;
|
|
97
102
|
}
|
|
98
103
|
// Refuses exactly where the real run would, so "Would forget" is a promise, not a guess.
|
|
99
|
-
function previewForget(hippoRoot, id, archive) {
|
|
104
|
+
async function previewForget(hippoRoot, tenantId, id, archive) {
|
|
100
105
|
requireInit(hippoRoot);
|
|
101
|
-
const entry =
|
|
106
|
+
const entry = await getMemory(cliApiContext(hippoRoot, tenantId), id);
|
|
102
107
|
if (!entry) {
|
|
103
108
|
printError(`Memory not found: ${id}`);
|
|
104
|
-
|
|
109
|
+
throw new CliExit(1);
|
|
105
110
|
}
|
|
106
111
|
if (!archive && entry.kind === 'raw') {
|
|
107
112
|
printError(rawForgetRefusal(id));
|
|
108
|
-
|
|
113
|
+
throw new CliExit(1);
|
|
109
114
|
}
|
|
110
115
|
if (archive && entry.kind !== 'raw') {
|
|
111
116
|
printError(`Could not archive ${id}: memory ${id} is not raw (kind=${entry.kind})`);
|
|
112
|
-
|
|
117
|
+
throw new CliExit(1);
|
|
113
118
|
}
|
|
114
|
-
const snippet = entry.content.length >
|
|
119
|
+
const snippet = entry.content.length > CONTENT_PREVIEW_CHARS ? `${entry.content.slice(0, CONTENT_PREVIEW_CHARS)}...` : entry.content;
|
|
115
120
|
console.log(`Would ${archive ? 'archive' : 'forget'} ${id} (dry run, nothing changed): "${snippet}"`);
|
|
116
121
|
}
|
|
117
|
-
export function
|
|
122
|
+
export function handleConflicts({ hippoRoot, flags }) {
|
|
118
123
|
requireInit(hippoRoot);
|
|
119
124
|
const conflicts = listMemoryConflicts(hippoRoot, String(flags['status'] ?? 'open'));
|
|
120
125
|
if (flags['json']) {
|
|
@@ -133,55 +138,58 @@ export function cmdConflicts(hippoRoot, flags) {
|
|
|
133
138
|
console.log('');
|
|
134
139
|
}
|
|
135
140
|
}
|
|
136
|
-
|
|
141
|
+
/** Shown when --keep is missing, to help the user decide. */
|
|
142
|
+
async function showConflictForResolve(hippoRoot, conflictId, tenantId) {
|
|
143
|
+
const conflicts = listMemoryConflicts(hippoRoot, 'open', tenantId);
|
|
144
|
+
const conflict = conflicts.find((c) => c.id === conflictId);
|
|
145
|
+
if (!conflict) {
|
|
146
|
+
printError(`Conflict ${conflictId} not found or already resolved.`);
|
|
147
|
+
throw new CliExit(1);
|
|
148
|
+
}
|
|
149
|
+
console.log(`Conflict ${conflictId}:`);
|
|
150
|
+
console.log(` ${conflict.memory_a_id} <-> ${conflict.memory_b_id}`);
|
|
151
|
+
console.log(` Reason: ${conflict.reason}`);
|
|
152
|
+
console.log('');
|
|
153
|
+
const ctx = cliApiContext(hippoRoot, tenantId);
|
|
154
|
+
const entryA = await getMemory(ctx, conflict.memory_a_id);
|
|
155
|
+
const entryB = await getMemory(ctx, conflict.memory_b_id);
|
|
156
|
+
if (entryA) {
|
|
157
|
+
console.log(` [A] ${conflict.memory_a_id}:`);
|
|
158
|
+
console.log(` ${entryA.content.slice(0, CONFLICT_PREVIEW_CHARS)}${entryA.content.length > CONFLICT_PREVIEW_CHARS ? '...' : ''}`);
|
|
159
|
+
}
|
|
160
|
+
if (entryB) {
|
|
161
|
+
console.log(` [B] ${conflict.memory_b_id}:`);
|
|
162
|
+
console.log(` ${entryB.content.slice(0, CONFLICT_PREVIEW_CHARS)}${entryB.content.length > CONFLICT_PREVIEW_CHARS ? '...' : ''}`);
|
|
163
|
+
}
|
|
164
|
+
console.log('');
|
|
165
|
+
console.log(`Resolve with: hippo resolve ${conflictId} --keep <memory_id> [--forget] [--reject-loser [--reason "<why>"]]`);
|
|
166
|
+
}
|
|
167
|
+
export async function handleResolve({ hippoRoot, tenantId, args, flags }) {
|
|
137
168
|
requireInit(hippoRoot);
|
|
138
169
|
const rawId = args[0] ?? '';
|
|
139
170
|
// Accept "42" or "conflict_42"
|
|
140
171
|
const conflictId = parseInt(rawId.replace(/^conflict_/, ''), 10);
|
|
141
172
|
if (isNaN(conflictId)) {
|
|
142
173
|
printError('Usage: hippo resolve <conflict_id> --keep <memory_id> [--forget]');
|
|
143
|
-
|
|
174
|
+
throw new CliExit(1);
|
|
144
175
|
}
|
|
145
|
-
const tenantId = resolveTenantId({});
|
|
146
176
|
const keepId = String(flags['keep'] ?? '').trim();
|
|
147
177
|
if (!keepId) {
|
|
148
|
-
|
|
149
|
-
const conflicts = listMemoryConflicts(hippoRoot, 'open', tenantId);
|
|
150
|
-
const conflict = conflicts.find((c) => c.id === conflictId);
|
|
151
|
-
if (!conflict) {
|
|
152
|
-
printError(`Conflict ${conflictId} not found or already resolved.`);
|
|
153
|
-
process.exit(1);
|
|
154
|
-
}
|
|
155
|
-
console.log(`Conflict ${conflictId}:`);
|
|
156
|
-
console.log(` ${conflict.memory_a_id} <-> ${conflict.memory_b_id}`);
|
|
157
|
-
console.log(` Reason: ${conflict.reason}`);
|
|
158
|
-
console.log('');
|
|
159
|
-
const entryA = readEntry(hippoRoot, conflict.memory_a_id, tenantId);
|
|
160
|
-
const entryB = readEntry(hippoRoot, conflict.memory_b_id, tenantId);
|
|
161
|
-
if (entryA) {
|
|
162
|
-
console.log(` [A] ${conflict.memory_a_id}:`);
|
|
163
|
-
console.log(` ${entryA.content.slice(0, 120)}${entryA.content.length > 120 ? '...' : ''}`);
|
|
164
|
-
}
|
|
165
|
-
if (entryB) {
|
|
166
|
-
console.log(` [B] ${conflict.memory_b_id}:`);
|
|
167
|
-
console.log(` ${entryB.content.slice(0, 120)}${entryB.content.length > 120 ? '...' : ''}`);
|
|
168
|
-
}
|
|
169
|
-
console.log('');
|
|
170
|
-
console.log(`Resolve with: hippo resolve ${conflictId} --keep <memory_id> [--forget] [--reject-loser [--reason "<why>"]]`);
|
|
178
|
+
await showConflictForResolve(hippoRoot, conflictId, tenantId);
|
|
171
179
|
return;
|
|
172
180
|
}
|
|
173
|
-
const forgetLoser =
|
|
181
|
+
const forgetLoser = boolFlag(flags, 'forget');
|
|
174
182
|
// --reject-loser tombstones the loser's digest so it cannot be re-asserted, as well as removing it.
|
|
175
183
|
// --reason is optional here, unlike `hippo reject`: resolve already has the conflict id and keepId.
|
|
176
|
-
const rejectLoser =
|
|
177
|
-
const reasonFlag =
|
|
184
|
+
const rejectLoser = boolFlag(flags, 'reject-loser');
|
|
185
|
+
const reasonFlag = stringFlag(flags, 'reason');
|
|
178
186
|
const result = resolveConflict(hippoRoot, conflictId, keepId, forgetLoser, tenantId, {
|
|
179
187
|
rejectLoserValue: rejectLoser,
|
|
180
188
|
reason: reasonFlag,
|
|
181
189
|
});
|
|
182
190
|
if (!result) {
|
|
183
191
|
printError(`Could not resolve conflict ${conflictId}. Check the ID and --keep value.`);
|
|
184
|
-
|
|
192
|
+
throw new CliExit(1);
|
|
185
193
|
}
|
|
186
194
|
const action = rejectLoser
|
|
187
195
|
? 'rejected (tombstoned) and removed'
|
|
@@ -190,31 +198,28 @@ export function cmdResolve(hippoRoot, args, flags) {
|
|
|
190
198
|
: 'weakened (half-life halved)';
|
|
191
199
|
console.log(`Resolved conflict ${conflictId}: kept ${keepId}, ${action} ${result.loserId}`);
|
|
192
200
|
}
|
|
193
|
-
// ---------------------------------------------------------------------------
|
|
194
201
|
// reject / rejections / unreject
|
|
195
|
-
|
|
196
|
-
export function cmdReject(hippoRoot, args, flags) {
|
|
202
|
+
export function handleReject({ hippoRoot, tenantId, args, flags }) {
|
|
197
203
|
// Store resolution mirrors `hippo remember`: --global writes to the
|
|
198
204
|
// global store, otherwise the local store (requireInit'd via resolveAuthRoot).
|
|
199
205
|
const root = resolveAuthRoot(hippoRoot, flags);
|
|
200
|
-
const tenantId = resolveTenantId({});
|
|
201
206
|
// --reason is REQUIRED: the tombstone stores no content, so reason is its only human-readable identity.
|
|
202
|
-
const reason =
|
|
207
|
+
const reason = (stringFlag(flags, 'reason') ?? '').trim();
|
|
203
208
|
if (!reason) {
|
|
204
209
|
printError('hippo reject requires --reason "<why>" (the tombstone stores no content; reason is its only identity).');
|
|
205
|
-
|
|
210
|
+
throw new CliExit(1);
|
|
206
211
|
}
|
|
207
|
-
const valueFlag =
|
|
212
|
+
const valueFlag = stringFlag(flags, 'value');
|
|
208
213
|
const memoryId = args[0];
|
|
209
214
|
if (!memoryId && valueFlag === undefined) {
|
|
210
215
|
printError('Usage: hippo reject <memory-id> --reason "<why>"');
|
|
211
216
|
printError(' or: hippo reject --value "<text>" --reason "<why>"');
|
|
212
|
-
|
|
217
|
+
throw new CliExit(1);
|
|
213
218
|
}
|
|
214
219
|
if (memoryId && valueFlag !== undefined) {
|
|
215
220
|
// Ambiguous ask: silently preferring one form would ignore the other without feedback.
|
|
216
221
|
printError('hippo reject takes EITHER a memory id OR --value, not both.');
|
|
217
|
-
|
|
222
|
+
throw new CliExit(1);
|
|
218
223
|
}
|
|
219
224
|
try {
|
|
220
225
|
const result = rejectValue({
|
|
@@ -225,31 +230,33 @@ export function cmdReject(hippoRoot, args, flags) {
|
|
|
225
230
|
memoryId: valueFlag === undefined ? memoryId : undefined,
|
|
226
231
|
value: valueFlag,
|
|
227
232
|
});
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
233
|
+
printRejected(result, reason);
|
|
234
|
+
}
|
|
235
|
+
catch (err) {
|
|
236
|
+
printError(`Could not reject: ${errorMessage(err)}`);
|
|
237
|
+
throw new CliExit(1);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
function printRejected(result, reason) {
|
|
241
|
+
const digestPrefix = result.digest.slice(0, DIGEST_DISPLAY_CHARS);
|
|
242
|
+
const preview = result.content.length > CONTENT_PREVIEW_CHARS ? `${result.content.slice(0, CONTENT_PREVIEW_CHARS)}...` : result.content;
|
|
243
|
+
console.log(`Rejected [${digestPrefix}...]: "${preview}"`);
|
|
244
|
+
console.log(` Reason: ${reason}`);
|
|
245
|
+
if (result.removedIds.length > 0) {
|
|
246
|
+
console.log(` Removed ${result.removedIds.length} matching row(s): ${result.removedIds.join(', ')}`);
|
|
247
|
+
if (result.successorIds.length > 0) {
|
|
248
|
+
console.log(` Merged rows that held it keep their other texts in: ${result.successorIds.join(', ')}`);
|
|
240
249
|
}
|
|
241
|
-
|
|
242
|
-
console.log(
|
|
250
|
+
if (result.dormantSuccessorIds.length > 0) {
|
|
251
|
+
console.log(` Dormant merged rows that held it keep their other texts in: ${result.dormantSuccessorIds.join(', ')}`);
|
|
243
252
|
}
|
|
244
253
|
}
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
process.exit(1);
|
|
254
|
+
else {
|
|
255
|
+
console.log(' No live rows matched (pre-emptive tombstone).');
|
|
248
256
|
}
|
|
249
257
|
}
|
|
250
|
-
export function
|
|
258
|
+
export function handleRejections({ hippoRoot, tenantId, flags }) {
|
|
251
259
|
const root = resolveAuthRoot(hippoRoot, flags);
|
|
252
|
-
const tenantId = resolveTenantId({});
|
|
253
260
|
const rows = listRejectionsForTenant(root, tenantId);
|
|
254
261
|
if (flags['json']) {
|
|
255
262
|
console.log(JSON.stringify({ rejections: rows }, null, 2));
|
|
@@ -261,7 +268,7 @@ export function cmdRejections(hippoRoot, flags) {
|
|
|
261
268
|
}
|
|
262
269
|
console.log(`${rows.length} rejected value(s):\n`);
|
|
263
270
|
for (const row of rows) {
|
|
264
|
-
console.log(`--- ${row.digest.slice(0,
|
|
271
|
+
console.log(`--- ${row.digest.slice(0, DIGEST_DISPLAY_CHARS)}...`);
|
|
265
272
|
console.log(` Reason: ${row.reason ?? 'none given'}`);
|
|
266
273
|
console.log(` Rejected by: ${row.rejectedBy ?? 'unknown'}`);
|
|
267
274
|
console.log(` Rejected at: ${row.rejectedAt}`);
|
|
@@ -272,67 +279,35 @@ export function cmdRejections(hippoRoot, flags) {
|
|
|
272
279
|
console.log('');
|
|
273
280
|
}
|
|
274
281
|
}
|
|
275
|
-
export function
|
|
282
|
+
export function handleUnreject({ hippoRoot, tenantId, args, flags }) {
|
|
276
283
|
const root = resolveAuthRoot(hippoRoot, flags);
|
|
277
|
-
const tenantId = resolveTenantId({});
|
|
278
284
|
const digestOrPrefix = (args[0] ?? '').trim();
|
|
279
285
|
if (!digestOrPrefix) {
|
|
280
286
|
printError('Usage: hippo unreject <digest-or-prefix>');
|
|
281
|
-
|
|
287
|
+
throw new CliExit(1);
|
|
282
288
|
}
|
|
283
289
|
const outcome = unrejectValue(root, tenantId, digestOrPrefix, 'cli');
|
|
284
290
|
if (outcome.status === 'not_found') {
|
|
285
291
|
printError(`No rejected value matches "${digestOrPrefix}". Run \`hippo rejections\` to list tombstones.`);
|
|
286
|
-
|
|
292
|
+
throw new CliExit(1);
|
|
287
293
|
}
|
|
288
294
|
if (outcome.status === 'ambiguous') {
|
|
289
295
|
printError(`"${digestOrPrefix}" matches ${outcome.candidates.length} tombstones. Use a longer prefix:`);
|
|
290
296
|
for (const c of outcome.candidates) {
|
|
291
|
-
printError(` ${c.digest.slice(0,
|
|
297
|
+
printError(` ${c.digest.slice(0, REJECTED_DIGEST_LIST_CHARS)}... ${c.reason ?? 'none given'}`);
|
|
292
298
|
}
|
|
293
|
-
|
|
299
|
+
throw new CliExit(1);
|
|
294
300
|
}
|
|
295
|
-
console.log(`Unrejected [${outcome.digest.slice(0,
|
|
301
|
+
console.log(`Unrejected [${outcome.digest.slice(0, DIGEST_DISPLAY_CHARS)}...] (was: ${outcome.reason ?? 'none given'})`);
|
|
296
302
|
}
|
|
297
|
-
/**
|
|
298
|
-
* `
|
|
299
|
-
|
|
300
|
-
* Dormant memories are what sleep keeps instead of deleting (on by default;
|
|
301
|
-
* `"dormant": { "enabled": false }` in .hippo/config.json deletes instead).
|
|
302
|
-
*/
|
|
303
|
-
export function cmdDormant(hippoRoot, args, flags) {
|
|
303
|
+
/** `hippo dormant [list|restore <id>|forget <id>]`: dormant memories are what sleep keeps instead of deleting
|
|
304
|
+
* (on by default; `"dormant": { "enabled": false }` in .hippo/config.json deletes instead). */
|
|
305
|
+
export function handleDormant({ hippoRoot, tenantId, args, flags }) {
|
|
304
306
|
const root = resolveAuthRoot(hippoRoot, flags);
|
|
305
|
-
const ctx =
|
|
306
|
-
hippoRoot: root,
|
|
307
|
-
tenantId: resolveTenantId({}),
|
|
308
|
-
actor: api.adminActor('cli'),
|
|
309
|
-
};
|
|
307
|
+
const ctx = cliApiContext(root, tenantId);
|
|
310
308
|
const sub = args[0];
|
|
311
309
|
if (sub === 'restore' || sub === 'forget') {
|
|
312
|
-
|
|
313
|
-
if (!id) {
|
|
314
|
-
printError(`Usage: hippo dormant ${sub} <id>`);
|
|
315
|
-
process.exit(1);
|
|
316
|
-
}
|
|
317
|
-
try {
|
|
318
|
-
if (sub === 'restore') {
|
|
319
|
-
api.restoreDormant(ctx, id);
|
|
320
|
-
console.log(`Restored ${id} to active memory.`);
|
|
321
|
-
}
|
|
322
|
-
else {
|
|
323
|
-
api.forgetDormant(ctx, id);
|
|
324
|
-
console.log(`Forgot dormant memory ${id} permanently.`);
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
catch (err) {
|
|
328
|
-
if (err instanceof RejectedValueError) {
|
|
329
|
-
printError(`Cannot restore ${id}: its value was rejected (${err.reason ?? 'no reason given'}). Run \`hippo unreject\` first to allow it.`);
|
|
330
|
-
}
|
|
331
|
-
else {
|
|
332
|
-
printError(`Could not ${sub} ${id}: ${err instanceof Error ? err.message : String(err)}`);
|
|
333
|
-
}
|
|
334
|
-
process.exit(1);
|
|
335
|
-
}
|
|
310
|
+
changeDormant(ctx, sub, (args[1] ?? '').trim());
|
|
336
311
|
return;
|
|
337
312
|
}
|
|
338
313
|
const queryArgs = sub === 'list' ? args.slice(1) : args;
|
|
@@ -345,56 +320,62 @@ export function cmdDormant(hippoRoot, args, flags) {
|
|
|
345
320
|
console.log(JSON.stringify({ dormant: rows }, null, 2));
|
|
346
321
|
return;
|
|
347
322
|
}
|
|
323
|
+
printDormantRows(rows, queryArgs.length > 0, root);
|
|
324
|
+
}
|
|
325
|
+
function changeDormant(ctx, sub, id) {
|
|
326
|
+
if (!id) {
|
|
327
|
+
printError(`Usage: hippo dormant ${sub} <id>`);
|
|
328
|
+
throw new CliExit(1);
|
|
329
|
+
}
|
|
330
|
+
try {
|
|
331
|
+
if (sub === 'restore') {
|
|
332
|
+
api.restoreDormant(ctx, id);
|
|
333
|
+
console.log(`Restored ${id} to active memory.`);
|
|
334
|
+
}
|
|
335
|
+
else {
|
|
336
|
+
api.forgetDormant(ctx, id);
|
|
337
|
+
console.log(`Forgot dormant memory ${id} permanently.`);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
catch (err) {
|
|
341
|
+
if (err instanceof RejectedValueError) {
|
|
342
|
+
printError(`Cannot restore ${id}: its value was rejected (${err.reason ?? 'no reason given'}). Run \`hippo unreject\` first to allow it.`);
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
printError(`Could not ${sub} ${id}: ${errorMessage(err)}`);
|
|
346
|
+
}
|
|
347
|
+
throw new CliExit(1);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
function printDormantRows(rows, hasQuery, root) {
|
|
348
351
|
if (rows.length === 0) {
|
|
349
|
-
console.log(
|
|
352
|
+
console.log(hasQuery ? 'No dormant memories match.' : 'No dormant memories.');
|
|
350
353
|
if (!loadConfig(root).dormant.enabled) {
|
|
351
354
|
console.log(`Sleep deletes faded memories. To keep them dormant instead, set "dormant": { "enabled": true } in ${path.join(root, 'config.json')}.`);
|
|
352
355
|
}
|
|
353
356
|
return;
|
|
354
357
|
}
|
|
355
|
-
console.log(`${rows.length} dormant memor${rows.length === 1 ? 'y' : 'ies'}${
|
|
358
|
+
console.log(`${rows.length} dormant memor${rows.length === 1 ? 'y' : 'ies'}${hasQuery ? ' matching' : ''} (newest first):\n`);
|
|
356
359
|
for (const row of rows) {
|
|
357
|
-
const preview = row.content.length >
|
|
360
|
+
const preview = row.content.length > DORMANT_PREVIEW_CHARS ? `${row.content.slice(0, DORMANT_PREVIEW_CHARS)}...` : row.content;
|
|
358
361
|
console.log(`--- ${row.id}`);
|
|
359
362
|
console.log(` ${preview}`);
|
|
360
|
-
console.log(` Dormant since ${row.dormantAt.slice(0,
|
|
363
|
+
console.log(` Dormant since ${row.dormantAt.slice(0, DATE_PREFIX_CHARS)} (${row.reason}, strength ${row.strength.toFixed(STRENGTH_DECIMALS)})${row.tags.length > 0 ? ` tags: ${row.tags.join(', ')}` : ''}`);
|
|
361
364
|
console.log('');
|
|
362
365
|
}
|
|
363
366
|
console.log('Bring one back: hippo dormant restore <id> Delete for good: hippo dormant forget <id>');
|
|
364
367
|
}
|
|
365
368
|
/** `hippo quarantine [list] [--all] [--json] [--global]`, `quarantine approve <id>`, `quarantine reject <id>` (poisoning defence). */
|
|
366
|
-
export function
|
|
369
|
+
export async function handleQuarantine({ hippoRoot, tenantId, args, flags }) {
|
|
367
370
|
const root = resolveAuthRoot(hippoRoot, flags);
|
|
368
|
-
const ctx =
|
|
369
|
-
hippoRoot: root,
|
|
370
|
-
tenantId: resolveTenantId({}),
|
|
371
|
-
actor: api.adminActor('cli'),
|
|
372
|
-
};
|
|
371
|
+
const ctx = cliApiContext(root, tenantId);
|
|
373
372
|
const sub = args[0];
|
|
374
373
|
if (sub === 'approve' || sub === 'reject') {
|
|
375
|
-
|
|
376
|
-
if (!id) {
|
|
377
|
-
printError(`Usage: hippo quarantine ${sub} <id>`);
|
|
378
|
-
process.exit(1);
|
|
379
|
-
}
|
|
380
|
-
try {
|
|
381
|
-
if (sub === 'approve') {
|
|
382
|
-
api.quarantineApprove(ctx, id);
|
|
383
|
-
console.log(`Approved ${id}: restored to its original scope.`);
|
|
384
|
-
}
|
|
385
|
-
else {
|
|
386
|
-
api.quarantineReject(ctx, id);
|
|
387
|
-
console.log(`Rejected ${id}: stays quarantined.`);
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
catch (err) {
|
|
391
|
-
printError(`Could not ${sub} ${id}: ${err instanceof Error ? err.message : String(err)}`);
|
|
392
|
-
process.exit(1);
|
|
393
|
-
}
|
|
374
|
+
await decideQuarantined(ctx, sub, (args[1] ?? '').trim());
|
|
394
375
|
return;
|
|
395
376
|
}
|
|
396
377
|
const status = flags['all'] ? 'all' : 'pending';
|
|
397
|
-
const rows = api.quarantineList(ctx, { status });
|
|
378
|
+
const rows = await api.quarantineList(ctx, { status });
|
|
398
379
|
if (flags['json']) {
|
|
399
380
|
console.log(JSON.stringify({ quarantine: rows }, null, 2));
|
|
400
381
|
return;
|
|
@@ -403,31 +384,54 @@ export function cmdQuarantine(hippoRoot, args, flags) {
|
|
|
403
384
|
console.log(status === 'all' ? 'No quarantined memories.' : 'No pending quarantined memories.');
|
|
404
385
|
return;
|
|
405
386
|
}
|
|
387
|
+
printQuarantineRows(rows);
|
|
388
|
+
}
|
|
389
|
+
async function decideQuarantined(ctx, sub, id) {
|
|
390
|
+
if (!id) {
|
|
391
|
+
printError(`Usage: hippo quarantine ${sub} <id>`);
|
|
392
|
+
throw new CliExit(1);
|
|
393
|
+
}
|
|
394
|
+
try {
|
|
395
|
+
if (sub === 'approve') {
|
|
396
|
+
await api.quarantineApprove(ctx, id);
|
|
397
|
+
console.log(`Approved ${id}: restored to its original scope.`);
|
|
398
|
+
}
|
|
399
|
+
else {
|
|
400
|
+
await api.quarantineReject(ctx, id);
|
|
401
|
+
console.log(`Rejected ${id}: stays quarantined.`);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
catch (err) {
|
|
405
|
+
printError(`Could not ${sub} ${id}: ${errorMessage(err)}`);
|
|
406
|
+
throw new CliExit(1);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
function printQuarantineRows(rows) {
|
|
406
410
|
console.log(`${rows.length} quarantined memor${rows.length === 1 ? 'y' : 'ies'} (newest first):\n`);
|
|
407
411
|
for (const row of rows) {
|
|
408
412
|
console.log(`--- ${row.id} [${row.status}]`);
|
|
409
413
|
console.log(` ${row.contentPreview}`);
|
|
410
|
-
console.log(` ${row.reason}, original scope ${row.originalScope ?? '(none)'}, quarantined ${row.quarantinedAt.slice(0,
|
|
414
|
+
console.log(` ${row.reason}, original scope ${row.originalScope ?? '(none)'}, quarantined ${row.quarantinedAt.slice(0, DATE_PREFIX_CHARS)}`);
|
|
411
415
|
console.log('');
|
|
412
416
|
}
|
|
413
417
|
console.log('Approve: hippo quarantine approve <id> Reject: hippo quarantine reject <id>');
|
|
414
418
|
}
|
|
415
|
-
export async function handleForget({ hippoRoot, args, flags }) {
|
|
419
|
+
export async function handleForget({ hippoRoot, tenantId, args, flags }) {
|
|
416
420
|
const id = args[0];
|
|
417
421
|
if (!id) {
|
|
418
422
|
printError('Please provide a memory ID.');
|
|
419
|
-
|
|
423
|
+
throw new CliExit(1);
|
|
420
424
|
}
|
|
421
425
|
// Archive has its own HTTP route (POST /v1/memories/:id/archive); route
|
|
422
426
|
// both branches the same way the direct path does.
|
|
423
|
-
const archive = flags
|
|
424
|
-
const reason =
|
|
427
|
+
const archive = flagIsTrue(flags, 'archive');
|
|
428
|
+
const reason = stringFlag(flags, 'reason') ?? null;
|
|
425
429
|
if (archive && !reason) {
|
|
426
430
|
printError(ARCHIVE_REASON_REQUIRED);
|
|
427
|
-
|
|
431
|
+
throw new CliExit(1);
|
|
428
432
|
}
|
|
429
|
-
if (flags
|
|
430
|
-
previewForget(hippoRoot, id, archive);
|
|
433
|
+
if (flagIsTrue(flags, 'dry-run')) {
|
|
434
|
+
await previewForget(hippoRoot, tenantId, id, archive);
|
|
431
435
|
return;
|
|
432
436
|
}
|
|
433
437
|
const routed = await runViaServerIfAvailable(hippoRoot, async (info, apiKey) => {
|
|
@@ -444,28 +448,28 @@ export async function handleForget({ hippoRoot, args, flags }) {
|
|
|
444
448
|
catch (err) {
|
|
445
449
|
// A server that died after the health probe is the caller's transport
|
|
446
450
|
// fallback to handle, not an error to report to the user.
|
|
447
|
-
if (client.classifyTransportFailure(err) !== 'none')
|
|
451
|
+
if (err instanceof Error && client.classifyTransportFailure(err) !== 'none')
|
|
448
452
|
throw err;
|
|
449
|
-
const msg =
|
|
453
|
+
const msg = errorMessage(err);
|
|
450
454
|
printError(archive ? `Could not archive ${id}: ${msg}` : msg);
|
|
451
|
-
|
|
455
|
+
throw new CliExit(1);
|
|
452
456
|
}
|
|
453
457
|
});
|
|
454
458
|
if (routed)
|
|
455
459
|
return;
|
|
456
|
-
cmdForget(hippoRoot, id, flags);
|
|
460
|
+
cmdForget(hippoRoot, tenantId, id, flags);
|
|
457
461
|
}
|
|
458
462
|
function invalidateChurn(hippoRoot, args, flags) {
|
|
459
463
|
if (args[0] || flags['id'] !== undefined) {
|
|
460
464
|
printError('Usage: hippo invalidate --churn [--dry-run]');
|
|
461
465
|
printError('--churn takes no pattern or --id.');
|
|
462
|
-
|
|
466
|
+
throw new CliExit(1);
|
|
463
467
|
}
|
|
464
468
|
if (!isGitRepo(process.cwd())) {
|
|
465
469
|
printError('hippo invalidate --churn must run inside a git repository.');
|
|
466
|
-
|
|
470
|
+
throw new CliExit(1);
|
|
467
471
|
}
|
|
468
|
-
const churnDryRun = flags
|
|
472
|
+
const churnDryRun = flagIsTrue(flags, 'dry-run');
|
|
469
473
|
let churnFailed = false;
|
|
470
474
|
for (const { root, result } of runChurnStaleForRepo(hippoRoot, churnDryRun)) {
|
|
471
475
|
if (result.error) {
|
|
@@ -488,34 +492,34 @@ function invalidateChurn(hippoRoot, args, flags) {
|
|
|
488
492
|
}
|
|
489
493
|
}
|
|
490
494
|
if (churnFailed)
|
|
491
|
-
|
|
495
|
+
throw new CliExit(1);
|
|
492
496
|
}
|
|
493
|
-
export function handleInvalidate({ hippoRoot, args, flags }) {
|
|
497
|
+
export function handleInvalidate({ hippoRoot, tenantId, args, flags }) {
|
|
494
498
|
requireInit(hippoRoot);
|
|
495
|
-
if (flags
|
|
499
|
+
if (flagIsTrue(flags, 'churn'))
|
|
496
500
|
return invalidateChurn(hippoRoot, args, flags);
|
|
497
501
|
const target = args[0];
|
|
498
|
-
if (flags
|
|
502
|
+
if (flagIsTrue(flags, 'id')) {
|
|
499
503
|
// Value-less --id must never silently fall through to pattern mode
|
|
500
504
|
// (pattern mode writes broadly; an ignored --id reverses user intent).
|
|
501
505
|
printError('--id requires a memory id');
|
|
502
|
-
|
|
506
|
+
throw new CliExit(1);
|
|
503
507
|
}
|
|
504
|
-
const onlyId =
|
|
505
|
-
const dryRun = flags
|
|
508
|
+
const onlyId = stringFlag(flags, 'id');
|
|
509
|
+
const dryRun = flagIsTrue(flags, 'dry-run');
|
|
506
510
|
if ((target && onlyId) || (!target && !onlyId)) {
|
|
507
511
|
printError('Usage: hippo invalidate "<old pattern>" [--dry-run] [--reason "<why>"]');
|
|
508
512
|
printError(' hippo invalidate --id <memory-id> [--dry-run] [--reason "<why>"]');
|
|
509
513
|
printError('Pass a pattern OR --id, not both. Tag matching is EXACT: the full pattern must equal a tag.');
|
|
510
|
-
|
|
514
|
+
throw new CliExit(1);
|
|
511
515
|
}
|
|
512
|
-
const reason = flags
|
|
516
|
+
const reason = nonEmptyStringFlag(flags, 'reason') ?? null;
|
|
513
517
|
const invTarget = {
|
|
514
518
|
from: target ?? `id:${onlyId}`,
|
|
515
519
|
to: reason,
|
|
516
520
|
type: 'migration',
|
|
517
521
|
};
|
|
518
|
-
const result = invalidateMatching(hippoRoot, invTarget,
|
|
522
|
+
const result = invalidateMatching(hippoRoot, invTarget, tenantId, { dryRun, onlyId });
|
|
519
523
|
const label = target ? `"${target}"` : `--id ${onlyId}`;
|
|
520
524
|
if (result.dryRun) {
|
|
521
525
|
if (result.invalidated === 0) {
|