hippo-memory 1.68.0 → 1.70.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 +6 -3
- 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 +1 -3
- package/dist/agent-memories/claude-code.js +11 -7
- package/dist/agent-memories/copilot.d.ts +3 -1
- package/dist/agent-memories/copilot.js +5 -4
- package/dist/agent-memories/files.js +3 -2
- 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/report.d.ts +1 -1
- package/dist/agent-memories/report.js +1 -1
- package/dist/agent-memories/source.d.ts +1 -1
- package/dist/agent-memories/source.js +6 -5
- package/dist/agent-memories/sync.d.ts +1 -1
- package/dist/agent-memories/sync.js +24 -33
- package/dist/agent-memories/types.d.ts +1 -1
- package/dist/api/assemble.d.ts +2 -2
- package/dist/api/assemble.js +42 -32
- package/dist/api/audit.d.ts +4 -7
- package/dist/api/audit.js +6 -20
- package/dist/api/auth.d.ts +5 -18
- package/dist/api/auth.js +44 -194
- 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} +2 -2
- package/dist/{availability.js → api/availability.js} +12 -29
- 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 +14 -4
- package/dist/api/context-select.js +50 -60
- package/dist/api/context-types.d.ts +5 -5
- package/dist/api/context.d.ts +2 -4
- package/dist/api/context.js +113 -85
- package/dist/api/dormant.d.ts +3 -3
- package/dist/api/dormant.js +38 -107
- package/dist/api/drill-down.d.ts +2 -2
- package/dist/api/drill-down.js +37 -65
- package/dist/api/forget.d.ts +4 -13
- package/dist/api/forget.js +13 -35
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +2 -2
- package/dist/api/index.d.ts +26 -0
- package/dist/api/index.js +29 -0
- package/dist/api/instruction-detect.js +74 -0
- package/dist/api/learn.js +63 -55
- package/dist/api/ledger-db.d.ts +20 -0
- package/dist/api/ledger-db.js +79 -0
- package/dist/api/on-store.d.ts +16 -0
- package/dist/api/on-store.js +36 -0
- package/dist/api/outcome.d.ts +9 -46
- package/dist/api/outcome.js +15 -57
- 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/promote.d.ts +7 -18
- package/dist/api/promote.js +30 -152
- package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +7 -7
- package/dist/{prompt-hook.js → api/prompt-hook.js} +34 -53
- package/dist/api/quarantine.d.ts +5 -5
- package/dist/api/quarantine.js +30 -106
- package/dist/api/recall-core.d.ts +4 -0
- package/dist/api/recall-core.js +112 -0
- package/dist/{recall-history.js → api/recall-history.js} +30 -25
- package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +5 -5
- package/dist/{recall-pipeline.js → api/recall-pipeline.js} +47 -42
- 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 +41 -16
- package/dist/api/recall.d.ts +1 -1
- package/dist/api/recall.js +39 -37
- package/dist/api/remember.d.ts +12 -13
- package/dist/api/remember.js +38 -27
- 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 -7
- package/dist/api/sleep-run.js +63 -75
- package/dist/api/sleep.d.ts +1 -1
- package/dist/api/tokens.d.ts +2 -2
- package/dist/api/tokens.js +9 -21
- package/dist/api/types.d.ts +2 -2
- package/dist/api/types.js +1 -1
- 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 +1 -1
- package/dist/capture/command.js +54 -41
- 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 +4 -1
- package/dist/capture/compact.js +59 -22
- 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} +48 -94
- package/dist/{compaction-spool.js → capture/compaction-spool.js} +17 -13
- package/dist/capture/copilot-transcript.d.ts +3 -0
- package/dist/capture/copilot-transcript.js +9 -2
- 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} +1 -5
- package/dist/{session-digest.js → capture/session-digest.js} +17 -23
- 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.d.ts +13 -0
- package/dist/capture/session-worker.js +196 -0
- package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
- package/dist/capture/transcript.js +68 -74
- package/dist/capture/working-state.d.ts +0 -3
- package/dist/capture/working-state.js +7 -7
- package/dist/{audit-prune.d.ts → cli/audit-prune.d.ts} +1 -2
- package/dist/{audit-prune.js → cli/audit-prune.js} +5 -39
- package/dist/cli/audit.d.ts +2 -2
- package/dist/cli/audit.js +77 -72
- package/dist/cli/auth.d.ts +2 -1
- package/dist/cli/auth.js +18 -20
- package/dist/cli/briefs.d.ts +4 -3
- package/dist/cli/briefs.js +59 -181
- package/dist/cli/card.d.ts +2 -1
- package/dist/cli/card.js +25 -23
- package/dist/{client.d.ts → cli/client.d.ts} +1 -1
- package/dist/{client.js → cli/client.js} +1 -1
- package/dist/cli/compact-resume-payload.d.ts +8 -0
- package/dist/cli/compact-resume-payload.js +39 -0
- package/dist/cli/context.d.ts +2 -13
- package/dist/cli/context.js +41 -71
- package/dist/cli/continuity.d.ts +6 -5
- package/dist/cli/continuity.js +109 -99
- package/dist/{correction-latency.d.ts → cli/correction-latency.d.ts} +1 -1
- package/dist/cli/curate.d.ts +9 -9
- package/dist/cli/curate.js +177 -149
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +46 -34
- package/dist/cli/decisions.d.ts +4 -3
- package/dist/cli/decisions.js +108 -218
- package/dist/cli/eval.d.ts +1 -3
- package/dist/cli/eval.js +43 -31
- package/dist/cli/explain.d.ts +1 -1
- package/dist/cli/explain.js +35 -19
- package/dist/cli/flag-values.d.ts +25 -0
- package/dist/cli/flag-values.js +103 -0
- package/dist/cli/flags.d.ts +303 -0
- package/dist/cli/flags.js +169 -0
- package/dist/cli/goals.d.ts +2 -1
- package/dist/cli/goals.js +39 -34
- package/dist/cli/hook-runtime.d.ts +49 -0
- package/dist/cli/hook-runtime.js +155 -0
- package/dist/cli/init.d.ts +2 -1
- package/dist/cli/init.js +151 -118
- package/dist/cli/install-steps.d.ts +7 -0
- package/dist/cli/install-steps.js +110 -0
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +9 -7
- package/dist/cli/maintenance.d.ts +5 -4
- package/dist/cli/maintenance.js +31 -27
- package/dist/cli/object-verbs.d.ts +40 -0
- package/dist/cli/object-verbs.js +65 -0
- package/dist/{owner-validation.d.ts → cli/owner-validation.d.ts} +0 -1
- package/dist/{owner-validation.js → cli/owner-validation.js} +2 -2
- package/dist/cli/playbooks.d.ts +4 -3
- package/dist/cli/playbooks.js +77 -280
- package/dist/cli/print.d.ts +18 -0
- package/dist/cli/print.js +85 -0
- package/dist/cli/projects.d.ts +2 -3
- package/dist/cli/projects.js +56 -49
- package/dist/{provenance-coverage.d.ts → cli/provenance-coverage.d.ts} +1 -1
- package/dist/cli/quality-repair-once.js +4 -4
- package/dist/{quality-repair.js → cli/quality-repair.js} +23 -37
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +101 -150
- package/dist/{refine-llm.d.ts → cli/refine-llm.d.ts} +1 -1
- package/dist/{refine-llm.js → cli/refine-llm.js} +70 -82
- package/dist/cli/remember.d.ts +1 -3
- package/dist/cli/remember.js +124 -103
- package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +3 -1
- package/dist/{scheduler.js → cli/scheduler.js} +13 -7
- package/dist/cli/serve.d.ts +1 -1
- package/dist/cli/serve.js +34 -4
- package/dist/cli/session-hooks.d.ts +4 -4
- package/dist/cli/session-hooks.js +265 -191
- package/dist/cli/setup.d.ts +2 -1
- package/dist/cli/setup.js +111 -45
- package/dist/cli/shared.d.ts +5 -95
- package/dist/cli/shared.js +18 -369
- package/dist/cli/slack.d.ts +2 -1
- package/dist/cli/slack.js +31 -55
- package/dist/cli/sleep-render.d.ts +4 -0
- package/dist/cli/sleep-render.js +61 -0
- package/dist/cli/sleep.d.ts +2 -8
- package/dist/cli/sleep.js +20 -76
- package/dist/cli/status.d.ts +3 -3
- package/dist/cli/status.js +39 -41
- package/dist/{stdin.js → cli/stdin.js} +6 -6
- package/dist/cli/transfer.d.ts +4 -4
- package/dist/cli/transfer.js +68 -42
- package/dist/cli/usage.js +8 -3
- package/dist/cli.d.ts +289 -5
- package/dist/cli.js +184 -117
- package/dist/connectors/dlq.d.ts +44 -0
- package/dist/connectors/dlq.js +30 -0
- package/dist/connectors/github/backfill.d.ts +1 -1
- package/dist/connectors/github/backfill.js +29 -66
- package/dist/connectors/github/cli-impl.js +59 -74
- package/dist/connectors/github/deletion.d.ts +5 -6
- package/dist/connectors/github/deletion.js +18 -52
- package/dist/connectors/github/dlq.d.ts +7 -61
- package/dist/connectors/github/dlq.js +19 -119
- package/dist/connectors/github/ingest.d.ts +2 -31
- package/dist/connectors/github/ingest.js +20 -82
- package/dist/connectors/github/octokit-client.d.ts +1 -1
- package/dist/connectors/github/octokit-client.js +2 -1
- package/dist/connectors/github/tenant-routing.d.ts +2 -2
- package/dist/connectors/github/tenant-routing.js +10 -36
- package/dist/connectors/github/transform.d.ts +1 -1
- package/dist/connectors/github/types.d.ts +1 -1
- package/dist/connectors/github/types.js +15 -18
- package/dist/connectors/github/webhook.d.ts +3 -2
- package/dist/connectors/github/webhook.js +84 -87
- package/dist/connectors/slack/backfill.d.ts +1 -1
- package/dist/connectors/slack/backfill.js +5 -29
- package/dist/connectors/slack/deletion.d.ts +4 -7
- package/dist/connectors/slack/deletion.js +20 -48
- package/dist/connectors/slack/dlq.d.ts +7 -49
- package/dist/connectors/slack/dlq.js +25 -118
- package/dist/connectors/slack/ingest.d.ts +5 -18
- package/dist/connectors/slack/ingest.js +27 -90
- package/dist/connectors/slack/signature.js +2 -1
- package/dist/connectors/slack/tenant-routing.d.ts +4 -1
- package/dist/connectors/slack/tenant-routing.js +13 -14
- package/dist/connectors/slack/transform.d.ts +1 -1
- package/dist/connectors/slack/types.d.ts +1 -1
- package/dist/connectors/slack/types.js +3 -12
- package/dist/connectors/slack/web-client.js +2 -2
- package/dist/connectors/slack/webhook.d.ts +3 -2
- package/dist/connectors/slack/webhook.js +75 -82
- package/dist/connectors/slack/workspaces.d.ts +4 -17
- package/dist/connectors/slack/workspaces.js +4 -34
- package/dist/consolidate/conflicts.d.ts +1 -1
- package/dist/consolidate/conflicts.js +4 -4
- package/dist/{dag.d.ts → consolidate/dag.d.ts} +1 -1
- package/dist/{dag.js → consolidate/dag.js} +60 -81
- package/dist/consolidate/decay.d.ts +2 -2
- package/dist/consolidate/decay.js +28 -22
- package/dist/{dedupe.js → consolidate/dedupe.js} +11 -19
- package/dist/consolidate/flush-units.d.ts +2 -2
- package/dist/{half-life-migration.d.ts → consolidate/half-life-migration.d.ts} +3 -9
- package/dist/consolidate/half-life-migration.js +106 -0
- package/dist/consolidate/llm-passes.js +8 -8
- package/dist/{memory-value.d.ts → consolidate/memory-value.d.ts} +7 -2
- package/dist/{memory-value.js → consolidate/memory-value.js} +9 -7
- package/dist/consolidate/merge.js +57 -54
- package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
- package/dist/{merged-row.js → consolidate/merged-row.js} +2 -2
- package/dist/consolidate/physics-pass.js +46 -46
- package/dist/{replay.d.ts → consolidate/replay.d.ts} +1 -1
- package/dist/{replay.js → consolidate/replay.js} +2 -2
- package/dist/consolidate/run.d.ts +7 -13
- package/dist/consolidate/run.js +6 -37
- package/dist/consolidate/sleep.d.ts +1 -1
- package/dist/consolidate/sleep.js +64 -134
- package/dist/{trace.js → consolidate/trace.js} +4 -6
- package/dist/consolidate/traces.js +34 -29
- package/dist/{ablation.js → core/ablation.js} +1 -1
- 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.js → core/ambient.js} +12 -10
- package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +16 -3
- package/dist/core/capture-contract.js +149 -0
- package/dist/{compare.d.ts → core/compare.d.ts} +2 -0
- package/dist/{compare.js → core/compare.js} +10 -3
- package/dist/{config.d.ts → core/config.d.ts} +6 -6
- package/dist/{config.js → core/config.js} +99 -72
- package/dist/core/handoff.js +87 -0
- package/dist/{memory-quality.js → core/memory-quality.js} +1 -1
- package/dist/{memory.d.ts → core/memory.d.ts} +19 -5
- package/dist/{memory.js → core/memory.js} +117 -82
- package/dist/{physics.d.ts → core/physics.d.ts} +1 -1
- package/dist/{physics.js → core/physics.js} +2 -1
- package/dist/{project-identity.d.ts → core/project-identity.d.ts} +0 -5
- package/dist/{project-identity.js → core/project-identity.js} +5 -17
- package/dist/{project-remote.js → core/project-remote.js} +4 -4
- package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +5 -0
- package/dist/{prompt-recall.js → core/prompt-recall.js} +14 -1
- package/dist/{salience.js → core/salience.js} +35 -20
- 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} +5 -5
- 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} +9 -9
- package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +101 -104
- package/dist/{dashboard.js → dashboard/dashboard.js} +124 -53
- package/dist/db/backup.js +1 -1
- package/dist/db/busy.d.ts +18 -1
- package/dist/db/busy.js +74 -9
- package/dist/db/connect.d.ts +10 -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 +25 -30
- package/dist/db/migrations/v08.js +1 -1
- package/dist/db/migrations/v14.js +39 -35
- package/dist/db/migrations/v16.js +29 -26
- package/dist/db/migrations/v18.js +6 -5
- package/dist/db/migrations/v20.js +4 -2
- package/dist/db/migrations/v22.js +39 -36
- package/dist/db/migrations/v24.js +27 -22
- package/dist/db/migrations/v29.js +37 -32
- package/dist/db/migrations/v31.js +36 -31
- package/dist/db/migrations/v35.js +1 -1
- package/dist/db/migrations/v39.js +1 -1
- package/dist/db/migrations/v40.js +15 -14
- package/dist/db/migrations/v43.js +7 -6
- package/dist/db/migrations/v44.js +1 -1
- package/dist/db/migrations/v45.js +1 -1
- package/dist/db/migrations/v46.js +1 -1
- package/dist/db/migrations/v47.js +1 -1
- 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/v52.js +1 -1
- package/dist/db/open.d.ts +9 -1
- package/dist/db/open.js +21 -4
- package/dist/{physics-state.d.ts → db/physics-state.d.ts} +3 -3
- package/dist/{physics-state.js → db/physics-state.js} +9 -16
- package/dist/{raw-archive-mirror-cleanup.d.ts → db/raw-archive-mirror-cleanup.d.ts} +5 -5
- package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +11 -6
- 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} +4 -2
- package/dist/{vector-store.js → db/vector-store.js} +76 -51
- package/dist/db/wal-checkpointer.d.ts +11 -0
- package/dist/db/wal-checkpointer.js +92 -0
- package/dist/doctor.js +105 -136
- 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 +3 -3
- package/dist/{eval-stats.js → eval/eval-stats.js} +12 -9
- package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +1 -1
- package/dist/{eval-suite.js → eval/eval-suite.js} +25 -23
- package/dist/{eval.d.ts → eval/eval.d.ts} +1 -1
- package/dist/{eval.js → eval/eval.js} +29 -22
- package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -3
- package/dist/{judgment.js → eval/judgment.js} +4 -9
- package/dist/extensions/openclaw-plugin/index.js +1 -2
- 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} +6 -6
- package/dist/{graph-extract.js → graph/extract.js} +37 -52
- package/dist/{graph-recall.d.ts → graph/recall.d.ts} +2 -2
- package/dist/{graph-recall.js → graph/recall.js} +55 -36
- package/dist/{graph-stream.d.ts → graph/stream.d.ts} +2 -2
- package/dist/{graph-stream.js → graph/stream.js} +9 -7
- package/dist/{graph-view.d.ts → graph/view.d.ts} +6 -3
- package/dist/{graph-view.js → graph/view.js} +127 -167
- 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 +14 -15
- package/dist/hooks/copilot.d.ts +48 -13
- package/dist/hooks/copilot.js +124 -39
- package/dist/{cli → hooks}/hook-blocks.js +1 -1
- package/dist/hooks/json-hooks.d.ts +3 -1
- package/dist/hooks/json-hooks.js +40 -122
- package/dist/hooks/opencode.js +35 -27
- package/dist/hooks/shared.d.ts +7 -5
- package/dist/hooks/shared.js +19 -8
- package/dist/importers/core.d.ts +2 -6
- package/dist/importers/core.js +41 -39
- package/dist/importers/markdown-parse.d.ts +1 -10
- package/dist/importers/markdown-parse.js +2 -19
- package/dist/importers/markdown.js +2 -1
- package/dist/importers/sources.js +50 -46
- package/dist/importers/vault.js +71 -92
- package/dist/index.d.ts +22 -22
- package/dist/index.js +21 -21
- package/dist/{autolearn.d.ts → learn/autolearn.d.ts} +2 -2
- package/dist/{autolearn.js → learn/autolearn.js} +13 -11
- 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 +125 -0
- package/dist/{forward-claim-detector.d.ts → learn/forward-claim-detector.d.ts} +1 -1
- package/dist/{forward-claim-detector.js → learn/forward-claim-detector.js} +1 -1
- package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +4 -0
- package/dist/{invalidation.js → learn/invalidation.js} +83 -99
- package/dist/mcp/admin-tools.d.ts +1 -1
- package/dist/mcp/admin-tools.js +37 -60
- 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.d.ts +2 -2
- package/dist/mcp/memory-tools.js +12 -31
- package/dist/mcp/protocol.d.ts +6 -10
- package/dist/mcp/protocol.js +8 -14
- package/dist/mcp/recall-tools.d.ts +2 -2
- package/dist/mcp/recall-tools.js +68 -50
- package/dist/mcp/request.js +65 -63
- package/dist/mcp/server.js +1 -1
- package/dist/mcp/session-state.d.ts +1 -2
- package/dist/mcp/session-state.js +2 -2
- package/dist/mcp/shared-gate.js +1 -1
- package/dist/mcp/stdio.js +69 -31
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +2 -2
- package/dist/{customer-notes.d.ts → objects/customer-notes.d.ts} +7 -24
- package/dist/objects/customer-notes.js +112 -0
- package/dist/{decisions.d.ts → objects/decisions.d.ts} +13 -28
- package/dist/objects/decisions.js +101 -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/{incidents.d.ts → objects/incidents.d.ts} +17 -44
- package/dist/objects/incidents.js +130 -0
- package/dist/objects/lifecycle.d.ts +27 -0
- package/dist/objects/lifecycle.js +96 -0
- package/dist/{policies.d.ts → objects/policies.d.ts} +14 -27
- package/dist/objects/policies.js +189 -0
- package/dist/{processes.d.ts → objects/processes.d.ts} +14 -34
- package/dist/objects/processes.js +146 -0
- package/dist/{project-briefs.d.ts → objects/project-briefs.d.ts} +19 -40
- package/dist/objects/project-briefs.js +255 -0
- package/dist/{skills.d.ts → objects/skills.d.ts} +11 -26
- package/dist/objects/skills.js +156 -0
- package/dist/postinstall.js +4 -2
- package/dist/predictions/planning-fallacy.d.ts +4 -76
- package/dist/predictions/planning-fallacy.js +4 -129
- package/dist/rerankers/clef.d.ts +2 -6
- package/dist/rerankers/clef.js +27 -47
- package/dist/rerankers/cross-encoder.d.ts +0 -7
- package/dist/rerankers/cross-encoder.js +15 -23
- package/dist/rerankers/index.js +8 -7
- package/dist/rerankers/jev.d.ts +1 -4
- package/dist/rerankers/jev.js +30 -49
- package/dist/rerankers/llm.d.ts +2 -4
- package/dist/rerankers/llm.js +33 -50
- package/dist/rerankers/outage-warning.d.ts +7 -0
- package/dist/rerankers/outage-warning.js +31 -0
- package/dist/rerankers/remote.d.ts +3 -0
- package/dist/rerankers/remote.js +23 -0
- package/dist/rerankers/types.d.ts +1 -1
- 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 -1
- package/dist/search/boosts.js +34 -13
- 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/hybrid-score.d.ts +2 -2
- package/dist/search/hybrid-score.js +1 -1
- package/dist/search/hybrid.d.ts +4 -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} +7 -5
- package/dist/{path-context.js → search/path-context.js} +3 -1
- package/dist/search/physics-search.d.ts +4 -4
- package/dist/search/physics-search.js +15 -15
- package/dist/search/rerank.d.ts +3 -3
- package/dist/search/rerank.js +4 -3
- package/dist/search/temporal.d.ts +1 -1
- package/dist/search/temporal.js +5 -2
- package/dist/search/vector.d.ts +3 -3
- package/dist/search/vector.js +17 -11
- package/dist/server/auth.d.ts +1 -1
- package/dist/server/auth.js +26 -18
- package/dist/server/boot.d.ts +24 -0
- package/dist/server/boot.js +465 -0
- package/dist/server/client-ip.d.ts +5 -1
- package/dist/server/client-ip.js +18 -6
- 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/key-check-bounds.d.ts +8 -0
- package/dist/server/key-check-bounds.js +46 -0
- package/dist/server/lifecycle.js +1 -1
- package/dist/server/mcp-http.d.ts +1 -4
- package/dist/server/mcp-http.js +34 -24
- package/dist/server/ready.d.ts +7 -0
- package/dist/server/ready.js +38 -0
- package/dist/server/request.d.ts +10 -4
- package/dist/server/request.js +63 -12
- package/dist/server/route-table.d.ts +15 -0
- package/dist/server/route-table.js +209 -0
- package/dist/server/routes/admin.js +13 -8
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +32 -97
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +42 -105
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +42 -95
- package/dist/server/routes/memories.js +21 -20
- package/dist/server/routes/object-routes.d.ts +40 -0
- package/dist/server/routes/object-routes.js +80 -0
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +40 -124
- package/dist/server/routes/predictions.js +29 -45
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +38 -118
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +38 -110
- package/dist/server/routes/recall.js +14 -12
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +37 -125
- package/dist/{server-detect.js → server/server-detect.js} +3 -2
- 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 +70 -0
- package/dist/server/tls.d.ts +6 -0
- package/dist/server/tls.js +24 -0
- package/dist/server/types.d.ts +27 -8
- package/dist/server/validation.d.ts +3 -4
- package/dist/server/validation.js +6 -11
- package/dist/server.d.ts +41 -50
- package/dist/server.js +26 -560
- package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +1 -1
- package/dist/{project-merge.js → sharing/project-merge.js} +26 -45
- package/dist/{scope.js → sharing/scope.js} +1 -1
- package/dist/{shared.d.ts → sharing/shared.d.ts} +10 -9
- package/dist/{shared.js → sharing/shared.js} +100 -77
- package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
- package/dist/{ambient-store.js → store/ambient.js} +10 -10
- package/dist/store/audit-event.d.ts +12 -6
- package/dist/store/audit-event.js +6 -5
- package/dist/{audit.d.ts → store/audit.d.ts} +27 -3
- package/dist/{audit.js → store/audit.js} +91 -6
- package/dist/{auth.d.ts → store/auth.d.ts} +15 -32
- package/dist/{auth.js → store/auth.js} +100 -92
- package/dist/store/candidates.d.ts +23 -12
- package/dist/store/candidates.js +87 -35
- package/dist/{card-detail.d.ts → store/card-detail.d.ts} +3 -3
- package/dist/{card-detail.js → store/card-detail.js} +1 -1
- package/dist/{store-cards.d.ts → store/cards.d.ts} +14 -9
- package/dist/{store-cards.js → store/cards.js} +85 -146
- package/dist/store/compactions.d.ts +78 -0
- package/dist/store/compactions.js +93 -0
- package/dist/store/conflicts.d.ts +22 -5
- package/dist/store/conflicts.js +160 -109
- 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 +92 -0
- package/dist/store/delete-and-batch.d.ts +20 -24
- package/dist/store/delete-and-batch.js +64 -40
- package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +12 -5
- package/dist/{delivery-recorder.js → store/delivery-recorder.js} +42 -30
- 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 +51 -0
- package/dist/store/doctor-reads.d.ts +16 -0
- package/dist/store/doctor-reads.js +19 -0
- package/dist/{dormant.d.ts → store/dormant.d.ts} +46 -12
- package/dist/{dormant.js → store/dormant.js} +151 -6
- package/dist/{embeddings.d.ts → store/embeddings/index.d.ts} +10 -6
- package/dist/{embeddings.js → store/embeddings/index.js} +60 -44
- package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
- package/dist/{local-embedding.js → store/embeddings/local.js} +68 -57
- package/dist/{embedding-provider.d.ts → store/embeddings/provider.d.ts} +2 -2
- package/dist/{embedding-provider.js → store/embeddings/provider.js} +47 -32
- package/dist/store/entry-reads.d.ts +46 -7
- package/dist/store/entry-reads.js +120 -21
- package/dist/store/entry-row.d.ts +8 -2
- package/dist/store/entry-row.js +28 -8
- package/dist/store/entry-writes.d.ts +33 -4
- package/dist/store/entry-writes.js +108 -26
- 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/{goals.d.ts → store/goals.d.ts} +6 -46
- package/dist/{goals.js → store/goals.js} +45 -94
- package/dist/store/graph-queue.d.ts +29 -0
- package/dist/store/graph-queue.js +101 -0
- package/dist/{graph/read.d.ts → store/graph-reads.d.ts} +26 -34
- package/dist/{graph/read.js → store/graph-reads.js} +63 -115
- package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +68 -8
- package/dist/{graph/rows.js → store/graph-rows.js} +14 -3
- package/dist/store/graph-view-rows.d.ts +12 -0
- package/dist/store/graph-view-rows.js +67 -0
- package/dist/store/graph-writes.d.ts +58 -0
- package/dist/store/graph-writes.js +256 -0
- package/dist/store/half-life.d.ts +34 -0
- package/dist/store/half-life.js +77 -0
- package/dist/store/handoffs.d.ts +6 -3
- package/dist/store/handoffs.js +70 -31
- package/dist/store/index-and-stats.d.ts +8 -1
- package/dist/store/index-and-stats.js +51 -48
- 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 +1 -1
- package/dist/store/markdown.js +4 -3
- package/dist/store/mirrors.d.ts +5 -7
- package/dist/store/mirrors.js +39 -25
- package/dist/store/object-types.d.ts +189 -0
- package/dist/store/object-types.js +4 -0
- package/dist/store/open.d.ts +8 -4
- package/dist/store/open.js +34 -23
- package/dist/store/planning-fallacy-evidence.d.ts +42 -0
- package/dist/store/planning-fallacy-evidence.js +81 -0
- package/dist/store/port.d.ts +646 -0
- package/dist/store/port.js +17 -0
- package/dist/{predictions/store.d.ts → store/predictions.d.ts} +15 -2
- package/dist/{predictions/store.js → store/predictions.js} +52 -67
- package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
- package/dist/{quarantine.js → store/quarantine.js} +64 -22
- package/dist/{raw-archive.d.ts → store/raw-archive.d.ts} +5 -3
- package/dist/{raw-archive.js → store/raw-archive.js} +11 -5
- package/dist/{recall-scope.d.ts → store/recall-scope.d.ts} +4 -7
- package/dist/{recall-scope.js → store/recall-scope.js} +8 -9
- package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -14
- package/dist/{recall-trace.js → store/recall-trace.js} +38 -43
- package/dist/store/rejected-values.d.ts +55 -0
- package/dist/store/rejected-values.js +162 -0
- package/dist/{rejection.d.ts → store/rejection.d.ts} +2 -2
- package/dist/{rejection.js → store/rejection.js} +3 -2
- package/dist/store/rows.d.ts +2 -3
- package/dist/store/rows.js +18 -11
- package/dist/store/search-rows.d.ts +15 -4
- package/dist/store/search-rows.js +43 -36
- package/dist/store/sessions.d.ts +18 -2
- package/dist/store/sessions.js +83 -46
- 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/sqlite/entry-writes-group.js +170 -0
- package/dist/store/sqlite/error-codec.d.ts +17 -0
- package/dist/store/sqlite/error-codec.js +59 -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 +28 -0
- package/dist/store/sqlite/executor.js +286 -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 +38 -0
- package/dist/store/sqlite/object-rows.d.ts +102 -0
- package/dist/store/sqlite/object-rows.js +218 -0
- package/dist/store/sqlite/objects-group.d.ts +20 -0
- package/dist/store/sqlite/objects-group.js +314 -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 +26 -0
- package/dist/store/sqlite/store.js +295 -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 +124 -0
- package/dist/store/sqlite/worker-ops.js +82 -0
- package/dist/store/sqlite/worker-store.d.ts +8 -0
- package/dist/store/sqlite/worker-store.js +76 -0
- package/dist/store/summaries.d.ts +2 -11
- package/dist/store/summaries.js +17 -44
- package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
- package/dist/store/tenant-lookup.d.ts +1 -1
- package/dist/{tenant.d.ts → store/tenant.d.ts} +2 -2
- package/dist/{tenant.js → store/tenant.js} +1 -1
- 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} +2 -9
- package/dist/{token-ledger.js → store/token-ledger.js} +31 -78
- 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 +26 -0
- package/dist/store/vector-writes.d.ts +10 -3
- package/dist/store/vector-writes.js +35 -5
- package/dist/{working-memory.d.ts → store/working-memory.d.ts} +5 -1
- package/dist/{working-memory.js → store/working-memory.js} +39 -41
- package/dist/support-bundle.d.ts +1 -1
- package/dist/support-bundle.js +13 -33
- 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 +67 -0
- package/dist/util/anthropic-messages.d.ts +31 -0
- package/dist/util/anthropic-messages.js +46 -0
- package/dist/util/atomic-write.d.ts +3 -0
- package/dist/util/atomic-write.js +107 -0
- package/dist/util/crash-handlers.d.ts +5 -0
- package/dist/util/crash-handlers.js +30 -0
- package/dist/{env.d.ts → util/env.d.ts} +17 -2
- package/dist/{env.js → util/env.js} +22 -2
- package/dist/util/home-path.js +67 -0
- package/dist/{http-retry.d.ts → util/http-retry.d.ts} +6 -2
- package/dist/{http-retry.js → util/http-retry.js} +38 -7
- 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} +5 -2
- package/dist/{log.js → util/log.js} +12 -3
- package/dist/util/real-path.d.ts +3 -0
- package/dist/util/real-path.js +15 -0
- package/dist/util/request-scope.d.ts +27 -0
- package/dist/util/request-scope.js +47 -0
- package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
- package/dist/{secret-detect.js → util/secret-detect.js} +5 -4
- 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 +18 -0
- package/dist/util/token-text.js +23 -0
- package/dist/{version.d.ts → util/version.d.ts} +1 -1
- package/dist/{version.js → util/version.js} +1 -1
- package/extensions/openclaw-plugin/index.ts +1 -5
- 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/api.d.ts +0 -26
- package/dist/api.js +0 -29
- package/dist/capture-contract.js +0 -49
- 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/customer-notes.js +0 -336
- package/dist/db.d.ts +0 -9
- package/dist/db.js +0 -8
- package/dist/decisions.js +0 -326
- package/dist/extract.js +0 -133
- package/dist/graph/rows.d.ts +0 -45
- package/dist/graph/types.js +0 -11
- package/dist/half-life-migration.js +0 -182
- package/dist/handoff.js +0 -68
- package/dist/home-path.js +0 -24
- 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/policies.js +0 -434
- package/dist/processes.js +0 -371
- package/dist/project-briefs.js +0 -523
- package/dist/reject-flow.d.ts +0 -69
- package/dist/reject-flow.js +0 -260
- package/dist/session-owners.d.ts +0 -7
- package/dist/session-owners.js +0 -54
- package/dist/skills.js +0 -367
- package/dist/store-port.d.ts +0 -191
- package/dist/store-port.js +0 -166
- /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/{recall-history.d.ts → api/recall-history.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/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +0 -0
- /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
- /package/dist/{correction-latency.js → cli/correction-latency.js} +0 -0
- /package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +0 -0
- /package/dist/{quality-repair.d.ts → cli/quality-repair.d.ts} +0 -0
- /package/dist/{stdin.d.ts → cli/stdin.d.ts} +0 -0
- /package/dist/{dedupe.d.ts → consolidate/dedupe.d.ts} +0 -0
- /package/dist/{memory-value-weights.d.ts → consolidate/memory-value-weights.d.ts} +0 -0
- /package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +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/{trace.d.ts → consolidate/trace.d.ts} +0 -0
- /package/dist/{ablation.d.ts → core/ablation.d.ts} +0 -0
- /package/dist/{ambient.d.ts → core/ambient.d.ts} +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/{card.d.ts → core/card.d.ts} +0 -0
- /package/dist/{card.js → core/card.js} +0 -0
- /package/dist/{handoff.d.ts → core/handoff.d.ts} +0 -0
- /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
- /package/dist/{physics-config.d.ts → core/physics-config.d.ts} +0 -0
- /package/dist/{physics-config.js → core/physics-config.js} +0 -0
- /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
- /package/dist/{salience.d.ts → core/salience.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.d.ts → dashboard/dashboard-types.d.ts} +0 -0
- /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
- /package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +0 -0
- /package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +0 -0
- /package/dist/{cli → hooks}/hook-blocks.d.ts +0 -0
- /package/dist/{path-context.d.ts → search/path-context.d.ts} +0 -0
- /package/dist/{rrf.d.ts → search/rrf.d.ts} +0 -0
- /package/dist/{rrf.js → search/rrf.js} +0 -0
- /package/dist/{rate-limit.d.ts → server/rate-limit.d.ts} +0 -0
- /package/dist/{rate-limit.js → server/rate-limit.js} +0 -0
- /package/dist/{server-detect.d.ts → server/server-detect.d.ts} +0 -0
- /package/dist/{scope.d.ts → sharing/scope.d.ts} +0 -0
- /package/dist/{summary-dirty.js → store/summary-dirty.js} +0 -0
- /package/dist/{yaml.d.ts → store/yaml.d.ts} +0 -0
- /package/dist/{yaml.js → store/yaml.js} +0 -0
- /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
- /package/dist/{escape.js → util/escape.js} +0 -0
- /package/dist/{home-path.d.ts → util/home-path.d.ts} +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/{secret-detect.d.ts → util/secret-detect.d.ts} +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/{transcript-tail.d.ts → util/transcript-tail.d.ts} +0 -0
- /package/dist/{transcript-tail.js → util/transcript-tail.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
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { calculateStrength } from '../memory.js';
|
|
2
|
-
import { detectSecret } from '../secret-detect.js';
|
|
3
|
-
import { rescueSet, rankNonPinnedByTenant, validateWeights } from '
|
|
4
|
-
import { MEMORY_VALUE_WEIGHTS, SOURCE_ARTIFACT_SHA256 } from '
|
|
1
|
+
import { calculateStrength } from '../core/memory.js';
|
|
2
|
+
import { detectSecret } from '../util/secret-detect.js';
|
|
3
|
+
import { rescueSet, rankNonPinnedByTenant, validateWeights } from './memory-value.js';
|
|
4
|
+
import { MEMORY_VALUE_WEIGHTS, SOURCE_ARTIFACT_SHA256 } from './memory-value-weights.js';
|
|
5
|
+
const STRENGTH_DECIMALS = 4;
|
|
5
6
|
export const DECAY_THRESHOLD = 0.05;
|
|
6
7
|
// A faded, unpinned, unrescued memory leaves active memory one of three
|
|
7
8
|
// ways. A raw receipt is append-only: trg_memories_raw_append_only aborts
|
|
@@ -12,7 +13,7 @@ export const DECAY_THRESHOLD = 0.05;
|
|
|
12
13
|
// Only called for rows `retirable` allows (never pinned, raw, kept for good or backing a first-class object).
|
|
13
14
|
function retireFaded(run, entry, strength) {
|
|
14
15
|
const { result } = run;
|
|
15
|
-
const why = `(strength ${strength.toFixed(
|
|
16
|
+
const why = `(strength ${strength.toFixed(STRENGTH_DECIMALS)} < ${DECAY_THRESHOLD})`;
|
|
16
17
|
// A faded secret is deleted, never kept dormant: keeping it would hold a
|
|
17
18
|
// credential on disk that the user reasonably expects forgetting removed.
|
|
18
19
|
if (run.config.dormant.enabled && !detectSecret(entry).flagged) {
|
|
@@ -65,35 +66,44 @@ function reportNonFiniteScores(result, rankById) {
|
|
|
65
66
|
`with non-finite computed features (never rescued): ${nonFiniteIds.join(', ')}`);
|
|
66
67
|
}
|
|
67
68
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
// Carried forward to logRun, where the mv_rescue audit rows are written: writing them here, before
|
|
71
|
-
// batchWriteAndDelete, would assert rescues whose effects might never land if a later phase throws.
|
|
72
|
-
const rescuedEntries = [];
|
|
73
|
-
let rescuedIds = new Set();
|
|
74
|
-
let rankById = new Map();
|
|
75
|
-
// --- Phase 1: classify (zero commits) ---
|
|
69
|
+
// --- Phase 1: classify (zero commits) ---
|
|
70
|
+
function classifyByStrength(run) {
|
|
76
71
|
const condemned = [];
|
|
77
72
|
const strengthById = new Map();
|
|
78
|
-
for (const entry of all) {
|
|
79
|
-
const strength = calculateStrength(entry, now, run.decayOpts);
|
|
73
|
+
for (const entry of run.all) {
|
|
74
|
+
const strength = calculateStrength(entry, run.now, run.decayOpts);
|
|
80
75
|
strengthById.set(entry.id, strength);
|
|
81
76
|
if (run.retirable(entry) && strength < DECAY_THRESHOLD) {
|
|
82
77
|
condemned.push(entry);
|
|
83
78
|
}
|
|
84
79
|
}
|
|
80
|
+
return { strengthById, condemnedIds: new Set(condemned.map((e) => e.id)) };
|
|
81
|
+
}
|
|
82
|
+
function reportRescue(result, entry, strength, rank) {
|
|
83
|
+
const rankNote = rank
|
|
84
|
+
? ` - rescued (rank ${rank.rank}/${rank.totalNonPinned} in tenant ${rank.tenantId}, top ${rank.keepN})`
|
|
85
|
+
: ' - rescued';
|
|
86
|
+
result.details.push(` 🛟 ${entry.id} (strength ${strength.toFixed(STRENGTH_DECIMALS)} < ${DECAY_THRESHOLD})${rankNote}`);
|
|
87
|
+
}
|
|
88
|
+
function decayWithMemoryValue(run) {
|
|
89
|
+
const { all, now, result } = run;
|
|
90
|
+
// Carried forward to logRun, where the mv_rescue audit rows are written: writing them here, before
|
|
91
|
+
// batchWriteAndDelete, would assert rescues whose effects might never land if a later phase throws.
|
|
92
|
+
const rescuedEntries = [];
|
|
93
|
+
let rescuedIds = new Set();
|
|
94
|
+
let rankById = new Map();
|
|
95
|
+
const { strengthById, condemnedIds } = classifyByStrength(run);
|
|
85
96
|
// --- Phase 2a: rescue decision (pure compute) ---
|
|
86
97
|
// Runs under --dry-run too (only the pendingDeletes flush and the audit write in
|
|
87
98
|
// logRun stay !dryRun-gated), so the preview matches what a
|
|
88
99
|
// real run would decide.
|
|
89
|
-
const condemnedIds = new Set(condemned.map((e) => e.id));
|
|
90
100
|
// Fail-loud must not depend on condemnation traffic: validate the frozen weights even when nothing is condemned.
|
|
91
101
|
validateWeights();
|
|
92
102
|
if (condemnedIds.size > 0) {
|
|
93
103
|
// Rank per tenant ONCE: rankById feeds both rescueSet (via precomputedRanks) and the detail/audit
|
|
94
104
|
// context below, so the whole-store ranking runs once per sleep and only when something is condemned.
|
|
95
105
|
rankById = rankNonPinnedByTenant(all, now);
|
|
96
|
-
rescuedIds = rescueSet(all, condemnedIds, now, MEMORY_VALUE_WEIGHTS, SOURCE_ARTIFACT_SHA256, rankById);
|
|
106
|
+
rescuedIds = rescueSet(all, condemnedIds, now, { weights: MEMORY_VALUE_WEIGHTS, digest: SOURCE_ARTIFACT_SHA256, precomputedRanks: rankById });
|
|
97
107
|
reportNonFiniteScores(result, rankById);
|
|
98
108
|
}
|
|
99
109
|
// --- Phase 2b: commit, one pass over `all` in ITS ORIGINAL ORDER ---
|
|
@@ -106,11 +116,7 @@ function decayWithMemoryValue(run) {
|
|
|
106
116
|
// Confidence is left alone here: it is an epistemic tier, not a
|
|
107
117
|
// cached computation, so resolveConfidence derives it on read.
|
|
108
118
|
rescuedEntries.push(keepSurvivor(run, entry, strength));
|
|
109
|
-
|
|
110
|
-
const rankNote = rank
|
|
111
|
-
? ` - rescued (rank ${rank.rank}/${rank.totalNonPinned} in tenant ${rank.tenantId}, top ${rank.keepN})`
|
|
112
|
-
: ' - rescued';
|
|
113
|
-
result.details.push(` 🛟 ${entry.id} (strength ${strength.toFixed(4)} < ${DECAY_THRESHOLD})${rankNote}`);
|
|
119
|
+
reportRescue(result, entry, strength, rankById.get(entry.id));
|
|
114
120
|
}
|
|
115
121
|
else {
|
|
116
122
|
retireFaded(run, entry, strength);
|
|
@@ -20,15 +20,13 @@
|
|
|
20
20
|
* WITHIN each tenant group; cross-tenant pairs are never compared. Raw and
|
|
21
21
|
* superseded rows are not candidates at all (v1.38.1).
|
|
22
22
|
*/
|
|
23
|
-
import { textOverlap } from '
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
import { derivationPartitionKey } from './recall-scope.js';
|
|
31
|
-
import { duplicateKey } from './same-text.js';
|
|
23
|
+
import { textOverlap } from '../util/tokenize.js';
|
|
24
|
+
import { loadCurrentDistilledEntries } from '../store/entry-reads.js';
|
|
25
|
+
import { deleteEntriesOneByOne, memoriesBackingObjects } from '../store/delete-and-batch.js';
|
|
26
|
+
import { compareEntryIdentity } from '../core/compare.js';
|
|
27
|
+
import { canAutoDelete } from '../core/memory.js';
|
|
28
|
+
import { derivationPartitionKey } from '../store/recall-scope.js';
|
|
29
|
+
import { duplicateKey } from '../util/same-text.js';
|
|
32
30
|
/** Quantization step for strength-tie comparisons. The historical 0.01
|
|
33
31
|
* epsilon (see `strengthBucket` below) applied via rounding instead of a
|
|
34
32
|
* raw abs-diff threshold, so the tiebreak is transitive. */
|
|
@@ -136,7 +134,7 @@ export function deduplicateStore(hippoRoot, options = {}) {
|
|
|
136
134
|
const dryRun = options.dryRun ?? false;
|
|
137
135
|
// Only current distilled rows compete: raw rows are append-only (the delete
|
|
138
136
|
// trigger would abort sleep mid-loop) and superseded rows are history, as in consolidate.ts.
|
|
139
|
-
const entries =
|
|
137
|
+
const entries = loadCurrentDistilledEntries(hippoRoot);
|
|
140
138
|
const entriesByTenant = entriesByPartition(entries);
|
|
141
139
|
// Shared across tenant groups: safe because memory ids are globally
|
|
142
140
|
// unique (crypto.randomUUID at creation), so an id in `removed` can never
|
|
@@ -156,14 +154,8 @@ export function deduplicateStore(hippoRoot, options = {}) {
|
|
|
156
154
|
}
|
|
157
155
|
/** The pairs whose loser was deleted; one store handle, one transaction per delete. */
|
|
158
156
|
function deletePairs(hippoRoot, pairs, actor) {
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
try {
|
|
163
|
-
return pairs.filter((p) => deleteEntryOn(db, hippoRoot, p.removed, { actor, reason: `dedup: duplicate of ${p.kept}`, automatic: true }));
|
|
164
|
-
}
|
|
165
|
-
finally {
|
|
166
|
-
closeHippoDb(db);
|
|
167
|
-
}
|
|
157
|
+
const targets = pairs.map((p) => ({ id: p.removed, reason: `dedup: duplicate of ${p.kept}` }));
|
|
158
|
+
const gone = deleteEntriesOneByOne(hippoRoot, targets, { actor, automatic: true });
|
|
159
|
+
return pairs.filter((_, i) => gone[i]);
|
|
168
160
|
}
|
|
169
161
|
//# sourceMappingURL=dedupe.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { MemoryEntry } from '../memory.js';
|
|
2
|
-
import type { DormantMove } from '../dormant.js';
|
|
1
|
+
import type { MemoryEntry } from '../core/memory.js';
|
|
2
|
+
import type { DormantMove } from '../store/dormant.js';
|
|
3
3
|
import type { FlushComponent } from '../store/delete-and-batch.js';
|
|
4
4
|
/** Components that share no id, ordered by each one's first op across writes, then deletes, then dormant moves. */
|
|
5
5
|
export declare function groupFlush(writes: readonly MemoryEntry[], deletes: readonly string[], dormant: readonly DormantMove[], units: readonly (readonly string[])[]): FlushComponent[];
|
|
@@ -19,13 +19,9 @@
|
|
|
19
19
|
* (7 days when never recorded) to the configured `defaultHalfLifeDays`. Once per store it also
|
|
20
20
|
* moves memories of live decisions, incidents and other objects off the flat 90 days they used to get.
|
|
21
21
|
*/
|
|
22
|
-
import { type MemoryEntry } from '
|
|
23
|
-
import { HALF_LIFE_BASE_META_KEY } from '
|
|
24
|
-
|
|
25
|
-
export declare const LEGACY_HALF_LIFE_BASE = 7;
|
|
26
|
-
/** The flat half-life the decision, incident and other object writers gave their memories before they took the default. */
|
|
27
|
-
export declare const LEGACY_TYPED_HALF_LIFE = 90;
|
|
28
|
-
export { HALF_LIFE_BASE_META_KEY };
|
|
22
|
+
import { type MemoryEntry } from '../core/memory.js';
|
|
23
|
+
import { HALF_LIFE_BASE_META_KEY, LEGACY_TYPED_HALF_LIFE } from '../store/open.js';
|
|
24
|
+
export { HALF_LIFE_BASE_META_KEY, LEGACY_TYPED_HALF_LIFE };
|
|
29
25
|
/** What {@link migrateDefaultHalfLife} did, or would do under `dryRun`. */
|
|
30
26
|
export interface HalfLifeMigrationResult {
|
|
31
27
|
from: number;
|
|
@@ -49,8 +45,6 @@ export declare function planHalfLifeMigration(entries: readonly MemoryEntry[], f
|
|
|
49
45
|
export declare function planTypedHalfLifeMigration(entries: readonly MemoryEntry[], to: number): MemoryEntry[];
|
|
50
46
|
/** The base this store's memories are on. */
|
|
51
47
|
export declare function storeHalfLifeBase(hippoRoot: string): number;
|
|
52
|
-
/** The base an object writer gives its memory: the flat 90 days until this store's typed migration has run, which then moves them, and the default after. */
|
|
53
|
-
export declare function objectHalfLifeDays(hippoRoot: string): number;
|
|
54
48
|
/**
|
|
55
49
|
* Move the store's memories from the base they are on, and those of objects from
|
|
56
50
|
* the old flat 90 days, to `to`, once. Under `dryRun` nothing is written, the recorded
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Moving a store's memories to a new default half-life.
|
|
3
|
+
*
|
|
4
|
+
* Each memory stores its own `half_life_days`, set at write from the
|
|
5
|
+
* default base and a few write-time multipliers (`deriveHalfLife`). Changing
|
|
6
|
+
* the default therefore reaches only new memories; without this migration a
|
|
7
|
+
* store would mix old-base and new-base memories, a state the decay
|
|
8
|
+
* evaluation never tested. The rule, declared before any run:
|
|
9
|
+
*
|
|
10
|
+
* - only a memory still on the old base is rescaled: its half-life is
|
|
11
|
+
* `deriveHalfLife(from, entry)` plus its recall bonus. A memory hippo shortened since
|
|
12
|
+
* (invalidated, superseded, a merge source, marked bad) or one with its own
|
|
13
|
+
* fixed half-life (decisions, incidents, customer notes) keeps its value;
|
|
14
|
+
* - every rescale is written to the audit log with the ids, so it can be
|
|
15
|
+
* undone, and the store records the base it is on (`meta`), so the
|
|
16
|
+
* migration runs once.
|
|
17
|
+
*
|
|
18
|
+
* `hippo sleep` runs it before its decay pass, from the base the store is on
|
|
19
|
+
* (7 days when never recorded) to the configured `defaultHalfLifeDays`. Once per store it also
|
|
20
|
+
* moves memories of live decisions, incidents and other objects off the flat 90 days they used to get.
|
|
21
|
+
*/
|
|
22
|
+
import { deriveHalfLife } from '../core/memory.js';
|
|
23
|
+
import { HALF_LIFE_BASE_META_KEY, LEGACY_TYPED_HALF_LIFE } from '../store/open.js';
|
|
24
|
+
import { moveHalfLives, recordedHalfLifeBase } from '../store/half-life.js';
|
|
25
|
+
const TYPED_SOURCES = new Set(['decision', 'incident', 'process', 'policy', 'skill', 'project_brief', 'customer_note']);
|
|
26
|
+
export { HALF_LIFE_BASE_META_KEY, LEGACY_TYPED_HALF_LIFE };
|
|
27
|
+
/** Recall bonus over `written`, the half-life `entry` got at write, or null when off it; each recall added 2 days. */
|
|
28
|
+
export function halfLifeRecallBonus(entry, written) {
|
|
29
|
+
if (entry.superseded_by || entry.tags.includes('invalidated') || entry.tags.includes('superseded'))
|
|
30
|
+
return null;
|
|
31
|
+
const bonus = entry.half_life_days - written;
|
|
32
|
+
const k = Math.round(bonus / 2);
|
|
33
|
+
return Math.abs(bonus - 2 * k) < 1e-9 && k >= 0 && k <= entry.retrieval_count ? bonus : null;
|
|
34
|
+
}
|
|
35
|
+
/** The entries to rescale from `from` to `to`, as copies that keep their recall bonus. Pure. */
|
|
36
|
+
export function planHalfLifeMigration(entries, from, to) {
|
|
37
|
+
if (from === to)
|
|
38
|
+
return [];
|
|
39
|
+
return entries.flatMap((e) => {
|
|
40
|
+
const bonus = halfLifeRecallBonus(e, deriveHalfLife(from, e));
|
|
41
|
+
return bonus === null ? [] : [{ ...e, half_life_days: deriveHalfLife(to, e) + bonus }];
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/** Memories of decisions, incidents and other objects still on the flat 90 days, as copies on `to` that keep their recall bonus. Pure. */
|
|
45
|
+
export function planTypedHalfLifeMigration(entries, to) {
|
|
46
|
+
return entries.flatMap((e) => {
|
|
47
|
+
const bonus = TYPED_SOURCES.has(e.source) ? halfLifeRecallBonus(e, LEGACY_TYPED_HALF_LIFE) : null;
|
|
48
|
+
const next = bonus === null ? e.half_life_days : deriveHalfLife(to, e) + bonus;
|
|
49
|
+
return next === e.half_life_days ? [] : [{ ...e, half_life_days: next }];
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/** The base this store's memories are on. */
|
|
53
|
+
export function storeHalfLifeBase(hippoRoot) {
|
|
54
|
+
return recordedHalfLifeBase(hippoRoot);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Move the store's memories from the base they are on, and those of objects from
|
|
58
|
+
* the old flat 90 days, to `to`, once. Under `dryRun` nothing is written, the recorded
|
|
59
|
+
* base included.
|
|
60
|
+
*/
|
|
61
|
+
export function migrateDefaultHalfLife(hippoRoot, to, opts = {}) {
|
|
62
|
+
const dryRun = opts.dryRun ?? false;
|
|
63
|
+
const { from, outcome } = moveHalfLives(hippoRoot, to, { dryRun, actor: opts.actor ?? 'system' }, (rows) => {
|
|
64
|
+
const { basePlan, typedPlan } = planMoves(rows, to);
|
|
65
|
+
const plan = [...basePlan, ...typedPlan];
|
|
66
|
+
return {
|
|
67
|
+
moves: [{ from: rows.from, to, entries: basePlan }, { from: LEGACY_TYPED_HALF_LIFE, to, entries: typedPlan }],
|
|
68
|
+
outcome: { rescaled: basePlan.length, typed: typedPlan.length, kept: rows.all.length - plan.length, halfLives: new Map(plan.map((e) => [e.id, e.half_life_days])) },
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
const moved = outcome ?? { rescaled: 0, typed: 0, kept: 0, halfLives: new Map() };
|
|
72
|
+
return { from, to, rescaled: moved.rescaled, typed: moved.typed, kept: moved.kept, dryRun, halfLives: moved.halfLives };
|
|
73
|
+
}
|
|
74
|
+
/** The base move and the move of object memories, planned from one read of the store. Pure. */
|
|
75
|
+
function planMoves(rows, to) {
|
|
76
|
+
const { all, typedPending } = rows;
|
|
77
|
+
const objects = objectMemoryIds(rows.objectRows);
|
|
78
|
+
const losers = conflictLosers(rows.conflictAudits, rows.resolvedConflicts);
|
|
79
|
+
const copies = new Set(all.flatMap((e) => (e.superseded_by ? [e.superseded_by] : [])));
|
|
80
|
+
// 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.
|
|
81
|
+
const objectWritten = (e) => objects.all.has(e.id) || (!copies.has(e.id) && TYPED_SOURCES.has(e.source) && halfLifeRecallBonus(e, LEGACY_TYPED_HALF_LIFE) !== null);
|
|
82
|
+
const typedPlan = typedPending ? planTypedHalfLifeMigration(all.filter((e) => objectWritten(e) && !objects.retired.has(e.id) && !losers.has(e.id)), to) : [];
|
|
83
|
+
const basePlan = planHalfLifeMigration(typedPending ? all.filter((e) => !objectWritten(e)) : all, rows.from, to);
|
|
84
|
+
return { basePlan, typedPlan };
|
|
85
|
+
}
|
|
86
|
+
/** Memories behind every object, and those behind a superseded or closed one. Retiring an object leaves its memory untouched, so only its table knows. */
|
|
87
|
+
function objectMemoryIds(objectRows) {
|
|
88
|
+
const all = new Set();
|
|
89
|
+
const retired = new Set();
|
|
90
|
+
for (const r of objectRows) {
|
|
91
|
+
all.add(r.memory_id);
|
|
92
|
+
if (r.status === 'superseded' || r.status === 'closed')
|
|
93
|
+
retired.add(r.memory_id);
|
|
94
|
+
}
|
|
95
|
+
return { all, retired };
|
|
96
|
+
}
|
|
97
|
+
/** Memories that lost a conflict, which resolveConflict halved untagged. A resolved conflict with no audit row (resolved before resolves were audited, or found stale) names no winner, so both sides count. */
|
|
98
|
+
function conflictLosers(audited, resolved) {
|
|
99
|
+
const losers = new Set(audited.map((a) => a.loserId));
|
|
100
|
+
const named = new Set(audited.map((a) => a.conflictId));
|
|
101
|
+
for (const c of resolved)
|
|
102
|
+
if (!named.has(c.id))
|
|
103
|
+
losers.add(c.memory_a_id).add(c.memory_b_id);
|
|
104
|
+
return losers;
|
|
105
|
+
}
|
|
106
|
+
//# 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;
|
|
@@ -30,7 +30,7 @@ export async function llmPasses(run, fetcher) {
|
|
|
30
30
|
run.result.extractionCandidates = extractionCandidates.length;
|
|
31
31
|
const llm = sleepLlm(run, fetcher);
|
|
32
32
|
if (llm.apiKey && extractionCandidates.length > 0 && !run.dryRun) {
|
|
33
|
-
const { extractFacts, storeExtractedFacts } = await import('../extract.js');
|
|
33
|
+
const { extractFacts, storeExtractedFacts } = await import('../learn/extract.js');
|
|
34
34
|
const batchLimit = 20;
|
|
35
35
|
let extractedCount = 0;
|
|
36
36
|
for (const candidate of extractionCandidates.slice(0, batchLimit)) {
|
|
@@ -60,7 +60,7 @@ async function dagBuildPass(run, { apiKey, llmError, llmOpts }) {
|
|
|
60
60
|
if (!(apiKey && extractedFacts.length >= 3 && !run.dryRun))
|
|
61
61
|
return;
|
|
62
62
|
try {
|
|
63
|
-
const { buildDag } = await import('
|
|
63
|
+
const { buildDag } = await import('./dag.js');
|
|
64
64
|
const dagResult = await buildDag(run.hippoRoot, extractedFacts, { ...llmOpts, onError: llmError('dag') });
|
|
65
65
|
run.result.dagCandidateClusters = dagResult.candidateClusters;
|
|
66
66
|
run.result.dagSummariesCreated = dagResult.summariesCreated;
|
|
@@ -83,7 +83,7 @@ async function dagBuildPass(run, { apiKey, llmError, llmOpts }) {
|
|
|
83
83
|
async function dagRebuildPass(run, { llmError, llmOpts }) {
|
|
84
84
|
const { result } = run;
|
|
85
85
|
try {
|
|
86
|
-
const { rebuildDirtySummaries } = await import('
|
|
86
|
+
const { rebuildDirtySummaries } = await import('./dag.js');
|
|
87
87
|
const rawCap = envDagRebuildCap();
|
|
88
88
|
// Hard ceiling so a misconfigured env can't burn unbounded LLM cost.
|
|
89
89
|
const cap = rawCap !== undefined ? Math.min(rawCap, 1000) : 20;
|
|
@@ -123,7 +123,7 @@ async function dagRebuildPass(run, { llmError, llmOpts }) {
|
|
|
123
123
|
// L2s directly via writeEntry without pushing back into survivors.
|
|
124
124
|
async function entityProfilePass(run, { llmError, llmOpts }) {
|
|
125
125
|
try {
|
|
126
|
-
const { buildEntityProfiles } = await import('
|
|
126
|
+
const { buildEntityProfiles } = await import('./dag.js');
|
|
127
127
|
const { loadAllL2Summaries } = await import('../store/summaries.js');
|
|
128
128
|
const l2Summaries = loadAllL2Summaries(run.hippoRoot);
|
|
129
129
|
if (l2Summaries.length >= 2) {
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* candidate set. Deletes(flag-on) subset Deletes(flag-off) by construction — this
|
|
19
19
|
* function can only ever shrink the condemned set, never grow it.
|
|
20
20
|
*/
|
|
21
|
-
import { type MemoryEntry } from '
|
|
21
|
+
import { type MemoryEntry } from '../core/memory.js';
|
|
22
22
|
/** The 8 live feature dims (FIT_DIMS) — canonical order for iteration. */
|
|
23
23
|
export declare const MV_FEATURE_NAMES: ReadonlyArray<keyof MvFeatureVector>;
|
|
24
24
|
export interface MvFeatureVector {
|
|
@@ -91,6 +91,11 @@ export interface MvRankInfo {
|
|
|
91
91
|
* the fail-loud path, never overridden by production callers.
|
|
92
92
|
*/
|
|
93
93
|
export declare function rankNonPinnedByTenant(entries: MemoryEntry[], now: Date, weights?: Readonly<Record<string, number>>, digest?: string): Map<string, MvRankInfo>;
|
|
94
|
+
export interface RescueSetOptions {
|
|
95
|
+
readonly weights?: Readonly<Record<string, number>>;
|
|
96
|
+
readonly digest?: string;
|
|
97
|
+
readonly precomputedRanks?: Map<string, MvRankInfo>;
|
|
98
|
+
}
|
|
94
99
|
/**
|
|
95
100
|
* Rescue decision: a condemned entry is rescued iff it ranks in the top
|
|
96
101
|
* 30% of its tenant's non-pinned candidate set by learned score. Returns the
|
|
@@ -109,5 +114,5 @@ export declare function rankNonPinnedByTenant(entries: MemoryEntry[], now: Date,
|
|
|
109
114
|
* exactly once per sleep instead of twice. Omitted (the default), rescueSet
|
|
110
115
|
* computes it internally as before — existing callers/tests are unaffected.
|
|
111
116
|
*/
|
|
112
|
-
export declare function rescueSet(entries: MemoryEntry[], condemnedIds: Set<string>, now: Date,
|
|
117
|
+
export declare function rescueSet(entries: MemoryEntry[], condemnedIds: Set<string>, now: Date, options?: RescueSetOptions): Set<string>;
|
|
113
118
|
//# sourceMappingURL=memory-value.d.ts.map
|
|
@@ -18,9 +18,10 @@
|
|
|
18
18
|
* candidate set. Deletes(flag-on) subset Deletes(flag-off) by construction — this
|
|
19
19
|
* function can only ever shrink the condemned set, never grow it.
|
|
20
20
|
*/
|
|
21
|
-
import { calculateStrength } from '
|
|
22
|
-
import { compareEntryIdentity } from '
|
|
21
|
+
import { calculateStrength } from '../core/memory.js';
|
|
22
|
+
import { compareEntryIdentity } from '../core/compare.js';
|
|
23
23
|
import { MEMORY_VALUE_WEIGHTS, SOURCE_ARTIFACT_SHA256 } from './memory-value-weights.js';
|
|
24
|
+
import { DAY_MS } from '../util/time.js';
|
|
24
25
|
/** The 8 live feature dims (FIT_DIMS) — canonical order for iteration. */
|
|
25
26
|
export const MV_FEATURE_NAMES = [
|
|
26
27
|
'age_days',
|
|
@@ -62,7 +63,7 @@ const MIN_RESCUE_GROUP = 10;
|
|
|
62
63
|
* FEATURE is clock-basis.
|
|
63
64
|
*/
|
|
64
65
|
export function computeMvFeatures(entry, now) {
|
|
65
|
-
const ageDays = (now.getTime() - Date.parse(entry.created)) /
|
|
66
|
+
const ageDays = (now.getTime() - Date.parse(entry.created)) / DAY_MS;
|
|
66
67
|
const pos = entry.outcome_positive ?? 0;
|
|
67
68
|
const neg = entry.outcome_negative ?? 0;
|
|
68
69
|
return {
|
|
@@ -97,11 +98,11 @@ export function validateWeights(weights = MEMORY_VALUE_WEIGHTS, digest = SOURCE_
|
|
|
97
98
|
const v = weights[key];
|
|
98
99
|
if (!isFiniteWeightValue(v)) {
|
|
99
100
|
throw new Error(`memory-value: weights constant is malformed — "${key}" is not a finite number ` +
|
|
100
|
-
`(src/memory-value-weights.ts)`);
|
|
101
|
+
`(src/consolidate/memory-value-weights.ts)`);
|
|
101
102
|
}
|
|
102
103
|
}
|
|
103
104
|
if (!isNonEmptyDigestString(digest)) {
|
|
104
|
-
throw new Error('memory-value: weights constant is malformed — SOURCE_ARTIFACT_SHA256 digest missing (src/memory-value-weights.ts)');
|
|
105
|
+
throw new Error('memory-value: weights constant is malformed — SOURCE_ARTIFACT_SHA256 digest missing (src/consolidate/memory-value-weights.ts)');
|
|
105
106
|
}
|
|
106
107
|
}
|
|
107
108
|
/**
|
|
@@ -194,7 +195,7 @@ export function rankNonPinnedByTenant(entries, now, weights = MEMORY_VALUE_WEIGH
|
|
|
194
195
|
const result = new Map();
|
|
195
196
|
for (const [tenantId, group] of byTenant) {
|
|
196
197
|
const scores = scoreEntries(group, now, weights);
|
|
197
|
-
// score DESC, then compareEntryIdentity, the shared tie-break of every score-primary sort (src/compare.ts).
|
|
198
|
+
// score DESC, then compareEntryIdentity, the shared tie-break of every score-primary sort (src/core/compare.ts).
|
|
198
199
|
// `-Infinity - -Infinity` is NaN, which Array.sort leaves insertion-order-dependent, so NaN ties too.
|
|
199
200
|
const sorted = [...group].sort((a, b) => {
|
|
200
201
|
const diff = scores.get(b.id) - scores.get(a.id);
|
|
@@ -234,7 +235,8 @@ export function rankNonPinnedByTenant(entries, now, weights = MEMORY_VALUE_WEIGH
|
|
|
234
235
|
* exactly once per sleep instead of twice. Omitted (the default), rescueSet
|
|
235
236
|
* computes it internally as before — existing callers/tests are unaffected.
|
|
236
237
|
*/
|
|
237
|
-
export function rescueSet(entries, condemnedIds, now,
|
|
238
|
+
export function rescueSet(entries, condemnedIds, now, options = {}) {
|
|
239
|
+
const { weights = MEMORY_VALUE_WEIGHTS, digest = SOURCE_ARTIFACT_SHA256, precomputedRanks } = options;
|
|
238
240
|
validateWeights(weights, digest); // fail loud before any rescue computation
|
|
239
241
|
const ranked = precomputedRanks ?? rankNonPinnedByTenant(entries, now, weights, digest);
|
|
240
242
|
const rescued = new Set();
|
|
@@ -1,15 +1,15 @@
|
|
|
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
|
|
@@ -23,10 +23,7 @@ const MERGE_SOURCE_HALF_LIFE_FACTOR = 0.3;
|
|
|
23
23
|
export function retireHeldTexts(run) {
|
|
24
24
|
const { survivors } = run;
|
|
25
25
|
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
|
-
};
|
|
26
|
+
const rejectedIn = (tenantId) => (text) => run.tombstones.find(tenantId, rejectionDigest(text)) !== null;
|
|
30
27
|
for (let i = survivors.length - 1; i >= 0; i--) {
|
|
31
28
|
const row = survivors[i];
|
|
32
29
|
const successor = run.retirable(row) ? successorAfterRetirement(row, byId, rejectedIn(row.tenantId)) : undefined;
|
|
@@ -46,17 +43,13 @@ export function retireHeldTexts(run) {
|
|
|
46
43
|
}
|
|
47
44
|
}
|
|
48
45
|
}
|
|
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)
|
|
46
|
+
/** The episodic survivors a merge may consume, grouped by the partition their merged row would land in. */
|
|
47
|
+
function partitionMergeCandidates(survivors) {
|
|
48
|
+
const alreadyMergedIds = new Set(survivors.flatMap((e) => e.parents));
|
|
49
|
+
const mergeCandidates = survivors.filter((e) => e.layer === Layer.Episodic && !e.superseded_by && !keptAsWritten(e) && !alreadyMergedIds.has(e.id)
|
|
56
50
|
&& !e.pinned // a pin merged with a look-alike would read as one of two values
|
|
57
51
|
&& tokenize(e.content).length > 0 // two empty token sets overlap 1, so tokenless text would merge with any other
|
|
58
52
|
&& isReusable(e));
|
|
59
|
-
const used = new Set();
|
|
60
53
|
// Partition BEFORE the overlap loop so a cluster can never span tenants and merge cross-tenant content.
|
|
61
54
|
// Map keeps insertion order, so a single-tenant store gets one partition in the original order.
|
|
62
55
|
const mergeCandidatesByTenant = new Map();
|
|
@@ -68,7 +61,16 @@ export function mergePass(run) {
|
|
|
68
61
|
else
|
|
69
62
|
mergeCandidatesByTenant.set(key, [entry]);
|
|
70
63
|
}
|
|
71
|
-
|
|
64
|
+
return mergeCandidatesByTenant;
|
|
65
|
+
}
|
|
66
|
+
// -------------------------------------------------------------------------
|
|
67
|
+
// 3. Merge pass - episodic entries only
|
|
68
|
+
// -------------------------------------------------------------------------
|
|
69
|
+
/** Returns how many clusters were skipped because their merged text matches a rejected value. */
|
|
70
|
+
export function mergePass(run) {
|
|
71
|
+
const used = new Set();
|
|
72
|
+
const mergeCandidatesByTenant = partitionMergeCandidates(run.survivors);
|
|
73
|
+
// The rejection guard reuses the run's one lazily opened tombstone handle; a dry-run
|
|
72
74
|
// never reaches batchWriteAndDelete's guard bypass, so it has nothing to protect there.
|
|
73
75
|
let mergesSkippedRejected = 0;
|
|
74
76
|
for (const [, tenantCandidates] of mergeCandidatesByTenant) {
|
|
@@ -107,28 +109,9 @@ function mergeCluster(run, partition, cluster, related, used) {
|
|
|
107
109
|
const { result, dryRun } = run;
|
|
108
110
|
// Create a semantic summary
|
|
109
111
|
const mergedContent = mergeContents(cluster);
|
|
110
|
-
const allTags = Array.from(new Set(cluster.flatMap((e) => e.tags))).sort();
|
|
111
|
-
const maxValence = pickStrongestValence(cluster);
|
|
112
112
|
// Build the semantic entry FIRST (createMemory is cheap and pure) so the tombstone check below runs
|
|
113
113
|
// 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
|
-
}
|
|
114
|
+
const semantic = dryRun ? null : semanticSummary(mergedContent, cluster, partition, run.config.defaultHalfLifeDays);
|
|
132
115
|
if (semantic && mergeRejected(run, semantic, cluster, related, used))
|
|
133
116
|
return false;
|
|
134
117
|
// Mark cluster members as used
|
|
@@ -150,14 +133,36 @@ function mergeCluster(run, partition, cluster, related, used) {
|
|
|
150
133
|
// references as `survivors`, and the later detectConflicts(survivors)
|
|
151
134
|
// pass in this same run must see the post-demotion half-life, or it
|
|
152
135
|
// can persist conflicts for entries the just-written state excludes.
|
|
153
|
-
|
|
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
|
-
}
|
|
136
|
+
demoteMergedSources(run, cluster);
|
|
158
137
|
}
|
|
159
138
|
return true;
|
|
160
139
|
}
|
|
140
|
+
function semanticSummary(mergedContent, cluster, partition, baseHalfLifeDays) {
|
|
141
|
+
const allTags = Array.from(new Set(cluster.flatMap((e) => e.tags))).sort();
|
|
142
|
+
const maxValence = pickStrongestValence(cluster);
|
|
143
|
+
return {
|
|
144
|
+
...createMemory(mergedContent, {
|
|
145
|
+
layer: Layer.Semantic,
|
|
146
|
+
tags: allTags,
|
|
147
|
+
emotional_valence: maxValence,
|
|
148
|
+
schema_fit: 0.7,
|
|
149
|
+
source: 'consolidation',
|
|
150
|
+
confidence: 'inferred',
|
|
151
|
+
tenantId: partition.tenantId,
|
|
152
|
+
scope: partition.scope,
|
|
153
|
+
baseHalfLifeDays,
|
|
154
|
+
}),
|
|
155
|
+
origin_project: partition.origin,
|
|
156
|
+
parents: cluster.map((e) => e.id),
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
function demoteMergedSources(run, cluster) {
|
|
160
|
+
for (const e of cluster) {
|
|
161
|
+
e.half_life_days = Math.max(1, Math.floor(e.half_life_days * MERGE_SOURCE_HALF_LIFE_FACTOR));
|
|
162
|
+
e.strength = calculateStrength(e, run.now, run.decayOpts);
|
|
163
|
+
run.pendingWrites.push(e);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
161
166
|
// mergeContents is DETERMINISTIC CONCATENATION (not an LLM paraphrase)
|
|
162
167
|
// — if a human rejected exactly this byte-identical rollup before, an
|
|
163
168
|
// unguarded sleep would regenerate it every cycle and
|
|
@@ -167,13 +172,11 @@ function mergeCluster(run, partition, cluster, related, used) {
|
|
|
167
172
|
// not demoted, not deleted — so a later sleep gets another chance if
|
|
168
173
|
// the tombstone is lifted.
|
|
169
174
|
function mergeRejected(run, semantic, cluster, related, used) {
|
|
170
|
-
const
|
|
171
|
-
if (!consolidateDb)
|
|
172
|
-
return false;
|
|
175
|
+
const { tombstones } = run;
|
|
173
176
|
const newDigest = rejectionDigest(semantic.content);
|
|
174
177
|
const oldDigest = rejectionDigest(legacyMergeContents(related)); // tombstones from older releases hold this format's digest
|
|
175
|
-
const newHit =
|
|
176
|
-
const tombstone = newHit ??
|
|
178
|
+
const newHit = tombstones.find(semantic.tenantId, newDigest);
|
|
179
|
+
const tombstone = newHit ?? tombstones.find(semantic.tenantId, oldDigest);
|
|
177
180
|
const mergeDigest = newHit ? newDigest : oldDigest;
|
|
178
181
|
if (!tombstone)
|
|
179
182
|
return false;
|
|
@@ -184,7 +187,7 @@ function mergeRejected(run, semantic, cluster, related, used) {
|
|
|
184
187
|
for (const e of rejected)
|
|
185
188
|
used.add(e.id);
|
|
186
189
|
try {
|
|
187
|
-
|
|
190
|
+
tombstones.audit({
|
|
188
191
|
tenantId: semantic.tenantId,
|
|
189
192
|
actor: 'sleep',
|
|
190
193
|
op: 'reject_refusal',
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type MemoryEntry } from '
|
|
1
|
+
import { type MemoryEntry } from '../core/memory.js';
|
|
2
2
|
/** The row that replaces a merged row once its retired texts leave: undefined when it holds none, null when nothing else is left. */
|
|
3
3
|
export declare function mergedSuccessor(row: MemoryEntry, retired: (text: string) => boolean, retiredIds: ReadonlySet<string>): MemoryEntry | null | undefined;
|
|
4
4
|
/** Sleep's check on a merged row: drops texts whose source was superseded since the merge, or that a rejection now covers. */
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// A sleep-merged row copies its sources' texts, so retiring a text (reject, or superseding its source) must reach the row too.
|
|
2
2
|
// SHORTCUT: reject rewrites merged rows at once, live and dormant; supersede and `resolve --reject-loser` wait for the next sleep's check, which sees a dormant row only once restored.
|
|
3
|
-
import { generateId } from '
|
|
4
|
-
import { duplicateKey, heldTexts, mergedText } from '
|
|
3
|
+
import { generateId } from '../core/memory.js';
|
|
4
|
+
import { duplicateKey, heldTexts, mergedText } from '../util/same-text.js';
|
|
5
5
|
/** The row that replaces a merged row once its retired texts leave: undefined when it holds none, null when nothing else is left. */
|
|
6
6
|
export function mergedSuccessor(row, retired, retiredIds) {
|
|
7
7
|
const texts = heldTexts(row);
|