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
|
@@ -1,23 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
* computeMvFeatures mirrors benchmarks/memory-value/extract.mjs's
|
|
6
|
-
* computeFeatures for the 8 live dims the fitter optimized over
|
|
7
|
-
* (FIT_DIMS) — the only dims MEMORY_VALUE_WEIGHTS carries a weight for.
|
|
8
|
-
* Any future edit to either side must keep them byte-equivalent; the parity
|
|
9
|
-
* test in tests/memory-value-wiring.test.ts enforces this.
|
|
10
|
-
*
|
|
11
|
-
* scoreEntries mirrors benchmarks/memory-value/evaluate.mjs's per-store
|
|
12
|
-
* min-max normalization + weighted scorer (no additional orientation
|
|
13
|
-
* multiply — the frozen weights already encode sign/orientation).
|
|
14
|
-
*
|
|
15
|
-
* rescueSet implements rescue-only semantics: a condemned entry is
|
|
16
|
-
* rescued iff its learned score ranks in the top 30% (RESCUE_BUDGET, the
|
|
17
|
-
* measured keep-budget operating point) of its own tenant's non-pinned
|
|
18
|
-
* candidate set. Deletes(flag-on) subset Deletes(flag-off) by construction — this
|
|
19
|
-
* function can only ever shrink the condemned set, never grow it.
|
|
20
|
-
*/
|
|
1
|
+
/** Learned memory-value scorer, a rescue-only veto in the sleep decay pass (it can only shrink the condemned set); mirrors benchmarks/memory-value/*.mjs.
|
|
2
|
+
* rescueSet rescues a condemned entry iff it ranks in the top 30% (RESCUE_BUDGET) of its tenant's non-pinned set; memory-value-wiring.test.ts guards parity. */
|
|
3
|
+
import { DEFAULT_TENANT_ID } from '../util/env.js';
|
|
4
|
+
import { strengthAblation } from '../core/ablation.js';
|
|
21
5
|
import { calculateStrength } from '../core/memory.js';
|
|
22
6
|
import { compareEntryIdentity } from '../core/compare.js';
|
|
23
7
|
import { MEMORY_VALUE_WEIGHTS, SOURCE_ARTIFACT_SHA256 } from './memory-value-weights.js';
|
|
@@ -36,32 +20,11 @@ export const MV_FEATURE_NAMES = [
|
|
|
36
20
|
/** The keep-budget operating point (the only point with measured
|
|
37
21
|
* evidence): a code constant tied to that evidence, not user-tunable. */
|
|
38
22
|
const RESCUE_BUDGET = 0.3;
|
|
39
|
-
/**
|
|
40
|
-
*
|
|
41
|
-
* size, a rank statistic is noise (the measured evidence says nothing about
|
|
42
|
-
* tiny scale), and the floor prevents immortal-entry
|
|
43
|
-
* convergence: keepN=ceil(0.3*N) guarantees >=1 rescue at N=1, so without a
|
|
44
|
-
* floor a condemned-only 1-entry tenant would be rescued every single sleep
|
|
45
|
-
* forever. A condemned-only tenant below the floor instead drains normally
|
|
46
|
-
* as entries are deleted: the surviving rescued subset only ever shrinks
|
|
47
|
-
* toward 0, never regrows past 10 to regain eligibility on its own. Code
|
|
48
|
-
* constant tied to that reasoning, not user-tunable (same posture as
|
|
49
|
-
* RESCUE_BUDGET).
|
|
50
|
-
*/
|
|
23
|
+
/** Per-tenant floor on the non-pinned candidate set: below it ranks are noise, and keepN=ceil(0.3*N) would rescue a 1-entry tenant's entry every sleep forever.
|
|
24
|
+
* A code constant tied to that reasoning, not user-tunable (like RESCUE_BUDGET). */
|
|
51
25
|
const MIN_RESCUE_GROUP = 10;
|
|
52
|
-
/**
|
|
53
|
-
*
|
|
54
|
-
* frozen weights carry (mirrors extract.mjs's computeFeatures).
|
|
55
|
-
*
|
|
56
|
-
* CRITICAL: `strength` is CLOCK-BASIS `calculateStrength(entry, now)` with
|
|
57
|
-
* NO DecayOptions — that is how the frozen weights' training features were
|
|
58
|
-
* computed (extract.mjs never passes decayOpts). Passing the production
|
|
59
|
-
* decay basis (config.decayBasis via consolidate.ts's decayOpts) into this
|
|
60
|
-
* feature would silently break parity with the frozen weight vector. This
|
|
61
|
-
* is an intentional divergence from the condemnation TRIGGER in
|
|
62
|
-
* consolidate.ts, which keeps using decayOpts as today — only the rescue
|
|
63
|
-
* FEATURE is clock-basis.
|
|
64
|
-
*/
|
|
26
|
+
/** Blind v1 feature dict for one entry, restricted to the 8 dims the frozen weights carry. `strength` is CLOCK-BASIS `calculateStrength(entry, now)` with no
|
|
27
|
+
* DecayOptions, as in the weights' training; passing the production decay basis would silently break parity with the frozen weights. */
|
|
65
28
|
export function computeMvFeatures(entry, now) {
|
|
66
29
|
const ageDays = (now.getTime() - Date.parse(entry.created)) / DAY_MS;
|
|
67
30
|
const pos = entry.outcome_positive ?? 0;
|
|
@@ -69,7 +32,7 @@ export function computeMvFeatures(entry, now) {
|
|
|
69
32
|
return {
|
|
70
33
|
age_days: ageDays,
|
|
71
34
|
half_life_days: entry.half_life_days,
|
|
72
|
-
strength: calculateStrength(entry, now), // clock-basis, never
|
|
35
|
+
strength: calculateStrength(entry, now, { ablation: strengthAblation() }), // clock-basis, never the production decay basis — see doc comment above
|
|
73
36
|
retrieval_count: entry.retrieval_count,
|
|
74
37
|
outcome_positive: pos,
|
|
75
38
|
outcome_negative: neg,
|
|
@@ -77,16 +40,8 @@ export function computeMvFeatures(entry, now) {
|
|
|
77
40
|
content_length: entry.content.length,
|
|
78
41
|
};
|
|
79
42
|
}
|
|
80
|
-
/**
|
|
81
|
-
*
|
|
82
|
-
* non-finite weight value, or a missing source digest. Flag-on + a broken
|
|
83
|
-
* constant must THROW, never silently behave as flag-off.
|
|
84
|
-
*
|
|
85
|
-
* Parameterized (defaults to the real frozen singleton) so the throw
|
|
86
|
-
* conditions are directly unit-testable without mutating the frozen
|
|
87
|
-
* MEMORY_VALUE_WEIGHTS export — mirrors fit.mjs's verifyFrozenWeights
|
|
88
|
-
* (see tests/memory-value-fit.test.ts's `describe('verifyFrozenWeights')`).
|
|
89
|
-
*/
|
|
43
|
+
/** Throws on a malformed weight constant (wrong dims, non-finite weight, missing digest): flag-on with a broken constant must throw, never act as flag-off.
|
|
44
|
+
* Parameterized (default: the frozen singleton) so the throw paths are unit-testable. */
|
|
90
45
|
function isFiniteWeightValue(value) {
|
|
91
46
|
return typeof value === 'number' && Number.isFinite(value);
|
|
92
47
|
}
|
|
@@ -105,25 +60,8 @@ export function validateWeights(weights = MEMORY_VALUE_WEIGHTS, digest = SOURCE_
|
|
|
105
60
|
throw new Error('memory-value: weights constant is malformed — SOURCE_ARTIFACT_SHA256 digest missing (src/consolidate/memory-value-weights.ts)');
|
|
106
61
|
}
|
|
107
62
|
}
|
|
108
|
-
/**
|
|
109
|
-
*
|
|
110
|
-
* (constant feature -> 0, matching evaluate.mjs), then score = dot(weights,
|
|
111
|
-
* normalized). The normalization context is exactly the entries passed in —
|
|
112
|
-
* callers control the bounded scope (per-tenant, non-pinned).
|
|
113
|
-
*
|
|
114
|
-
* `weights` defaults to the real frozen singleton; parameterized (like
|
|
115
|
-
* validateWeights) so callers/tests can score against an explicit vector
|
|
116
|
-
* without touching the module singleton.
|
|
117
|
-
*
|
|
118
|
-
* Non-finite features: Date.parse on a malformed `created`
|
|
119
|
-
* string yields NaN, and NaN would silently corrupt every OTHER entry's
|
|
120
|
-
* min-max in the same group. An entry with ANY non-finite computed feature
|
|
121
|
-
* is excluded from the normalization context entirely (its raw values never
|
|
122
|
-
* touch min/max) and always scores -Infinity — the lowest possible score, so
|
|
123
|
-
* it sorts to the bottom of its tenant deterministically and (via rescueSet's
|
|
124
|
-
* explicit finite-score guard below) can never be rescued. Conservative
|
|
125
|
-
* direction: deletes(flag-on) subset deletes(flag-off) still holds.
|
|
126
|
-
*/
|
|
63
|
+
/** Min-max normalize the 8 features over the given entries (constant -> 0), then score = dot(weights, normalized); callers set the scope.
|
|
64
|
+
* An entry with any non-finite feature (NaN from a malformed `created`) is excluded from normalization and scores -Infinity, so it can never be rescued. */
|
|
127
65
|
export function scoreEntries(entries, now, weights = MEMORY_VALUE_WEIGHTS) {
|
|
128
66
|
const raw = new Map();
|
|
129
67
|
for (const e of entries)
|
|
@@ -166,17 +104,8 @@ export function scoreEntries(entries, now, weights = MEMORY_VALUE_WEIGHTS) {
|
|
|
166
104
|
}
|
|
167
105
|
return scores;
|
|
168
106
|
}
|
|
169
|
-
/**
|
|
170
|
-
*
|
|
171
|
-
* group independently, and returns per-entry rank context for every
|
|
172
|
-
* non-pinned entry (not just condemned ones) — the shared basis for both
|
|
173
|
-
* rescueSet's rescue decision and consolidate.ts's audit-row rank context,
|
|
174
|
-
* so the two never compute the ranking differently.
|
|
175
|
-
*
|
|
176
|
-
* `weights`/`digest` default to the real frozen singleton — parameterized
|
|
177
|
-
* (like validateWeights/scoreEntries) purely for direct unit-testability of
|
|
178
|
-
* the fail-loud path, never overridden by production callers.
|
|
179
|
-
*/
|
|
107
|
+
/** Group non-pinned entries by tenantId, score and rank each group independently, and return rank context for every non-pinned entry;
|
|
108
|
+
* rescueSet and the consolidate audit rows share it so they never compute the ranking differently. */
|
|
180
109
|
export function rankNonPinnedByTenant(entries, now, weights = MEMORY_VALUE_WEIGHTS, digest = SOURCE_ARTIFACT_SHA256) {
|
|
181
110
|
validateWeights(weights, digest);
|
|
182
111
|
const byTenant = new Map();
|
|
@@ -185,7 +114,7 @@ export function rankNonPinnedByTenant(entries, now, weights = MEMORY_VALUE_WEIGH
|
|
|
185
114
|
continue; // pinned entries never compete for rescue (never condemned)
|
|
186
115
|
// Default an undefined tenantId as dag.ts:341 does: a raw/legacy row can carry one at runtime,
|
|
187
116
|
// and keying it "undefined" would split it into its own singleton tenant.
|
|
188
|
-
const tenantId = e.tenantId ??
|
|
117
|
+
const tenantId = e.tenantId ?? DEFAULT_TENANT_ID;
|
|
189
118
|
const list = byTenant.get(tenantId);
|
|
190
119
|
if (list)
|
|
191
120
|
list.push(e);
|
|
@@ -217,24 +146,8 @@ export function rankNonPinnedByTenant(entries, now, weights = MEMORY_VALUE_WEIGH
|
|
|
217
146
|
}
|
|
218
147
|
return result;
|
|
219
148
|
}
|
|
220
|
-
/**
|
|
221
|
-
*
|
|
222
|
-
* 30% of its tenant's non-pinned candidate set by learned score. Returns the
|
|
223
|
-
* subset of condemnedIds that are rescued — the caller filters commits
|
|
224
|
-
* (rescued -> survivors) and threads the same set into detectConflicts.
|
|
225
|
-
*
|
|
226
|
-
* `weights`/`digest` default to the real frozen singleton; production
|
|
227
|
-
* callers (consolidate.ts) never pass overrides — the params exist purely so
|
|
228
|
-
* "flag on + a broken constant throws" is directly testable end-to-end
|
|
229
|
-
* through this function without mutating the frozen module singleton.
|
|
230
|
-
*
|
|
231
|
-
* `precomputedRanks`: when the caller has already
|
|
232
|
-
* computed the per-tenant ranking (e.g. consolidate.ts needs it separately
|
|
233
|
-
* for detail/audit rank context), pass it here to skip the internal
|
|
234
|
-
* rankNonPinnedByTenant call — the whole-store ranking pass then runs
|
|
235
|
-
* exactly once per sleep instead of twice. Omitted (the default), rescueSet
|
|
236
|
-
* computes it internally as before — existing callers/tests are unaffected.
|
|
237
|
-
*/
|
|
149
|
+
/** Rescue decision: the subset of condemnedIds ranking in the top 30% of their tenant's non-pinned set by learned score.
|
|
150
|
+
* Pass `precomputedRanks` to skip the internal ranking so the whole-store pass runs once per sleep; `weights`/`digest` overrides exist for tests only. */
|
|
238
151
|
export function rescueSet(entries, condemnedIds, now, options = {}) {
|
|
239
152
|
const { weights = MEMORY_VALUE_WEIGHTS, digest = SOURCE_ARTIFACT_SHA256, precomputedRanks } = options;
|
|
240
153
|
validateWeights(weights, digest); // fail loud before any rescue computation
|
|
@@ -3,10 +3,10 @@ import { tokenize } from '../util/tokenize.js';
|
|
|
3
3
|
import { jaccardMinShared, overlapPartners } from './overlap-index.js';
|
|
4
4
|
import { compareEntryIdentity } from '../core/compare.js';
|
|
5
5
|
import { duplicateKey, mergedText } from '../util/same-text.js';
|
|
6
|
-
import { successorAfterRetirement } from '
|
|
6
|
+
import { successorAfterRetirement } from '../core/merged-row.js';
|
|
7
7
|
import { rejectionDigest } from '../store/rejection.js';
|
|
8
8
|
import { reportAuditWriteFailure } from '../store/audit.js';
|
|
9
|
-
import { derivationScope, derivationPartitionKey } from '../
|
|
9
|
+
import { derivationScope, derivationPartitionKey } from '../core/recall-scope.js';
|
|
10
10
|
import { jaccardSets } from './conflicts.js';
|
|
11
11
|
import { keptAsWritten } from './run.js';
|
|
12
12
|
import { isReusable } from '../core/memory-quality.js';
|
|
@@ -14,11 +14,8 @@ const MERGE_OVERLAP_THRESHOLD = 0.35; // Jaccard similarity for "related"
|
|
|
14
14
|
const MERGE_MIN_CLUSTER = 2; // minimum cluster size to merge
|
|
15
15
|
const MERGE_MAX_SOURCES = 5; // with MERGE_MAX_CHARS, keeps a merged row near 500 tokens, a third of the 1,500-token context budget
|
|
16
16
|
const MERGE_MAX_CHARS = 2000; // total source text; sources past either cap stay unmerged and keep their half-life
|
|
17
|
-
// Half-life scale for merged source episodics.
|
|
18
|
-
//
|
|
19
|
-
// last_retrieved/half_life and never reads the stored strength field, so a
|
|
20
|
-
// stored-strength write is inert for ranking and gets overwritten by the
|
|
21
|
-
// next sleep's decay pass anyway.
|
|
17
|
+
// Half-life scale for merged source episodics. Demote via half_life_days: calculateStrength() recomputes live strength and never reads the stored field,
|
|
18
|
+
// so a stored-strength write is inert for ranking and overwritten by the next decay pass.
|
|
22
19
|
const MERGE_SOURCE_HALF_LIFE_FACTOR = 0.3;
|
|
23
20
|
export function retireHeldTexts(run) {
|
|
24
21
|
const { survivors } = run;
|
|
@@ -63,9 +60,7 @@ function partitionMergeCandidates(survivors) {
|
|
|
63
60
|
}
|
|
64
61
|
return mergeCandidatesByTenant;
|
|
65
62
|
}
|
|
66
|
-
// -------------------------------------------------------------------------
|
|
67
63
|
// 3. Merge pass - episodic entries only
|
|
68
|
-
// -------------------------------------------------------------------------
|
|
69
64
|
/** Returns how many clusters were skipped because their merged text matches a rejected value. */
|
|
70
65
|
export function mergePass(run) {
|
|
71
66
|
const used = new Set();
|
|
@@ -123,16 +118,8 @@ function mergeCluster(run, partition, cluster, related, used) {
|
|
|
123
118
|
run.pendingWrites.push(semantic);
|
|
124
119
|
run.units.push([semantic.id, ...cluster.map((e) => e.id)]);
|
|
125
120
|
result.semanticCreated++;
|
|
126
|
-
//
|
|
127
|
-
//
|
|
128
|
-
// Immediate ranking is deliberately unchanged: dropping children below a
|
|
129
|
-
// worse-retrieving summary regresses budget-bounded QA. The stored
|
|
130
|
-
// strength is refreshed to the live value so inspect, replay sampling,
|
|
131
|
-
// and strength-sorted assembly see the truth instead of a fake 0.3.
|
|
132
|
-
// Mutate in place (not a copy): `cluster` holds the same object
|
|
133
|
-
// references as `survivors`, and the later detectConflicts(survivors)
|
|
134
|
-
// pass in this same run must see the post-demotion half-life, or it
|
|
135
|
-
// can persist conflicts for entries the just-written state excludes.
|
|
121
|
+
// Scale half_life_days so merged sources decay sooner but stay recoverable; ranking is unchanged on purpose (demoting children regresses QA).
|
|
122
|
+
// Mutate in place: `cluster` shares references with `survivors`, and the later detectConflicts(survivors) must see the post-demotion half-life.
|
|
136
123
|
demoteMergedSources(run, cluster);
|
|
137
124
|
}
|
|
138
125
|
return true;
|
|
@@ -163,14 +150,8 @@ function demoteMergedSources(run, cluster) {
|
|
|
163
150
|
run.pendingWrites.push(e);
|
|
164
151
|
}
|
|
165
152
|
}
|
|
166
|
-
// mergeContents is
|
|
167
|
-
//
|
|
168
|
-
// unguarded sleep would regenerate it every cycle and
|
|
169
|
-
// batchWriteAndDelete's guard bypass (store.ts) would silently
|
|
170
|
-
// re-assert it forever. This producer-side check is what makes that
|
|
171
|
-
// bypass safe. A hit skips the WHOLE cluster: sources stay unmerged —
|
|
172
|
-
// not demoted, not deleted — so a later sleep gets another chance if
|
|
173
|
-
// the tombstone is lifted.
|
|
153
|
+
// mergeContents is deterministic, so a rollup a human already rejected would regenerate each cycle and batchWriteAndDelete's guard bypass would re-assert it;
|
|
154
|
+
// this producer-side check makes that bypass safe. A hit skips the whole cluster (no demote, no delete) so a later sleep can retry.
|
|
174
155
|
function mergeRejected(run, semantic, cluster, related, used) {
|
|
175
156
|
const { tombstones } = run;
|
|
176
157
|
const newDigest = rejectionDigest(semantic.content);
|
|
@@ -180,9 +161,7 @@ function mergeRejected(run, semantic, cluster, related, used) {
|
|
|
180
161
|
const mergeDigest = newHit ? newDigest : oldDigest;
|
|
181
162
|
if (!tombstone)
|
|
182
163
|
return false;
|
|
183
|
-
// Still mark used
|
|
184
|
-
// DIFFERENT cluster within this same pass; next sleep re-clusters
|
|
185
|
-
// them fresh.
|
|
164
|
+
// Still mark used: these members are not re-tried against a different cluster in this pass; the next sleep re-clusters them fresh.
|
|
186
165
|
const rejected = newHit ? cluster : related; // the old format digested the uncapped list, so rows past the cap were rejected too
|
|
187
166
|
for (const e of rejected)
|
|
188
167
|
used.add(e.id);
|
|
@@ -203,9 +182,7 @@ function mergeRejected(run, semantic, cluster, related, used) {
|
|
|
203
182
|
}
|
|
204
183
|
return true;
|
|
205
184
|
}
|
|
206
|
-
// ---------------------------------------------------------------------------
|
|
207
185
|
// Helpers
|
|
208
|
-
// ---------------------------------------------------------------------------
|
|
209
186
|
function mergeContents(entries) {
|
|
210
187
|
// Each distinct text goes in once and in full (the merge demotes every source), one bullet with its lines indented, so heldTextKeys can read it back.
|
|
211
188
|
// Newest first says which version is current; compareEntryIdentity settles ties, so the row and its rejection digest depend only on the sources.
|
|
@@ -215,7 +192,9 @@ function mergeContents(entries) {
|
|
|
215
192
|
if (!texts.has(duplicateKey(e.content)))
|
|
216
193
|
texts.set(duplicateKey(e.content), e.content);
|
|
217
194
|
}
|
|
218
|
-
const header = entries.length === 2
|
|
195
|
+
const header = entries.length === 2
|
|
196
|
+
? '[Consolidated from 2 related memories, newest first]'
|
|
197
|
+
: `[Consolidated pattern from ${entries.length} related memories, newest first]`;
|
|
219
198
|
return mergedText(header, [...texts.values()]);
|
|
220
199
|
}
|
|
221
200
|
function legacyMergeContents(entries) {
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import { type PhysicsParticle } from '../core/physics.js';
|
|
2
|
+
import type { MemoryEntry } from '../core/memory.js';
|
|
1
3
|
import type { SleepRun } from './run.js';
|
|
2
|
-
export declare function physicsPass(run: SleepRun): void;
|
|
4
|
+
export declare function physicsPass(run: SleepRun, maxParticles?: number): void;
|
|
5
|
+
/** Every stored particle in load order up to the cap; past it, the most recently recalled survivors (memory id breaks ties),
|
|
6
|
+
* then particles with no survivor. */
|
|
7
|
+
export declare function particlesToSimulate(stored: PhysicsParticle[], entries: ReadonlyMap<string, MemoryEntry>, max?: number): PhysicsParticle[];
|
|
3
8
|
//# sourceMappingURL=physics-pass.d.ts.map
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { refreshParticleProperties } from '../db/physics-state.js';
|
|
2
|
-
import { loadStoredParticles, saveStoredParticles } from '../store/vector-
|
|
2
|
+
import { loadStoredParticles, saveStoredParticles } from '../store/vector-index.js';
|
|
3
3
|
import { simulate } from '../core/physics.js';
|
|
4
4
|
import { errorMessage } from '../util/log.js';
|
|
5
5
|
const STATS_DECIMALS = 4;
|
|
6
|
-
//
|
|
6
|
+
// Every substep is all-pairs, so one sleep moves at most this many particles; the rest keep their stored state until they are recalled.
|
|
7
|
+
const SLEEP_PHYSICS_MAX_PARTICLES = 1000;
|
|
7
8
|
// 2. Physics simulation pass
|
|
8
|
-
|
|
9
|
-
export function physicsPass(run) {
|
|
9
|
+
export function physicsPass(run, maxParticles = SLEEP_PHYSICS_MAX_PARTICLES) {
|
|
10
10
|
if (run.dryRun)
|
|
11
11
|
return;
|
|
12
12
|
const { config, result } = run;
|
|
@@ -14,27 +14,45 @@ export function physicsPass(run) {
|
|
|
14
14
|
const physicsEnabled = config.physics.enabled === true
|
|
15
15
|
|| (config.physics.enabled === 'auto');
|
|
16
16
|
if (physicsEnabled)
|
|
17
|
-
simulateStoredParticles(run);
|
|
17
|
+
simulateStoredParticles(run, maxParticles);
|
|
18
18
|
}
|
|
19
19
|
catch (error) {
|
|
20
20
|
result.details.push(` ⚠️ physics simulation skipped: ${errorMessage(error)}`);
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
|
-
function simulateStoredParticles(run) {
|
|
23
|
+
function simulateStoredParticles(run, maxParticles) {
|
|
24
24
|
const { result, survivors } = run;
|
|
25
|
-
const
|
|
26
|
-
if (
|
|
25
|
+
const stored = loadStoredParticles(run.hippoRoot);
|
|
26
|
+
if (stored.length === 0)
|
|
27
27
|
return;
|
|
28
28
|
// Build entry lookup for property refresh
|
|
29
29
|
const entryMap = new Map(survivors.map(e => [e.id, e]));
|
|
30
|
+
const particles = particlesToSimulate(stored, entryMap, maxParticles);
|
|
30
31
|
refreshParticleProperties(particles, entryMap, run.now);
|
|
31
32
|
const stats = simulate(particles, survivorForces(run));
|
|
32
33
|
saveStoredParticles(run.hippoRoot, particles);
|
|
33
34
|
result.physicsSimulated = stats.particleCount;
|
|
34
|
-
|
|
35
|
+
const capped = particles.length < stored.length ? ` (the ${particles.length} most recently recalled of ${stored.length})` : '';
|
|
36
|
+
result.details.push(` ⚛️ physics: ${stats.particleCount} particles${capped}, ` +
|
|
35
37
|
`avg vel ${stats.avgVelocityMagnitude.toFixed(STATS_DECIMALS)}, ` +
|
|
36
38
|
`energy ${stats.energy.total.toFixed(STATS_DECIMALS)}`);
|
|
37
39
|
}
|
|
40
|
+
/** Every stored particle in load order up to the cap; past it, the most recently recalled survivors (memory id breaks ties),
|
|
41
|
+
* then particles with no survivor. */
|
|
42
|
+
export function particlesToSimulate(stored, entries, max = SLEEP_PHYSICS_MAX_PARTICLES) {
|
|
43
|
+
if (stored.length <= max)
|
|
44
|
+
return stored;
|
|
45
|
+
const recalled = (p) => entries.get(p.memoryId)?.last_retrieved ?? '';
|
|
46
|
+
const ranked = [...stored].sort((a, b) => {
|
|
47
|
+
const [ra, rb] = [recalled(a), recalled(b)];
|
|
48
|
+
if (ra !== rb)
|
|
49
|
+
return ra < rb ? 1 : -1;
|
|
50
|
+
return a.memoryId < b.memoryId ? -1 : a.memoryId > b.memoryId ? 1 : 0;
|
|
51
|
+
});
|
|
52
|
+
const kept = new Set(ranked.slice(0, max));
|
|
53
|
+
// Load order, not rank order: the force sums run in this order, so a capped run matches an uncapped one over the same set.
|
|
54
|
+
return stored.filter((p) => kept.has(p));
|
|
55
|
+
}
|
|
38
56
|
function survivorForces(run) {
|
|
39
57
|
// Build conflict pairs from survivors
|
|
40
58
|
const conflictPairs = new Map();
|
|
@@ -1,41 +1,9 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Hippocampal replay is internally-driven reactivation of memories during
|
|
5
|
-
* slow-wave sleep: the brain picks important recent experiences and "plays
|
|
6
|
-
* them back" without external input, strengthening them before they decay.
|
|
7
|
-
* In McClelland's complementary-learning-systems framing, replay is also
|
|
8
|
-
* how episodic memories train the neocortex (interleaved rehearsal); in
|
|
9
|
-
* reward-modulated STDP, replay is gated by dopamine so rewarded
|
|
10
|
-
* experiences get preferentially consolidated.
|
|
11
|
-
*
|
|
12
|
-
* This module implements a lightweight, deterministic analog. During each
|
|
13
|
-
* `hippo sleep`, we sample N surviving memories by a priority score that
|
|
14
|
-
* weighs reward feedback, emotional valence, under-rehearsal, and age —
|
|
15
|
-
* then apply the same retrieval-strengthening dynamics `markRetrieved`
|
|
16
|
-
* applies to real queries. The effect is that important memories stay
|
|
17
|
-
* strong even when the user hasn't explicitly queried them recently.
|
|
18
|
-
*
|
|
19
|
-
* Distinct from the other consolidation passes:
|
|
20
|
-
* - decay: removes what's too weak
|
|
21
|
-
* - physics: moves particles in embedding space
|
|
22
|
-
* - merge: collapses near-duplicate episodics into semantics
|
|
23
|
-
* - REPLAY: picks winners and rehearses them (this file)
|
|
24
|
-
*/
|
|
1
|
+
/** Replay: during `hippo sleep`, sample N survivors weighted by reward, valence, under-rehearsal and age, then apply the `markRetrieved` strengthening.
|
|
2
|
+
* A lightweight deterministic analog of hippocampal replay, so important memories stay strong without being queried; distinct from decay, physics and merge. */
|
|
25
3
|
import { type MemoryEntry } from '../core/memory.js';
|
|
26
|
-
/**
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
*/
|
|
30
|
-
export declare function replayPriority(entry: MemoryEntry, now: Date): number;
|
|
31
|
-
/**
|
|
32
|
-
* Pick `count` memories for replay, weighted by `replayPriority`, without
|
|
33
|
-
* replacement. Deterministic given the same seed.
|
|
34
|
-
*
|
|
35
|
-
* The sampler is weighted but not greedy — picking by priority alone would
|
|
36
|
-
* always pick the top-N, which overfits. Biological replay shows both
|
|
37
|
-
* preferential-for-reward AND stochastic-exploration characteristics; we
|
|
38
|
-
* keep the stochastic element so adjacent survivors aren't always ignored.
|
|
39
|
-
*/
|
|
4
|
+
/** Priority score for ranking survivors for replay (higher = more likely sampled); pure in the entry and current time. */
|
|
5
|
+
export declare function replayPriority(entry: MemoryEntry, now: Date, outcomeAblated: boolean): number;
|
|
6
|
+
/** Pick `count` memories for replay, weighted by `replayPriority`, without replacement; deterministic for a seed.
|
|
7
|
+
* Weighted but not greedy: always taking the top-N overfits, so a stochastic element keeps adjacent survivors in play. */
|
|
40
8
|
export declare function sampleForReplay(survivors: MemoryEntry[], count: number, now: Date, seed?: number): MemoryEntry[];
|
|
41
9
|
//# sourceMappingURL=replay.d.ts.map
|
|
@@ -1,27 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
|
|
4
|
-
* Hippocampal replay is internally-driven reactivation of memories during
|
|
5
|
-
* slow-wave sleep: the brain picks important recent experiences and "plays
|
|
6
|
-
* them back" without external input, strengthening them before they decay.
|
|
7
|
-
* In McClelland's complementary-learning-systems framing, replay is also
|
|
8
|
-
* how episodic memories train the neocortex (interleaved rehearsal); in
|
|
9
|
-
* reward-modulated STDP, replay is gated by dopamine so rewarded
|
|
10
|
-
* experiences get preferentially consolidated.
|
|
11
|
-
*
|
|
12
|
-
* This module implements a lightweight, deterministic analog. During each
|
|
13
|
-
* `hippo sleep`, we sample N surviving memories by a priority score that
|
|
14
|
-
* weighs reward feedback, emotional valence, under-rehearsal, and age —
|
|
15
|
-
* then apply the same retrieval-strengthening dynamics `markRetrieved`
|
|
16
|
-
* applies to real queries. The effect is that important memories stay
|
|
17
|
-
* strong even when the user hasn't explicitly queried them recently.
|
|
18
|
-
*
|
|
19
|
-
* Distinct from the other consolidation passes:
|
|
20
|
-
* - decay: removes what's too weak
|
|
21
|
-
* - physics: moves particles in embedding space
|
|
22
|
-
* - merge: collapses near-duplicate episodics into semantics
|
|
23
|
-
* - REPLAY: picks winners and rehearses them (this file)
|
|
24
|
-
*/
|
|
1
|
+
/** Replay: during `hippo sleep`, sample N survivors weighted by reward, valence, under-rehearsal and age, then apply the `markRetrieved` strengthening.
|
|
2
|
+
* A lightweight deterministic analog of hippocampal replay, so important memories stay strong without being queried; distinct from decay, physics and merge. */
|
|
3
|
+
import { HOUR_MS } from '../util/time.js';
|
|
25
4
|
import { isOutcomeSlowAblated } from '../core/ablation.js';
|
|
26
5
|
import { resolveConfidence } from '../core/memory.js';
|
|
27
6
|
const VALENCE_WEIGHT = {
|
|
@@ -30,38 +9,35 @@ const VALENCE_WEIGHT = {
|
|
|
30
9
|
negative: 1.5,
|
|
31
10
|
critical: 2.0,
|
|
32
11
|
};
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
12
|
+
// Floor keeps every weight positive for sampleForReplay; the rest scale reward and idle boosts.
|
|
13
|
+
const REWARD_FLOOR = 0.1;
|
|
14
|
+
const REWARD_POSITIVE_GAIN = 0.5;
|
|
15
|
+
const REWARD_NET_GAIN = 0.25;
|
|
16
|
+
const IDLE_BOOST_GAIN = 0.1;
|
|
17
|
+
const STRENGTH_FLOOR = 0.1;
|
|
18
|
+
/** Priority score for ranking survivors for replay (higher = more likely sampled); pure in the entry and current time. */
|
|
19
|
+
export function replayPriority(entry, now, outcomeAblated) {
|
|
38
20
|
const pos = entry.outcome_positive ?? 0;
|
|
39
21
|
const neg = entry.outcome_negative ?? 0;
|
|
40
|
-
// Reward signal: neutral
|
|
41
|
-
//
|
|
42
|
-
|
|
43
|
-
// because sampleForReplay depends on all weights being positive.
|
|
44
|
-
const rewardSignal = isOutcomeSlowAblated()
|
|
22
|
+
// Reward signal: neutral = 1, strongly rewarded > 1, negative-dominated floors at 0.1 (still eligible, just unlikely).
|
|
23
|
+
// The clamp is required because sampleForReplay needs all weights positive.
|
|
24
|
+
const rewardSignal = outcomeAblated
|
|
45
25
|
? 1.0 // EVAL-ONLY ablation (see ablation.ts): outcome-off also silences replay's reward bias
|
|
46
|
-
: Math.max(
|
|
26
|
+
: Math.max(REWARD_FLOOR, 1 + pos * REWARD_POSITIVE_GAIN + (pos - neg) * REWARD_NET_GAIN);
|
|
47
27
|
const valence = VALENCE_WEIGHT[entry.emotional_valence] ?? 1.0;
|
|
48
28
|
// Under-rehearsed memories benefit most from replay.
|
|
49
29
|
const underRehearsed = 1 / (1 + (entry.retrieval_count ?? 0));
|
|
50
30
|
// Idle-time boost: memories that haven't been touched recently need rehearsal more.
|
|
51
31
|
const lastRetrieved = new Date(entry.last_retrieved);
|
|
52
32
|
const deltaMs = now.getTime() - lastRetrieved.getTime();
|
|
53
|
-
const ageHours = Number.isFinite(deltaMs) ? Math.max(0, deltaMs /
|
|
54
|
-
const idleBoost = 1 + Math.log1p(ageHours) *
|
|
33
|
+
const ageHours = Number.isFinite(deltaMs) ? Math.max(0, deltaMs / HOUR_MS) : 0;
|
|
34
|
+
const idleBoost = 1 + Math.log1p(ageHours) * IDLE_BOOST_GAIN;
|
|
55
35
|
// Weight by current strength so dead-and-decaying memories don't waste replay slots.
|
|
56
36
|
const rawStrength = Number.isFinite(entry.strength) ? entry.strength : 0;
|
|
57
|
-
const strengthFloor = Math.max(
|
|
37
|
+
const strengthFloor = Math.max(STRENGTH_FLOOR, rawStrength);
|
|
58
38
|
return rewardSignal * valence * underRehearsed * idleBoost * strengthFloor;
|
|
59
39
|
}
|
|
60
|
-
/**
|
|
61
|
-
* Deterministic 32-bit RNG (Mulberry32). Same seed → same sequence.
|
|
62
|
-
* Keeps replay reproducible for tests and audit runs without bringing
|
|
63
|
-
* in a random-number dependency.
|
|
64
|
-
*/
|
|
40
|
+
/** Deterministic 32-bit RNG (Mulberry32): same seed, same sequence, so replay is reproducible without a random-number dependency. */
|
|
65
41
|
function mulberry32(seed) {
|
|
66
42
|
let s = seed >>> 0;
|
|
67
43
|
return () => {
|
|
@@ -71,29 +47,22 @@ function mulberry32(seed) {
|
|
|
71
47
|
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
|
|
72
48
|
};
|
|
73
49
|
}
|
|
74
|
-
/**
|
|
75
|
-
*
|
|
76
|
-
* replacement. Deterministic given the same seed.
|
|
77
|
-
*
|
|
78
|
-
* The sampler is weighted but not greedy — picking by priority alone would
|
|
79
|
-
* always pick the top-N, which overfits. Biological replay shows both
|
|
80
|
-
* preferential-for-reward AND stochastic-exploration characteristics; we
|
|
81
|
-
* keep the stochastic element so adjacent survivors aren't always ignored.
|
|
82
|
-
*/
|
|
50
|
+
/** Pick `count` memories for replay, weighted by `replayPriority`, without replacement; deterministic for a seed.
|
|
51
|
+
* Weighted but not greedy: always taking the top-N overfits, so a stochastic element keeps adjacent survivors in play. */
|
|
83
52
|
export function sampleForReplay(survivors, count, now, seed = Date.now() >>> 0) {
|
|
84
53
|
if (count <= 0 || survivors.length === 0)
|
|
85
54
|
return [];
|
|
86
55
|
const rng = mulberry32(seed);
|
|
87
|
-
// Deliberately-marked and aged-out memories are both untrusted
|
|
88
|
-
//
|
|
89
|
-
// the stored value (it no longer carries the age-out case, see memory.ts).
|
|
56
|
+
// Deliberately-marked and aged-out memories are both untrusted and rehearsing them defeats staleness, so derive rather than trust
|
|
57
|
+
// the stored value (it no longer carries the age-out case).
|
|
90
58
|
const eligible = survivors.filter((e) => resolveConfidence(e, now) !== 'stale');
|
|
91
59
|
if (eligible.length === 0)
|
|
92
60
|
return [];
|
|
61
|
+
const outcomeAblated = isOutcomeSlowAblated();
|
|
93
62
|
const pool = eligible.map((entry, idx) => ({
|
|
94
63
|
entry,
|
|
95
64
|
idx,
|
|
96
|
-
weight: replayPriority(entry, now),
|
|
65
|
+
weight: replayPriority(entry, now, outcomeAblated),
|
|
97
66
|
}));
|
|
98
67
|
const want = Math.min(count, pool.length);
|
|
99
68
|
const chosen = [];
|
package/dist/consolidate/run.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ftsDrift } from '../store/entry-row.js';
|
|
2
|
-
import { NO_MERGE_TAGS } from '../sharing/
|
|
2
|
+
import { NO_MERGE_TAGS } from '../sharing/share.js';
|
|
3
3
|
export const REPLAY_COUNT_DEFAULT = 5;
|
|
4
4
|
export function keptAsWritten(entry) {
|
|
5
5
|
return entry.tags.some((tag) => NO_MERGE_TAGS.has(tag));
|
|
@@ -1,11 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Consolidation engine ("Sleep") for Hippo.
|
|
3
|
-
*
|
|
4
|
-
* Steps:
|
|
5
|
-
* 1. Decay pass - remove entries below strength threshold
|
|
6
|
-
* 2. Merge pass - find episodic entries with high text overlap, create semantic summaries
|
|
7
|
-
* 3. Stats tracking
|
|
8
|
-
*/
|
|
1
|
+
/** Consolidation engine ("Sleep"): decay pass (drop entries below the strength threshold), merge pass (semantic summaries of overlapping episodics), stats. */
|
|
9
2
|
import { type WriteBudget } from '../util/write-budget.js';
|
|
10
3
|
import { type ConsolidationResult } from './run.js';
|
|
11
4
|
/**
|