hippo-memory 1.70.0 → 1.72.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 +2 -2
- package/dist/agent-memories/apply.d.ts +0 -11
- package/dist/agent-memories/apply.js +6 -21
- package/dist/agent-memories/claude-code.d.ts +4 -2
- package/dist/agent-memories/claude-code.js +15 -6
- package/dist/agent-memories/codex.js +1 -1
- package/dist/agent-memories/copilot.d.ts +1 -3
- package/dist/agent-memories/copilot.js +1 -17
- package/dist/agent-memories/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/project-folds.d.ts +10 -0
- package/dist/agent-memories/project-folds.js +34 -0
- package/dist/agent-memories/report.js +2 -1
- package/dist/agent-memories/sync.d.ts +4 -2
- package/dist/agent-memories/sync.js +18 -11
- package/dist/api/assemble.d.ts +7 -44
- package/dist/api/assemble.js +3 -23
- package/dist/api/audit.d.ts +33 -1
- package/dist/api/audit.js +48 -1
- package/dist/api/auth.d.ts +20 -26
- package/dist/api/auth.js +43 -29
- package/dist/api/auto-sleep.d.ts +5 -2
- package/dist/api/auto-sleep.js +9 -5
- package/dist/api/availability.d.ts +2 -15
- package/dist/api/availability.js +4 -18
- package/dist/api/cards.d.ts +42 -0
- package/dist/api/cards.js +52 -0
- package/dist/api/conflicts.d.ts +28 -0
- package/dist/api/conflicts.js +61 -0
- package/dist/api/context-render.js +4 -3
- package/dist/api/context-select.js +12 -15
- package/dist/api/context-types.d.ts +10 -35
- package/dist/api/context.d.ts +5 -22
- package/dist/api/context.js +38 -46
- package/dist/api/continuity.d.ts +47 -0
- package/dist/api/continuity.js +66 -0
- package/dist/{cli → api}/correction-latency.d.ts +2 -14
- package/dist/{cli → api}/correction-latency.js +2 -14
- package/dist/api/dormant.d.ts +5 -21
- package/dist/api/dormant.js +11 -28
- package/dist/api/drill-down.d.ts +7 -46
- package/dist/api/drill-down.js +6 -27
- package/dist/api/embeddings.d.ts +17 -0
- package/dist/api/embeddings.js +28 -0
- package/dist/api/error-reply.d.ts +8 -0
- package/dist/api/error-reply.js +21 -0
- package/dist/api/forget.d.ts +11 -26
- package/dist/api/forget.js +23 -35
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +5 -9
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +6 -2
- package/dist/api/index.js +6 -2
- package/dist/api/instruction-detect.js +21 -6
- package/dist/api/learn.d.ts +4 -0
- package/dist/api/learn.js +53 -27
- package/dist/api/ledger-db.d.ts +2 -5
- package/dist/api/ledger-db.js +5 -35
- package/dist/api/memories.d.ts +23 -0
- package/dist/api/memories.js +46 -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/outcome.js +1 -1
- package/dist/api/pilot-arm.d.ts +1 -11
- package/dist/api/pilot-arm.js +5 -45
- package/dist/api/predictions.d.ts +11 -0
- package/dist/api/predictions.js +24 -0
- package/dist/api/projects.d.ts +21 -0
- package/dist/api/projects.js +24 -0
- package/dist/api/promote.d.ts +13 -17
- package/dist/api/promote.js +12 -20
- package/dist/api/prompt-hook.d.ts +19 -6
- package/dist/api/prompt-hook.js +54 -13
- package/dist/api/provenance-coverage.d.ts +14 -0
- package/dist/{cli → api}/provenance-coverage.js +2 -6
- package/dist/api/recall-cli.d.ts +58 -0
- package/dist/api/recall-cli.js +103 -0
- package/dist/api/recall-core.js +17 -9
- 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 +21 -15
- package/dist/api/recall-request.js +1 -1
- package/dist/api/recall-types.d.ts +64 -304
- package/dist/api/recall.d.ts +3 -34
- package/dist/api/recall.js +63 -89
- 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 +20 -2
- package/dist/api/remember.js +16 -3
- package/dist/api/session-end.d.ts +22 -0
- package/dist/api/session-end.js +101 -0
- package/dist/api/sleep-run.d.ts +2 -4
- package/dist/api/sleep-run.js +28 -28
- package/dist/api/sleep.d.ts +9 -28
- package/dist/api/status.d.ts +24 -0
- package/dist/api/status.js +40 -0
- package/dist/api/store-init.d.ts +4 -0
- package/dist/api/store-init.js +9 -0
- package/dist/api/tokens.d.ts +3 -10
- package/dist/api/tokens.js +4 -11
- package/dist/api/types.d.ts +8 -29
- package/dist/api/types.js +10 -23
- package/dist/capture/caller-session.d.ts +0 -3
- package/dist/capture/caller-session.js +1 -12
- package/dist/capture/capture-error.d.ts +2 -2
- package/dist/capture/capture-error.js +23 -18
- package/dist/capture/codex-patch.js +3 -1
- package/dist/capture/command.d.ts +4 -12
- package/dist/capture/command.js +39 -114
- package/dist/capture/compact.d.ts +4 -15
- package/dist/capture/compact.js +26 -30
- package/dist/capture/compaction-items-caller.js +11 -20
- package/dist/capture/compaction-record.d.ts +7 -93
- package/dist/capture/compaction-record.js +34 -399
- package/dist/capture/compaction-spool.d.ts +5 -3
- package/dist/capture/compaction-spool.js +21 -7
- package/dist/capture/copilot-transcript.d.ts +2 -1
- package/dist/capture/copilot-transcript.js +2 -1
- package/dist/capture/extract.d.ts +5 -2
- package/dist/capture/extract.js +4 -3
- package/dist/capture/failure-caller.d.ts +1 -1
- package/dist/capture/failure-caller.js +21 -16
- package/dist/capture/failure-reading.d.ts +2 -1
- package/dist/capture/failure-reading.js +7 -9
- package/dist/capture/pre-compact-caller.js +5 -4
- package/dist/capture/session-digest.d.ts +1 -1
- package/dist/capture/session-digest.js +17 -10
- package/dist/capture/session-end-caller.js +2 -1
- package/dist/capture/session-worker.js +3 -4
- package/dist/capture/transcript.d.ts +4 -11
- package/dist/capture/transcript.js +10 -21
- package/dist/capture/working-state.d.ts +4 -2
- package/dist/capture/working-state.js +4 -2
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +1 -59
- package/dist/cli/audit-prune.js +2 -61
- package/dist/cli/audit.d.ts +1 -1
- package/dist/cli/audit.js +42 -43
- package/dist/cli/auth.d.ts +2 -2
- package/dist/cli/auth.js +61 -44
- package/dist/cli/briefs.d.ts +1 -4
- package/dist/cli/briefs.js +42 -301
- package/dist/cli/card.d.ts +2 -2
- package/dist/cli/card.js +63 -56
- package/dist/cli/client.d.ts +12 -27
- package/dist/cli/client.js +41 -44
- package/dist/cli/compact-resume-payload.js +4 -3
- package/dist/cli/context.d.ts +2 -3
- package/dist/cli/context.js +22 -18
- package/dist/cli/continuity.d.ts +6 -6
- package/dist/cli/continuity.js +81 -86
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +88 -116
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +55 -34
- package/dist/cli/decisions.d.ts +2 -4
- package/dist/cli/decisions.js +18 -309
- package/dist/cli/eval.d.ts +1 -1
- package/dist/cli/eval.js +27 -26
- package/dist/cli/exit.d.ts +6 -0
- package/dist/cli/exit.js +11 -0
- package/dist/cli/explain.d.ts +2 -3
- package/dist/cli/explain.js +25 -27
- package/dist/cli/flag-values.d.ts +6 -1
- package/dist/cli/flag-values.js +42 -15
- package/dist/cli/flags.d.ts +0 -288
- package/dist/cli/flags.js +3 -138
- 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/graph.d.ts +3 -0
- package/dist/cli/graph.js +83 -0
- package/dist/cli/hook-runtime.d.ts +12 -32
- package/dist/cli/hook-runtime.js +21 -64
- package/dist/cli/incidents.d.ts +3 -0
- package/dist/cli/incidents.js +112 -0
- package/dist/cli/init.d.ts +2 -2
- package/dist/cli/init.js +33 -30
- package/dist/cli/install-steps.d.ts +2 -1
- package/dist/cli/install-steps.js +13 -14
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +4 -1
- package/dist/cli/lenient-id.d.ts +2 -0
- package/dist/cli/lenient-id.js +13 -0
- package/dist/cli/maintenance.d.ts +5 -5
- package/dist/cli/maintenance.js +37 -43
- package/dist/cli/notes.d.ts +2 -0
- package/dist/cli/notes.js +41 -0
- package/dist/cli/object-verbs.js +4 -3
- package/dist/cli/open-browser.d.ts +14 -0
- package/dist/cli/open-browser.js +26 -0
- package/dist/cli/owner-validation.d.ts +5 -28
- package/dist/cli/owner-validation.js +5 -28
- package/dist/cli/playbooks.d.ts +3 -4
- package/dist/cli/playbooks.js +131 -300
- package/dist/cli/predictions.d.ts +3 -0
- package/dist/cli/predictions.js +175 -0
- package/dist/cli/print.d.ts +2 -5
- package/dist/cli/print.js +3 -5
- package/dist/cli/projects.d.ts +2 -2
- package/dist/cli/projects.js +31 -25
- package/dist/cli/quality-repair-once.d.ts +1 -1
- package/dist/cli/quality-repair-once.js +7 -6
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +67 -137
- package/dist/cli/refine-llm.d.ts +5 -31
- package/dist/cli/refine-llm.js +23 -50
- package/dist/cli/remember.d.ts +3 -3
- package/dist/cli/remember.js +134 -192
- package/dist/cli/scheduler.d.ts +2 -17
- package/dist/cli/scheduler.js +14 -19
- package/dist/cli/serve.js +23 -14
- package/dist/cli/session-hooks.d.ts +11 -19
- package/dist/cli/session-hooks.js +143 -214
- package/dist/cli/setup.d.ts +4 -4
- package/dist/cli/setup.js +35 -30
- package/dist/cli/shared.d.ts +7 -25
- package/dist/cli/shared.js +17 -60
- package/dist/cli/slack.d.ts +2 -2
- package/dist/cli/slack.js +19 -23
- package/dist/cli/sleep-render.js +6 -3
- package/dist/cli/sleep.d.ts +3 -2
- package/dist/cli/sleep.js +17 -49
- package/dist/cli/status.d.ts +11 -14
- package/dist/cli/status.js +74 -120
- 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 +87 -108
- package/dist/cli/usage.d.ts +0 -79
- package/dist/cli/usage.js +1 -689
- package/dist/cli/verb-row.d.ts +32 -0
- package/dist/cli/verb-row.js +6 -0
- package/dist/cli/verbs/health.d.ts +27 -0
- package/dist/cli/verbs/health.js +232 -0
- package/dist/cli/verbs/memory.d.ts +16 -0
- package/dist/cli/verbs/memory.js +244 -0
- package/dist/cli/verbs/objects.d.ts +20 -0
- package/dist/cli/verbs/objects.js +254 -0
- package/dist/cli/verbs/sessions.d.ts +31 -0
- package/dist/cli/verbs/sessions.js +312 -0
- package/dist/cli/verbs.d.ts +81 -0
- package/dist/cli/verbs.js +7 -0
- package/dist/cli/versioned-verbs.d.ts +51 -0
- package/dist/cli/versioned-verbs.js +79 -0
- package/dist/cli.d.ts +1 -654
- package/dist/cli.js +44 -510
- package/dist/connectors/dlq.d.ts +39 -3
- package/dist/connectors/dlq.js +37 -3
- package/dist/connectors/github/backfill.d.ts +5 -25
- package/dist/connectors/github/backfill.js +26 -52
- 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 +34 -93
- package/dist/connectors/github/ingest.d.ts +4 -12
- package/dist/connectors/github/ingest.js +5 -36
- 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 +3 -16
- package/dist/connectors/github/webhook.js +38 -23
- package/dist/connectors/ingest.d.ts +10 -0
- package/dist/connectors/ingest.js +28 -0
- 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 +51 -90
- package/dist/connectors/slack/ingest.d.ts +4 -9
- package/dist/connectors/slack/ingest.js +4 -30
- 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 +3 -19
- package/dist/connectors/slack/webhook.js +6 -26
- package/dist/connectors/slack/workspaces.d.ts +4 -24
- package/dist/connectors/slack/workspaces.js +4 -24
- package/dist/consolidate/conflicts.js +7 -15
- 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 +29 -84
- package/dist/consolidate/decay.js +7 -19
- package/dist/consolidate/dedupe.d.ts +13 -52
- package/dist/consolidate/dedupe.js +18 -74
- 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 +49 -40
- 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 +18 -105
- package/dist/consolidate/merge.js +12 -33
- package/dist/consolidate/physics-pass.d.ts +6 -1
- package/dist/consolidate/physics-pass.js +27 -9
- package/dist/consolidate/replay.d.ts +6 -38
- package/dist/consolidate/replay.js +25 -56
- package/dist/consolidate/run.js +1 -1
- package/dist/consolidate/sleep.d.ts +1 -8
- package/dist/consolidate/sleep.js +13 -22
- package/dist/consolidate/trace.d.ts +3 -18
- package/dist/consolidate/trace.js +3 -18
- package/dist/consolidate/traces.js +9 -25
- package/dist/core/ablation.d.ts +14 -91
- package/dist/core/ablation.js +16 -91
- package/dist/core/active-scope.d.ts +7 -0
- package/dist/{sharing/scope.js → core/active-scope.js} +5 -12
- package/dist/core/ambient.d.ts +5 -8
- package/dist/core/ambient.js +40 -26
- package/dist/core/api-errors.d.ts +16 -0
- package/dist/core/api-errors.js +20 -0
- 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 +11 -1
- package/dist/core/compaction-timing.d.ts +7 -0
- package/dist/core/compaction-timing.js +9 -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 +20 -16
- package/dist/core/cosine.d.ts +3 -0
- package/dist/core/cosine.js +19 -0
- package/dist/core/handoff.d.ts +1 -7
- package/dist/core/handoff.js +1 -7
- package/dist/core/markdown.d.ts +6 -0
- package/dist/{store → core}/markdown.js +23 -22
- package/dist/core/memory-audit.d.ts +17 -0
- package/dist/core/memory-audit.js +54 -0
- package/dist/core/memory-quality.js +1 -1
- package/dist/core/memory.d.ts +51 -168
- package/dist/core/memory.js +76 -239
- package/dist/{consolidate → core}/merged-row.d.ts +1 -1
- package/dist/{consolidate → core}/merged-row.js +3 -2
- 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 +65 -138
- package/dist/core/prediction.d.ts +3 -0
- package/dist/core/prediction.js +6 -0
- package/dist/core/project-identity.d.ts +20 -58
- package/dist/core/project-identity.js +27 -39
- 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/recall-scope.d.ts +69 -0
- package/dist/core/recall-scope.js +138 -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 +3 -8
- package/dist/db/busy.js +37 -33
- package/dist/db/connect.js +7 -8
- package/dist/db/index.d.ts +3 -3
- package/dist/db/index.js +3 -3
- package/dist/db/migrate.js +3 -3
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- 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/migrations/v55.d.ts +3 -0
- package/dist/db/migrations/v55.js +17 -0
- package/dist/db/open.d.ts +2 -2
- package/dist/db/open.js +21 -9
- package/dist/db/physics-state.d.ts +6 -22
- package/dist/db/physics-state.js +28 -39
- package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
- package/dist/db/raw-archive-mirror-cleanup.js +2 -17
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -2
- package/dist/db/vector-store.d.ts +2 -0
- package/dist/db/vector-store.js +25 -5
- package/dist/db/wal-checkpointer.js +2 -1
- package/dist/doctor.js +85 -27
- package/dist/embeddings/local.d.ts +62 -0
- package/dist/embeddings/local.js +146 -0
- package/dist/embeddings/provider.d.ts +43 -0
- package/dist/{store/embeddings → embeddings}/provider.js +58 -83
- package/dist/embeddings/transformers.d.ts +26 -0
- package/dist/embeddings/transformers.js +89 -0
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +3 -2
- 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 +91 -45
- package/dist/eval/eval.d.ts +6 -24
- package/dist/eval/eval.js +8 -35
- package/dist/eval/judgment.d.ts +0 -3
- package/dist/eval/judgment.js +30 -15
- package/dist/extensions/openclaw-plugin/index.js +1 -1
- package/dist/graph/extract.d.ts +5 -27
- package/dist/graph/extract.js +10 -36
- package/dist/graph/recall.d.ts +7 -20
- package/dist/graph/recall.js +15 -77
- 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 +24 -44
- package/dist/graph/write.d.ts +1 -1
- package/dist/graph/write.js +9 -9
- package/dist/hooks/codex-session.js +3 -2
- package/dist/hooks/codex-wrapper.js +4 -3
- 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 +22 -59
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +17 -81
- package/dist/hooks/shared.d.ts +6 -21
- package/dist/hooks/shared.js +31 -33
- package/dist/importers/core.d.ts +12 -37
- package/dist/importers/core.js +10 -28
- 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 +12 -39
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +31 -85
- package/dist/index.d.ts +8 -3
- package/dist/index.js +8 -3
- package/dist/learn/autolearn.d.ts +23 -42
- package/dist/learn/autolearn.js +45 -52
- package/dist/learn/churn-git.js +13 -4
- package/dist/learn/extract.d.ts +3 -2
- package/dist/learn/extract.js +8 -8
- package/dist/learn/forward-claim-detector.d.ts +6 -30
- package/dist/learn/forward-claim-detector.js +18 -68
- package/dist/learn/invalidation.d.ts +6 -18
- package/dist/learn/invalidation.js +18 -31
- package/dist/mcp/admin-tools.d.ts +2 -2
- package/dist/mcp/admin-tools.js +30 -53
- package/dist/mcp/format.js +3 -2
- package/dist/mcp/framing.d.ts +1 -0
- package/dist/mcp/framing.js +1 -1
- package/dist/mcp/memory-tools.js +7 -10
- package/dist/mcp/protocol.d.ts +15 -29
- package/dist/mcp/protocol.js +26 -16
- package/dist/mcp/recall-tools.js +14 -11
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +12 -27
- 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 +68 -16
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +47 -22
- package/dist/objects/customer-notes.d.ts +9 -44
- package/dist/objects/customer-notes.js +7 -48
- package/dist/objects/decisions.d.ts +14 -52
- package/dist/objects/decisions.js +15 -53
- package/dist/objects/descriptor.d.ts +1 -1
- package/dist/objects/incidents.d.ts +9 -40
- package/dist/objects/incidents.js +7 -41
- package/dist/objects/lifecycle.d.ts +1 -1
- package/dist/objects/lifecycle.js +2 -1
- package/dist/objects/policies.d.ts +13 -91
- package/dist/objects/policies.js +13 -99
- package/dist/objects/processes.d.ts +9 -54
- package/dist/objects/processes.js +7 -61
- package/dist/objects/project-briefs.d.ts +13 -57
- package/dist/objects/project-briefs.js +16 -78
- package/dist/objects/skills.d.ts +9 -44
- package/dist/objects/skills.js +8 -54
- package/dist/postinstall.js +7 -20
- package/dist/predictions/planning-fallacy.d.ts +11 -34
- package/dist/rerankers/clef.js +6 -37
- package/dist/rerankers/cross-encoder.d.ts +31 -2
- package/dist/rerankers/cross-encoder.js +65 -101
- package/dist/rerankers/index.js +5 -4
- package/dist/rerankers/jev.js +11 -10
- package/dist/rerankers/llm.d.ts +2 -11
- package/dist/rerankers/llm.js +14 -14
- package/dist/rerankers/outage-warning.d.ts +5 -2
- package/dist/rerankers/outage-warning.js +7 -4
- 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/bm25-search.js +1 -1
- package/dist/search/boosts.d.ts +0 -2
- package/dist/search/boosts.js +3 -3
- package/dist/search/embed-memories.d.ts +9 -0
- package/dist/search/embed-memories.js +377 -0
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +93 -0
- package/dist/search/hybrid.d.ts +11 -2
- package/dist/search/hybrid.js +9 -4
- 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.d.ts +6 -3
- package/dist/search/physics-search.js +29 -19
- package/dist/search/rerank.js +1 -1
- package/dist/search/rrf.d.ts +7 -35
- package/dist/search/rrf.js +5 -30
- package/dist/search/vector.d.ts +13 -4
- package/dist/search/vector.js +40 -13
- package/dist/server/auth.d.ts +11 -28
- package/dist/server/auth.js +49 -32
- package/dist/server/boot.d.ts +2 -21
- package/dist/server/boot.js +69 -161
- package/dist/server/client-ip.d.ts +3 -21
- package/dist/server/client-ip.js +8 -30
- package/dist/server/deadline.d.ts +0 -2
- package/dist/server/deadline.js +1 -7
- package/dist/server/defaults.d.ts +4 -0
- package/dist/server/defaults.js +5 -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 +24 -53
- 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 +16 -19
- package/dist/server/route-checks.d.ts +7 -0
- package/dist/server/route-checks.js +42 -0
- package/dist/server/route-table.d.ts +9 -8
- package/dist/server/route-table.js +127 -139
- package/dist/server/routes/admin.d.ts +8 -8
- package/dist/server/routes/admin.js +35 -49
- package/dist/server/routes/customer-notes.d.ts +6 -6
- package/dist/server/routes/customer-notes.js +8 -14
- package/dist/server/routes/decisions.d.ts +6 -6
- package/dist/server/routes/decisions.js +12 -21
- package/dist/server/routes/incidents.d.ts +6 -6
- package/dist/server/routes/incidents.js +14 -25
- package/dist/server/routes/memories.d.ts +9 -9
- package/dist/server/routes/memories.js +20 -63
- package/dist/server/routes/object-routes.d.ts +6 -11
- package/dist/server/routes/object-routes.js +11 -22
- package/dist/server/routes/policies.d.ts +7 -7
- package/dist/server/routes/policies.js +12 -22
- package/dist/server/routes/predictions.d.ts +6 -6
- package/dist/server/routes/predictions.js +22 -38
- package/dist/server/routes/processes.d.ts +6 -6
- package/dist/server/routes/processes.js +17 -28
- package/dist/server/routes/project-briefs.d.ts +7 -7
- package/dist/server/routes/project-briefs.js +11 -20
- package/dist/server/routes/recall.d.ts +5 -5
- package/dist/server/routes/recall.js +16 -45
- package/dist/server/routes/skills.d.ts +7 -7
- package/dist/server/routes/skills.js +10 -22
- package/dist/server/server-detect.d.ts +15 -53
- package/dist/server/server-detect.js +55 -96
- package/dist/server/sleep-child.js +26 -7
- package/dist/server/sleep-offload.d.ts +11 -5
- package/dist/server/sleep-offload.js +21 -12
- package/dist/server/types.d.ts +32 -18
- package/dist/server/validation.d.ts +3 -2
- package/dist/server/validation.js +15 -33
- package/dist/server.d.ts +7 -6
- package/dist/server.js +8 -6
- 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 +73 -0
- package/dist/sharing/project-merge.d.ts +11 -19
- package/dist/sharing/project-merge.js +63 -125
- package/dist/sharing/search-both.d.ts +60 -0
- package/dist/sharing/search-both.js +138 -0
- package/dist/sharing/share.d.ts +40 -0
- package/dist/sharing/share.js +229 -0
- package/dist/store/ambient.js +9 -15
- package/dist/store/audit-event.d.ts +5 -13
- package/dist/store/audit-event.js +4 -12
- package/dist/store/audit.d.ts +2 -21
- package/dist/store/audit.js +8 -67
- package/dist/store/auth.d.ts +10 -8
- package/dist/store/auth.js +17 -12
- package/dist/store/candidates.d.ts +23 -5
- package/dist/store/candidates.js +119 -71
- package/dist/store/capture-write.d.ts +17 -0
- package/dist/store/capture-write.js +35 -0
- 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/compaction-caller.d.ts +18 -0
- package/dist/store/compaction-caller.js +29 -0
- package/dist/store/compactions-record.d.ts +115 -0
- package/dist/store/compactions-record.js +417 -0
- package/dist/store/compactions.js +6 -4
- package/dist/store/conflicts.d.ts +4 -21
- package/dist/store/conflicts.js +76 -152
- package/dist/store/connectors/dlq.d.ts +10 -0
- package/dist/store/connectors/dlq.js +32 -0
- package/dist/store/connectors/github.d.ts +14 -16
- package/dist/store/connectors/github.js +34 -57
- package/dist/store/connectors/slack.d.ts +2 -11
- package/dist/store/connectors/slack.js +18 -47
- package/dist/store/dashboard-reads.js +11 -14
- package/dist/store/delete-and-batch.d.ts +17 -31
- package/dist/store/delete-and-batch.js +84 -67
- package/dist/store/delivery-recorder.d.ts +15 -4
- package/dist/store/delivery-recorder.js +34 -17
- package/dist/store/descendant-page.js +6 -3
- package/dist/store/diagnostics.js +6 -13
- package/dist/store/dormant.d.ts +8 -30
- package/dist/store/dormant.js +18 -57
- package/dist/store/embeddings/index.d.ts +11 -90
- package/dist/store/embeddings/index.js +18 -523
- package/dist/store/entry-reads.d.ts +34 -61
- package/dist/store/entry-reads.js +111 -136
- package/dist/store/entry-row.d.ts +6 -35
- package/dist/store/entry-row.js +9 -37
- package/dist/store/entry-writes.d.ts +12 -18
- package/dist/store/entry-writes.js +46 -44
- package/dist/store/failure-log-at.d.ts +8 -0
- package/dist/store/failure-log-at.js +16 -0
- package/dist/store/failure-log.d.ts +2 -2
- package/dist/store/failure-log.js +5 -3
- package/dist/{trust → store}/gated-write.d.ts +3 -1
- package/dist/{trust → store}/gated-write.js +7 -5
- package/dist/store/goals.d.ts +3 -40
- package/dist/store/goals.js +41 -178
- 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 +24 -60
- 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 +10 -35
- package/dist/store/graph-writes.js +59 -106
- package/dist/store/half-life.d.ts +2 -1
- package/dist/store/half-life.js +14 -16
- package/dist/store/handoffs.d.ts +6 -12
- package/dist/store/handoffs.js +22 -40
- package/dist/store/index-and-stats.d.ts +6 -19
- package/dist/store/index-and-stats.js +36 -84
- package/dist/store/key-writes.js +1 -1
- package/dist/store/ledger-turn.d.ts +9 -0
- package/dist/store/ledger-turn.js +38 -0
- package/dist/store/mirrors.d.ts +2 -6
- package/dist/store/mirrors.js +24 -29
- package/dist/store/open.d.ts +0 -4
- package/dist/store/open.js +42 -62
- package/dist/store/pilot-arm.d.ts +12 -0
- package/dist/store/pilot-arm.js +42 -0
- 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 +91 -82
- package/dist/store/port.js +8 -0
- package/dist/store/predictions.d.ts +12 -53
- package/dist/store/predictions.js +41 -125
- package/dist/store/project-tags.d.ts +62 -0
- package/dist/store/project-tags.js +67 -0
- package/dist/{cli → store}/quality-repair.js +15 -31
- package/dist/store/quarantine.js +2 -1
- package/dist/store/raw-archive.d.ts +4 -16
- package/dist/store/raw-archive.js +14 -29
- package/dist/store/recall-trace.d.ts +12 -77
- package/dist/store/recall-trace.js +37 -97
- package/dist/store/rejected-values.js +9 -20
- package/dist/store/rejection-probe.d.ts +4 -0
- package/dist/store/rejection-probe.js +19 -0
- package/dist/store/rejection.d.ts +10 -73
- package/dist/store/rejection.js +12 -84
- 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 +14 -0
- package/dist/store/rule-sql.js +56 -0
- package/dist/store/search-rows.d.ts +7 -38
- package/dist/store/search-rows.js +23 -54
- package/dist/store/sessions.d.ts +10 -47
- package/dist/store/sessions.js +21 -75
- package/dist/store/set-aside.d.ts +14 -0
- package/dist/store/set-aside.js +23 -0
- package/dist/store/sqlite/busy.d.ts +3 -0
- package/dist/store/sqlite/busy.js +8 -0
- package/dist/store/sqlite/connector-events-group.js +5 -8
- package/dist/store/sqlite/connector-writes-group.js +3 -3
- package/dist/store/sqlite/entry-writes-group.js +4 -4
- package/dist/store/sqlite/error-codec.js +8 -5
- package/dist/store/sqlite/executor.d.ts +2 -1
- package/dist/store/sqlite/executor.js +12 -5
- package/dist/store/sqlite/graph-reads-group.js +1 -1
- package/dist/store/sqlite/held-connection.d.ts +9 -0
- package/dist/store/sqlite/held-connection.js +41 -0
- package/dist/store/sqlite/local.d.ts +3 -3
- package/dist/store/sqlite/local.js +1 -0
- package/dist/store/sqlite/object-rows.d.ts +1 -1
- package/dist/store/sqlite/object-rows.js +6 -3
- package/dist/store/sqlite/objects-group.d.ts +1 -1
- package/dist/store/sqlite/objects-group.js +5 -3
- package/dist/store/sqlite/quarantine-group.js +2 -2
- package/dist/store/sqlite/store.d.ts +1 -4
- package/dist/store/sqlite/store.js +16 -15
- 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 +11 -63
- package/dist/store/summaries.js +37 -148
- 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 -50
- package/dist/store/token-ledger.js +19 -85
- package/dist/store/usage-reports.js +5 -13
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +171 -0
- package/dist/store/working-memory.d.ts +6 -25
- package/dist/store/working-memory.js +18 -52
- package/dist/support-bundle.js +9 -8
- package/dist/trust/reject-flow.js +3 -5
- package/dist/util/agent-homes.d.ts +15 -0
- package/dist/util/agent-homes.js +34 -0
- package/dist/util/anthropic-messages.d.ts +3 -0
- package/dist/util/anthropic-messages.js +35 -6
- 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/chunked.d.ts +3 -0
- package/dist/util/chunked.js +10 -0
- package/dist/util/crash-handlers.d.ts +8 -1
- package/dist/util/crash-handlers.js +52 -10
- package/dist/util/ellipsize.d.ts +3 -0
- package/dist/util/ellipsize.js +5 -0
- package/dist/util/env.d.ts +14 -6
- package/dist/util/env.js +15 -7
- package/dist/util/format.d.ts +3 -0
- package/dist/util/format.js +6 -0
- package/dist/util/home-path.d.ts +2 -1
- package/dist/util/home-path.js +4 -2
- package/dist/util/hook-payload.d.ts +8 -0
- package/dist/util/hook-payload.js +37 -0
- package/dist/util/http-retry.d.ts +9 -1
- package/dist/util/http-retry.js +67 -8
- package/dist/util/http-util.d.ts +0 -8
- package/dist/util/http-util.js +10 -21
- package/dist/util/limits.d.ts +7 -0
- package/dist/util/limits.js +14 -0
- package/dist/util/log.d.ts +7 -2
- package/dist/util/log.js +34 -9
- package/dist/util/request-scope.d.ts +5 -2
- package/dist/util/request-scope.js +13 -7
- package/dist/util/secret-detect.d.ts +5 -30
- package/dist/util/secret-detect.js +19 -40
- package/dist/util/sqlite-blocked.d.ts +2 -0
- package/dist/util/sqlite-blocked.js +5 -0
- package/dist/util/stored-json.d.ts +1 -1
- package/dist/util/stored-json.js +1 -1
- package/dist/util/stream-tee.d.ts +3 -0
- package/dist/util/stream-tee.js +35 -0
- package/dist/util/time.d.ts +4 -0
- package/dist/util/time.js +4 -0
- package/dist/util/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/dist/{store → util}/yaml.d.ts +1 -5
- package/dist/{store → util}/yaml.js +2 -6
- 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 +2 -2
- package/dist/cli/provenance-coverage.d.ts +0 -18
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/sharing/scope.d.ts +0 -14
- package/dist/sharing/shared.d.ts +0 -187
- package/dist/sharing/shared.js +0 -563
- package/dist/store/embeddings/local.d.ts +0 -15
- package/dist/store/embeddings/local.js +0 -192
- package/dist/store/embeddings/provider.d.ts +0 -77
- package/dist/store/markdown.d.ts +0 -10
- package/dist/store/recall-scope.d.ts +0 -138
- package/dist/store/recall-scope.js +0 -216
- package/dist/store/vector-writes.d.ts +0 -13
- package/dist/store/vector-writes.js +0 -89
- /package/dist/{store → core}/object-types.d.ts +0 -0
- /package/dist/{store → core}/object-types.js +0 -0
- /package/dist/{cli → store}/quality-repair.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.js +0 -0
package/dist/cli/remember.js
CHANGED
|
@@ -1,33 +1,29 @@
|
|
|
1
1
|
// The write verbs: `hippo remember`, `hippo supersede` and `hippo trace`.
|
|
2
2
|
import { envAnthropicApiKey } from '../util/env.js';
|
|
3
|
-
import { evalNow } from '../core/ablation.js';
|
|
3
|
+
import { evalNow, strengthAblation } from '../core/ablation.js';
|
|
4
4
|
import * as fs from 'fs';
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import { listMemoryConflicts } from '../store/conflicts.js';
|
|
12
|
-
import { RejectedValueError } from '../store/rejection.js';
|
|
5
|
+
import { calculateStrength, calculateRewardFactor, confidenceFacets, confidenceLabel, Layer, } from '../core/memory.js';
|
|
6
|
+
import * as api from '../api/index.js';
|
|
7
|
+
import { getMemory } from '../api/memories.js';
|
|
8
|
+
import { ConflictError, NotFoundError } from '../core/api-errors.js';
|
|
9
|
+
import { isInitialized } from '../core/project-identity.js';
|
|
10
|
+
import { RejectedValueError } from '../core/api-errors.js';
|
|
13
11
|
import { renderTraceContent, parseSteps } from '../consolidate/trace.js';
|
|
14
|
-
import { embedMemory } from '../store/embeddings/index.js';
|
|
15
|
-
import { loadConfig } from '../core/config.js';
|
|
16
12
|
import { extractPathTags } from '../search/path-context.js';
|
|
17
|
-
import { detectScope } from '../
|
|
18
|
-
import { assertClientScope } from '../
|
|
19
|
-
import { getGlobalRoot, initGlobal } from '../sharing/
|
|
13
|
+
import { detectScope } from '../core/active-scope.js';
|
|
14
|
+
import { assertClientScope } from '../core/recall-scope.js';
|
|
15
|
+
import { getGlobalRoot, initGlobal } from '../sharing/global-store.js';
|
|
20
16
|
import { vetSecrets } from '../util/secret-detect.js';
|
|
21
17
|
import * as client from './client.js';
|
|
22
|
-
import {
|
|
23
|
-
import { computeSalience } from '../core/salience.js';
|
|
18
|
+
import { cliApiContext } from './api-context.js';
|
|
24
19
|
import { validateOwner, isStrictOwnerEnv } from './owner-validation.js';
|
|
25
20
|
import { printError } from './output.js';
|
|
26
|
-
import {
|
|
21
|
+
import { requireInit, runViaServerIfAvailable } from './shared.js';
|
|
27
22
|
import { fmt } from './print.js';
|
|
28
|
-
import { boolFlag, flagIsTrue, stringFlag } from './flag-values.js';
|
|
23
|
+
import { boolFlag, flagIsTrue, isOneOf, stringFlag, stringListFlag } from './flag-values.js';
|
|
29
24
|
import { DAY_MS } from '../util/time.js';
|
|
30
25
|
import { errorMessage } from '../util/log.js';
|
|
26
|
+
import { CliExit } from './exit.js';
|
|
31
27
|
const PARENT_PREVIEW_CHARS = 70;
|
|
32
28
|
const DETAIL_CONTENT_CHARS = 160;
|
|
33
29
|
// Shared by the direct write and the routed request so both store the same tags.
|
|
@@ -60,19 +56,16 @@ function rememberConfidence(flags) {
|
|
|
60
56
|
confidence = 'verified';
|
|
61
57
|
return confidence;
|
|
62
58
|
}
|
|
59
|
+
const USER_VISIBLE_KINDS = ['distilled', 'superseded'];
|
|
63
60
|
function parseKindFlag(flags) {
|
|
64
61
|
const kindFlagRaw = stringFlag(flags, 'kind');
|
|
65
62
|
const kindFlag = kindFlagRaw === undefined ? undefined : kindFlagRaw.toLowerCase();
|
|
66
|
-
//
|
|
67
|
-
//
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
// 'archived' is an internal sentinel set only inside archiveRawMemory's transaction.
|
|
71
|
-
const userVisibleKinds = ['distilled', 'superseded'];
|
|
72
|
-
if (kindFlag !== undefined && !userVisibleKinds.includes(kindFlag)) {
|
|
73
|
-
printError(`Invalid --kind: "${kindFlagRaw}". Must be one of: ${userVisibleKinds.join(', ')}`);
|
|
63
|
+
// 'raw' is reserved for ingestion connectors (deletions go through archiveRawMemory); the append-only trigger aborts forget/consolidate on raw rows,
|
|
64
|
+
// so exposing --kind raw would create unforgettable memories. 'archived' is an internal sentinel set only in that transaction.
|
|
65
|
+
if (kindFlag !== undefined && !isOneOf(USER_VISIBLE_KINDS, kindFlag)) {
|
|
66
|
+
printError(`Invalid --kind: "${kindFlagRaw}". Must be one of: ${USER_VISIBLE_KINDS.join(', ')}`);
|
|
74
67
|
printError(`(kind='raw' is reserved for ingestion connectors; kind='archived' is internal.)`);
|
|
75
|
-
|
|
68
|
+
throw new CliExit(1);
|
|
76
69
|
}
|
|
77
70
|
return kindFlag;
|
|
78
71
|
}
|
|
@@ -82,7 +75,7 @@ function parseRememberEnvelope(flags) {
|
|
|
82
75
|
const ownerCheck = validateOwner(ownerRaw, { strict: isStrictOwnerEnv() });
|
|
83
76
|
if (!ownerCheck.ok) {
|
|
84
77
|
printError(ownerCheck.message);
|
|
85
|
-
|
|
78
|
+
throw new CliExit(1);
|
|
86
79
|
}
|
|
87
80
|
if (ownerCheck.message)
|
|
88
81
|
printError(ownerCheck.message);
|
|
@@ -92,7 +85,7 @@ function parseRememberEnvelope(flags) {
|
|
|
92
85
|
assertClientScope(scope);
|
|
93
86
|
return { kind, owner, artifactRef, scope };
|
|
94
87
|
}
|
|
95
|
-
async function cmdRemember(hippoRoot, text, flags) {
|
|
88
|
+
async function cmdRemember(hippoRoot, tenantId, text, flags) {
|
|
96
89
|
const useGlobal = boolFlag(flags, 'global');
|
|
97
90
|
const targetRoot = useGlobal ? getGlobalRoot() : hippoRoot;
|
|
98
91
|
if (useGlobal) {
|
|
@@ -102,60 +95,33 @@ async function cmdRemember(hippoRoot, text, flags) {
|
|
|
102
95
|
requireInit(hippoRoot);
|
|
103
96
|
}
|
|
104
97
|
const { requested: requestedTags, all: allTags } = rememberTags(flags, process.cwd());
|
|
105
|
-
const confidence = rememberConfidence(flags);
|
|
106
|
-
// Schema fit needs the store, which the routed request has no access to, so it stays here.
|
|
107
|
-
const schemaFit = schemaFitInStore(targetRoot, resolveTenantId({}), text, requestedTags);
|
|
108
98
|
const envelope = parseRememberEnvelope(flags);
|
|
109
|
-
|
|
110
|
-
const
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
99
|
+
const ctx = cliApiContext(targetRoot, tenantId);
|
|
100
|
+
const outcome = api.rememberLocally(ctx, {
|
|
101
|
+
content: text,
|
|
102
|
+
kind: envelope.kind,
|
|
103
|
+
scope: envelope.scope ?? undefined,
|
|
104
|
+
owner: envelope.owner ?? undefined,
|
|
105
|
+
artifactRef: envelope.artifactRef ?? undefined,
|
|
114
106
|
tags: allTags,
|
|
107
|
+
// Schema fit is scored on the tags the caller typed, without the path and scope tags added from this process.
|
|
108
|
+
fitTags: requestedTags,
|
|
109
|
+
layer: Layer.Episodic,
|
|
115
110
|
pinned: boolFlag(flags, 'pin'),
|
|
116
111
|
source: useGlobal ? 'cli-global' : 'cli',
|
|
117
|
-
confidence,
|
|
118
|
-
|
|
119
|
-
kind: envelope.kind,
|
|
120
|
-
scope: envelope.scope,
|
|
121
|
-
owner: envelope.owner,
|
|
122
|
-
artifact_ref: envelope.artifactRef,
|
|
123
|
-
tenantId,
|
|
124
|
-
baseHalfLifeDays: rememberConfig.defaultHalfLifeDays,
|
|
112
|
+
confidence: rememberConfidence(flags),
|
|
113
|
+
force: boolFlag(flags, 'force'),
|
|
125
114
|
});
|
|
126
|
-
if (
|
|
115
|
+
if (outcome.status === 'skipped') {
|
|
116
|
+
console.log(`Skipped (salience: ${outcome.reason}, score ${outcome.score.toFixed(2)})`);
|
|
127
117
|
return;
|
|
128
|
-
writeEntry(targetRoot, entry);
|
|
129
|
-
updateStats(targetRoot, { remembered: 1 });
|
|
130
|
-
printRemembered(entry, useGlobal);
|
|
131
|
-
void embedMemory(targetRoot, entry);
|
|
132
|
-
await extractRememberFacts(targetRoot, entry, flags);
|
|
133
|
-
}
|
|
134
|
-
/** False when the gate skips the write; a start_weak verdict weakens `entry` in place. */
|
|
135
|
-
function passesSalienceGate(entry, text, targetRoot, rememberConfig, flags) {
|
|
136
|
-
if (!rememberConfig.salience.enabled || boolFlag(flags, 'pin') || boolFlag(flags, 'force'))
|
|
137
|
-
return true;
|
|
138
|
-
// computeSalience compares against the last `recentWindow` rows only; below 1 its slice takes every row, so that case still loads them all.
|
|
139
|
-
const window = Math.trunc(rememberConfig.salience.recentWindow);
|
|
140
|
-
const recent = Number.isSafeInteger(window) && window >= 1
|
|
141
|
-
? loadNewestEntries(targetRoot, entry.tenantId, window)
|
|
142
|
-
: loadAllEntries(targetRoot, entry.tenantId);
|
|
143
|
-
const salienceResult = computeSalience(text, entry.tags, recent, {
|
|
144
|
-
recentWindow: rememberConfig.salience.recentWindow,
|
|
145
|
-
overlapThreshold: rememberConfig.salience.overlapThreshold,
|
|
146
|
-
minContentLength: rememberConfig.salience.minContentLength,
|
|
147
|
-
maxRepeatErrors: rememberConfig.salience.maxRepeatErrors,
|
|
148
|
-
});
|
|
149
|
-
if (salienceResult.decision === 'skip') {
|
|
150
|
-
console.log(`Skipped (salience: ${salienceResult.reason}, score ${salienceResult.score.toFixed(2)})`);
|
|
151
|
-
return false;
|
|
152
|
-
}
|
|
153
|
-
if (salienceResult.decision === 'start_weak') {
|
|
154
|
-
entry.strength = salienceResult.score;
|
|
155
|
-
entry.half_life_days = Math.max(1, entry.half_life_days * 0.5);
|
|
156
|
-
console.log(`Weakened (salience: ${salienceResult.reason}, strength ${salienceResult.score.toFixed(2)})`);
|
|
157
118
|
}
|
|
158
|
-
|
|
119
|
+
const weak = outcome.startedWeak;
|
|
120
|
+
if (weak)
|
|
121
|
+
console.log(`Weakened (salience: ${weak.reason}, strength ${weak.strength.toFixed(2)})`);
|
|
122
|
+
printRemembered(outcome.entry, useGlobal);
|
|
123
|
+
const request = { requested: boolFlag(flags, 'extract'), apiKey: envAnthropicApiKey() };
|
|
124
|
+
printExtraction(await api.extractRememberedFacts(ctx, outcome.entry, request));
|
|
159
125
|
}
|
|
160
126
|
function printRemembered(entry, useGlobal) {
|
|
161
127
|
const prefix = useGlobal ? '[global] ' : '';
|
|
@@ -168,80 +134,59 @@ function printRemembered(entry, useGlobal) {
|
|
|
168
134
|
for (const w of vetSecrets(entry.content, entry.tags, false).warnings)
|
|
169
135
|
printError(`Warning: ${w}`);
|
|
170
136
|
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
const shouldExtract = flags['extract'] || config.extraction.enabled === true;
|
|
174
|
-
const apiKey = envAnthropicApiKey() ?? '';
|
|
175
|
-
if (shouldExtract && apiKey) {
|
|
176
|
-
try {
|
|
177
|
-
const { extractFacts, storeExtractedFacts } = await import('../learn/extract.js');
|
|
178
|
-
const facts = await extractFacts(entry.content, {
|
|
179
|
-
apiKey,
|
|
180
|
-
model: config.extraction.model,
|
|
181
|
-
onError: (msg) => printError(` (extraction failed: ${msg})`),
|
|
182
|
-
});
|
|
183
|
-
if (facts.length > 0) {
|
|
184
|
-
storeExtractedFacts(targetRoot, entry, facts);
|
|
185
|
-
printError(` extracted ${facts.length} fact(s)`);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
catch (err) {
|
|
189
|
-
// Extraction is best-effort: report it, never block remember.
|
|
190
|
-
printError(` (extraction failed: ${errorMessage(err)})`);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
else if (shouldExtract && !apiKey) {
|
|
137
|
+
function printExtraction(extraction) {
|
|
138
|
+
if (extraction.status === 'no_key')
|
|
194
139
|
printError(' (extraction skipped: ANTHROPIC_API_KEY not set)');
|
|
195
|
-
|
|
140
|
+
if (extraction.status !== 'ran')
|
|
141
|
+
return;
|
|
142
|
+
for (const failure of extraction.failures)
|
|
143
|
+
printError(` (extraction failed: ${failure})`);
|
|
144
|
+
if (extraction.facts > 0)
|
|
145
|
+
printError(` extracted ${extraction.facts} fact(s)`);
|
|
196
146
|
}
|
|
197
147
|
function supersedeTags(flags) {
|
|
198
|
-
|
|
199
|
-
return Array.isArray(rawTags)
|
|
200
|
-
? rawTags.map((t) => String(t))
|
|
201
|
-
: typeof rawTags === 'string'
|
|
202
|
-
? rawTags.split(',').map((t) => t.trim()).filter(Boolean)
|
|
203
|
-
: undefined;
|
|
148
|
+
return stringListFlag(flags, 'tag');
|
|
204
149
|
}
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
150
|
+
/** The api's conflict text differs by which writer lost; the row itself names its successor either way. */
|
|
151
|
+
async function alreadySupersededLine(hippoRoot, oldId, tenantId, conflict) {
|
|
152
|
+
const by = (await getMemory(cliApiContext(hippoRoot, tenantId), oldId))?.superseded_by;
|
|
153
|
+
return by ? `Error: memory ${oldId} is already superseded by ${by}. Supersede that one instead.` : `Error: ${conflict.message}`;
|
|
154
|
+
}
|
|
155
|
+
function parseLayerFlag(flags) {
|
|
156
|
+
const raw = stringFlag(flags, 'layer');
|
|
157
|
+
if (raw === undefined)
|
|
158
|
+
return undefined;
|
|
159
|
+
const layer = Object.values(Layer).find((l) => l === raw);
|
|
160
|
+
if (layer === undefined) {
|
|
161
|
+
printError(`Invalid --layer: "${raw}". Must be one of: ${Object.values(Layer).join(', ')}`);
|
|
162
|
+
throw new CliExit(1);
|
|
215
163
|
}
|
|
164
|
+
return layer;
|
|
216
165
|
}
|
|
217
|
-
function cmdSupersede(hippoRoot, oldId, newContent, flags) {
|
|
166
|
+
async function cmdSupersede(hippoRoot, tenantId, oldId, newContent, flags) {
|
|
218
167
|
requireInit(hippoRoot);
|
|
219
|
-
const
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
168
|
+
const overrides = {
|
|
169
|
+
layer: parseLayerFlag(flags),
|
|
170
|
+
tags: supersedeTags(flags),
|
|
171
|
+
// Without --pin the successor keeps the old row's pin.
|
|
172
|
+
pinned: flagIsTrue(flags, 'pin') ? true : undefined,
|
|
173
|
+
};
|
|
174
|
+
let newId;
|
|
175
|
+
try {
|
|
176
|
+
({ newId } = api.supersede(cliApiContext(hippoRoot, tenantId), oldId, newContent, overrides));
|
|
223
177
|
}
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
178
|
+
catch (err) {
|
|
179
|
+
if (err instanceof NotFoundError)
|
|
180
|
+
printError(`Error: memory ${oldId} not found.`);
|
|
181
|
+
else if (err instanceof RejectedValueError)
|
|
182
|
+
printError(`Error: ${err.message}`);
|
|
183
|
+
else if (err instanceof ConflictError)
|
|
184
|
+
printError(await alreadySupersededLine(hippoRoot, oldId, tenantId, err));
|
|
185
|
+
else
|
|
186
|
+
throw err;
|
|
187
|
+
throw new CliExit(1);
|
|
227
188
|
}
|
|
228
|
-
|
|
229
|
-
const tags = supersedeTags(flags);
|
|
230
|
-
const pinned = flagIsTrue(flags, 'pin') || old.pinned;
|
|
231
|
-
const newEntry = createSuccessor(old, newContent, {
|
|
232
|
-
tenantId: old.tenantId,
|
|
233
|
-
baseHalfLifeDays: loadConfig(hippoRoot).defaultHalfLifeDays,
|
|
234
|
-
layer,
|
|
235
|
-
tags,
|
|
236
|
-
pinned,
|
|
237
|
-
});
|
|
238
|
-
// Write the SUCCESSOR first: a rejection-guard refusal then mutates nothing, and an old-row failure leaves an
|
|
239
|
-
// orphan successor rather than a dangling pointer. Unlike api.supersede this path is two non-atomic writes.
|
|
240
|
-
writeSuccessor(hippoRoot, newEntry);
|
|
241
|
-
old.superseded_by = newEntry.id;
|
|
242
|
-
writeEntry(hippoRoot, old);
|
|
243
|
-
emitCliAudit(hippoRoot, 'supersede', oldId, { newId: newEntry.id });
|
|
244
|
-
console.log(`Superseded ${oldId} → ${newEntry.id}`);
|
|
189
|
+
console.log(`Superseded ${oldId} → ${newId}`);
|
|
245
190
|
}
|
|
246
191
|
function parseStepsOrExit(stepsJson) {
|
|
247
192
|
try {
|
|
@@ -249,7 +194,7 @@ function parseStepsOrExit(stepsJson) {
|
|
|
249
194
|
}
|
|
250
195
|
catch (err) {
|
|
251
196
|
printError(errorMessage(err));
|
|
252
|
-
|
|
197
|
+
throw new CliExit(1);
|
|
253
198
|
}
|
|
254
199
|
}
|
|
255
200
|
function traceTags(flags) {
|
|
@@ -260,7 +205,7 @@ function traceTags(flags) {
|
|
|
260
205
|
? [String(rawTags)]
|
|
261
206
|
: [];
|
|
262
207
|
}
|
|
263
|
-
function cmdTraceRecord(hippoRoot, flags) {
|
|
208
|
+
function cmdTraceRecord(hippoRoot, tenantId, flags) {
|
|
264
209
|
requireInit(hippoRoot);
|
|
265
210
|
const task = String(flags['task'] ?? '').trim();
|
|
266
211
|
const stepsJson = String(flags['steps'] ?? '').trim();
|
|
@@ -268,11 +213,11 @@ function cmdTraceRecord(hippoRoot, flags) {
|
|
|
268
213
|
const validOutcomes = ['success', 'failure', 'partial'];
|
|
269
214
|
if (!task || !stepsJson || !outcome) {
|
|
270
215
|
printError('Usage: hippo trace record --task <t> --steps <json> --outcome <success|failure|partial> [--session <id>] [--tag <t>]');
|
|
271
|
-
|
|
216
|
+
throw new CliExit(1);
|
|
272
217
|
}
|
|
273
|
-
if (!validOutcomes
|
|
218
|
+
if (!isOneOf(validOutcomes, outcome)) {
|
|
274
219
|
printError(`Invalid outcome: "${outcome}". Must be one of: ${validOutcomes.join(', ')}.`);
|
|
275
|
-
|
|
220
|
+
throw new CliExit(1);
|
|
276
221
|
}
|
|
277
222
|
const steps = parseStepsOrExit(stepsJson);
|
|
278
223
|
const sessionId = String(flags['session'] ?? '').trim() || null;
|
|
@@ -280,40 +225,39 @@ function cmdTraceRecord(hippoRoot, flags) {
|
|
|
280
225
|
const content = renderTraceContent({
|
|
281
226
|
task,
|
|
282
227
|
steps,
|
|
283
|
-
outcome
|
|
228
|
+
outcome,
|
|
284
229
|
});
|
|
285
|
-
const
|
|
286
|
-
|
|
230
|
+
const { id } = api.remember(cliApiContext(hippoRoot, tenantId), {
|
|
231
|
+
content,
|
|
287
232
|
tags,
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
233
|
+
local: {
|
|
234
|
+
layer: Layer.Trace,
|
|
235
|
+
source: String(flags['source'] ?? 'cli'),
|
|
236
|
+
traceOutcome: outcome,
|
|
237
|
+
sourceSessionId: sessionId,
|
|
238
|
+
},
|
|
293
239
|
});
|
|
294
|
-
|
|
295
|
-
console.log(`Recorded trace ${entry.id} (outcome=${outcome}, ${steps.length} steps)`);
|
|
240
|
+
console.log(`Recorded trace ${id} (outcome=${outcome}, ${steps.length} steps)`);
|
|
296
241
|
}
|
|
297
|
-
function cmdTrace(hippoRoot, id, flags) {
|
|
242
|
+
async function cmdTrace(hippoRoot, tenantId, id, flags) {
|
|
298
243
|
requireInit(hippoRoot);
|
|
299
244
|
const asJson = boolFlag(flags, 'json');
|
|
300
|
-
const tenantId = resolveTenantId({});
|
|
301
245
|
// Look in local store first, then global.
|
|
302
|
-
let entry =
|
|
246
|
+
let entry = await getMemory(cliApiContext(hippoRoot, tenantId), id);
|
|
303
247
|
let sourceLabel = 'local';
|
|
304
248
|
const globalRoot = getGlobalRoot();
|
|
305
249
|
if (!entry && isInitialized(globalRoot)) {
|
|
306
|
-
entry =
|
|
250
|
+
entry = await getMemory(cliApiContext(globalRoot, tenantId), id);
|
|
307
251
|
sourceLabel = 'global';
|
|
308
252
|
}
|
|
309
253
|
if (!entry) {
|
|
310
254
|
printError(`Memory not found: ${id}`);
|
|
311
|
-
|
|
255
|
+
throw new CliExit(1);
|
|
312
256
|
}
|
|
313
257
|
const t = {
|
|
314
258
|
entry, id, sourceLabel,
|
|
315
259
|
...traceStats(entry),
|
|
316
|
-
...traceLineage(hippoRoot, globalRoot, entry, id, tenantId),
|
|
260
|
+
...(await traceLineage(hippoRoot, globalRoot, entry, id, tenantId)),
|
|
317
261
|
};
|
|
318
262
|
if (asJson) {
|
|
319
263
|
printTraceJson(t);
|
|
@@ -323,9 +267,9 @@ function cmdTrace(hippoRoot, id, flags) {
|
|
|
323
267
|
}
|
|
324
268
|
function traceStats(entry) {
|
|
325
269
|
const now = evalNow();
|
|
326
|
-
const strength = calculateStrength(entry, now);
|
|
270
|
+
const strength = calculateStrength(entry, now, { ablation: strengthAblation() });
|
|
327
271
|
const halfLife = entry.half_life_days;
|
|
328
|
-
const rewardFactor = calculateRewardFactor(entry);
|
|
272
|
+
const rewardFactor = calculateRewardFactor(entry, strengthAblation());
|
|
329
273
|
const effHalfLife = halfLife * rewardFactor;
|
|
330
274
|
const createdMs = new Date(entry.created).getTime();
|
|
331
275
|
const ageDays = (now.getTime() - createdMs) / DAY_MS;
|
|
@@ -334,20 +278,22 @@ function traceStats(entry) {
|
|
|
334
278
|
const facets = confidenceFacets(entry, now);
|
|
335
279
|
const conf = confidenceLabel(entry, now).text;
|
|
336
280
|
// Projected strength: same decay curve, just push `now` out.
|
|
337
|
-
const projectedAt = (days) => calculateStrength(entry, new Date(now.getTime() + days * DAY_MS));
|
|
281
|
+
const projectedAt = (days) => calculateStrength(entry, new Date(now.getTime() + days * DAY_MS), { ablation: strengthAblation() });
|
|
338
282
|
return { strength, halfLife, rewardFactor, effHalfLife, ageDays, sinceLast, facets, conf, projectedAt };
|
|
339
283
|
}
|
|
340
|
-
function traceLineage(hippoRoot, globalRoot, entry, id, tenantId) {
|
|
284
|
+
async function traceLineage(hippoRoot, globalRoot, entry, id, tenantId) {
|
|
341
285
|
// Parents (consolidation lineage) — schema v9 field.
|
|
342
286
|
const parents = Array.isArray(entry.parents) ? entry.parents : [];
|
|
343
|
-
const parentPreviews =
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
287
|
+
const parentPreviews = [];
|
|
288
|
+
for (const pid of parents) {
|
|
289
|
+
const p = (await getMemory(cliApiContext(hippoRoot, tenantId), pid))
|
|
290
|
+
?? (isInitialized(globalRoot) ? await getMemory(cliApiContext(globalRoot, tenantId), pid) : null);
|
|
291
|
+
parentPreviews.push({ id: pid, content: p ? p.content.replace(/\s+/g, ' ').slice(0, PARENT_PREVIEW_CHARS) : '(not found)' });
|
|
292
|
+
}
|
|
347
293
|
// Open conflicts involving this memory.
|
|
348
294
|
const allConflicts = [
|
|
349
|
-
...
|
|
350
|
-
...(isInitialized(globalRoot) ?
|
|
295
|
+
...api.listConflicts(cliApiContext(hippoRoot, tenantId), 'open'),
|
|
296
|
+
...(isInitialized(globalRoot) ? api.listConflicts(cliApiContext(globalRoot, tenantId), 'open') : []),
|
|
351
297
|
];
|
|
352
298
|
const myConflicts = allConflicts.filter((c) => c.memory_a_id === id || c.memory_b_id === id);
|
|
353
299
|
return { parentPreviews, myConflicts };
|
|
@@ -387,7 +333,8 @@ function printTraceText(t) {
|
|
|
387
333
|
console.log(`Memory: ${entry.id} [${sourceLabel}]`);
|
|
388
334
|
console.log('='.repeat(50));
|
|
389
335
|
console.log(`Content: ${entry.content.replace(/\s+/g, ' ').slice(0, DETAIL_CONTENT_CHARS)}${entry.content.length > DETAIL_CONTENT_CHARS ? '...' : ''}`);
|
|
390
|
-
console.log(`Layer: ${entry.layer.padEnd(10)} Confidence: ${conf.padEnd(14)} Pinned: ${entry.pinned ? 'yes' : 'no'}${entry.starred ? ' Starred:
|
|
336
|
+
console.log(`Layer: ${entry.layer.padEnd(10)} Confidence: ${conf.padEnd(14)} Pinned: ${entry.pinned ? 'yes' : 'no'}${entry.starred ? ' Starred: ' +
|
|
337
|
+
'yes' : ''}`);
|
|
391
338
|
console.log(`Tags: ${entry.tags.join(', ') || '(none)'}`);
|
|
392
339
|
console.log(`Created: ${entry.created} (${fmt(ageDays, 1)} days ago)`);
|
|
393
340
|
console.log();
|
|
@@ -418,7 +365,7 @@ function printTraceText(t) {
|
|
|
418
365
|
}
|
|
419
366
|
}
|
|
420
367
|
}
|
|
421
|
-
export async function handleRemember({ hippoRoot, args, flags }) {
|
|
368
|
+
export async function handleRemember({ hippoRoot, tenantId, args, flags }) {
|
|
422
369
|
let text;
|
|
423
370
|
if (args.length === 1 && args[0] === '-') {
|
|
424
371
|
text = fs.readFileSync(0, 'utf-8').trim();
|
|
@@ -428,25 +375,20 @@ export async function handleRemember({ hippoRoot, args, flags }) {
|
|
|
428
375
|
}
|
|
429
376
|
if (!text || text.length < 3) {
|
|
430
377
|
printError('Memory content too short (minimum 3 characters).');
|
|
431
|
-
|
|
378
|
+
throw new CliExit(1);
|
|
432
379
|
}
|
|
433
|
-
// Thin-client routing
|
|
434
|
-
//
|
|
435
|
-
// flags (--pin, --layer, --extract, --global) still need the direct
|
|
436
|
-
// path; we only intercept the minimal envelope. The salience gate is
|
|
437
|
-
// NOT in richFlag and the route does not apply it, so a routed remember
|
|
438
|
-
// stores what a direct one would skip; do not read this list as covering salience.
|
|
380
|
+
// Thin-client routing: simple `remember` calls go over HTTP so the daemon stays the single writer; rich flags need the direct path.
|
|
381
|
+
// The salience gate is not in richFlag and the route does not apply it, so a routed remember stores what a direct one would skip.
|
|
439
382
|
const richFlag = flags['pin'] || flags['global'] || flags['extract'] || flags['force'] ||
|
|
440
383
|
flags['observed'] || flags['inferred'] || flags['verified'] ||
|
|
441
384
|
flags['layer'] !== undefined;
|
|
442
385
|
if (!richFlag && await rememberViaThinClient(hippoRoot, text, flags))
|
|
443
386
|
return;
|
|
444
|
-
await cmdRemember(hippoRoot, text, flags);
|
|
387
|
+
await cmdRemember(hippoRoot, tenantId, text, flags);
|
|
445
388
|
}
|
|
446
389
|
async function rememberViaThinClient(hippoRoot, text, flags) {
|
|
447
390
|
const rememberKindRaw = stringFlag(flags, 'kind')?.toLowerCase();
|
|
448
|
-
|
|
449
|
-
if (rememberKindRaw !== undefined && !rememberKindAllowed.includes(rememberKindRaw))
|
|
391
|
+
if (rememberKindRaw !== undefined && !isOneOf(USER_VISIBLE_KINDS, rememberKindRaw))
|
|
450
392
|
return false;
|
|
451
393
|
const tags = rememberTags(flags, process.cwd()).all;
|
|
452
394
|
// Validate --owner on the thin-client path too, so validation is the same whether or not a server is up.
|
|
@@ -454,7 +396,7 @@ async function rememberViaThinClient(hippoRoot, text, flags) {
|
|
|
454
396
|
const thinOwnerCheck = validateOwner(thinOwnerRaw, { strict: isStrictOwnerEnv() });
|
|
455
397
|
if (!thinOwnerCheck.ok) {
|
|
456
398
|
printError(thinOwnerCheck.message);
|
|
457
|
-
|
|
399
|
+
throw new CliExit(1);
|
|
458
400
|
}
|
|
459
401
|
if (thinOwnerCheck.message)
|
|
460
402
|
printError(thinOwnerCheck.message);
|
|
@@ -473,25 +415,25 @@ async function rememberViaThinClient(hippoRoot, text, flags) {
|
|
|
473
415
|
printError(`Warning: ${w}`);
|
|
474
416
|
});
|
|
475
417
|
}
|
|
476
|
-
export function handleSupersede({ hippoRoot, args, flags }) {
|
|
418
|
+
export async function handleSupersede({ hippoRoot, tenantId, args, flags }) {
|
|
477
419
|
const oldId = args[0];
|
|
478
420
|
const newContent = args.slice(1).join(' ').trim();
|
|
479
421
|
if (!oldId || !newContent) {
|
|
480
422
|
printError('Usage: hippo supersede <old-id> "<new content>" [--layer L] [--tag T] [--pin]');
|
|
481
|
-
|
|
423
|
+
throw new CliExit(1);
|
|
482
424
|
}
|
|
483
|
-
cmdSupersede(hippoRoot, oldId, newContent, flags);
|
|
425
|
+
await cmdSupersede(hippoRoot, tenantId, oldId, newContent, flags);
|
|
484
426
|
}
|
|
485
|
-
export function handleTrace({ hippoRoot, args, flags }) {
|
|
427
|
+
export async function handleTrace({ hippoRoot, tenantId, args, flags }) {
|
|
486
428
|
const sub = args[0] ? String(args[0]) : '';
|
|
487
429
|
if (sub === 'record') {
|
|
488
|
-
cmdTraceRecord(hippoRoot, flags);
|
|
430
|
+
cmdTraceRecord(hippoRoot, tenantId, flags);
|
|
489
431
|
return;
|
|
490
432
|
}
|
|
491
433
|
if (!sub) {
|
|
492
434
|
printError('Usage: hippo trace <memory-id> | hippo trace record --task <t> --steps <json> --outcome <o>');
|
|
493
|
-
|
|
435
|
+
throw new CliExit(1);
|
|
494
436
|
}
|
|
495
|
-
cmdTrace(hippoRoot, sub, flags);
|
|
437
|
+
await cmdTrace(hippoRoot, tenantId, sub, flags);
|
|
496
438
|
}
|
|
497
439
|
//# sourceMappingURL=remember.js.map
|
package/dist/cli/scheduler.d.ts
CHANGED
|
@@ -1,30 +1,15 @@
|
|
|
1
|
-
import * as fs from 'fs';
|
|
2
1
|
export declare const DAILY_TASK_NAME = "hippo-daily-runner";
|
|
3
2
|
interface WorkspaceRegistry {
|
|
4
3
|
version: 1;
|
|
5
4
|
workspaces: string[];
|
|
6
5
|
}
|
|
7
|
-
/**
|
|
8
|
-
* Dependency-injection seam for tests. Production code always uses the real
|
|
9
|
-
* `fs` functions imported above; tests override this via
|
|
10
|
-
* __setSchedulerFsDeps to substitute fakes instead of `vi.mock`ing the
|
|
11
|
-
* built-in `fs` module. Never called outside tests -- this module's public
|
|
12
|
-
* behavior is unaffected when it's never invoked.
|
|
13
|
-
*/
|
|
14
|
-
export interface SchedulerFsDeps {
|
|
15
|
-
existsSync: typeof fs.existsSync;
|
|
16
|
-
readFileSync: typeof fs.readFileSync;
|
|
17
|
-
mkdirSync: typeof fs.mkdirSync;
|
|
18
|
-
writeFile: (file: string, text: string) => void;
|
|
19
|
-
renameSync: typeof fs.renameSync;
|
|
20
|
-
}
|
|
21
|
-
/** Test-only override. Not part of this module's public API surface. */
|
|
22
|
-
export declare function __setSchedulerFsDeps(overrides: Partial<SchedulerFsDeps>): void;
|
|
23
6
|
export declare function workspaceRegistryPath(globalRoot: string): string;
|
|
24
7
|
export declare function loadWorkspaceRegistry(globalRoot: string): WorkspaceRegistry;
|
|
25
8
|
export declare function saveWorkspaceRegistry(globalRoot: string, registry: WorkspaceRegistry): void;
|
|
26
9
|
export declare function registerWorkspace(globalRoot: string, projectDir: string): WorkspaceRegistry;
|
|
27
10
|
export declare function listRegisteredWorkspaces(globalRoot: string): string[];
|
|
11
|
+
/** True when a runner path holds a character that would break the quoted command or split the crontab line. */
|
|
12
|
+
export declare function hasUnsafeRunnerPathChars(runnerDir: string, platform: NodeJS.Platform): boolean;
|
|
28
13
|
export declare function buildDailyRunnerCommand(projectDir: string, platform?: NodeJS.Platform): string;
|
|
29
14
|
/** What the Windows task runs. A plain `cmd /c` task opens a visible console every morning. */
|
|
30
15
|
export declare function buildWindowsTaskRun(cmd: string): string;
|
package/dist/cli/scheduler.js
CHANGED
|
@@ -3,18 +3,6 @@ import * as path from 'path';
|
|
|
3
3
|
import { errorMessage, log } from '../util/log.js';
|
|
4
4
|
import { writeFileAtomic } from '../util/atomic-write.js';
|
|
5
5
|
export const DAILY_TASK_NAME = 'hippo-daily-runner';
|
|
6
|
-
let fsDeps = {
|
|
7
|
-
existsSync: fs.existsSync,
|
|
8
|
-
readFileSync: fs.readFileSync,
|
|
9
|
-
mkdirSync: fs.mkdirSync,
|
|
10
|
-
// One rename, so a crash mid-save cannot leave a truncated registry that reads as corrupt.
|
|
11
|
-
writeFile: writeFileAtomic,
|
|
12
|
-
renameSync: fs.renameSync,
|
|
13
|
-
};
|
|
14
|
-
/** Test-only override. Not part of this module's public API surface. */
|
|
15
|
-
export function __setSchedulerFsDeps(overrides) {
|
|
16
|
-
fsDeps = { ...fsDeps, ...overrides };
|
|
17
|
-
}
|
|
18
6
|
function defaultRegistry() {
|
|
19
7
|
return {
|
|
20
8
|
version: 1,
|
|
@@ -29,11 +17,11 @@ function normalizeWorkspace(projectDir) {
|
|
|
29
17
|
}
|
|
30
18
|
export function loadWorkspaceRegistry(globalRoot) {
|
|
31
19
|
const registryPath = workspaceRegistryPath(globalRoot);
|
|
32
|
-
if (!
|
|
20
|
+
if (!fs.existsSync(registryPath))
|
|
33
21
|
return defaultRegistry();
|
|
34
22
|
let text;
|
|
35
23
|
try {
|
|
36
|
-
text =
|
|
24
|
+
text = fs.readFileSync(registryPath, 'utf8');
|
|
37
25
|
}
|
|
38
26
|
catch (err) {
|
|
39
27
|
log.warn(`workspace registry ${registryPath} could not be read (${errorMessage(err)}); starting with no workspaces`);
|
|
@@ -59,16 +47,17 @@ function setAsideCorruptRegistry(registryPath, err) {
|
|
|
59
47
|
const reason = errorMessage(err);
|
|
60
48
|
const aside = `${registryPath}.corrupt-${new Date().toISOString().replace(/[:.]/g, '-')}`;
|
|
61
49
|
try {
|
|
62
|
-
|
|
50
|
+
fs.renameSync(registryPath, aside);
|
|
63
51
|
log.warn(`workspace registry ${registryPath} is corrupt (${reason}); moved it to ${aside} and starting with no workspaces`);
|
|
64
52
|
}
|
|
65
53
|
catch (renameErr) {
|
|
66
|
-
log.warn(`workspace registry ${registryPath} is corrupt (${reason}) and could not be moved aside (${errorMessage(renameErr)});
|
|
54
|
+
log.warn(`workspace registry ${registryPath} is corrupt (${reason}) and could not be moved aside (${errorMessage(renameErr)}); ` +
|
|
55
|
+
`starting with no workspaces`);
|
|
67
56
|
}
|
|
68
57
|
}
|
|
69
58
|
export function saveWorkspaceRegistry(globalRoot, registry) {
|
|
70
|
-
|
|
71
|
-
|
|
59
|
+
fs.mkdirSync(globalRoot, { recursive: true, mode: 0o700 });
|
|
60
|
+
writeFileAtomic(workspaceRegistryPath(globalRoot), JSON.stringify({
|
|
72
61
|
version: 1,
|
|
73
62
|
workspaces: [...new Set(registry.workspaces.map(normalizeWorkspace))].sort(),
|
|
74
63
|
}, null, 2) + '\n');
|
|
@@ -82,6 +71,12 @@ export function registerWorkspace(globalRoot, projectDir) {
|
|
|
82
71
|
export function listRegisteredWorkspaces(globalRoot) {
|
|
83
72
|
return loadWorkspaceRegistry(globalRoot).workspaces;
|
|
84
73
|
}
|
|
74
|
+
// Crontab reads % as a newline and both shells expand $ and backtick; a backslash is a path separator on Windows only.
|
|
75
|
+
const UNSAFE_RUNNER_PATH_CHARS = /["`$%\n\r]/;
|
|
76
|
+
/** True when a runner path holds a character that would break the quoted command or split the crontab line. */
|
|
77
|
+
export function hasUnsafeRunnerPathChars(runnerDir, platform) {
|
|
78
|
+
return UNSAFE_RUNNER_PATH_CHARS.test(runnerDir) || (platform !== 'win32' && runnerDir.includes('\\'));
|
|
79
|
+
}
|
|
85
80
|
export function buildDailyRunnerCommand(projectDir, platform = process.platform) {
|
|
86
81
|
if (platform === 'win32') {
|
|
87
82
|
const resolved = path.win32.resolve(projectDir).replace(/\\/g, '/');
|
|
@@ -105,7 +100,7 @@ export function buildSchtasksCreateArgs(taskName, cmd) {
|
|
|
105
100
|
export function runDailyMaintenance(workspaces, runCommand) {
|
|
106
101
|
for (const workspace of workspaces) {
|
|
107
102
|
const resolved = normalizeWorkspace(workspace);
|
|
108
|
-
if (!
|
|
103
|
+
if (!fs.existsSync(path.join(resolved, '.hippo')))
|
|
109
104
|
continue;
|
|
110
105
|
runCommand(resolved, ['learn', '--git', '--days', '1']);
|
|
111
106
|
runCommand(resolved, ['sleep']);
|