hippo-memory 1.69.0 → 1.71.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -2
- package/dist/agent-memories/apply.d.ts +3 -3
- package/dist/agent-memories/apply.js +16 -31
- package/dist/agent-memories/claude-code.d.ts +5 -5
- package/dist/agent-memories/claude-code.js +25 -12
- package/dist/agent-memories/copilot.js +3 -2
- package/dist/agent-memories/files.js +26 -14
- package/dist/agent-memories/gemini.js +6 -5
- package/dist/agent-memories/keys.js +3 -2
- package/dist/agent-memories/legacy.d.ts +2 -2
- package/dist/agent-memories/legacy.js +2 -2
- package/dist/agent-memories/markdown.d.ts +1 -3
- package/dist/agent-memories/markdown.js +1 -3
- package/dist/agent-memories/report.d.ts +1 -1
- package/dist/agent-memories/report.js +3 -2
- package/dist/agent-memories/source.d.ts +1 -1
- package/dist/agent-memories/source.js +6 -5
- package/dist/agent-memories/sync.d.ts +5 -3
- package/dist/agent-memories/sync.js +34 -38
- package/dist/agent-memories/types.d.ts +1 -1
- package/dist/api/assemble.d.ts +9 -46
- package/dist/api/assemble.js +44 -54
- package/dist/api/audit.d.ts +8 -7
- package/dist/api/audit.js +15 -21
- package/dist/api/auth.d.ts +17 -39
- package/dist/api/auth.js +76 -216
- package/dist/api/auto-sleep.d.ts +13 -0
- package/dist/api/auto-sleep.js +32 -0
- package/dist/{availability.d.ts → api/availability.d.ts} +4 -17
- package/dist/{availability.js → api/availability.js} +14 -44
- package/dist/{context-auto.js → api/context-auto.js} +2 -1
- package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
- package/dist/{context-render.js → api/context-render.js} +7 -6
- package/dist/api/context-select.d.ts +5 -5
- package/dist/api/context-select.js +39 -48
- package/dist/api/context-types.d.ts +15 -40
- package/dist/api/context.d.ts +7 -26
- package/dist/api/context.js +67 -97
- package/dist/api/dormant.d.ts +7 -23
- package/dist/api/dormant.js +40 -128
- package/dist/api/drill-down.d.ts +9 -48
- package/dist/api/drill-down.js +41 -90
- package/dist/api/forget.d.ts +5 -33
- package/dist/api/forget.js +17 -73
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +2 -2
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +28 -0
- package/dist/api/index.js +31 -0
- package/dist/api/instruction-detect.js +85 -0
- package/dist/api/learn.js +63 -55
- package/dist/api/ledger-db.d.ts +21 -0
- package/dist/api/ledger-db.js +81 -0
- package/dist/api/memories.d.ts +5 -0
- package/dist/api/memories.js +7 -0
- package/dist/api/objects.d.ts +9 -0
- package/dist/api/objects.js +11 -0
- package/dist/api/on-store.d.ts +16 -0
- package/dist/api/on-store.js +38 -0
- package/dist/api/outcome.d.ts +5 -42
- package/dist/api/outcome.js +15 -80
- package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
- package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
- package/dist/api/predictions.d.ts +9 -0
- package/dist/api/predictions.js +18 -0
- package/dist/api/promote.d.ts +16 -31
- package/dist/api/promote.js +38 -123
- package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +11 -11
- package/dist/{prompt-hook.js → api/prompt-hook.js} +42 -60
- package/dist/api/quarantine.d.ts +5 -5
- package/dist/api/quarantine.js +30 -106
- package/dist/api/recall-cli.d.ts +55 -0
- package/dist/api/recall-cli.js +94 -0
- package/dist/api/recall-core.d.ts +4 -0
- package/dist/api/recall-core.js +120 -0
- package/dist/api/recall-finish.d.ts +53 -0
- package/dist/api/recall-finish.js +30 -0
- package/dist/api/recall-history.d.ts +64 -0
- package/dist/api/recall-history.js +159 -0
- package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +7 -8
- package/dist/{recall-pipeline.js → api/recall-pipeline.js} +60 -48
- package/dist/api/recall-record.d.ts +10 -13
- package/dist/api/recall-record.js +10 -30
- package/dist/api/recall-request.d.ts +2 -2
- package/dist/api/recall-request.js +3 -3
- package/dist/api/recall-types.d.ts +101 -316
- package/dist/api/recall.d.ts +5 -33
- package/dist/api/recall.js +92 -91
- package/dist/api/refine.d.ts +7 -0
- package/dist/api/refine.js +10 -0
- package/dist/api/remember-local.d.ts +57 -0
- package/dist/api/remember-local.js +90 -0
- package/dist/api/remember.d.ts +27 -12
- package/dist/api/remember.js +42 -46
- package/dist/api/session-owners.d.ts +4 -0
- package/dist/api/session-owners.js +17 -0
- package/dist/api/sleep-run.d.ts +7 -9
- package/dist/api/sleep-run.js +78 -94
- package/dist/api/sleep.d.ts +10 -29
- package/dist/api/tokens.d.ts +5 -12
- package/dist/api/tokens.js +12 -31
- package/dist/api/types.d.ts +8 -31
- package/dist/api/types.js +5 -23
- package/dist/capture/caller-session.d.ts +2 -2
- package/dist/capture/caller-session.js +8 -8
- package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
- package/dist/{capture-error.js → capture/capture-error.js} +7 -7
- package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
- package/dist/capture/command.d.ts +5 -13
- package/dist/capture/command.js +57 -60
- package/dist/capture/compact-resume-caller.d.ts +1 -1
- package/dist/capture/compact-resume-caller.js +7 -7
- package/dist/capture/compact.d.ts +8 -16
- package/dist/capture/compact.js +56 -47
- package/dist/capture/compaction-items-caller.d.ts +1 -1
- package/dist/capture/compaction-items-caller.js +7 -5
- package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
- package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
- package/dist/{compaction-record.js → capture/compaction-record.js} +143 -157
- package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +1 -1
- package/dist/{compaction-spool.js → capture/compaction-spool.js} +18 -14
- package/dist/capture/copilot-transcript.js +1 -1
- package/dist/capture/extract.js +2 -2
- package/dist/capture/failure-caller.d.ts +2 -2
- package/dist/capture/failure-caller.js +6 -6
- package/dist/capture/failure-reading.d.ts +2 -5
- package/dist/capture/failure-reading.js +11 -12
- package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
- package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
- package/dist/capture/pre-compact-caller.d.ts +1 -1
- package/dist/capture/pre-compact-caller.js +2 -2
- package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +2 -6
- package/dist/{session-digest.js → capture/session-digest.js} +29 -29
- package/dist/capture/session-end-caller.d.ts +2 -2
- package/dist/capture/session-end-caller.js +1 -1
- package/dist/capture/session-texts.d.ts +1 -1
- package/dist/capture/session-texts.js +5 -5
- package/dist/capture/session-worker.js +6 -4
- package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
- package/dist/capture/transcript.d.ts +2 -10
- package/dist/capture/transcript.js +72 -92
- package/dist/capture/working-state.d.ts +0 -3
- package/dist/capture/working-state.js +7 -7
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +28 -0
- package/dist/cli/audit-prune.js +40 -0
- package/dist/cli/audit.d.ts +2 -2
- package/dist/cli/audit.js +92 -88
- package/dist/cli/auth.d.ts +2 -1
- package/dist/cli/auth.js +69 -53
- package/dist/cli/briefs.d.ts +4 -3
- package/dist/cli/briefs.js +76 -202
- package/dist/cli/card.d.ts +2 -1
- package/dist/cli/card.js +55 -54
- package/dist/cli/client.d.ts +28 -0
- package/dist/{client.js → cli/client.js} +25 -44
- package/dist/cli/compact-resume-payload.d.ts +8 -0
- package/dist/cli/compact-resume-payload.js +40 -0
- package/dist/cli/context.d.ts +1 -13
- package/dist/cli/context.js +51 -77
- package/dist/cli/continuity.d.ts +6 -5
- package/dist/cli/continuity.js +153 -145
- package/dist/cli/correction-latency.d.ts +24 -0
- package/dist/{correction-latency.js → cli/correction-latency.js} +2 -14
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +226 -222
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +70 -52
- package/dist/cli/decisions.d.ts +4 -3
- package/dist/cli/decisions.js +129 -253
- package/dist/cli/eval.d.ts +1 -3
- package/dist/cli/eval.js +56 -42
- package/dist/cli/exit.d.ts +6 -0
- package/dist/cli/exit.js +11 -0
- package/dist/cli/explain.d.ts +1 -2
- package/dist/cli/explain.js +39 -21
- package/dist/cli/flag-values.d.ts +30 -0
- package/dist/cli/flag-values.js +120 -0
- package/dist/cli/flags.d.ts +304 -0
- package/dist/cli/flags.js +169 -0
- package/dist/cli/github.d.ts +14 -0
- package/dist/cli/github.js +184 -0
- package/dist/cli/goals.d.ts +2 -1
- package/dist/cli/goals.js +76 -75
- package/dist/cli/hook-runtime.d.ts +31 -0
- package/dist/cli/hook-runtime.js +139 -0
- package/dist/cli/init.d.ts +2 -1
- package/dist/cli/init.js +153 -126
- package/dist/cli/install-steps.d.ts +7 -0
- package/dist/cli/install-steps.js +101 -0
- package/dist/cli/last-sleep.d.ts +3 -1
- package/dist/cli/last-sleep.js +12 -7
- package/dist/cli/maintenance.d.ts +5 -4
- package/dist/cli/maintenance.js +41 -42
- package/dist/cli/object-verbs.d.ts +40 -0
- package/dist/cli/object-verbs.js +66 -0
- package/dist/cli/owner-validation.d.ts +18 -0
- package/dist/cli/owner-validation.js +33 -0
- package/dist/cli/playbooks.d.ts +4 -3
- package/dist/cli/playbooks.js +98 -306
- package/dist/cli/print.d.ts +15 -0
- package/dist/cli/print.js +82 -0
- package/dist/cli/projects.d.ts +2 -3
- package/dist/cli/projects.js +56 -51
- package/dist/cli/provenance-coverage.d.ts +14 -0
- package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +2 -6
- package/dist/cli/quality-repair-once.js +4 -4
- package/dist/cli/recall.d.ts +2 -6
- package/dist/cli/recall.js +128 -253
- package/dist/cli/refine-llm.d.ts +35 -0
- package/dist/cli/refine-llm.js +128 -0
- package/dist/cli/remember.d.ts +4 -6
- package/dist/cli/remember.js +193 -230
- package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +4 -17
- package/dist/{scheduler.js → cli/scheduler.js} +22 -22
- package/dist/cli/serve.d.ts +1 -1
- package/dist/cli/serve.js +46 -7
- package/dist/cli/session-hooks.d.ts +11 -19
- package/dist/cli/session-hooks.js +263 -258
- package/dist/cli/setup.d.ts +4 -3
- package/dist/cli/setup.js +55 -37
- package/dist/cli/shared.d.ts +14 -118
- package/dist/cli/shared.js +26 -400
- package/dist/cli/slack.d.ts +2 -1
- package/dist/cli/slack.js +46 -74
- package/dist/cli/sleep-render.d.ts +4 -0
- package/dist/cli/sleep-render.js +61 -0
- package/dist/cli/sleep.d.ts +3 -8
- package/dist/cli/sleep.js +34 -91
- package/dist/cli/status.d.ts +9 -12
- package/dist/cli/status.js +86 -131
- package/dist/{stdin.d.ts → cli/stdin.d.ts} +4 -6
- package/dist/{stdin.js → cli/stdin.js} +8 -9
- package/dist/cli/transfer.d.ts +9 -9
- package/dist/cli/transfer.js +125 -122
- package/dist/cli/usage.js +13 -5
- package/dist/cli.d.ts +69 -167
- package/dist/cli.js +187 -296
- package/dist/connectors/dlq.d.ts +44 -0
- package/dist/connectors/dlq.js +30 -0
- package/dist/connectors/github/backfill.d.ts +6 -26
- package/dist/connectors/github/backfill.js +42 -114
- package/dist/connectors/github/deletion.d.ts +6 -21
- package/dist/connectors/github/deletion.js +17 -64
- package/dist/connectors/github/dlq.d.ts +12 -91
- package/dist/connectors/github/dlq.js +23 -140
- package/dist/connectors/github/ingest.d.ts +4 -37
- package/dist/connectors/github/ingest.js +24 -93
- package/dist/connectors/github/octokit-client.d.ts +5 -17
- package/dist/connectors/github/octokit-client.js +29 -25
- package/dist/connectors/github/ratelimit.d.ts +3 -14
- package/dist/connectors/github/ratelimit.js +3 -14
- package/dist/connectors/github/scope.d.ts +3 -5
- package/dist/connectors/github/scope.js +3 -5
- package/dist/connectors/github/signature.d.ts +4 -26
- package/dist/connectors/github/signature.js +4 -26
- package/dist/connectors/github/tenant-routing.d.ts +4 -26
- package/dist/connectors/github/tenant-routing.js +13 -61
- package/dist/connectors/github/transform.d.ts +1 -1
- package/dist/connectors/github/transform.js +2 -16
- package/dist/connectors/github/types.d.ts +4 -16
- package/dist/connectors/github/types.js +17 -27
- package/dist/connectors/github/webhook.d.ts +5 -18
- package/dist/connectors/github/webhook.js +86 -105
- package/dist/connectors/slack/backfill.d.ts +5 -18
- package/dist/connectors/slack/backfill.js +9 -42
- package/dist/connectors/slack/deletion.d.ts +4 -7
- package/dist/connectors/slack/deletion.js +20 -49
- package/dist/connectors/slack/dlq.d.ts +9 -68
- package/dist/connectors/slack/dlq.js +26 -136
- package/dist/connectors/slack/ingest.d.ts +4 -18
- package/dist/connectors/slack/ingest.js +26 -91
- package/dist/connectors/slack/scope.d.ts +2 -8
- package/dist/connectors/slack/scope.js +2 -8
- package/dist/connectors/slack/signature.d.ts +1 -6
- package/dist/connectors/slack/signature.js +2 -1
- package/dist/connectors/slack/tenant-routing.d.ts +4 -18
- package/dist/connectors/slack/tenant-routing.js +11 -31
- package/dist/connectors/slack/transform.d.ts +3 -19
- package/dist/connectors/slack/transform.js +2 -18
- package/dist/connectors/slack/types.d.ts +4 -10
- package/dist/connectors/slack/types.js +5 -16
- package/dist/connectors/slack/web-client.js +34 -28
- package/dist/connectors/slack/webhook.d.ts +5 -21
- package/dist/connectors/slack/webhook.js +80 -108
- package/dist/connectors/slack/workspaces.d.ts +8 -41
- package/dist/connectors/slack/workspaces.js +8 -58
- package/dist/consolidate/conflicts.d.ts +1 -1
- package/dist/consolidate/conflicts.js +10 -18
- package/dist/consolidate/dag-summary.d.ts +8 -0
- package/dist/consolidate/dag-summary.js +41 -0
- package/dist/{dag.d.ts → consolidate/dag.d.ts} +6 -29
- package/dist/{dag.js → consolidate/dag.js} +49 -131
- package/dist/consolidate/decay.d.ts +2 -2
- package/dist/consolidate/decay.js +35 -41
- package/dist/consolidate/dedupe.d.ts +29 -0
- package/dist/consolidate/dedupe.js +103 -0
- package/dist/consolidate/flush-units.d.ts +5 -6
- package/dist/consolidate/flush-units.js +3 -3
- package/dist/consolidate/half-life-migration.d.ts +34 -0
- package/dist/consolidate/half-life-migration.js +89 -0
- package/dist/consolidate/llm-passes.js +12 -29
- package/dist/consolidate/memory-value-weights.d.ts +8 -0
- package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +2 -13
- package/dist/consolidate/memory-value.d.ts +45 -0
- package/dist/consolidate/memory-value.js +164 -0
- package/dist/consolidate/merge.js +65 -83
- package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
- package/dist/{merged-row.js → consolidate/merged-row.js} +4 -3
- package/dist/consolidate/physics-pass.js +46 -48
- package/dist/consolidate/replay.d.ts +9 -0
- package/dist/consolidate/replay.js +84 -0
- package/dist/consolidate/run.d.ts +7 -13
- package/dist/consolidate/run.js +6 -37
- package/dist/consolidate/sleep.d.ts +2 -9
- package/dist/consolidate/sleep.js +69 -151
- package/dist/consolidate/trace.d.ts +19 -0
- package/dist/{trace.js → consolidate/trace.js} +7 -24
- package/dist/consolidate/traces.js +40 -51
- package/dist/core/ablation.d.ts +15 -0
- package/dist/core/ablation.js +49 -0
- package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
- package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
- package/dist/{ambient.d.ts → core/ambient.d.ts} +1 -8
- package/dist/{ambient.js → core/ambient.js} +13 -18
- package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +16 -3
- package/dist/{capture-contract.js → core/capture-contract.js} +67 -1
- package/dist/{card.d.ts → core/card.d.ts} +4 -1
- package/dist/{card.js → core/card.js} +8 -0
- package/dist/core/compare.d.ts +32 -0
- package/dist/core/compare.js +70 -0
- package/dist/{config.d.ts → core/config.d.ts} +14 -28
- package/dist/{config.js → core/config.js} +101 -75
- package/dist/{handoff.d.ts → core/handoff.d.ts} +1 -7
- package/dist/core/handoff.js +81 -0
- package/dist/{memory-quality.js → core/memory-quality.js} +2 -2
- package/dist/core/memory.d.ts +183 -0
- package/dist/core/memory.js +380 -0
- package/dist/core/package-root.d.ts +3 -0
- package/dist/core/package-root.js +5 -0
- package/dist/{physics-config.d.ts → core/physics-config.d.ts} +1 -4
- package/dist/{physics-config.js → core/physics-config.js} +3 -8
- package/dist/{physics.d.ts → core/physics.d.ts} +16 -62
- package/dist/{physics.js → core/physics.js} +60 -122
- package/dist/{project-identity.d.ts → core/project-identity.d.ts} +17 -63
- package/dist/{project-identity.js → core/project-identity.js} +22 -55
- package/dist/{project-remote.js → core/project-remote.js} +17 -6
- package/dist/{prompt-recall.js → core/prompt-recall.js} +1 -1
- package/dist/core/raw-append-only.d.ts +5 -0
- package/dist/core/raw-append-only.js +7 -0
- package/dist/{salience.d.ts → core/salience.d.ts} +1 -7
- package/dist/{salience.js → core/salience.js} +36 -27
- package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
- package/dist/{search/types.js → core/search-types.js} +1 -1
- package/dist/core/session-digest-row.d.ts +5 -0
- package/dist/core/session-digest-row.js +6 -0
- package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
- package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +7 -7
- package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
- package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
- package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +11 -10
- package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +110 -104
- package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +2 -1
- package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +1 -0
- package/dist/{dashboard.js → dashboard/dashboard.js} +172 -55
- package/dist/db/backup.js +1 -1
- package/dist/db/busy.d.ts +19 -2
- package/dist/db/busy.js +88 -14
- package/dist/db/connect.d.ts +11 -2
- package/dist/db/connect.js +43 -10
- package/dist/db/index.d.ts +9 -0
- package/dist/db/index.js +8 -0
- package/dist/db/meta.d.ts +4 -0
- package/dist/db/meta.js +11 -1
- package/dist/db/migrate.d.ts +8 -1
- package/dist/db/migrate.js +28 -33
- package/dist/db/migrations/types.d.ts +2 -5
- package/dist/db/migrations/v08.js +1 -1
- package/dist/db/migrations/v14.js +39 -36
- package/dist/db/migrations/v15.js +2 -8
- package/dist/db/migrations/v16.js +31 -29
- package/dist/db/migrations/v17.js +2 -3
- package/dist/db/migrations/v18.js +6 -5
- package/dist/db/migrations/v19.js +2 -5
- package/dist/db/migrations/v20.js +5 -8
- package/dist/db/migrations/v22.js +28 -38
- package/dist/db/migrations/v23.js +3 -14
- package/dist/db/migrations/v24.js +25 -22
- package/dist/db/migrations/v25.js +3 -8
- package/dist/db/migrations/v26.js +2 -13
- package/dist/db/migrations/v27.js +3 -11
- package/dist/db/migrations/v28.js +2 -14
- package/dist/db/migrations/v29.js +23 -32
- package/dist/db/migrations/v30.js +4 -16
- package/dist/db/migrations/v31.js +23 -31
- package/dist/db/migrations/v32.js +4 -22
- package/dist/db/migrations/v33.js +2 -15
- package/dist/db/migrations/v34.js +2 -11
- package/dist/db/migrations/v35.js +2 -11
- package/dist/db/migrations/v36.js +2 -11
- package/dist/db/migrations/v37.js +8 -33
- package/dist/db/migrations/v38.js +5 -38
- package/dist/db/migrations/v39.js +10 -21
- package/dist/db/migrations/v40.js +8 -14
- package/dist/db/migrations/v41.js +2 -24
- package/dist/db/migrations/v43.js +7 -6
- package/dist/db/migrations/v44.js +2 -8
- package/dist/db/migrations/v45.js +2 -7
- package/dist/db/migrations/v46.js +1 -1
- package/dist/db/migrations/v47.js +2 -3
- package/dist/db/migrations/v48.js +1 -1
- package/dist/db/migrations/v49.js +1 -1
- package/dist/db/migrations/v50.js +8 -7
- package/dist/db/migrations/v51.js +1 -1
- package/dist/db/migrations/v52.js +1 -1
- package/dist/db/open.d.ts +11 -1
- package/dist/db/open.js +37 -4
- package/dist/db/physics-state.d.ts +23 -0
- package/dist/{physics-state.js → db/physics-state.js} +34 -52
- package/dist/db/raw-archive-mirror-cleanup.d.ts +5 -0
- package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +10 -20
- package/dist/db/request-stores.d.ts +15 -2
- package/dist/db/request-stores.js +37 -15
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -0
- package/dist/{vector-store.d.ts → db/vector-store.d.ts} +6 -2
- package/dist/{vector-store.js → db/vector-store.js} +83 -51
- package/dist/db/wal-checkpointer.d.ts +11 -0
- package/dist/db/wal-checkpointer.js +92 -0
- package/dist/doctor.js +176 -152
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.d.ts +1 -1
- package/dist/entry/project-identity.js +1 -1
- package/dist/entry/session-text.d.ts +3 -3
- package/dist/entry/session-text.js +5 -4
- package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +15 -53
- package/dist/{eval-stats.js → eval/eval-stats.js} +24 -51
- package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +3 -14
- package/dist/{eval-suite.js → eval/eval-suite.js} +99 -57
- package/dist/{eval.d.ts → eval/eval.d.ts} +7 -25
- package/dist/{eval.js → eval/eval.js} +35 -55
- package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -6
- package/dist/{judgment.js → eval/judgment.js} +23 -20
- package/dist/extensions/openclaw-plugin/index.js +2 -3
- package/dist/graph/delta.d.ts +3 -2
- package/dist/graph/delta.js +9 -23
- package/dist/{graph-extract.d.ts → graph/extract.d.ts} +10 -32
- package/dist/{graph-extract.js → graph/extract.js} +40 -81
- package/dist/{graph-recall.d.ts → graph/recall.d.ts} +9 -22
- package/dist/{graph-recall.js → graph/recall.js} +65 -108
- package/dist/graph/stream.d.ts +38 -0
- package/dist/{graph-stream.js → graph/stream.js} +20 -41
- package/dist/graph/view.d.ts +50 -0
- package/dist/graph/view.js +265 -0
- package/dist/graph/write.d.ts +4 -76
- package/dist/graph/write.js +13 -397
- package/dist/hooks/codex-session.js +1 -1
- package/dist/hooks/codex-wrapper.js +16 -17
- package/dist/hooks/copilot.d.ts +1 -8
- package/dist/hooks/copilot.js +16 -16
- package/dist/{cli → hooks}/hook-blocks.d.ts +6 -2
- package/dist/{cli → hooks}/hook-blocks.js +38 -125
- package/dist/hooks/json-hooks.d.ts +5 -37
- package/dist/hooks/json-hooks.js +49 -179
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +44 -103
- package/dist/hooks/shared.d.ts +8 -21
- package/dist/hooks/shared.js +30 -25
- package/dist/importers/core.d.ts +13 -42
- package/dist/importers/core.js +48 -64
- package/dist/importers/markdown-parse.d.ts +9 -32
- package/dist/importers/markdown-parse.js +10 -44
- package/dist/importers/markdown.js +5 -13
- package/dist/importers/sources.js +57 -81
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +95 -172
- package/dist/index.d.ts +26 -22
- package/dist/index.js +25 -21
- package/dist/learn/autolearn.d.ts +29 -0
- package/dist/{autolearn.js → learn/autolearn.js} +26 -51
- package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
- package/dist/{churn-git.js → learn/churn-git.js} +6 -4
- package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
- package/dist/learn/extract.js +123 -0
- package/dist/learn/forward-claim-detector.d.ts +12 -0
- package/dist/learn/forward-claim-detector.js +60 -0
- package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +10 -18
- package/dist/{invalidation.js → learn/invalidation.js} +92 -125
- package/dist/mcp/admin-tools.d.ts +1 -1
- package/dist/mcp/admin-tools.js +39 -64
- package/dist/mcp/format.d.ts +5 -5
- package/dist/mcp/format.js +7 -6
- package/dist/mcp/framing.d.ts +6 -0
- package/dist/mcp/framing.js +11 -3
- package/dist/mcp/memory-tools.js +10 -35
- package/dist/mcp/protocol.d.ts +14 -36
- package/dist/mcp/protocol.js +10 -19
- package/dist/mcp/recall-tools.d.ts +2 -2
- package/dist/mcp/recall-tools.js +70 -52
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +71 -85
- package/dist/mcp/server.d.ts +3 -9
- package/dist/mcp/server.js +6 -17
- package/dist/mcp/session-state.d.ts +2 -3
- package/dist/mcp/session-state.js +7 -13
- package/dist/mcp/shared-gate.js +1 -1
- package/dist/mcp/stdio.d.ts +2 -6
- package/dist/mcp/stdio.js +112 -38
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +7 -5
- package/dist/objects/customer-notes.d.ts +44 -0
- package/dist/objects/customer-notes.js +71 -0
- package/dist/objects/decisions.d.ts +41 -0
- package/dist/objects/decisions.js +63 -0
- package/dist/objects/descriptor.d.ts +52 -0
- package/dist/objects/descriptor.js +4 -0
- package/dist/objects/fields.d.ts +15 -0
- package/dist/objects/fields.js +21 -0
- package/dist/objects/incidents.d.ts +45 -0
- package/dist/objects/incidents.js +96 -0
- package/dist/objects/lifecycle.d.ts +27 -0
- package/dist/objects/lifecycle.js +96 -0
- package/dist/objects/policies.d.ts +60 -0
- package/dist/objects/policies.js +102 -0
- package/dist/objects/processes.d.ts +43 -0
- package/dist/objects/processes.js +92 -0
- package/dist/objects/project-briefs.d.ts +63 -0
- package/dist/objects/project-briefs.js +194 -0
- package/dist/objects/skills.d.ts +51 -0
- package/dist/objects/skills.js +110 -0
- package/dist/postinstall.js +10 -21
- package/dist/predictions/planning-fallacy.d.ts +14 -109
- package/dist/predictions/planning-fallacy.js +4 -129
- package/dist/rerankers/clef.d.ts +2 -6
- package/dist/rerankers/clef.js +28 -76
- package/dist/rerankers/cross-encoder.d.ts +0 -7
- package/dist/rerankers/cross-encoder.js +18 -28
- package/dist/rerankers/index.js +8 -7
- package/dist/rerankers/jev.d.ts +1 -4
- package/dist/rerankers/jev.js +36 -52
- package/dist/rerankers/llm.d.ts +2 -13
- package/dist/rerankers/llm.js +42 -59
- package/dist/rerankers/outage-warning.d.ts +8 -0
- package/dist/rerankers/outage-warning.js +32 -0
- package/dist/rerankers/remote.d.ts +4 -0
- package/dist/rerankers/remote.js +25 -0
- package/dist/rerankers/types.d.ts +3 -15
- package/dist/search/as-of.d.ts +1 -1
- package/dist/search/bm25-search.d.ts +2 -2
- package/dist/search/bm25-search.js +7 -7
- package/dist/search/bm25.d.ts +1 -1
- package/dist/search/bm25.js +1 -1
- package/dist/search/boosts.d.ts +5 -3
- package/dist/search/boosts.js +36 -15
- package/dist/search/breakdown.d.ts +2 -2
- package/dist/search/breakdown.js +2 -1
- package/dist/search/explain.d.ts +1 -1
- package/dist/search/explain.js +3 -2
- package/dist/search/finalize.d.ts +2 -2
- package/dist/search/finalize.js +4 -3
- package/dist/search/fusion.d.ts +1 -1
- package/dist/search/fusion.js +3 -3
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +90 -0
- package/dist/search/hybrid-score.d.ts +2 -2
- package/dist/search/hybrid-score.js +1 -1
- package/dist/search/hybrid.d.ts +6 -4
- package/dist/search/hybrid.js +11 -8
- package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
- package/dist/{multihop.js → search/multihop.js} +9 -8
- package/dist/search/path-context.d.ts +11 -0
- package/dist/{path-context.js → search/path-context.js} +8 -19
- package/dist/search/physics-search.d.ts +4 -4
- package/dist/search/physics-search.js +25 -22
- package/dist/search/rerank.d.ts +3 -3
- package/dist/search/rerank.js +4 -3
- package/dist/search/rrf.d.ts +15 -0
- package/dist/search/rrf.js +36 -0
- package/dist/search/temporal.d.ts +1 -1
- package/dist/search/temporal.js +5 -2
- package/dist/search/vector.d.ts +10 -3
- package/dist/search/vector.js +51 -15
- package/dist/server/auth.d.ts +10 -29
- package/dist/server/auth.js +57 -42
- package/dist/server/boot.d.ts +5 -0
- package/dist/server/boot.js +432 -0
- package/dist/server/client-ip.d.ts +8 -20
- package/dist/server/client-ip.js +23 -34
- package/dist/server/cursor.d.ts +1 -1
- package/dist/server/cursor.js +2 -3
- package/dist/server/deadline.d.ts +13 -0
- package/dist/server/deadline.js +45 -0
- package/dist/server/defaults.d.ts +3 -0
- package/dist/server/defaults.js +4 -0
- package/dist/server/key-check-bounds.d.ts +9 -0
- package/dist/server/key-check-bounds.js +46 -0
- package/dist/server/lifecycle.d.ts +5 -4
- package/dist/server/lifecycle.js +20 -5
- package/dist/server/mcp-http.d.ts +1 -4
- package/dist/server/mcp-http.js +44 -68
- package/dist/server/rate-limit.d.ts +21 -0
- package/dist/{rate-limit.js → server/rate-limit.js} +4 -13
- package/dist/server/ready.d.ts +7 -0
- package/dist/server/ready.js +38 -0
- package/dist/server/request.d.ts +14 -12
- package/dist/server/request.js +71 -28
- package/dist/server/route-table.d.ts +15 -0
- package/dist/server/route-table.js +202 -0
- package/dist/server/routes/admin.js +29 -30
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +35 -105
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +45 -115
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +44 -105
- package/dist/server/routes/memories.js +21 -43
- package/dist/server/routes/object-routes.d.ts +35 -0
- package/dist/server/routes/object-routes.js +72 -0
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +42 -134
- package/dist/server/routes/predictions.js +35 -63
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +44 -134
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +41 -120
- package/dist/server/routes/recall.js +21 -44
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +40 -138
- package/dist/server/server-detect.d.ts +28 -0
- package/dist/server/server-detect.js +156 -0
- package/dist/server/sleep-child.d.ts +2 -0
- package/dist/server/sleep-child.js +19 -0
- package/dist/server/sleep-offload.d.ts +20 -0
- package/dist/server/sleep-offload.js +73 -0
- package/dist/server/tls.d.ts +6 -0
- package/dist/server/tls.js +24 -0
- package/dist/server/types.d.ts +35 -14
- package/dist/server/validation.d.ts +6 -5
- package/dist/server/validation.js +16 -34
- package/dist/server.d.ts +39 -61
- package/dist/server.js +26 -569
- package/dist/sharing/global-store.d.ts +19 -0
- package/dist/sharing/global-store.js +75 -0
- package/dist/sharing/global-sync.d.ts +6 -0
- package/dist/sharing/global-sync.js +80 -0
- package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +5 -6
- package/dist/{project-merge.js → sharing/project-merge.js} +34 -51
- package/dist/sharing/scope.d.ts +7 -0
- package/dist/{scope.js → sharing/scope.js} +5 -12
- package/dist/sharing/search-both.d.ts +60 -0
- package/dist/sharing/search-both.js +138 -0
- package/dist/sharing/share.d.ts +38 -0
- package/dist/sharing/share.js +226 -0
- package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
- package/dist/{ambient-store.js → store/ambient.js} +11 -16
- package/dist/store/audit-event.d.ts +15 -17
- package/dist/store/audit-event.js +9 -16
- package/dist/{audit.d.ts → store/audit.d.ts} +29 -8
- package/dist/{audit.js → store/audit.js} +95 -18
- package/dist/{auth.d.ts → store/auth.d.ts} +19 -36
- package/dist/{auth.js → store/auth.js} +108 -99
- package/dist/store/candidates.d.ts +41 -13
- package/dist/store/candidates.js +141 -60
- package/dist/{card-detail.d.ts → store/card-detail.d.ts} +5 -4
- package/dist/{card-detail.js → store/card-detail.js} +3 -2
- package/dist/{store-cards.d.ts → store/cards.d.ts} +26 -16
- package/dist/{store-cards.js → store/cards.js} +133 -248
- package/dist/store/compactions.d.ts +78 -0
- package/dist/store/compactions.js +93 -0
- package/dist/store/conflicts.d.ts +26 -26
- package/dist/store/conflicts.js +194 -222
- package/dist/store/connectors/github.d.ts +84 -0
- package/dist/store/connectors/github.js +180 -0
- package/dist/store/connectors/slack.d.ts +69 -0
- package/dist/store/connectors/slack.js +177 -0
- package/dist/store/dashboard-reads.d.ts +27 -0
- package/dist/store/dashboard-reads.js +88 -0
- package/dist/store/delete-and-batch.d.ts +27 -51
- package/dist/store/delete-and-batch.js +100 -92
- package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +16 -5
- package/dist/{delivery-recorder.js → store/delivery-recorder.js} +60 -38
- package/dist/store/descendant-page.d.ts +12 -0
- package/dist/store/descendant-page.js +99 -0
- package/dist/store/diagnostics.d.ts +47 -0
- package/dist/store/diagnostics.js +44 -0
- package/dist/store/doctor-reads.d.ts +16 -0
- package/dist/store/doctor-reads.js +19 -0
- package/dist/store/dormant.d.ts +105 -0
- package/dist/store/dormant.js +241 -0
- package/dist/store/embeddings/index.d.ts +36 -0
- package/dist/{embeddings.js → store/embeddings/index.js} +104 -224
- package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
- package/dist/{local-embedding.js → store/embeddings/local.js} +69 -75
- package/dist/store/embeddings/provider.d.ts +40 -0
- package/dist/{embedding-provider.js → store/embeddings/provider.js} +78 -91
- package/dist/store/entry-reads.d.ts +66 -63
- package/dist/store/entry-reads.js +159 -121
- package/dist/store/entry-row.d.ts +14 -37
- package/dist/store/entry-row.js +37 -45
- package/dist/store/entry-writes.d.ts +40 -17
- package/dist/store/entry-writes.js +105 -41
- package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
- package/dist/{failure-log.js → store/failure-log.js} +9 -2
- package/dist/store/goals.d.ts +96 -0
- package/dist/store/goals.js +260 -0
- package/dist/store/graph-queue.d.ts +13 -0
- package/dist/store/graph-queue.js +70 -0
- package/dist/store/graph-reads.d.ts +41 -0
- package/dist/{graph/read.js → store/graph-reads.js} +72 -162
- package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +71 -14
- package/dist/{graph/rows.js → store/graph-rows.js} +20 -12
- package/dist/store/graph-view-rows.d.ts +13 -0
- package/dist/store/graph-view-rows.js +68 -0
- package/dist/store/graph-writes.d.ts +33 -0
- package/dist/store/graph-writes.js +232 -0
- package/dist/store/half-life.d.ts +35 -0
- package/dist/store/half-life.js +75 -0
- package/dist/store/handoffs.d.ts +6 -12
- package/dist/store/handoffs.js +54 -63
- package/dist/store/index-and-stats.d.ts +14 -20
- package/dist/store/index-and-stats.js +74 -119
- package/dist/store/index.d.ts +4 -0
- package/dist/store/index.js +3 -0
- package/dist/store/key-audit.d.ts +2 -2
- package/dist/store/key-audit.js +4 -4
- package/dist/store/key-writes.d.ts +12 -5
- package/dist/store/key-writes.js +30 -4
- package/dist/store/ledger-turn.d.ts +17 -0
- package/dist/store/ledger-turn.js +27 -0
- package/dist/store/markdown.d.ts +3 -7
- package/dist/store/markdown.js +25 -23
- package/dist/store/mirrors.d.ts +7 -13
- package/dist/store/mirrors.js +52 -47
- package/dist/store/object-types.d.ts +189 -0
- package/dist/store/object-types.js +4 -0
- package/dist/store/open.d.ts +6 -4
- package/dist/store/open.js +30 -36
- package/dist/store/planning-fallacy-evidence.d.ts +14 -0
- package/dist/store/planning-fallacy-evidence.js +52 -0
- package/dist/store/port.d.ts +649 -0
- package/dist/store/port.js +17 -0
- package/dist/{predictions/store.d.ts → store/predictions.d.ts} +25 -52
- package/dist/{predictions/store.js → store/predictions.js} +88 -184
- package/dist/{quality-repair.js → store/quality-repair.js} +27 -57
- package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
- package/dist/{quarantine.js → store/quarantine.js} +64 -22
- package/dist/store/raw-archive.d.ts +14 -0
- package/dist/{raw-archive.js → store/raw-archive.js} +20 -31
- package/dist/store/recall-scope.d.ts +78 -0
- package/dist/{recall-scope.js → store/recall-scope.js} +23 -84
- package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -81
- package/dist/{recall-trace.js → store/recall-trace.js} +41 -122
- package/dist/store/rejected-values.d.ts +55 -0
- package/dist/store/rejected-values.js +150 -0
- package/dist/store/rejection.d.ts +54 -0
- package/dist/{rejection.js → store/rejection.js} +16 -67
- package/dist/store/report-reads.d.ts +6 -0
- package/dist/store/report-reads.js +29 -0
- package/dist/store/rows.d.ts +11 -22
- package/dist/store/rows.js +52 -43
- package/dist/store/rule-sql.d.ts +5 -0
- package/dist/store/rule-sql.js +37 -0
- package/dist/store/search-rows.d.ts +22 -42
- package/dist/store/search-rows.js +55 -78
- package/dist/store/sessions.d.ts +23 -49
- package/dist/store/sessions.js +96 -118
- package/dist/store/sqlite/commit-watch.d.ts +4 -0
- package/dist/store/sqlite/commit-watch.js +29 -0
- package/dist/store/sqlite/connector-events-group.d.ts +5 -0
- package/dist/store/sqlite/connector-events-group.js +50 -0
- package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
- package/dist/store/sqlite/connector-writes-group.js +65 -0
- package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
- package/dist/store/sqlite/dag-reads-group.js +45 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
- package/dist/store/{entry-writes-group.js → sqlite/entry-writes-group.js} +73 -60
- package/dist/store/sqlite/error-codec.d.ts +17 -0
- package/dist/store/sqlite/error-codec.js +61 -0
- package/dist/store/sqlite/executor-counts.d.ts +10 -0
- package/dist/store/sqlite/executor-counts.js +11 -0
- package/dist/store/sqlite/executor.d.ts +29 -0
- package/dist/store/sqlite/executor.js +287 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
- package/dist/store/sqlite/graph-reads-group.js +18 -0
- package/dist/store/sqlite/local.d.ts +21 -0
- package/dist/store/sqlite/local.js +39 -0
- package/dist/store/sqlite/object-rows.d.ts +102 -0
- package/dist/store/sqlite/object-rows.js +221 -0
- package/dist/store/sqlite/objects-group.d.ts +20 -0
- package/dist/store/sqlite/objects-group.js +316 -0
- package/dist/store/sqlite/predictions-group.d.ts +5 -0
- package/dist/store/sqlite/predictions-group.js +28 -0
- package/dist/store/sqlite/quarantine-group.d.ts +5 -0
- package/dist/store/sqlite/quarantine-group.js +38 -0
- package/dist/store/sqlite/store.d.ts +23 -0
- package/dist/store/sqlite/store.js +294 -0
- package/dist/store/sqlite/vector-pack.d.ts +18 -0
- package/dist/store/sqlite/vector-pack.js +46 -0
- package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
- package/dist/store/sqlite/vector-reads-group.js +23 -0
- package/dist/store/sqlite/worker-entry.d.ts +2 -0
- package/dist/store/sqlite/worker-entry.js +8 -0
- package/dist/store/sqlite/worker-jobs.d.ts +5 -0
- package/dist/store/sqlite/worker-jobs.js +116 -0
- package/dist/store/sqlite/worker-ops.d.ts +135 -0
- package/dist/store/sqlite/worker-ops.js +93 -0
- package/dist/store/sqlite/worker-store.d.ts +8 -0
- package/dist/store/sqlite/worker-store.js +79 -0
- package/dist/store/summaries.d.ts +11 -72
- package/dist/store/summaries.js +47 -186
- package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
- package/dist/{summary-dirty.js → store/summary-dirty.js} +1 -1
- package/dist/store/tenant-lookup.d.ts +6 -1
- package/dist/store/tenant-lookup.js +7 -0
- package/dist/store/tenant.d.ts +11 -0
- package/dist/store/tenant.js +28 -0
- package/dist/store/token-ledger-rows.d.ts +61 -0
- package/dist/store/token-ledger-rows.js +68 -0
- package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +14 -51
- package/dist/{token-ledger.js → store/token-ledger.js} +51 -129
- package/dist/store/tombstone-checks.d.ts +12 -0
- package/dist/store/tombstone-checks.js +31 -0
- package/dist/store/usage-reports.d.ts +7 -0
- package/dist/store/usage-reports.js +18 -0
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +170 -0
- package/dist/{working-memory.d.ts → store/working-memory.d.ts} +11 -26
- package/dist/store/working-memory.js +118 -0
- package/dist/{yaml.d.ts → store/yaml.d.ts} +1 -5
- package/dist/{yaml.js → store/yaml.js} +2 -6
- package/dist/support-bundle.d.ts +1 -1
- package/dist/support-bundle.js +19 -37
- package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
- package/dist/{gated-write.js → trust/gated-write.js} +6 -6
- package/dist/trust/quarantine.d.ts +4 -0
- package/dist/trust/quarantine.js +8 -0
- package/dist/trust/reject-flow.d.ts +23 -0
- package/dist/trust/reject-flow.js +65 -0
- package/dist/util/anthropic-messages.d.ts +31 -0
- package/dist/util/anthropic-messages.js +58 -0
- package/dist/util/atomic-write.d.ts +4 -0
- package/dist/util/atomic-write.js +138 -0
- package/dist/util/capped-json.d.ts +6 -0
- package/dist/util/capped-json.js +46 -0
- package/dist/util/crash-handlers.d.ts +12 -0
- package/dist/util/crash-handlers.js +72 -0
- package/dist/{env.d.ts → util/env.d.ts} +27 -7
- package/dist/{env.js → util/env.js} +33 -8
- package/dist/{home-path.d.ts → util/home-path.d.ts} +2 -1
- package/dist/util/home-path.js +69 -0
- package/dist/{http-retry.d.ts → util/http-retry.d.ts} +8 -2
- package/dist/util/http-retry.js +103 -0
- package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
- package/dist/{http-util.js → util/http-util.js} +31 -11
- package/dist/util/json.d.ts +17 -0
- package/dist/util/json.js +25 -0
- package/dist/{log.d.ts → util/log.d.ts} +7 -3
- package/dist/{log.js → util/log.js} +36 -11
- package/dist/util/real-path.d.ts +3 -0
- package/dist/util/real-path.js +15 -0
- package/dist/util/request-scope.d.ts +28 -0
- package/dist/util/request-scope.js +48 -0
- package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
- package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +5 -30
- package/dist/{secret-detect.js → util/secret-detect.js} +17 -42
- package/dist/util/stored-json.d.ts +9 -0
- package/dist/util/stored-json.js +8 -0
- package/dist/util/time.d.ts +2 -0
- package/dist/util/time.js +3 -0
- package/dist/util/token-text.d.ts +15 -0
- package/dist/util/token-text.js +20 -0
- package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +2 -0
- package/dist/util/transcript-tail.js +49 -0
- package/dist/util/version.d.ts +11 -0
- package/dist/util/version.js +26 -0
- package/extensions/openclaw-plugin/index.ts +2 -6
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
- package/dist/ablation.d.ts +0 -102
- package/dist/ablation.js +0 -136
- package/dist/api.d.ts +0 -26
- package/dist/api.js +0 -29
- package/dist/audit-prune.d.ts +0 -62
- package/dist/audit-prune.js +0 -107
- package/dist/autolearn.d.ts +0 -56
- package/dist/client.d.ts +0 -48
- package/dist/compare.d.ts +0 -86
- package/dist/compare.js +0 -117
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/connectors/github/cli-impl.js +0 -227
- package/dist/connectors/github/idempotency.d.ts +0 -19
- package/dist/connectors/github/idempotency.js +0 -27
- package/dist/connectors/slack/idempotency.d.ts +0 -17
- package/dist/connectors/slack/idempotency.js +0 -31
- package/dist/correction-latency.d.ts +0 -36
- package/dist/customer-notes.d.ts +0 -96
- package/dist/customer-notes.js +0 -336
- package/dist/db.d.ts +0 -9
- package/dist/db.js +0 -8
- package/dist/decisions.d.ts +0 -94
- package/dist/decisions.js +0 -326
- package/dist/dedupe.d.ts +0 -75
- package/dist/dedupe.js +0 -169
- package/dist/dormant.d.ts +0 -93
- package/dist/dormant.js +0 -137
- package/dist/embedding-provider.d.ts +0 -77
- package/dist/embeddings.d.ts +0 -101
- package/dist/extract.js +0 -133
- package/dist/forward-claim-detector.d.ts +0 -36
- package/dist/forward-claim-detector.js +0 -112
- package/dist/goals.d.ts +0 -173
- package/dist/goals.js +0 -448
- package/dist/graph/read.d.ts +0 -73
- package/dist/graph/rows.d.ts +0 -45
- package/dist/graph/types.js +0 -11
- package/dist/graph-stream.d.ts +0 -70
- package/dist/graph-view.d.ts +0 -73
- package/dist/graph-view.js +0 -333
- package/dist/half-life-migration.d.ts +0 -63
- package/dist/half-life-migration.js +0 -182
- package/dist/handoff.js +0 -68
- package/dist/home-path.js +0 -24
- package/dist/http-retry.js +0 -51
- package/dist/incidents.d.ts +0 -103
- package/dist/incidents.js +0 -349
- package/dist/instruction-detect.js +0 -27
- package/dist/json.d.ts +0 -7
- package/dist/json.js +0 -11
- package/dist/ledger-db.d.ts +0 -10
- package/dist/ledger-db.js +0 -42
- package/dist/memory-value-weights.d.ts +0 -19
- package/dist/memory-value.d.ts +0 -113
- package/dist/memory-value.js +0 -250
- package/dist/memory.d.ts +0 -294
- package/dist/memory.js +0 -522
- package/dist/owner-validation.d.ts +0 -42
- package/dist/owner-validation.js +0 -56
- package/dist/path-context.d.ts +0 -24
- package/dist/physics-state.d.ts +0 -39
- package/dist/policies.d.ts +0 -151
- package/dist/policies.js +0 -434
- package/dist/processes.d.ts +0 -108
- package/dist/processes.js +0 -371
- package/dist/project-briefs.d.ts +0 -128
- package/dist/project-briefs.js +0 -523
- package/dist/provenance-coverage.d.ts +0 -18
- package/dist/rate-limit.d.ts +0 -34
- package/dist/raw-archive-mirror-cleanup.d.ts +0 -20
- package/dist/raw-archive.d.ts +0 -24
- package/dist/recall-history.d.ts +0 -131
- package/dist/recall-history.js +0 -227
- package/dist/recall-scope.d.ts +0 -138
- package/dist/refine-llm.d.ts +0 -61
- package/dist/refine-llm.js +0 -167
- package/dist/reject-flow.d.ts +0 -69
- package/dist/reject-flow.js +0 -260
- package/dist/rejection.d.ts +0 -100
- package/dist/replay.d.ts +0 -41
- package/dist/replay.js +0 -122
- package/dist/rrf.d.ts +0 -43
- package/dist/rrf.js +0 -61
- package/dist/scope.d.ts +0 -14
- package/dist/server-detect.d.ts +0 -72
- package/dist/server-detect.js +0 -222
- package/dist/session-owners.d.ts +0 -7
- package/dist/session-owners.js +0 -54
- package/dist/shared.d.ts +0 -186
- package/dist/shared.js +0 -540
- package/dist/skills.d.ts +0 -101
- package/dist/skills.js +0 -367
- package/dist/store/entry-writes-group.d.ts +0 -9
- package/dist/store/vector-writes.d.ts +0 -6
- package/dist/store/vector-writes.js +0 -59
- package/dist/store-port.d.ts +0 -262
- package/dist/store-port.js +0 -178
- package/dist/tenant.d.ts +0 -25
- package/dist/tenant.js +0 -43
- package/dist/trace.d.ts +0 -34
- package/dist/transcript-tail.js +0 -48
- package/dist/version.d.ts +0 -26
- package/dist/version.js +0 -41
- package/dist/working-memory.js +0 -154
- /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
- /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
- /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
- /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
- /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
- /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
- /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
- /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
- /package/dist/{api-errors.js → core/api-errors.js} +0 -0
- /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
- /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
- /package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +0 -0
- /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
- /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
- /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
- /package/dist/{quality-repair.d.ts → store/quality-repair.d.ts} +0 -0
- /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
- /package/dist/{escape.js → util/escape.js} +0 -0
- /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
- /package/dist/{keyset.js → util/keyset.js} +0 -0
- /package/dist/{same-text.js → util/same-text.js} +0 -0
- /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
- /package/dist/{db → util}/sqlite-blocked.js +0 -0
- /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
- /package/dist/{tokenize.js → util/tokenize.js} +0 -0
- /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
- /package/dist/{write-budget.js → util/write-budget.js} +0 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/** Moves a store's memories to a new default half-life: only memories still on the old base are rescaled (`deriveHalfLife(from, entry)` plus recall bonus).
|
|
2
|
+
* Memories hippo shortened since, or with their own fixed half-life, keep theirs; rescales are audit-logged and `meta` records the base, so it runs once. */
|
|
3
|
+
import { deriveHalfLife } from '../core/memory.js';
|
|
4
|
+
import { HALF_LIFE_BASE_META_KEY, LEGACY_TYPED_HALF_LIFE } from '../store/open.js';
|
|
5
|
+
import { moveHalfLives, recordedHalfLifeBase } from '../store/half-life.js';
|
|
6
|
+
const TYPED_SOURCES = new Set(['decision', 'incident', 'process', 'policy', 'skill', 'project_brief', 'customer_note']);
|
|
7
|
+
export { HALF_LIFE_BASE_META_KEY, LEGACY_TYPED_HALF_LIFE };
|
|
8
|
+
/** Recall bonus over `written`, the half-life `entry` got at write, or null when off it; each recall added 2 days. */
|
|
9
|
+
export function halfLifeRecallBonus(entry, written) {
|
|
10
|
+
if (entry.superseded_by || entry.tags.includes('invalidated') || entry.tags.includes('superseded'))
|
|
11
|
+
return null;
|
|
12
|
+
const bonus = entry.half_life_days - written;
|
|
13
|
+
const k = Math.round(bonus / 2);
|
|
14
|
+
return Math.abs(bonus - 2 * k) < 1e-9 && k >= 0 && k <= entry.retrieval_count ? bonus : null;
|
|
15
|
+
}
|
|
16
|
+
/** The entries to rescale from `from` to `to`, as copies that keep their recall bonus. Pure. */
|
|
17
|
+
export function planHalfLifeMigration(entries, from, to) {
|
|
18
|
+
if (from === to)
|
|
19
|
+
return [];
|
|
20
|
+
return entries.flatMap((e) => {
|
|
21
|
+
const bonus = halfLifeRecallBonus(e, deriveHalfLife(from, e));
|
|
22
|
+
return bonus === null ? [] : [{ ...e, half_life_days: deriveHalfLife(to, e) + bonus }];
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
/** Memories of decisions, incidents and other objects still on the flat 90 days, as copies on `to` that keep their recall bonus. Pure. */
|
|
26
|
+
export function planTypedHalfLifeMigration(entries, to) {
|
|
27
|
+
return entries.flatMap((e) => {
|
|
28
|
+
const bonus = TYPED_SOURCES.has(e.source) ? halfLifeRecallBonus(e, LEGACY_TYPED_HALF_LIFE) : null;
|
|
29
|
+
const next = bonus === null ? e.half_life_days : deriveHalfLife(to, e) + bonus;
|
|
30
|
+
return next === e.half_life_days ? [] : [{ ...e, half_life_days: next }];
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/** The base this store's memories are on. */
|
|
34
|
+
export function storeHalfLifeBase(hippoRoot) {
|
|
35
|
+
return recordedHalfLifeBase(hippoRoot);
|
|
36
|
+
}
|
|
37
|
+
/** Move the store's memories, and those of objects on the old flat 90 days, from their recorded base to `to`, once; `dryRun` writes nothing. */
|
|
38
|
+
export function migrateDefaultHalfLife(hippoRoot, to, opts = {}) {
|
|
39
|
+
const dryRun = opts.dryRun ?? false;
|
|
40
|
+
const { from, outcome } = moveHalfLives(hippoRoot, to, { dryRun, actor: opts.actor ?? 'system' }, (rows) => {
|
|
41
|
+
const { basePlan, typedPlan } = planMoves(rows, to);
|
|
42
|
+
const plan = [...basePlan, ...typedPlan];
|
|
43
|
+
return {
|
|
44
|
+
moves: [{ from: rows.from, to, entries: basePlan }, { from: LEGACY_TYPED_HALF_LIFE, to, entries: typedPlan }],
|
|
45
|
+
outcome: {
|
|
46
|
+
rescaled: basePlan.length,
|
|
47
|
+
typed: typedPlan.length,
|
|
48
|
+
kept: rows.all.length - plan.length,
|
|
49
|
+
halfLives: new Map(plan.map((e) => [e.id, e.half_life_days]))
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
});
|
|
53
|
+
const moved = outcome ?? { rescaled: 0, typed: 0, kept: 0, halfLives: new Map() };
|
|
54
|
+
return { from, to, rescaled: moved.rescaled, typed: moved.typed, kept: moved.kept, dryRun, halfLives: moved.halfLives };
|
|
55
|
+
}
|
|
56
|
+
/** The base move and the move of object memories, planned from one read of the store. Pure. */
|
|
57
|
+
function planMoves(rows, to) {
|
|
58
|
+
const { all, typedPending } = rows;
|
|
59
|
+
const objects = objectMemoryIds(rows.objectRows);
|
|
60
|
+
const losers = conflictLosers(rows.conflictAudits, rows.resolvedConflicts);
|
|
61
|
+
const copies = new Set(all.flatMap((e) => (e.superseded_by ? [e.superseded_by] : [])));
|
|
62
|
+
// Provenance before shape: an object's memory came from its writer, a supersede copy from the base (it keeps the source). Shape decides the rest.
|
|
63
|
+
const objectWritten = (e) => objects.all.has(e.id) || (!copies.has(e.id) && TYPED_SOURCES.has(e.source) && halfLifeRecallBonus(e, LEGACY_TYPED_HALF_LIFE) !== null);
|
|
64
|
+
const typedPlan = typedPending ? planTypedHalfLifeMigration(all.filter((e) => objectWritten(e) && !objects.retired.has(e.id) && !losers.has(e.id)), to) : [];
|
|
65
|
+
const basePlan = planHalfLifeMigration(typedPending ? all.filter((e) => !objectWritten(e)) : all, rows.from, to);
|
|
66
|
+
return { basePlan, typedPlan };
|
|
67
|
+
}
|
|
68
|
+
/** Memories behind every object, and those behind a superseded or closed one. Retiring an object leaves its memory untouched, so only its table knows. */
|
|
69
|
+
function objectMemoryIds(objectRows) {
|
|
70
|
+
const all = new Set();
|
|
71
|
+
const retired = new Set();
|
|
72
|
+
for (const r of objectRows) {
|
|
73
|
+
all.add(r.memory_id);
|
|
74
|
+
if (r.status === 'superseded' || r.status === 'closed')
|
|
75
|
+
retired.add(r.memory_id);
|
|
76
|
+
}
|
|
77
|
+
return { all, retired };
|
|
78
|
+
}
|
|
79
|
+
/** Memories that lost a conflict, which resolveConflict halved untagged. A resolved conflict with no audit
|
|
80
|
+
* row (resolved before resolves were audited, or found stale) names no winner, so both sides count. */
|
|
81
|
+
function conflictLosers(audited, resolved) {
|
|
82
|
+
const losers = new Set(audited.map((a) => a.loserId));
|
|
83
|
+
const named = new Set(audited.map((a) => a.conflictId));
|
|
84
|
+
for (const c of resolved)
|
|
85
|
+
if (!named.has(c.id))
|
|
86
|
+
losers.add(c.memory_a_id).add(c.memory_b_id);
|
|
87
|
+
return losers;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=half-life-migration.js.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { envAnthropicApiKey, envDagRebuildCap } from '../env.js';
|
|
2
|
-
import { Layer } from '../memory.js';
|
|
3
|
-
import { log } from '../log.js';
|
|
1
|
+
import { envAnthropicApiKey, envDagRebuildCap } from '../util/env.js';
|
|
2
|
+
import { Layer } from '../core/memory.js';
|
|
3
|
+
import { log } from '../util/log.js';
|
|
4
4
|
import { keptAsWritten } from './run.js';
|
|
5
|
-
import { isReusable } from '../memory-quality.js';
|
|
5
|
+
import { isReusable } from '../core/memory-quality.js';
|
|
6
6
|
/** The key, model options and once-per-line error reporter every LLM phase shares. */
|
|
7
7
|
function sleepLlm(run, fetcher) {
|
|
8
8
|
const { config, result } = run;
|
|
@@ -21,16 +21,14 @@ function sleepLlm(run, fetcher) {
|
|
|
21
21
|
return { apiKey, llmError, llmOpts };
|
|
22
22
|
}
|
|
23
23
|
export async function llmPasses(run, fetcher) {
|
|
24
|
-
// -------------------------------------------------------------------------
|
|
25
24
|
// 1.6. Batch extraction — extract facts from episodic memories missing them
|
|
26
|
-
// -------------------------------------------------------------------------
|
|
27
25
|
const extractedFromIds = new Set(run.survivors.filter((e) => e.extracted_from).map((e) => e.extracted_from));
|
|
28
26
|
const extractionCandidates = run.survivors.filter((e) => e.layer === Layer.Episodic && !e.superseded_by && !extractedFromIds.has(e.id) && !keptAsWritten(e)
|
|
29
27
|
&& e.trace_outcome === null && e.source !== 'auto-promote' && isReusable(e));
|
|
30
28
|
run.result.extractionCandidates = extractionCandidates.length;
|
|
31
29
|
const llm = sleepLlm(run, fetcher);
|
|
32
30
|
if (llm.apiKey && extractionCandidates.length > 0 && !run.dryRun) {
|
|
33
|
-
const { extractFacts, storeExtractedFacts } = await import('../extract.js');
|
|
31
|
+
const { extractFacts, storeExtractedFacts } = await import('../learn/extract.js');
|
|
34
32
|
const batchLimit = 20;
|
|
35
33
|
let extractedCount = 0;
|
|
36
34
|
for (const candidate of extractionCandidates.slice(0, batchLimit)) {
|
|
@@ -52,15 +50,13 @@ export async function llmPasses(run, fetcher) {
|
|
|
52
50
|
await entityProfilePass(run, llm);
|
|
53
51
|
}
|
|
54
52
|
}
|
|
55
|
-
// -------------------------------------------------------------------------
|
|
56
53
|
// 1.7. DAG summarization — cluster extracted facts and generate summaries
|
|
57
|
-
// -------------------------------------------------------------------------
|
|
58
54
|
async function dagBuildPass(run, { apiKey, llmError, llmOpts }) {
|
|
59
55
|
const extractedFacts = run.survivors.filter((e) => e.tags.includes('extracted') && e.dag_level === 1 && !e.superseded_by && isReusable(e));
|
|
60
56
|
if (!(apiKey && extractedFacts.length >= 3 && !run.dryRun))
|
|
61
57
|
return;
|
|
62
58
|
try {
|
|
63
|
-
const { buildDag } = await import('
|
|
59
|
+
const { buildDag } = await import('./dag.js');
|
|
64
60
|
const dagResult = await buildDag(run.hippoRoot, extractedFacts, { ...llmOpts, onError: llmError('dag') });
|
|
65
61
|
run.result.dagCandidateClusters = dagResult.candidateClusters;
|
|
66
62
|
run.result.dagSummariesCreated = dagResult.summariesCreated;
|
|
@@ -72,18 +68,12 @@ async function dagBuildPass(run, { apiKey, llmError, llmOpts }) {
|
|
|
72
68
|
llmError('dag')(String(err));
|
|
73
69
|
}
|
|
74
70
|
}
|
|
75
|
-
//
|
|
76
|
-
//
|
|
77
|
-
// -------------------------------------------------------------------------
|
|
78
|
-
// Consumer of the summary_dirty flag. Walks dirty L2 summaries, regenerates
|
|
79
|
-
// each via generateDagSummary, atomically refreshes content + 6 metadata
|
|
80
|
-
// columns + clears summary_dirty (with FTS sync). Same apiKey/dryRun gate
|
|
81
|
-
// as buildDag above. Cap HIPPO_DAG_REBUILD_CAP (default 20, hard ceiling
|
|
82
|
-
// 1000) prevents runaway LLM cost.
|
|
71
|
+
// 1.8. DAG summary rebuild: drain the summary_dirty queue set by child-write hooks; same apiKey/dryRun gate as buildDag.
|
|
72
|
+
// Cap HIPPO_DAG_REBUILD_CAP (default 20, hard ceiling 1000) prevents runaway LLM cost.
|
|
83
73
|
async function dagRebuildPass(run, { llmError, llmOpts }) {
|
|
84
74
|
const { result } = run;
|
|
85
75
|
try {
|
|
86
|
-
const { rebuildDirtySummaries } = await import('
|
|
76
|
+
const { rebuildDirtySummaries } = await import('./dag.js');
|
|
87
77
|
const rawCap = envDagRebuildCap();
|
|
88
78
|
// Hard ceiling so a misconfigured env can't burn unbounded LLM cost.
|
|
89
79
|
const cap = rawCap !== undefined ? Math.min(rawCap, 1000) : 20;
|
|
@@ -112,18 +102,11 @@ async function dagRebuildPass(run, { llmError, llmOpts }) {
|
|
|
112
102
|
llmError('dag rebuild')(String(err));
|
|
113
103
|
}
|
|
114
104
|
}
|
|
115
|
-
//
|
|
116
|
-
// 1.
|
|
117
|
-
// -------------------------------------------------------------------------
|
|
118
|
-
// Aggregate per-entity L2 summaries (e.g. all the speaker:Alice
|
|
119
|
-
// topic summaries) into a single L3 entity profile. Runs even when phase
|
|
120
|
-
// 1.7 buildDag was skipped (re-clusters existing L2s every sleep).
|
|
121
|
-
//
|
|
122
|
-
// Uses loadAllL2Summaries (not `survivors`) because phase 1.7 wrote new
|
|
123
|
-
// L2s directly via writeEntry without pushing back into survivors.
|
|
105
|
+
// 1.9. DAG entity profiles: cluster L2 summaries into per-entity L3 profiles; runs even when 1.7 was skipped (re-clusters existing L2s every sleep).
|
|
106
|
+
// Uses loadAllL2Summaries, not `survivors`: phase 1.7 wrote new L2s via writeEntry without pushing them into survivors.
|
|
124
107
|
async function entityProfilePass(run, { llmError, llmOpts }) {
|
|
125
108
|
try {
|
|
126
|
-
const { buildEntityProfiles } = await import('
|
|
109
|
+
const { buildEntityProfiles } = await import('./dag.js');
|
|
127
110
|
const { loadAllL2Summaries } = await import('../store/summaries.js');
|
|
128
111
|
const l2Summaries = loadAllL2Summaries(run.hippoRoot);
|
|
129
112
|
if (l2Summaries.length >= 2) {
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Frozen learned memory-value weight vector, GENERATED from benchmarks/memory-value/weights-learned.json; never edit by hand (a sync test fails CI on drift).
|
|
2
|
+
* CAVEAT: usage-feature signs come from an anti-oracle simulation, not real usage value; never read this as production ranking advice. */
|
|
3
|
+
/** The 8 live feature dims the fitter optimized over (FIT_DIMS). */
|
|
4
|
+
export declare const MEMORY_VALUE_WEIGHTS: Readonly<Record<string, number>>;
|
|
5
|
+
/** sha256 of benchmarks/memory-value/weights-learned.json at freeze time
|
|
6
|
+
* (weights-learned.meta.json's `weightsFileSha256`). */
|
|
7
|
+
export declare const SOURCE_ARTIFACT_SHA256 = "1e747abed0df771fc9c354da8562771b336c4042faf0266f565bba1b5a8c5a40";
|
|
8
|
+
//# sourceMappingURL=memory-value-weights.d.ts.map
|
|
@@ -1,16 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* GENERATED FROM the frozen artifact
|
|
5
|
-
* (benchmarks/memory-value/weights-learned.json +
|
|
6
|
-
* benchmarks/memory-value/weights-learned.meta.json). NEVER EDIT BY HAND —
|
|
7
|
-
* tests/memory-value-wiring.test.ts's weights-sync test asserts this constant
|
|
8
|
-
* equals the committed JSON artifact (value equality + digest match), so
|
|
9
|
-
* drift between the artifact and this file fails CI.
|
|
10
|
-
*
|
|
11
|
-
* CAVEAT: usage-feature signs reflect an anti-oracle simulation, NOT real usage
|
|
12
|
-
* value. Never read this as production ranking advice.
|
|
13
|
-
*/
|
|
1
|
+
/** Frozen learned memory-value weight vector, GENERATED from benchmarks/memory-value/weights-learned.json; never edit by hand (a sync test fails CI on drift).
|
|
2
|
+
* CAVEAT: usage-feature signs come from an anti-oracle simulation, not real usage value; never read this as production ranking advice. */
|
|
14
3
|
/** The 8 live feature dims the fitter optimized over (FIT_DIMS). */
|
|
15
4
|
export const MEMORY_VALUE_WEIGHTS = Object.freeze({
|
|
16
5
|
age_days: -0.3245577821391783,
|
|
@@ -0,0 +1,45 @@
|
|
|
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 { type MemoryEntry } from '../core/memory.js';
|
|
4
|
+
/** The 8 live feature dims (FIT_DIMS) — canonical order for iteration. */
|
|
5
|
+
export declare const MV_FEATURE_NAMES: ReadonlyArray<keyof MvFeatureVector>;
|
|
6
|
+
export interface MvFeatureVector {
|
|
7
|
+
age_days: number;
|
|
8
|
+
half_life_days: number;
|
|
9
|
+
strength: number;
|
|
10
|
+
retrieval_count: number;
|
|
11
|
+
outcome_positive: number;
|
|
12
|
+
outcome_negative: number;
|
|
13
|
+
outcome_ratio: number;
|
|
14
|
+
content_length: number;
|
|
15
|
+
}
|
|
16
|
+
/** 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
|
|
17
|
+
* DecayOptions, as in the weights' training; passing the production decay basis would silently break parity with the frozen weights. */
|
|
18
|
+
export declare function computeMvFeatures(entry: MemoryEntry, now: Date): MvFeatureVector;
|
|
19
|
+
export declare function validateWeights(weights?: Readonly<Record<string, number>>, digest?: string): void;
|
|
20
|
+
/** Min-max normalize the 8 features over the given entries (constant -> 0), then score = dot(weights, normalized); callers set the scope.
|
|
21
|
+
* 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. */
|
|
22
|
+
export declare function scoreEntries(entries: MemoryEntry[], now: Date, weights?: Readonly<Record<string, number>>): Map<string, number>;
|
|
23
|
+
/** Per-entry rank context within its tenant's non-pinned candidate set: the basis both rescueSet and the consolidate audit-row metadata read. */
|
|
24
|
+
export interface MvRankInfo {
|
|
25
|
+
tenantId: string;
|
|
26
|
+
score: number;
|
|
27
|
+
/** 1-based rank by score DESC within the tenant's non-pinned candidate set. */
|
|
28
|
+
rank: number;
|
|
29
|
+
/** Size of the tenant's non-pinned candidate set. */
|
|
30
|
+
totalNonPinned: number;
|
|
31
|
+
/** ceil(RESCUE_BUDGET * totalNonPinned) — the rescue cutoff; rank <= keepN rescues. */
|
|
32
|
+
keepN: number;
|
|
33
|
+
}
|
|
34
|
+
/** Group non-pinned entries by tenantId, score and rank each group independently, and return rank context for every non-pinned entry;
|
|
35
|
+
* rescueSet and the consolidate audit rows share it so they never compute the ranking differently. */
|
|
36
|
+
export declare function rankNonPinnedByTenant(entries: MemoryEntry[], now: Date, weights?: Readonly<Record<string, number>>, digest?: string): Map<string, MvRankInfo>;
|
|
37
|
+
export interface RescueSetOptions {
|
|
38
|
+
readonly weights?: Readonly<Record<string, number>>;
|
|
39
|
+
readonly digest?: string;
|
|
40
|
+
readonly precomputedRanks?: Map<string, MvRankInfo>;
|
|
41
|
+
}
|
|
42
|
+
/** Rescue decision: the subset of condemnedIds ranking in the top 30% of their tenant's non-pinned set by learned score.
|
|
43
|
+
* Pass `precomputedRanks` to skip the internal ranking so the whole-store pass runs once per sleep; `weights`/`digest` overrides exist for tests only. */
|
|
44
|
+
export declare function rescueSet(entries: MemoryEntry[], condemnedIds: Set<string>, now: Date, options?: RescueSetOptions): Set<string>;
|
|
45
|
+
//# sourceMappingURL=memory-value.d.ts.map
|
|
@@ -0,0 +1,164 @@
|
|
|
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 { calculateStrength } from '../core/memory.js';
|
|
5
|
+
import { compareEntryIdentity } from '../core/compare.js';
|
|
6
|
+
import { MEMORY_VALUE_WEIGHTS, SOURCE_ARTIFACT_SHA256 } from './memory-value-weights.js';
|
|
7
|
+
import { DAY_MS } from '../util/time.js';
|
|
8
|
+
/** The 8 live feature dims (FIT_DIMS) — canonical order for iteration. */
|
|
9
|
+
export const MV_FEATURE_NAMES = [
|
|
10
|
+
'age_days',
|
|
11
|
+
'half_life_days',
|
|
12
|
+
'strength',
|
|
13
|
+
'retrieval_count',
|
|
14
|
+
'outcome_positive',
|
|
15
|
+
'outcome_negative',
|
|
16
|
+
'outcome_ratio',
|
|
17
|
+
'content_length',
|
|
18
|
+
];
|
|
19
|
+
/** The keep-budget operating point (the only point with measured
|
|
20
|
+
* evidence): a code constant tied to that evidence, not user-tunable. */
|
|
21
|
+
const RESCUE_BUDGET = 0.3;
|
|
22
|
+
/** 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.
|
|
23
|
+
* A code constant tied to that reasoning, not user-tunable (like RESCUE_BUDGET). */
|
|
24
|
+
const MIN_RESCUE_GROUP = 10;
|
|
25
|
+
/** 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
|
|
26
|
+
* DecayOptions, as in the weights' training; passing the production decay basis would silently break parity with the frozen weights. */
|
|
27
|
+
export function computeMvFeatures(entry, now) {
|
|
28
|
+
const ageDays = (now.getTime() - Date.parse(entry.created)) / DAY_MS;
|
|
29
|
+
const pos = entry.outcome_positive ?? 0;
|
|
30
|
+
const neg = entry.outcome_negative ?? 0;
|
|
31
|
+
return {
|
|
32
|
+
age_days: ageDays,
|
|
33
|
+
half_life_days: entry.half_life_days,
|
|
34
|
+
strength: calculateStrength(entry, now), // clock-basis, never decayOpts — see doc comment above
|
|
35
|
+
retrieval_count: entry.retrieval_count,
|
|
36
|
+
outcome_positive: pos,
|
|
37
|
+
outcome_negative: neg,
|
|
38
|
+
outcome_ratio: (pos - neg) / (pos + neg + 1), // same formula as extract.mjs / calculateRewardFactor's ratio term
|
|
39
|
+
content_length: entry.content.length,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/** 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.
|
|
43
|
+
* Parameterized (default: the frozen singleton) so the throw paths are unit-testable. */
|
|
44
|
+
function isFiniteWeightValue(value) {
|
|
45
|
+
return typeof value === 'number' && Number.isFinite(value);
|
|
46
|
+
}
|
|
47
|
+
function isNonEmptyDigestString(value) {
|
|
48
|
+
return typeof value === 'string' && value.length > 0;
|
|
49
|
+
}
|
|
50
|
+
export function validateWeights(weights = MEMORY_VALUE_WEIGHTS, digest = SOURCE_ARTIFACT_SHA256) {
|
|
51
|
+
for (const key of MV_FEATURE_NAMES) {
|
|
52
|
+
const v = weights[key];
|
|
53
|
+
if (!isFiniteWeightValue(v)) {
|
|
54
|
+
throw new Error(`memory-value: weights constant is malformed — "${key}" is not a finite number ` +
|
|
55
|
+
`(src/consolidate/memory-value-weights.ts)`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (!isNonEmptyDigestString(digest)) {
|
|
59
|
+
throw new Error('memory-value: weights constant is malformed — SOURCE_ARTIFACT_SHA256 digest missing (src/consolidate/memory-value-weights.ts)');
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/** Min-max normalize the 8 features over the given entries (constant -> 0), then score = dot(weights, normalized); callers set the scope.
|
|
63
|
+
* 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. */
|
|
64
|
+
export function scoreEntries(entries, now, weights = MEMORY_VALUE_WEIGHTS) {
|
|
65
|
+
const raw = new Map();
|
|
66
|
+
for (const e of entries)
|
|
67
|
+
raw.set(e.id, computeMvFeatures(e, now));
|
|
68
|
+
const nonFiniteIds = new Set();
|
|
69
|
+
for (const e of entries) {
|
|
70
|
+
const nf = raw.get(e.id);
|
|
71
|
+
if (MV_FEATURE_NAMES.some((f) => !Number.isFinite(nf[f])))
|
|
72
|
+
nonFiniteIds.add(e.id);
|
|
73
|
+
}
|
|
74
|
+
const normContextEntries = entries.filter((e) => !nonFiniteIds.has(e.id));
|
|
75
|
+
const minMax = new Map();
|
|
76
|
+
for (const f of MV_FEATURE_NAMES) {
|
|
77
|
+
let min = Infinity;
|
|
78
|
+
let max = -Infinity;
|
|
79
|
+
for (const e of normContextEntries) {
|
|
80
|
+
const v = raw.get(e.id)[f];
|
|
81
|
+
if (v < min)
|
|
82
|
+
min = v;
|
|
83
|
+
if (v > max)
|
|
84
|
+
max = v;
|
|
85
|
+
}
|
|
86
|
+
minMax.set(f, { min, max });
|
|
87
|
+
}
|
|
88
|
+
const norm = (f, v) => {
|
|
89
|
+
const { min, max } = minMax.get(f);
|
|
90
|
+
return max === min ? 0 : (v - min) / (max - min);
|
|
91
|
+
};
|
|
92
|
+
const scores = new Map();
|
|
93
|
+
for (const e of entries) {
|
|
94
|
+
if (nonFiniteIds.has(e.id)) {
|
|
95
|
+
scores.set(e.id, -Infinity);
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
const nf = raw.get(e.id);
|
|
99
|
+
let sum = 0;
|
|
100
|
+
for (const f of MV_FEATURE_NAMES)
|
|
101
|
+
sum += weights[f] * norm(f, nf[f]);
|
|
102
|
+
scores.set(e.id, sum);
|
|
103
|
+
}
|
|
104
|
+
return scores;
|
|
105
|
+
}
|
|
106
|
+
/** Group non-pinned entries by tenantId, score and rank each group independently, and return rank context for every non-pinned entry;
|
|
107
|
+
* rescueSet and the consolidate audit rows share it so they never compute the ranking differently. */
|
|
108
|
+
export function rankNonPinnedByTenant(entries, now, weights = MEMORY_VALUE_WEIGHTS, digest = SOURCE_ARTIFACT_SHA256) {
|
|
109
|
+
validateWeights(weights, digest);
|
|
110
|
+
const byTenant = new Map();
|
|
111
|
+
for (const e of entries) {
|
|
112
|
+
if (e.pinned)
|
|
113
|
+
continue; // pinned entries never compete for rescue (never condemned)
|
|
114
|
+
// Default an undefined tenantId as dag.ts:341 does: a raw/legacy row can carry one at runtime,
|
|
115
|
+
// and keying it "undefined" would split it into its own singleton tenant.
|
|
116
|
+
const tenantId = e.tenantId ?? DEFAULT_TENANT_ID;
|
|
117
|
+
const list = byTenant.get(tenantId);
|
|
118
|
+
if (list)
|
|
119
|
+
list.push(e);
|
|
120
|
+
else
|
|
121
|
+
byTenant.set(tenantId, [e]);
|
|
122
|
+
}
|
|
123
|
+
const result = new Map();
|
|
124
|
+
for (const [tenantId, group] of byTenant) {
|
|
125
|
+
const scores = scoreEntries(group, now, weights);
|
|
126
|
+
// score DESC, then compareEntryIdentity, the shared tie-break of every score-primary sort (src/core/compare.ts).
|
|
127
|
+
// `-Infinity - -Infinity` is NaN, which Array.sort leaves insertion-order-dependent, so NaN ties too.
|
|
128
|
+
const sorted = [...group].sort((a, b) => {
|
|
129
|
+
const diff = scores.get(b.id) - scores.get(a.id);
|
|
130
|
+
return diff === 0 || Number.isNaN(diff) ? compareEntryIdentity(a, b) : diff;
|
|
131
|
+
});
|
|
132
|
+
// Tenants smaller than MIN_RESCUE_GROUP never rescue (keepN 0); see that constant's doc comment.
|
|
133
|
+
const keepN = sorted.length < MIN_RESCUE_GROUP
|
|
134
|
+
? 0
|
|
135
|
+
: Math.min(sorted.length, Math.ceil(RESCUE_BUDGET * sorted.length));
|
|
136
|
+
sorted.forEach((e, i) => {
|
|
137
|
+
result.set(e.id, {
|
|
138
|
+
tenantId,
|
|
139
|
+
score: scores.get(e.id),
|
|
140
|
+
rank: i + 1,
|
|
141
|
+
totalNonPinned: sorted.length,
|
|
142
|
+
keepN,
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
return result;
|
|
147
|
+
}
|
|
148
|
+
/** Rescue decision: the subset of condemnedIds ranking in the top 30% of their tenant's non-pinned set by learned score.
|
|
149
|
+
* Pass `precomputedRanks` to skip the internal ranking so the whole-store pass runs once per sleep; `weights`/`digest` overrides exist for tests only. */
|
|
150
|
+
export function rescueSet(entries, condemnedIds, now, options = {}) {
|
|
151
|
+
const { weights = MEMORY_VALUE_WEIGHTS, digest = SOURCE_ARTIFACT_SHA256, precomputedRanks } = options;
|
|
152
|
+
validateWeights(weights, digest); // fail loud before any rescue computation
|
|
153
|
+
const ranked = precomputedRanks ?? rankNonPinnedByTenant(entries, now, weights, digest);
|
|
154
|
+
const rescued = new Set();
|
|
155
|
+
for (const id of condemnedIds) {
|
|
156
|
+
const info = ranked.get(id);
|
|
157
|
+
// An explicit finite guard, not just -Infinity sorting last: when a whole tenant
|
|
158
|
+
// ties at -Infinity, rank alone could place one inside keepN.
|
|
159
|
+
if (info && info.rank <= info.keepN && Number.isFinite(info.score))
|
|
160
|
+
rescued.add(id);
|
|
161
|
+
}
|
|
162
|
+
return rescued;
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=memory-value.js.map
|
|
@@ -1,32 +1,26 @@
|
|
|
1
|
-
import { Layer, calculateStrength, createMemory } from '../memory.js';
|
|
2
|
-
import { tokenize } from '../tokenize.js';
|
|
3
|
-
import { jaccardMinShared, overlapPartners } from '
|
|
4
|
-
import { compareEntryIdentity } from '../compare.js';
|
|
5
|
-
import { duplicateKey, mergedText } from '../same-text.js';
|
|
6
|
-
import { successorAfterRetirement } from '
|
|
7
|
-
import { rejectionDigest
|
|
8
|
-
import {
|
|
9
|
-
import { derivationScope, derivationPartitionKey } from '../recall-scope.js';
|
|
1
|
+
import { Layer, calculateStrength, createMemory } from '../core/memory.js';
|
|
2
|
+
import { tokenize } from '../util/tokenize.js';
|
|
3
|
+
import { jaccardMinShared, overlapPartners } from './overlap-index.js';
|
|
4
|
+
import { compareEntryIdentity } from '../core/compare.js';
|
|
5
|
+
import { duplicateKey, mergedText } from '../util/same-text.js';
|
|
6
|
+
import { successorAfterRetirement } from './merged-row.js';
|
|
7
|
+
import { rejectionDigest } from '../store/rejection.js';
|
|
8
|
+
import { reportAuditWriteFailure } from '../store/audit.js';
|
|
9
|
+
import { derivationScope, derivationPartitionKey } from '../store/recall-scope.js';
|
|
10
10
|
import { jaccardSets } from './conflicts.js';
|
|
11
11
|
import { keptAsWritten } from './run.js';
|
|
12
|
-
import { isReusable } from '../memory-quality.js';
|
|
12
|
+
import { isReusable } from '../core/memory-quality.js';
|
|
13
13
|
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;
|
|
25
22
|
const byId = new Map(run.all.map((e) => [e.id, e]));
|
|
26
|
-
const rejectedIn = (tenantId) => (text) =>
|
|
27
|
-
const db = run.getConsolidateDb();
|
|
28
|
-
return db !== null && findRejectedValue(db, tenantId, rejectionDigest(text)) !== null;
|
|
29
|
-
};
|
|
23
|
+
const rejectedIn = (tenantId) => (text) => run.tombstones.find(tenantId, rejectionDigest(text)) !== null;
|
|
30
24
|
for (let i = survivors.length - 1; i >= 0; i--) {
|
|
31
25
|
const row = survivors[i];
|
|
32
26
|
const successor = run.retirable(row) ? successorAfterRetirement(row, byId, rejectedIn(row.tenantId)) : undefined;
|
|
@@ -46,17 +40,13 @@ export function retireHeldTexts(run) {
|
|
|
46
40
|
}
|
|
47
41
|
}
|
|
48
42
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
export function mergePass(run) {
|
|
54
|
-
const alreadyMergedIds = new Set(run.survivors.flatMap((e) => e.parents));
|
|
55
|
-
const mergeCandidates = run.survivors.filter((e) => e.layer === Layer.Episodic && !e.superseded_by && !keptAsWritten(e) && !alreadyMergedIds.has(e.id)
|
|
43
|
+
/** The episodic survivors a merge may consume, grouped by the partition their merged row would land in. */
|
|
44
|
+
function partitionMergeCandidates(survivors) {
|
|
45
|
+
const alreadyMergedIds = new Set(survivors.flatMap((e) => e.parents));
|
|
46
|
+
const mergeCandidates = survivors.filter((e) => e.layer === Layer.Episodic && !e.superseded_by && !keptAsWritten(e) && !alreadyMergedIds.has(e.id)
|
|
56
47
|
&& !e.pinned // a pin merged with a look-alike would read as one of two values
|
|
57
48
|
&& tokenize(e.content).length > 0 // two empty token sets overlap 1, so tokenless text would merge with any other
|
|
58
49
|
&& isReusable(e));
|
|
59
|
-
const used = new Set();
|
|
60
50
|
// Partition BEFORE the overlap loop so a cluster can never span tenants and merge cross-tenant content.
|
|
61
51
|
// Map keeps insertion order, so a single-tenant store gets one partition in the original order.
|
|
62
52
|
const mergeCandidatesByTenant = new Map();
|
|
@@ -68,7 +58,14 @@ export function mergePass(run) {
|
|
|
68
58
|
else
|
|
69
59
|
mergeCandidatesByTenant.set(key, [entry]);
|
|
70
60
|
}
|
|
71
|
-
|
|
61
|
+
return mergeCandidatesByTenant;
|
|
62
|
+
}
|
|
63
|
+
// 3. Merge pass - episodic entries only
|
|
64
|
+
/** Returns how many clusters were skipped because their merged text matches a rejected value. */
|
|
65
|
+
export function mergePass(run) {
|
|
66
|
+
const used = new Set();
|
|
67
|
+
const mergeCandidatesByTenant = partitionMergeCandidates(run.survivors);
|
|
68
|
+
// The rejection guard reuses the run's one lazily opened tombstone handle; a dry-run
|
|
72
69
|
// never reaches batchWriteAndDelete's guard bypass, so it has nothing to protect there.
|
|
73
70
|
let mergesSkippedRejected = 0;
|
|
74
71
|
for (const [, tenantCandidates] of mergeCandidatesByTenant) {
|
|
@@ -107,28 +104,9 @@ function mergeCluster(run, partition, cluster, related, used) {
|
|
|
107
104
|
const { result, dryRun } = run;
|
|
108
105
|
// Create a semantic summary
|
|
109
106
|
const mergedContent = mergeContents(cluster);
|
|
110
|
-
const allTags = Array.from(new Set(cluster.flatMap((e) => e.tags))).sort();
|
|
111
|
-
const maxValence = pickStrongestValence(cluster);
|
|
112
107
|
// Build the semantic entry FIRST (createMemory is cheap and pure) so the tombstone check below runs
|
|
113
108
|
// under the partition's tenant, the one every cluster member shares and the row will land in.
|
|
114
|
-
|
|
115
|
-
if (!dryRun) {
|
|
116
|
-
semantic = {
|
|
117
|
-
...createMemory(mergedContent, {
|
|
118
|
-
layer: Layer.Semantic,
|
|
119
|
-
tags: allTags,
|
|
120
|
-
emotional_valence: maxValence,
|
|
121
|
-
schema_fit: 0.7,
|
|
122
|
-
source: 'consolidation',
|
|
123
|
-
confidence: 'inferred',
|
|
124
|
-
tenantId: partition.tenantId,
|
|
125
|
-
scope: partition.scope,
|
|
126
|
-
baseHalfLifeDays: run.config.defaultHalfLifeDays,
|
|
127
|
-
}),
|
|
128
|
-
origin_project: partition.origin,
|
|
129
|
-
parents: cluster.map((e) => e.id),
|
|
130
|
-
};
|
|
131
|
-
}
|
|
109
|
+
const semantic = dryRun ? null : semanticSummary(mergedContent, cluster, partition, run.config.defaultHalfLifeDays);
|
|
132
110
|
if (semantic && mergeRejected(run, semantic, cluster, related, used))
|
|
133
111
|
return false;
|
|
134
112
|
// Mark cluster members as used
|
|
@@ -140,51 +118,55 @@ function mergeCluster(run, partition, cluster, related, used) {
|
|
|
140
118
|
run.pendingWrites.push(semantic);
|
|
141
119
|
run.units.push([semantic.id, ...cluster.map((e) => e.id)]);
|
|
142
120
|
result.semanticCreated++;
|
|
143
|
-
//
|
|
144
|
-
//
|
|
145
|
-
|
|
146
|
-
// worse-retrieving summary regresses budget-bounded QA. The stored
|
|
147
|
-
// strength is refreshed to the live value so inspect, replay sampling,
|
|
148
|
-
// and strength-sorted assembly see the truth instead of a fake 0.3.
|
|
149
|
-
// Mutate in place (not a copy): `cluster` holds the same object
|
|
150
|
-
// references as `survivors`, and the later detectConflicts(survivors)
|
|
151
|
-
// pass in this same run must see the post-demotion half-life, or it
|
|
152
|
-
// can persist conflicts for entries the just-written state excludes.
|
|
153
|
-
for (const e of cluster) {
|
|
154
|
-
e.half_life_days = Math.max(1, Math.floor(e.half_life_days * MERGE_SOURCE_HALF_LIFE_FACTOR));
|
|
155
|
-
e.strength = calculateStrength(e, run.now, run.decayOpts);
|
|
156
|
-
run.pendingWrites.push(e);
|
|
157
|
-
}
|
|
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.
|
|
123
|
+
demoteMergedSources(run, cluster);
|
|
158
124
|
}
|
|
159
125
|
return true;
|
|
160
126
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
127
|
+
function semanticSummary(mergedContent, cluster, partition, baseHalfLifeDays) {
|
|
128
|
+
const allTags = Array.from(new Set(cluster.flatMap((e) => e.tags))).sort();
|
|
129
|
+
const maxValence = pickStrongestValence(cluster);
|
|
130
|
+
return {
|
|
131
|
+
...createMemory(mergedContent, {
|
|
132
|
+
layer: Layer.Semantic,
|
|
133
|
+
tags: allTags,
|
|
134
|
+
emotional_valence: maxValence,
|
|
135
|
+
schema_fit: 0.7,
|
|
136
|
+
source: 'consolidation',
|
|
137
|
+
confidence: 'inferred',
|
|
138
|
+
tenantId: partition.tenantId,
|
|
139
|
+
scope: partition.scope,
|
|
140
|
+
baseHalfLifeDays,
|
|
141
|
+
}),
|
|
142
|
+
origin_project: partition.origin,
|
|
143
|
+
parents: cluster.map((e) => e.id),
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
function demoteMergedSources(run, cluster) {
|
|
147
|
+
for (const e of cluster) {
|
|
148
|
+
e.half_life_days = Math.max(1, Math.floor(e.half_life_days * MERGE_SOURCE_HALF_LIFE_FACTOR));
|
|
149
|
+
e.strength = calculateStrength(e, run.now, run.decayOpts);
|
|
150
|
+
run.pendingWrites.push(e);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
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.
|
|
169
155
|
function mergeRejected(run, semantic, cluster, related, used) {
|
|
170
|
-
const
|
|
171
|
-
if (!consolidateDb)
|
|
172
|
-
return false;
|
|
156
|
+
const { tombstones } = run;
|
|
173
157
|
const newDigest = rejectionDigest(semantic.content);
|
|
174
158
|
const oldDigest = rejectionDigest(legacyMergeContents(related)); // tombstones from older releases hold this format's digest
|
|
175
|
-
const newHit =
|
|
176
|
-
const tombstone = newHit ??
|
|
159
|
+
const newHit = tombstones.find(semantic.tenantId, newDigest);
|
|
160
|
+
const tombstone = newHit ?? tombstones.find(semantic.tenantId, oldDigest);
|
|
177
161
|
const mergeDigest = newHit ? newDigest : oldDigest;
|
|
178
162
|
if (!tombstone)
|
|
179
163
|
return false;
|
|
180
|
-
// Still mark used
|
|
181
|
-
// DIFFERENT cluster within this same pass; next sleep re-clusters
|
|
182
|
-
// 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.
|
|
183
165
|
const rejected = newHit ? cluster : related; // the old format digested the uncapped list, so rows past the cap were rejected too
|
|
184
166
|
for (const e of rejected)
|
|
185
167
|
used.add(e.id);
|
|
186
168
|
try {
|
|
187
|
-
|
|
169
|
+
tombstones.audit({
|
|
188
170
|
tenantId: semantic.tenantId,
|
|
189
171
|
actor: 'sleep',
|
|
190
172
|
op: 'reject_refusal',
|
|
@@ -200,9 +182,7 @@ function mergeRejected(run, semantic, cluster, related, used) {
|
|
|
200
182
|
}
|
|
201
183
|
return true;
|
|
202
184
|
}
|
|
203
|
-
// ---------------------------------------------------------------------------
|
|
204
185
|
// Helpers
|
|
205
|
-
// ---------------------------------------------------------------------------
|
|
206
186
|
function mergeContents(entries) {
|
|
207
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.
|
|
208
188
|
// Newest first says which version is current; compareEntryIdentity settles ties, so the row and its rejection digest depend only on the sources.
|
|
@@ -212,7 +192,9 @@ function mergeContents(entries) {
|
|
|
212
192
|
if (!texts.has(duplicateKey(e.content)))
|
|
213
193
|
texts.set(duplicateKey(e.content), e.content);
|
|
214
194
|
}
|
|
215
|
-
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]`;
|
|
216
198
|
return mergedText(header, [...texts.values()]);
|
|
217
199
|
}
|
|
218
200
|
function legacyMergeContents(entries) {
|