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/core/memory.js
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
3
|
-
* Based on the strength formula from PLAN.md.
|
|
4
|
-
*/
|
|
5
|
-
import { envLossAversionRatio } from '../util/env.js';
|
|
1
|
+
/** Core data model for Hippo memory entries, based on the strength formula from PLAN.md. */
|
|
2
|
+
import { DEFAULT_TENANT_ID, envLossAversionRatio } from '../util/env.js';
|
|
6
3
|
import { BadRequestError } from './api-errors.js';
|
|
7
4
|
import { randomUUID } from 'crypto';
|
|
8
|
-
import {
|
|
5
|
+
import { evalNow, NO_STRENGTH_ABLATION } from './ablation.js';
|
|
9
6
|
import { AGENT_MEMORY_TOOLS, toolSourcePrefix } from './agent-memory-tools.js';
|
|
7
|
+
import { isJsonString } from '../util/json.js';
|
|
10
8
|
import { DAY_MS } from '../util/time.js';
|
|
11
9
|
import { ID_SUFFIX_CHARS } from '../util/token-text.js';
|
|
12
10
|
export const DEFAULT_SCHEMA_FIT = 0.5;
|
|
@@ -18,58 +16,20 @@ export var Layer;
|
|
|
18
16
|
Layer["Semantic"] = "semantic";
|
|
19
17
|
Layer["Trace"] = "trace";
|
|
20
18
|
})(Layer || (Layer = {}));
|
|
19
|
+
export const MEMORY_KINDS = ['raw', 'distilled', 'superseded', 'archived'];
|
|
21
20
|
/** Tag on a memory whose named file/symbol/script changed after it was stored. */
|
|
22
21
|
export const CHURN_STALE_TAG = 'churn-stale';
|
|
23
|
-
//
|
|
24
|
-
|
|
25
|
-
// (env var, default 1.0; see getLossAversionRatio + applyLossAversionRatio).
|
|
26
|
-
const EMOTIONAL_MULTIPLIERS = {
|
|
22
|
+
// Losses weigh ~2x gains (Lovallo-Kahneman), so negative is 2.0; HIPPO_LOSS_AVERSION_RATIO scales it per process.
|
|
23
|
+
export const EMOTIONAL_MULTIPLIERS = {
|
|
27
24
|
neutral: 1.0,
|
|
28
25
|
positive: 1.0,
|
|
29
26
|
negative: 2.0, // error-tagged
|
|
30
27
|
critical: 2.0,
|
|
31
28
|
};
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
*
|
|
35
|
-
* `calculateStrength` is called per-entry inside hot recall loops
|
|
36
|
-
* (api.ts/consolidate.ts/search.ts), so a per-call `process.env` lookup
|
|
37
|
-
* would multiply N entries by M recalls of lookup cost. Lazy module-cache
|
|
38
|
-
* reads the env ONCE on first call and memoizes for the process lifetime.
|
|
39
|
-
* Test isolation via `_resetLossAversionRatioCacheForTests()` below.
|
|
40
|
-
*/
|
|
41
|
-
/**
|
|
42
|
-
* Minimum acceptable ratio. Below this, the negative multiplier
|
|
43
|
-
* (2.0 * ratio) becomes small enough that calculateStrength * decay can fall
|
|
44
|
-
* below `DECAY_THRESHOLD = 0.05` in `src/consolidate.ts:146`, which would
|
|
45
|
-
* permanently delete non-pinned error-tagged memories on the next sleep
|
|
46
|
-
* cycle. 0.5 is chosen as the floor because (a) it recovers the pre-calibration
|
|
47
|
-
* effective multiplier (2.0 * 0.5 = 1.0 + the negative premium, i.e. 1.5x
|
|
48
|
-
* the pre-calibration default), and (b) below this the user is asking for LESS
|
|
49
|
-
* loss aversion than has ever shipped — that's outside the supported
|
|
50
|
-
* tuning range.
|
|
51
|
-
*/
|
|
29
|
+
// A lower ratio can drop an error-tagged memory under sleep's DECAY_THRESHOLD (src/consolidate/decay.ts),
|
|
30
|
+
// so values below it fall back to 1.0.
|
|
52
31
|
const LOSS_AVERSION_RATIO_MIN = 0.5;
|
|
53
|
-
|
|
54
|
-
* Validation policy:
|
|
55
|
-
* - Valid: finite numbers >= 0.5.
|
|
56
|
-
* - Invalid (silent fallback to 1.0): empty string, non-numeric,
|
|
57
|
-
* numbers below 0.5 (including 0 and negatives), NaN, +/-Infinity.
|
|
58
|
-
* Silent because opt-in env vars should not crash production recall
|
|
59
|
-
* on a typo.
|
|
60
|
-
*
|
|
61
|
-
* Why the 0.5 floor and not 0:
|
|
62
|
-
* - Rejecting only `0` leaves the same silent data-loss surface for any ratio
|
|
63
|
-
* below ~0.025 (and worse for aged memories, where even ratio=0.25
|
|
64
|
-
* can produce strength < DECAY_THRESHOLD = 0.05 in consolidate.ts).
|
|
65
|
-
* Floor at the pre-calibration equivalent (0.5) so the env var's tuning
|
|
66
|
-
* range never crosses into the deletion regime.
|
|
67
|
-
* - Users wanting LESS loss aversion than the pre-calibration 1.5 multiplier
|
|
68
|
-
* should reconsider the design intent (the calibration was
|
|
69
|
-
* toward MORE loss aversion, not less). If a future use case
|
|
70
|
-
* genuinely needs ratio < 0.5, the right path is a separate
|
|
71
|
-
* `HIPPO_NEGATIVE_MULTIPLIER` env override.
|
|
72
|
-
*/
|
|
32
|
+
// Read once: calculateStrength runs per entry inside hot loops (src/api, src/consolidate, src/search).
|
|
73
33
|
let _lossAversionRatioCache;
|
|
74
34
|
function getLossAversionRatio() {
|
|
75
35
|
if (_lossAversionRatioCache !== undefined)
|
|
@@ -80,8 +40,6 @@ function getLossAversionRatio() {
|
|
|
80
40
|
return 1.0;
|
|
81
41
|
}
|
|
82
42
|
const parsed = Number(raw);
|
|
83
|
-
// Finite + >= 0.5 floor. Anything below 0.5 silently falls back to 1.0
|
|
84
|
-
// to avoid the consolidation-deletion vector (see JSDoc above).
|
|
85
43
|
if (!Number.isFinite(parsed) || parsed < LOSS_AVERSION_RATIO_MIN) {
|
|
86
44
|
_lossAversionRatioCache = 1.0;
|
|
87
45
|
return 1.0;
|
|
@@ -89,42 +47,20 @@ function getLossAversionRatio() {
|
|
|
89
47
|
_lossAversionRatioCache = parsed;
|
|
90
48
|
return parsed;
|
|
91
49
|
}
|
|
92
|
-
/**
|
|
93
|
-
* Test-only helper. Tests that mutate `process.env.HIPPO_LOSS_AVERSION_RATIO`
|
|
94
|
-
* MUST call this in BOTH `beforeEach` AND `afterEach`:
|
|
95
|
-
* - beforeEach: clear any stale cache from a previous test before setting
|
|
96
|
-
* the env var for this test.
|
|
97
|
-
* - afterEach: clear the cache so the next test (which may not set the env
|
|
98
|
-
* var) reads the clean default instead of this test's value.
|
|
99
|
-
* See `tests/emotional-multipliers.test.ts` for the pattern.
|
|
100
|
-
*/
|
|
50
|
+
/** Test-only: a test that sets HIPPO_LOSS_AVERSION_RATIO calls this in beforeEach and afterEach (tests/emotional-multipliers.test.ts). */
|
|
101
51
|
export function _resetLossAversionRatioCacheForTests() {
|
|
102
52
|
_lossAversionRatioCache = undefined;
|
|
103
53
|
}
|
|
104
|
-
/**
|
|
105
|
-
|
|
106
|
-
* Other valences (positive, critical, neutral) pass through unchanged.
|
|
107
|
-
* `critical` is deliberately NOT scaled, so the calibration only touches the
|
|
108
|
-
* specific empirical claim (TFAS 2x losses-vs-gains).
|
|
109
|
-
*/
|
|
110
|
-
function applyLossAversionRatio(valence, baseMultiplier) {
|
|
54
|
+
/** Scales only the `negative` multiplier; `critical` stays unscaled so the knob moves just the losses-vs-gains claim. */
|
|
55
|
+
export function applyLossAversionRatio(valence, baseMultiplier) {
|
|
111
56
|
if (valence !== 'negative')
|
|
112
57
|
return baseMultiplier;
|
|
113
58
|
return baseMultiplier * getLossAversionRatio();
|
|
114
59
|
}
|
|
115
|
-
/**
|
|
116
|
-
|
|
117
|
-
*
|
|
118
|
-
* reward_ratio = (positive - negative) / (positive + negative + 1)
|
|
119
|
-
* reward_factor = 1 + 0.5 * reward_ratio
|
|
120
|
-
*
|
|
121
|
-
* Range: (0.5, 1.5). Neutral (no outcomes) returns 1.0.
|
|
122
|
-
* Modulates effective half-life: memories with consistent positive outcomes
|
|
123
|
-
* decay slower; consistent negative outcomes decay faster.
|
|
124
|
-
*/
|
|
125
|
-
export function calculateRewardFactor(entry) {
|
|
60
|
+
/** 1 + REWARD_SLOPE * (pos - neg) / (pos + neg + 1), in (0.5, 1.5), 1.0 with no outcomes; it scales the effective half-life. */
|
|
61
|
+
export function calculateRewardFactor(entry, ablation = NO_STRENGTH_ABLATION) {
|
|
126
62
|
// EVAL-ONLY ablation (see ablation.ts): the slow outcome channel.
|
|
127
|
-
if (
|
|
63
|
+
if (ablation.outcomeSlow)
|
|
128
64
|
return 1.0;
|
|
129
65
|
const pos = entry.outcome_positive ?? 0;
|
|
130
66
|
const neg = entry.outcome_negative ?? 0;
|
|
@@ -134,65 +70,42 @@ export function calculateRewardFactor(entry) {
|
|
|
134
70
|
return 1 + REWARD_SLOPE * ratio;
|
|
135
71
|
}
|
|
136
72
|
/** Bad marks alone never push a memory under sleep's 0.05 retire line; supersede is the hard correction. */
|
|
137
|
-
const MAX_WRONG_HALVINGS = 3;
|
|
138
|
-
// Shared by calculateStrength and strengthSql so the two cannot drift.
|
|
139
|
-
const DECAY_BASE = 0.5;
|
|
140
|
-
const REWARD_SLOPE = 0.5;
|
|
141
|
-
const RETRIEVAL_BOOST_SLOPE = 0.1;
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
* Net wrongness: bad outcome marks past good ones, never below zero.
|
|
146
|
-
* Strength halves per unit (capped at 3) and recall stops strengthening
|
|
147
|
-
* the memory, so a correction outranks pinning, error tags and heavy recall.
|
|
148
|
-
*/
|
|
149
|
-
export function netWrong(entry) {
|
|
150
|
-
if (isOutcomeSlowAblated() || isDecayAblated())
|
|
73
|
+
export const MAX_WRONG_HALVINGS = 3;
|
|
74
|
+
// Shared by calculateStrength and strengthSql (src/store/rule-sql.ts) so the two cannot drift.
|
|
75
|
+
export const DECAY_BASE = 0.5;
|
|
76
|
+
export const REWARD_SLOPE = 0.5;
|
|
77
|
+
export const RETRIEVAL_BOOST_SLOPE = 0.1;
|
|
78
|
+
/** Bad outcome marks past good ones, floored at zero; each halves strength and stops recall strengthening, so a correction outranks pinning. */
|
|
79
|
+
export function netWrong(entry, ablation = NO_STRENGTH_ABLATION) {
|
|
80
|
+
if (ablation.outcomeSlow || ablation.decay)
|
|
151
81
|
return 0;
|
|
152
82
|
return Math.max(0, (entry.outcome_negative ?? 0) - (entry.outcome_positive ?? 0));
|
|
153
83
|
}
|
|
154
|
-
/**
|
|
155
|
-
*
|
|
156
|
-
* strength(t) = base_strength * decay * retrieval_boost * emotional_multiplier
|
|
157
|
-
*
|
|
158
|
-
* Decay basis modes:
|
|
159
|
-
* - clock: classic wall-clock decay (daysSince / halfLife)
|
|
160
|
-
* - session: decay by sleep cycles instead of days (sessionsSince / halfLife)
|
|
161
|
-
* - adaptive: wall-clock decay with half-life scaled by session frequency
|
|
162
|
-
*
|
|
163
|
-
* Pinned memories skip time decay; being marked wrong still fades them (netWrong).
|
|
164
|
-
*/
|
|
84
|
+
/** Strength at `now` = decay * retrieval boost * emotional multiplier, clamped to [0, 1]; the basis modes are on DecayOptions.
|
|
85
|
+
* Pinned memories skip time decay, but being marked wrong still fades them (netWrong). */
|
|
165
86
|
export function calculateStrength(entry,
|
|
166
|
-
// evalNow()
|
|
167
|
-
// simulated-time protocols; see ablation.ts). Explicit `now` always wins.
|
|
87
|
+
// evalNow() is the real clock unless HIPPO_FAKE_NOW is set (eval-only); an explicit `now` wins.
|
|
168
88
|
now = evalNow(), options = {}) {
|
|
89
|
+
const ablation = options.ablation ?? NO_STRENGTH_ABLATION;
|
|
169
90
|
// Being marked wrong outranks every shield: pinning, error tags, heavy recall.
|
|
170
|
-
const wrongPenalty = Math.pow(DECAY_BASE, Math.min(netWrong(entry), MAX_WRONG_HALVINGS));
|
|
91
|
+
const wrongPenalty = Math.pow(DECAY_BASE, Math.min(netWrong(entry, ablation), MAX_WRONG_HALVINGS));
|
|
171
92
|
if (entry.pinned)
|
|
172
93
|
return wrongPenalty;
|
|
173
|
-
// EVAL-ONLY ablation (see ablation.ts): anchor decay at
|
|
174
|
-
|
|
175
|
-
// NOT reconstructed - see the ablation.ts caveat (fresh stores per arm).
|
|
176
|
-
const lastRetrieved = new Date(isRecallBoostAblated() ? entry.created : entry.last_retrieved);
|
|
94
|
+
// EVAL-ONLY ablation (see ablation.ts): anchor decay at creation so clock resets from earlier unflagged runs cannot leak in.
|
|
95
|
+
const lastRetrieved = new Date(ablation.recallBoost ? entry.created : entry.last_retrieved);
|
|
177
96
|
const daysSince = (now.getTime() - lastRetrieved.getTime()) / DAY_MS;
|
|
178
|
-
|
|
179
|
-
const rewardFactor = calculateRewardFactor(entry);
|
|
97
|
+
const rewardFactor = calculateRewardFactor(entry, ablation);
|
|
180
98
|
const effectiveHalfLife = entry.half_life_days * rewardFactor;
|
|
181
99
|
// Guard: zero half-life causes 0/0 = NaN in the exponent
|
|
182
100
|
if (effectiveHalfLife <= 0)
|
|
183
101
|
return 0.0;
|
|
184
102
|
const decayExponent = decayExponentFor(options, daysSince, effectiveHalfLife);
|
|
185
|
-
// EVAL-ONLY ablation (see ablation.ts): decay
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
const decay = isDecayAblated() ? 1.0 : Math.pow(DECAY_BASE, decayExponent);
|
|
189
|
-
const retrievalBoost = retrievalBoostFor(entry);
|
|
190
|
-
// Emotional multiplier. HIPPO_LOSS_AVERSION_RATIO scales the negative one ONLY; the lazy
|
|
191
|
-
// module cache makes this one lookup + one multiply, not a per-call process.env read.
|
|
103
|
+
// EVAL-ONLY ablation (see ablation.ts): decay := 1, so the [0,1] clamp below caps the boost at baseline.
|
|
104
|
+
const decay = ablation.decay ? 1.0 : Math.pow(DECAY_BASE, decayExponent);
|
|
105
|
+
const retrievalBoost = retrievalBoostFor(entry, ablation);
|
|
192
106
|
const baseMultiplier = EMOTIONAL_MULTIPLIERS[entry.emotional_valence] ?? 1.0;
|
|
193
107
|
const emotionalMultiplier = applyLossAversionRatio(entry.emotional_valence, baseMultiplier);
|
|
194
108
|
const raw = decay * retrievalBoost * emotionalMultiplier;
|
|
195
|
-
// Clamp to [0, 1] with NaN guard
|
|
196
109
|
const clamped = Math.min(1.0, Math.max(0.0, raw));
|
|
197
110
|
return Number.isFinite(clamped) ? clamped * wrongPenalty : 0.0;
|
|
198
111
|
}
|
|
@@ -200,8 +113,7 @@ function decayExponentFor(options, daysSince, halfLifeDays) {
|
|
|
200
113
|
let effectiveHalfLife = halfLifeDays;
|
|
201
114
|
const basis = options.decayBasis ?? 'clock';
|
|
202
115
|
if (basis === 'session') {
|
|
203
|
-
//
|
|
204
|
-
// Estimate sessions since last retrieval from wall-clock time and avg interval.
|
|
116
|
+
// Each sleep cycle counts as one "day"; sessions since last retrieval are estimated from wall time and the average interval.
|
|
205
117
|
const avgInterval = options.avgSessionIntervalDays ?? 1;
|
|
206
118
|
const sessionsSince = avgInterval > 0 ? Math.max(0, daysSince / avgInterval) : daysSince;
|
|
207
119
|
return sessionsSince / effectiveHalfLife;
|
|
@@ -214,44 +126,14 @@ function decayExponentFor(options, daysSince, halfLifeDays) {
|
|
|
214
126
|
}
|
|
215
127
|
return daysSince / effectiveHalfLife;
|
|
216
128
|
}
|
|
217
|
-
// clock: classic wall-clock decay
|
|
218
129
|
return daysSince / effectiveHalfLife;
|
|
219
130
|
}
|
|
220
|
-
//
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
return isRecallBoostAblated() || netWrong(entry) > 0
|
|
131
|
+
// EVAL-ONLY ablation (see ablation.ts) neutralizes the read side too, so counts written before the flag cannot leak in.
|
|
132
|
+
function retrievalBoostFor(entry, ablation) {
|
|
133
|
+
return ablation.recallBoost || netWrong(entry, ablation) > 0
|
|
224
134
|
? 1.0
|
|
225
135
|
: 1 + RETRIEVAL_BOOST_SLOPE * Math.log2(entry.retrieval_count + 1);
|
|
226
136
|
}
|
|
227
|
-
/** calculateStrength's clock-basis formula as SQL over `memories` columns, flags and multipliers baked in; keep in step.
|
|
228
|
-
* An unparseable date scores NULL here and 0 in JS, so sums agree. */
|
|
229
|
-
export function strengthSql(now) {
|
|
230
|
-
const num = (n) => (Number.isInteger(n) ? n.toFixed(1) : String(n));
|
|
231
|
-
const pos = 'COALESCE(outcome_positive, 0)';
|
|
232
|
-
const neg = 'COALESCE(outcome_negative, 0)';
|
|
233
|
-
const wrong = isOutcomeSlowAblated() || isDecayAblated() ? '0' : `MAX(0, ${neg} - ${pos})`;
|
|
234
|
-
const reward = isOutcomeSlowAblated()
|
|
235
|
-
? '1.0'
|
|
236
|
-
: `(CASE WHEN ${pos} = 0 AND ${neg} = 0 THEN 1.0 ELSE 1.0 + ${REWARD_SLOPE} * (${pos} - ${neg}) / (${pos} + ${neg} + 1.0) END)`;
|
|
237
|
-
const halfLife = `(COALESCE(half_life_days, ${SQL_DEFAULT_HALF_LIFE_DAYS}) * ${reward})`;
|
|
238
|
-
const anchor = isRecallBoostAblated() ? 'created' : 'last_retrieved';
|
|
239
|
-
const nowJulian = num(now.getTime() / DAY_MS + UNIX_EPOCH_JULIAN_DAY);
|
|
240
|
-
const decay = isDecayAblated() ? '1.0' : `pow(${DECAY_BASE}, (${nowJulian} - julianday(${anchor})) / ${halfLife})`;
|
|
241
|
-
const boost = isRecallBoostAblated()
|
|
242
|
-
? '1.0'
|
|
243
|
-
: `(CASE WHEN ${wrong} > 0 THEN 1.0 ELSE 1.0 + ${RETRIEVAL_BOOST_SLOPE} * log2(COALESCE(retrieval_count, 0) + 1) END)`;
|
|
244
|
-
const valences = /* SAFETY: a Record keyed by EmotionalValence */ Object.keys(EMOTIONAL_MULTIPLIERS);
|
|
245
|
-
const emotion = `(CASE COALESCE(emotional_valence, 'neutral') ${valences
|
|
246
|
-
.map((v) => `WHEN '${v}' THEN ${num(applyLossAversionRatio(v, EMOTIONAL_MULTIPLIERS[v]))}`)
|
|
247
|
-
.join(' ')} ELSE 1.0 END)`;
|
|
248
|
-
const penalty = `pow(${DECAY_BASE}, MIN(${wrong}, ${MAX_WRONG_HALVINGS}))`;
|
|
249
|
-
return `(CASE WHEN pinned THEN ${penalty} WHEN ${halfLife} <= 0 THEN 0.0
|
|
250
|
-
ELSE MIN(1.0, MAX(0.0, ${decay} * ${boost} * ${emotion})) * ${penalty} END)`;
|
|
251
|
-
}
|
|
252
|
-
/**
|
|
253
|
-
* Derive half-life based on signals, as per PLAN.md table.
|
|
254
|
-
*/
|
|
255
137
|
const HIGH_SCHEMA_FIT = 0.7;
|
|
256
138
|
const HIGH_FIT_HALF_LIFE_FACTOR = 1.5;
|
|
257
139
|
const LOW_SCHEMA_FIT = 0.3;
|
|
@@ -261,35 +143,25 @@ const TAG_FIT_WEIGHT = 0.6;
|
|
|
261
143
|
const CONTENT_FIT_WEIGHT = 0.4;
|
|
262
144
|
const CONTENT_TOKEN_SHARE_MIN = 0.2;
|
|
263
145
|
const CONTENT_ENOUGH_FRACTION = 0.1;
|
|
146
|
+
// An error is worth remembering longer than a neutral note (PLAN.md half-life table).
|
|
147
|
+
const ERROR_TAG_HALF_LIFE_FACTOR = 2;
|
|
148
|
+
// Each retrieval lengthens the half-life by this many days (PLAN.md).
|
|
149
|
+
const RETRIEVAL_HALF_LIFE_GAIN_DAYS = 2;
|
|
150
|
+
/** The base half-life scaled by the PLAN.md signals: an error tag, and high or low schema fit. */
|
|
264
151
|
export function deriveHalfLife(base, entry) {
|
|
265
152
|
let hl = base;
|
|
266
|
-
// Error-tagged: 2x half-life
|
|
267
153
|
if (entry.tags?.includes('error')) {
|
|
268
|
-
hl *=
|
|
154
|
+
hl *= ERROR_TAG_HALF_LIFE_FACTOR;
|
|
269
155
|
}
|
|
270
|
-
// High schema fit: consolidates faster (1.5x)
|
|
271
156
|
if (entry.schema_fit !== undefined && entry.schema_fit > HIGH_SCHEMA_FIT) {
|
|
272
157
|
hl *= HIGH_FIT_HALF_LIFE_FACTOR;
|
|
273
158
|
}
|
|
274
|
-
// Low schema fit: decay faster (0.5x)
|
|
275
159
|
if (entry.schema_fit !== undefined && entry.schema_fit < LOW_SCHEMA_FIT) {
|
|
276
160
|
hl *= LOW_FIT_HALF_LIFE_FACTOR;
|
|
277
161
|
}
|
|
278
162
|
return hl;
|
|
279
163
|
}
|
|
280
|
-
/**
|
|
281
|
-
* Apply outcome feedback to a memory entry.
|
|
282
|
-
*
|
|
283
|
-
* Increments outcome_positive or outcome_negative counters.
|
|
284
|
-
* The reward factor in calculateStrength() uses these counts to
|
|
285
|
-
* continuously modulate the effective half-life:
|
|
286
|
-
* reward_ratio = (pos - neg) / (pos + neg + 1)
|
|
287
|
-
* reward_factor = 1 + 0.5 * reward_ratio // range (0.5, 1.5)
|
|
288
|
-
* effective_hl = half_life_days * reward_factor
|
|
289
|
-
*
|
|
290
|
-
* No fixed half-life delta. Decay rate adjusts proportionally to
|
|
291
|
-
* cumulative reward signal, inspired by R-STDP in spiking networks.
|
|
292
|
-
*/
|
|
164
|
+
/** Counts the outcome; calculateStrength turns the counts into a reward factor on the half-life, so there is no fixed delta here. */
|
|
293
165
|
export function applyOutcome(entry, good) {
|
|
294
166
|
const updated = {
|
|
295
167
|
...entry,
|
|
@@ -307,17 +179,17 @@ export function entryAfterOutcome(entry, good) {
|
|
|
307
179
|
return updated;
|
|
308
180
|
return { ...updated, tags: updated.tags.filter((t) => t !== CHURN_STALE_TAG) };
|
|
309
181
|
}
|
|
310
|
-
/**
|
|
311
|
-
* Generate a random memory ID using crypto.randomUUID().
|
|
312
|
-
*/
|
|
182
|
+
/** A new id: `prefix_` plus the first ID_SUFFIX_CHARS hex characters of a random UUID. */
|
|
313
183
|
export function generateId(prefix = 'mem') {
|
|
314
184
|
return `${prefix}_${randomUUID().replace(/-/g, '').slice(0, ID_SUFFIX_CHARS)}`;
|
|
315
185
|
}
|
|
186
|
+
// Days without a retrieval before trust lapses; pinned and verified rows are exempt by policy.
|
|
187
|
+
const AGED_OUT_AFTER_DAYS = 30;
|
|
316
188
|
function isAgedOut(entry, now) {
|
|
317
189
|
if (entry.pinned || entry.confidence === 'verified')
|
|
318
190
|
return false;
|
|
319
191
|
const lastRetrieved = new Date(entry.last_retrieved);
|
|
320
|
-
return (now.getTime() - lastRetrieved.getTime()) / DAY_MS >
|
|
192
|
+
return (now.getTime() - lastRetrieved.getTime()) / DAY_MS > AGED_OUT_AFTER_DAYS;
|
|
321
193
|
}
|
|
322
194
|
export function confidenceFacets(entry, now = evalNow()) {
|
|
323
195
|
return facetsOf(entry, now);
|
|
@@ -325,8 +197,7 @@ export function confidenceFacets(entry, now = evalNow()) {
|
|
|
325
197
|
export function facetsOf(entry, now) {
|
|
326
198
|
return { tier: entry.confidence, agedOut: isAgedOut(entry, now) };
|
|
327
199
|
}
|
|
328
|
-
//
|
|
329
|
-
// used to read 'stale', so warning on it separately keeps the same set.
|
|
200
|
+
// An aged-out row warns on its own, since its stored tier alone would hide it.
|
|
330
201
|
export function confidenceLabel(entry, now = evalNow()) {
|
|
331
202
|
const { tier, agedOut } = confidenceFacets(entry, now);
|
|
332
203
|
return {
|
|
@@ -334,29 +205,16 @@ export function confidenceLabel(entry, now = evalNow()) {
|
|
|
334
205
|
warn: agedOut || tier === 'stale' || tier === 'inferred',
|
|
335
206
|
};
|
|
336
207
|
}
|
|
337
|
-
/**
|
|
338
|
-
* Resolve the effective confidence for a memory entry.
|
|
339
|
-
* If the entry has not been retrieved in 30+ days and is not 'verified',
|
|
340
|
-
* returns 'stale'. Otherwise returns the stored confidence value.
|
|
341
|
-
*/
|
|
208
|
+
/** The stored confidence, or 'stale' once the entry is aged out (not retrieved for AGED_OUT_AFTER_DAYS; pinned and verified exempt). */
|
|
342
209
|
export function resolveConfidence(entry, now = evalNow()) {
|
|
343
210
|
return isAgedOut(entry, now) ? 'stale' : entry.confidence;
|
|
344
211
|
}
|
|
345
|
-
/**
|
|
346
|
-
*
|
|
347
|
-
* write-time multipliers. 365 because 7 days lost the current fact far more
|
|
348
|
-
* often, and 730 days or no decay did no better. `hippo sleep` moves memories still
|
|
349
|
-
* on an older base (src/consolidate/half-life-migration.ts).
|
|
350
|
-
*/
|
|
212
|
+
/** Base half-life in days before deriveHalfLife's multipliers: 365 because 7 lost the current fact far more often and 730 did no better.
|
|
213
|
+
* `hippo sleep` moves memories still on an older base (src/consolidate/half-life-migration.ts). */
|
|
351
214
|
export const DEFAULT_HALF_LIFE_DAYS = 365;
|
|
352
215
|
export const COMPACTION_MEMORY_TAG = 'compaction-memory';
|
|
353
216
|
export const COMPACTION_SOURCE_PREFIX = 'compaction:';
|
|
354
217
|
export const KEEP_PAIRS = AGENT_MEMORY_TOOLS.map((t) => ({ tag: t.tag, sourcePrefix: toolSourcePrefix(t.id) }));
|
|
355
|
-
const sqlText = (s) => `'${s.replace(/'/g, "''")}'`;
|
|
356
|
-
// json_each matches the tag as a whole element; substr, not LIKE, keeps the prefix case-sensitive like startsWith.
|
|
357
|
-
const keepPairSql = (p) => `(COALESCE(superseded_by, '') = '' AND EXISTS (SELECT 1 FROM json_each(CASE WHEN json_valid(tags_json) THEN tags_json ELSE '[]' END) WHERE value = ${sqlText(p.tag)}) AND substr(source, 1, ${p.sourcePrefix.length}) = ${sqlText(p.sourcePrefix)})`;
|
|
358
|
-
// Pinned and kept rows stay (a superseded row is not kept: its successor carries the tag and source); raw rows leave only through archiveRawMemory. The SQL twin guards the DELETE itself.
|
|
359
|
-
export const AUTO_DELETABLE_SQL = `pinned = 0 AND kind != 'raw'${KEEP_PAIRS.map((p) => ` AND NOT ${keepPairSql(p)}`).join('')}`;
|
|
360
218
|
export function isKeptForGood(entry) {
|
|
361
219
|
return !entry.superseded_by && KEEP_PAIRS.some((p) => entry.tags.includes(p.tag) && entry.source.startsWith(p.sourcePrefix));
|
|
362
220
|
}
|
|
@@ -403,9 +261,8 @@ export function createMemory(content, options = {}) {
|
|
|
403
261
|
scope: options.scope ?? null,
|
|
404
262
|
owner: options.owner ?? null,
|
|
405
263
|
artifact_ref: options.artifact_ref ?? null,
|
|
406
|
-
tenantId: options.tenantId ??
|
|
264
|
+
tenantId: options.tenantId ?? DEFAULT_TENANT_ID,
|
|
407
265
|
};
|
|
408
|
-
// Recalculate strength with the emotional multiplier applied
|
|
409
266
|
entry.strength = calculateStrength(entry);
|
|
410
267
|
return entry;
|
|
411
268
|
}
|
|
@@ -433,29 +290,25 @@ export function createSuccessor(old, content, opts) {
|
|
|
433
290
|
baseHalfLifeDays: opts.baseHalfLifeDays,
|
|
434
291
|
});
|
|
435
292
|
// A legacy null origin has nothing to carry, so the store stamps it from its own location.
|
|
436
|
-
if (
|
|
293
|
+
if (isJsonString(old.origin_project)) {
|
|
437
294
|
next.origin_project = old.origin_project;
|
|
438
295
|
}
|
|
439
296
|
return next;
|
|
440
297
|
}
|
|
441
|
-
/**
|
|
442
|
-
*
|
|
443
|
-
* Returns 0..1 where:
|
|
444
|
-
* >0.7 = high fit (consistent with existing knowledge, consolidates faster)
|
|
445
|
-
* 0.3-0.7 = moderate fit
|
|
446
|
-
* <0.3 = novel (doesn't match existing patterns, decays faster if unused)
|
|
447
|
-
*
|
|
448
|
-
* Uses tag overlap (always available) weighted by how common each tag is.
|
|
449
|
-
* Rare shared tags signal stronger schema fit than common ones.
|
|
450
|
-
*/
|
|
298
|
+
/** How well new content fits existing knowledge, 0..1: above 0.7 consolidates faster, below 0.3 is novel and decays faster if unused.
|
|
299
|
+
* Tags shared with existing memories count by rarity (a rare shared tag fits more), plus content-token overlap. */
|
|
451
300
|
export function computeSchemaFit(content, tags, existingEntries) {
|
|
301
|
+
return schemaFitFrom(content, tags, schemaFitSourceOf(existingEntries));
|
|
302
|
+
}
|
|
303
|
+
/** What schema fit reads from `entries`, built once for a caller that scores many contents against the same rows. */
|
|
304
|
+
export function schemaFitSourceOf(entries) {
|
|
452
305
|
const tagCounts = new Map();
|
|
453
|
-
for (const entry of
|
|
306
|
+
for (const entry of entries) {
|
|
454
307
|
for (const tag of entry.tags) {
|
|
455
308
|
tagCounts.set(tag, (tagCounts.get(tag) ?? 0) + 1);
|
|
456
309
|
}
|
|
457
310
|
}
|
|
458
|
-
return
|
|
311
|
+
return { rows: entries.length, tagCounts, contents: entries.map((e) => e.content) };
|
|
459
312
|
}
|
|
460
313
|
function significantTokens(text) {
|
|
461
314
|
return new Set(text.toLowerCase().replace(/[^\w\s]/g, ' ').split(/\s+/).filter((t) => t.length > 3));
|
|
@@ -464,10 +317,10 @@ function significantTokens(text) {
|
|
|
464
317
|
export function schemaFitFrom(content, tags, source) {
|
|
465
318
|
const N = source.rows;
|
|
466
319
|
if (N === 0)
|
|
467
|
-
return
|
|
320
|
+
return DEFAULT_SCHEMA_FIT;
|
|
468
321
|
const tagFreq = source.tagCounts;
|
|
469
322
|
if (tags.length === 0 && tagFreq.size === 0)
|
|
470
|
-
return
|
|
323
|
+
return DEFAULT_SCHEMA_FIT;
|
|
471
324
|
// Tag overlap, weighted so a shared rare tag counts for more than a shared common one.
|
|
472
325
|
let weightedOverlap = 0;
|
|
473
326
|
let totalWeight = 0;
|
|
@@ -509,41 +362,25 @@ function inferValence(tags) {
|
|
|
509
362
|
return 'positive';
|
|
510
363
|
return 'neutral';
|
|
511
364
|
}
|
|
512
|
-
/**
|
|
513
|
-
*
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
* this returns the entries UNMUTATED - neutralizing all three strengthening
|
|
518
|
-
* sub-effects (clock reset, retrieval_count, half-life increment) at the
|
|
519
|
-
* single shared write site. The entries (not an empty array) must be
|
|
520
|
-
* returned because callers derive `last_retrieval_ids` from the return
|
|
521
|
-
* value, and a later `hippo outcome --good/--bad` targets those ids - an
|
|
522
|
-
* empty return would silently co-ablate the outcome channel in the
|
|
523
|
-
* strengthen-off arm. PERSISTENCE is gated separately at
|
|
524
|
-
* each persisting caller (CLI recall, api context, MCP recall/context,
|
|
525
|
-
* consolidation replay): writeEntry on identical rows still refreshes
|
|
526
|
-
* updated_at, rewrites mirrors, and marks DAG parents dirty,
|
|
527
|
-
* so those write loops skip under the flag.
|
|
528
|
-
* The default `now` honors HIPPO_FAKE_NOW (simulated-time protocols).
|
|
529
|
-
*/
|
|
530
|
-
// Confidence is deliberately absent below: it is an epistemic tier, not a
|
|
531
|
-
// recency signal, and a stored 'stale' is always a deliberate mark.
|
|
532
|
-
export function markRetrieved(entries, now = evalNow()) {
|
|
533
|
-
if (isRecallBoostAblated())
|
|
365
|
+
/** Returns copies with the retrieval count, clock and half-life updated; the caller persists them.
|
|
366
|
+
* Under HIPPO_ABLATE_RECALL_BOOST (eval-only) the entries come back unchanged, not empty, since callers derive last_retrieval_ids from them. */
|
|
367
|
+
export function markRetrieved(entries, now = evalNow(), options = {}) {
|
|
368
|
+
const ablation = options.ablation ?? NO_STRENGTH_ABLATION;
|
|
369
|
+
if (ablation.recallBoost)
|
|
534
370
|
return entries;
|
|
535
371
|
return entries.map((e) => {
|
|
536
372
|
if (e.superseded_by)
|
|
537
373
|
return e;
|
|
538
|
-
const wrong = netWrong(e) > 0;
|
|
374
|
+
const wrong = netWrong(e, ablation) > 0;
|
|
375
|
+
// Confidence stays untouched: it is an epistemic tier, not a recency signal.
|
|
539
376
|
const updated = {
|
|
540
377
|
...e,
|
|
541
378
|
retrieval_count: e.retrieval_count + 1,
|
|
379
|
+
// A wrong memory keeps both, since last_retrieved is the decay anchor.
|
|
542
380
|
last_retrieved: wrong ? e.last_retrieved : now.toISOString(),
|
|
543
|
-
|
|
544
|
-
half_life_days: wrong ? e.half_life_days : e.half_life_days + 2,
|
|
381
|
+
half_life_days: wrong ? e.half_life_days : e.half_life_days + RETRIEVAL_HALF_LIFE_GAIN_DAYS,
|
|
545
382
|
};
|
|
546
|
-
updated.strength = calculateStrength(updated, now);
|
|
383
|
+
updated.strength = calculateStrength(updated, now, { ablation });
|
|
547
384
|
return updated;
|
|
548
385
|
});
|
|
549
386
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type MemoryEntry } from '
|
|
1
|
+
import { type MemoryEntry } from './memory.js';
|
|
2
2
|
/** The row that replaces a merged row once its retired texts leave: undefined when it holds none, null when nothing else is left. */
|
|
3
3
|
export declare function mergedSuccessor(row: MemoryEntry, retired: (text: string) => boolean, retiredIds: ReadonlySet<string>): MemoryEntry | null | undefined;
|
|
4
4
|
/** Sleep's check on a merged row: drops texts whose source was superseded since the merge, or that a rejection now covers. */
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// A sleep-merged row copies its sources' texts, so retiring a text (reject, or superseding its source) must reach the row too.
|
|
2
|
-
// SHORTCUT: reject rewrites merged rows at once, live and dormant; supersede and `resolve
|
|
3
|
-
|
|
2
|
+
// SHORTCUT: reject rewrites merged rows at once, live and dormant; supersede and `resolve
|
|
3
|
+
// --reject-loser` wait for the next sleep's check, which sees a dormant row only once restored.
|
|
4
|
+
import { generateId } from './memory.js';
|
|
4
5
|
import { duplicateKey, heldTexts, mergedText } from '../util/same-text.js';
|
|
5
6
|
/** The row that replaces a merged row once its retired texts leave: undefined when it holds none, null when nothing else is left. */
|
|
6
7
|
export function mergedSuccessor(row, retired, retiredIds) {
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
import { fileURLToPath } from 'url';
|
|
3
|
+
/** The package folder: it holds package.json, bin/ and dist-ui/. The same two steps up from src/core and from dist/core. */
|
|
4
|
+
export const PACKAGE_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..');
|
|
5
|
+
//# sourceMappingURL=package-root.js.map
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Physics engine configuration for Hippo memory-as-physics.
|
|
3
|
-
* All constants are tunable; defaults calibrated for ~500 memory corpus.
|
|
4
|
-
*/
|
|
1
|
+
/** Physics engine configuration for Hippo memory-as-physics. All constants are tunable; defaults calibrated for ~500 memory corpus. */
|
|
5
2
|
export interface PhysicsConfig {
|
|
6
3
|
/** Use physics scoring when embeddings available. 'auto' = yes if embeddings exist. */
|
|
7
4
|
enabled: boolean | 'auto';
|
|
@@ -1,12 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Physics engine configuration for Hippo memory-as-physics.
|
|
3
|
-
* All constants are tunable; defaults calibrated for ~500 memory corpus.
|
|
4
|
-
*/
|
|
1
|
+
/** Physics engine configuration for Hippo memory-as-physics. All constants are tunable; defaults calibrated for ~500 memory corpus. */
|
|
5
2
|
export const DEFAULT_PHYSICS_CONFIG = {
|
|
6
|
-
// Off by default: the paired ablation (benchmarks/physics-ablation/) found
|
|
7
|
-
//
|
|
8
|
-
// (MRR 0.68 vs 0.84, R@5 74% vs 84%). Opt in with physics.enabled 'auto'
|
|
9
|
-
// or true.
|
|
3
|
+
// Off by default: the paired ablation (benchmarks/physics-ablation/) found physics worse than classic hybrid on every metric, CI excluding zero
|
|
4
|
+
// (MRR 0.68 vs 0.84, R@5 74% vs 84%). Opt in with physics.enabled 'auto' or true.
|
|
10
5
|
enabled: false,
|
|
11
6
|
G_query: 2.0,
|
|
12
7
|
G_memory: 0.01,
|