hippo-memory 1.72.0 → 2.1.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 -4
- package/dist/agent-memories/apply.d.ts +7 -5
- package/dist/agent-memories/apply.js +66 -39
- package/dist/agent-memories/claude-code.d.ts +8 -2
- package/dist/agent-memories/claude-code.js +26 -7
- package/dist/agent-memories/copilot.js +2 -1
- package/dist/agent-memories/files.js +2 -1
- package/dist/agent-memories/legacy.d.ts +6 -3
- package/dist/agent-memories/legacy.js +35 -14
- package/dist/agent-memories/markdown.d.ts +3 -1
- package/dist/agent-memories/markdown.js +3 -1
- package/dist/agent-memories/openclaw.js +5 -2
- package/dist/agent-memories/plan.js +11 -1
- package/dist/agent-memories/project-folds.js +2 -1
- package/dist/agent-memories/report.d.ts +4 -1
- package/dist/agent-memories/report.js +43 -9
- package/dist/agent-memories/source.d.ts +8 -2
- package/dist/agent-memories/source.js +11 -3
- package/dist/agent-memories/sync.d.ts +7 -2
- package/dist/agent-memories/sync.js +141 -101
- package/dist/api/assemble.d.ts +6 -4
- package/dist/api/assemble.js +11 -5
- package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
- package/dist/api/auth/audit.js +58 -0
- package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -16
- package/dist/api/{auth.js → auth/auth.js} +66 -54
- package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
- package/dist/api/{quarantine.js → auth/quarantine.js} +8 -7
- package/dist/api/auth/session-owners.d.ts +10 -0
- package/dist/api/auth/session-owners.js +35 -0
- package/dist/api/availability.d.ts +3 -1
- package/dist/api/availability.js +3 -1
- package/dist/api/busy.d.ts +2 -0
- package/dist/api/busy.js +2 -0
- package/dist/api/cli-surface.d.ts +6 -0
- package/dist/api/cli-surface.js +6 -0
- package/dist/api/config-of.d.ts +5 -0
- package/dist/api/config-of.js +6 -0
- package/dist/api/context-auto.d.ts +4 -1
- package/dist/api/context-auto.js +14 -4
- package/dist/api/context-render.js +14 -7
- package/dist/api/context-select.d.ts +4 -1
- package/dist/api/context-select.js +31 -34
- package/dist/api/context-types.d.ts +38 -12
- package/dist/api/context.d.ts +8 -5
- package/dist/api/context.js +120 -63
- package/dist/api/continuity.d.ts +24 -21
- package/dist/api/continuity.js +18 -20
- package/dist/api/correction-latency.d.ts +3 -1
- package/dist/api/correction-latency.js +3 -1
- package/dist/api/error-reply.d.ts +4 -1
- package/dist/api/error-reply.js +12 -3
- package/dist/api/index.d.ts +39 -23
- package/dist/api/index.js +21 -23
- package/dist/api/instruction-detect.d.ts +4 -1
- package/dist/api/instruction-detect.js +75 -20
- package/dist/api/ledger-db.d.ts +15 -11
- package/dist/api/ledger-db.js +21 -23
- package/dist/api/memories/conflicts.d.ts +33 -0
- package/dist/api/memories/conflicts.js +67 -0
- package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
- package/dist/api/{forget.js → memories/forget.js} +23 -17
- package/dist/api/memories/memories.d.ts +27 -0
- package/dist/api/memories/memories.js +52 -0
- package/dist/api/memories/outcome.d.ts +22 -0
- package/dist/api/memories/outcome.js +28 -0
- package/dist/api/memories/promote.d.ts +40 -0
- package/dist/api/memories/promote.js +76 -0
- package/dist/api/memories/refine.d.ts +10 -0
- package/dist/api/memories/refine.js +12 -0
- package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +17 -9
- package/dist/api/{remember-local.js → memories/remember-local.js} +46 -24
- package/dist/api/{remember.d.ts → memories/remember.d.ts} +22 -13
- package/dist/api/{remember.js → memories/remember.js} +50 -32
- package/dist/api/objects/cards.d.ts +39 -0
- package/dist/api/{cards.js → objects/cards.js} +12 -14
- package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
- package/dist/api/{drill-down.js → objects/drill-down.js} +7 -7
- package/dist/api/objects/goals.d.ts +18 -0
- package/dist/api/{goals.js → objects/goals.js} +12 -12
- package/dist/api/objects/graph.d.ts +11 -0
- package/dist/api/objects/graph.js +16 -0
- package/dist/api/objects/objects.d.ts +9 -0
- package/dist/api/{objects.js → objects/objects.js} +2 -3
- package/dist/api/objects/predictions.d.ts +11 -0
- package/dist/api/{predictions.js → objects/predictions.js} +7 -5
- package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
- package/dist/api/{projects.js → objects/projects.js} +8 -4
- package/dist/api/pilot-arm.d.ts +8 -4
- package/dist/api/pilot-arm.js +5 -4
- package/dist/api/prompt-hook.d.ts +35 -20
- package/dist/api/prompt-hook.js +66 -44
- package/dist/api/provenance-coverage.d.ts +3 -1
- package/dist/api/provenance-coverage.js +3 -1
- package/dist/api/recall/finish.d.ts +185 -0
- package/dist/api/recall/finish.js +301 -0
- package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
- package/dist/api/{recall-pipeline.js → recall/pipeline.js} +185 -101
- package/dist/api/recall/recall.d.ts +6 -0
- package/dist/api/{recall.js → recall/recall.js} +116 -72
- package/dist/api/recall/render.d.ts +39 -0
- package/dist/api/recall/render.js +60 -0
- package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
- package/dist/api/recall/request.js +261 -0
- package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
- package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
- package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -68
- package/dist/api/{recall-types.js → recall/types.js} +1 -1
- package/dist/api/session-end.d.ts +36 -8
- package/dist/api/session-end.js +71 -25
- package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
- package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
- package/dist/api/sleep/dormant.d.ts +25 -0
- package/dist/api/sleep/dormant.js +64 -0
- package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
- package/dist/api/sleep/learn.js +138 -0
- package/dist/api/sleep/sleep-run.d.ts +38 -0
- package/dist/api/{sleep-run.js → sleep/sleep-run.js} +54 -45
- package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
- package/dist/api/sleep/sleep.js +9 -0
- package/dist/api/status.d.ts +3 -1
- package/dist/api/status.js +3 -1
- package/dist/api/store-init.d.ts +4 -1
- package/dist/api/store-init.js +4 -1
- package/dist/api/tokens.d.ts +10 -9
- package/dist/api/tokens.js +9 -10
- package/dist/api/types.d.ts +27 -12
- package/dist/api/types.js +13 -4
- package/dist/capture/caller-session.d.ts +8 -2
- package/dist/capture/caller-session.js +16 -6
- package/dist/capture/capture-error.d.ts +3 -1
- package/dist/capture/capture-error.js +3 -1
- package/dist/capture/codex-patch.js +7 -2
- package/dist/capture/command.d.ts +4 -2
- package/dist/capture/command.js +34 -15
- package/dist/capture/compact-resume-caller.js +15 -8
- package/dist/capture/compact.d.ts +8 -5
- package/dist/capture/compact.js +34 -23
- package/dist/capture/compaction-items-caller.js +9 -3
- package/dist/capture/compaction-record.d.ts +4 -3
- package/dist/capture/compaction-record.js +20 -12
- package/dist/capture/compaction-spool.d.ts +18 -9
- package/dist/capture/compaction-spool.js +105 -63
- package/dist/capture/copilot-transcript.d.ts +11 -3
- package/dist/capture/copilot-transcript.js +16 -6
- package/dist/capture/extract.js +20 -8
- package/dist/capture/failure-caller.js +23 -12
- package/dist/capture/failure-reading.d.ts +10 -3
- package/dist/capture/failure-reading.js +24 -7
- package/dist/capture/pre-compact-caller.js +11 -4
- package/dist/capture/session-digest.d.ts +15 -4
- package/dist/capture/session-digest.js +39 -13
- package/dist/capture/session-end-caller.d.ts +4 -1
- package/dist/capture/session-end-caller.js +20 -8
- package/dist/capture/session-texts.d.ts +6 -2
- package/dist/capture/session-texts.js +22 -7
- package/dist/capture/session-worker.d.ts +4 -2
- package/dist/capture/session-worker.js +58 -17
- package/dist/capture/transcript.d.ts +13 -4
- package/dist/capture/transcript.js +32 -10
- package/dist/capture/working-state.d.ts +13 -4
- package/dist/capture/working-state.js +50 -56
- package/dist/cli/api-context.d.ts +14 -2
- package/dist/cli/api-context.js +45 -2
- package/dist/cli/audit.js +33 -33
- package/dist/cli/auth.js +23 -31
- package/dist/cli/briefs.d.ts +1 -1
- package/dist/cli/briefs.js +20 -15
- package/dist/cli/card.d.ts +1 -1
- package/dist/cli/card.js +56 -73
- package/dist/cli/client.d.ts +12 -5
- package/dist/cli/client.js +53 -23
- package/dist/cli/compact-resume-payload.d.ts +4 -1
- package/dist/cli/compact-resume-payload.js +12 -5
- package/dist/cli/context.js +43 -18
- package/dist/cli/continuity.d.ts +5 -5
- package/dist/cli/continuity.js +90 -107
- package/dist/cli/curate.d.ts +5 -4
- package/dist/cli/curate.js +55 -77
- package/dist/cli/dag.d.ts +1 -1
- package/dist/cli/dag.js +14 -17
- package/dist/cli/decisions.js +30 -30
- package/dist/cli/eval.js +16 -21
- package/dist/cli/exit.d.ts +4 -1
- package/dist/cli/exit.js +10 -2
- package/dist/cli/explain.js +12 -11
- package/dist/cli/flag-values.d.ts +1 -1
- package/dist/cli/flag-values.js +9 -18
- package/dist/cli/github.d.ts +6 -0
- package/dist/cli/github.js +25 -13
- package/dist/cli/goals.d.ts +1 -1
- package/dist/cli/goals.js +39 -56
- package/dist/cli/graph.d.ts +1 -1
- package/dist/cli/graph.js +15 -11
- package/dist/cli/hook-runtime.d.ts +34 -10
- package/dist/cli/hook-runtime.js +41 -16
- package/dist/cli/incidents.d.ts +1 -1
- package/dist/cli/incidents.js +25 -25
- package/dist/cli/init.d.ts +1 -1
- package/dist/cli/init.js +35 -20
- package/dist/cli/install-steps.d.ts +12 -3
- package/dist/cli/install-steps.js +42 -18
- package/dist/cli/last-sleep.d.ts +4 -1
- package/dist/cli/last-sleep.js +9 -4
- package/dist/cli/maintenance.d.ts +1 -1
- package/dist/cli/maintenance.js +11 -12
- package/dist/cli/notes.d.ts +1 -1
- package/dist/cli/notes.js +8 -5
- package/dist/cli/object-verbs.d.ts +5 -5
- package/dist/cli/object-verbs.js +13 -16
- package/dist/cli/open-browser.js +11 -2
- package/dist/cli/playbooks.d.ts +3 -3
- package/dist/cli/playbooks.js +40 -32
- package/dist/cli/predictions.js +17 -22
- package/dist/cli/print.js +4 -2
- package/dist/cli/projects.js +21 -11
- package/dist/cli/quality-repair-once.d.ts +1 -1
- package/dist/cli/quality-repair-once.js +7 -6
- package/dist/cli/recall.js +129 -93
- package/dist/cli/refine-llm.d.ts +15 -4
- package/dist/cli/refine-llm.js +17 -7
- package/dist/cli/remember.js +51 -55
- package/dist/cli/scheduler.d.ts +4 -1
- package/dist/cli/scheduler.js +9 -5
- package/dist/cli/serve.js +28 -18
- package/dist/cli/session-hooks.d.ts +2 -6
- package/dist/cli/session-hooks.js +140 -112
- package/dist/cli/setup.d.ts +1 -1
- package/dist/cli/setup.js +56 -34
- package/dist/cli/shared.d.ts +4 -2
- package/dist/cli/shared.js +26 -11
- package/dist/cli/slack.js +15 -24
- package/dist/cli/sleep-render.d.ts +3 -1
- package/dist/cli/sleep-render.js +8 -5
- package/dist/cli/sleep.js +16 -8
- package/dist/cli/status.d.ts +4 -4
- package/dist/cli/status.js +32 -27
- package/dist/cli/stdin.d.ts +10 -3
- package/dist/cli/stdin.js +10 -3
- package/dist/cli/transfer.d.ts +4 -4
- package/dist/cli/transfer.js +97 -82
- package/dist/cli/usage.d.ts +1 -1
- package/dist/cli/usage.js +1 -1
- package/dist/cli/verb-row.d.ts +2 -0
- package/dist/cli/verbs/health.js +2 -0
- package/dist/cli/verbs/memory.js +47 -53
- package/dist/cli/verbs/objects.js +16 -7
- package/dist/cli/verbs/sessions.js +4 -2
- package/dist/cli/versioned-verbs.d.ts +8 -7
- package/dist/cli/versioned-verbs.js +31 -21
- package/dist/cli.js +14 -18
- package/dist/connectors/dlq.d.ts +6 -6
- package/dist/connectors/dlq.js +12 -7
- package/dist/connectors/github/backfill.d.ts +4 -4
- package/dist/connectors/github/backfill.js +6 -4
- package/dist/connectors/github/deletion.d.ts +6 -4
- package/dist/connectors/github/deletion.js +5 -4
- package/dist/connectors/github/dlq.d.ts +8 -6
- package/dist/connectors/github/dlq.js +11 -5
- package/dist/connectors/github/ingest.d.ts +2 -2
- package/dist/connectors/github/ingest.js +9 -5
- package/dist/connectors/github/octokit-client.d.ts +3 -1
- package/dist/connectors/github/octokit-client.js +7 -2
- package/dist/connectors/github/ratelimit.d.ts +6 -2
- package/dist/connectors/github/ratelimit.js +6 -2
- package/dist/connectors/github/signature.d.ts +14 -3
- package/dist/connectors/github/signature.js +17 -3
- package/dist/connectors/github/tenant-routing.d.ts +6 -4
- package/dist/connectors/github/tenant-routing.js +6 -5
- package/dist/connectors/github/transform.js +50 -67
- package/dist/connectors/github/types.d.ts +10 -3
- package/dist/connectors/github/types.js +6 -2
- package/dist/connectors/github/webhook.d.ts +5 -5
- package/dist/connectors/github/webhook.js +36 -23
- package/dist/connectors/ingest.d.ts +5 -3
- package/dist/connectors/ingest.js +3 -3
- package/dist/connectors/slack/backfill.d.ts +5 -5
- package/dist/connectors/slack/backfill.js +3 -3
- package/dist/connectors/slack/deletion.d.ts +4 -4
- package/dist/connectors/slack/deletion.js +6 -5
- package/dist/connectors/slack/dlq.d.ts +4 -4
- package/dist/connectors/slack/dlq.js +6 -6
- package/dist/connectors/slack/ingest.d.ts +6 -4
- package/dist/connectors/slack/ingest.js +5 -4
- package/dist/connectors/slack/signature.d.ts +4 -1
- package/dist/connectors/slack/tenant-routing.d.ts +6 -4
- package/dist/connectors/slack/tenant-routing.js +6 -5
- package/dist/connectors/slack/transform.d.ts +6 -2
- package/dist/connectors/slack/transform.js +6 -2
- package/dist/connectors/slack/types.d.ts +3 -1
- package/dist/connectors/slack/web-client.js +8 -3
- package/dist/connectors/slack/webhook.d.ts +5 -5
- package/dist/connectors/slack/webhook.js +19 -11
- package/dist/connectors/slack/workspaces.d.ts +7 -3
- package/dist/connectors/slack/workspaces.js +7 -3
- package/dist/connectors/store.d.ts +8 -0
- package/dist/connectors/store.js +2 -0
- package/dist/consolidate/conflicts.js +24 -10
- package/dist/consolidate/dag-summary.js +2 -1
- package/dist/consolidate/dag.d.ts +10 -5
- package/dist/consolidate/dag.js +45 -39
- package/dist/consolidate/decay.js +19 -6
- package/dist/consolidate/dedupe.d.ts +14 -5
- package/dist/consolidate/dedupe.js +28 -17
- package/dist/consolidate/flush-units.d.ts +4 -1
- package/dist/consolidate/flush-units.js +4 -1
- package/dist/consolidate/half-life-migration.d.ts +18 -8
- package/dist/consolidate/half-life-migration.js +48 -18
- package/dist/consolidate/llm-passes.js +27 -11
- package/dist/consolidate/memory-value-weights.d.ts +6 -2
- package/dist/consolidate/memory-value-weights.js +6 -2
- package/dist/consolidate/memory-value.d.ts +30 -10
- package/dist/consolidate/memory-value.js +37 -14
- package/dist/consolidate/merge.d.ts +4 -1
- package/dist/consolidate/merge.js +47 -37
- package/dist/consolidate/overlap-index.d.ts +8 -2
- package/dist/consolidate/overlap-index.js +11 -4
- package/dist/consolidate/physics-pass.d.ts +3 -1
- package/dist/consolidate/physics-pass.js +10 -7
- package/dist/consolidate/replay.d.ts +11 -4
- package/dist/consolidate/replay.js +19 -7
- package/dist/consolidate/run.d.ts +13 -5
- package/dist/consolidate/run.js +4 -4
- package/dist/consolidate/sleep.d.ts +14 -6
- package/dist/consolidate/sleep.js +42 -39
- package/dist/consolidate/trace.d.ts +7 -2
- package/dist/consolidate/trace.js +7 -2
- package/dist/consolidate/traces.js +27 -30
- package/dist/core/ablation.d.ts +9 -3
- package/dist/core/ablation.js +14 -4
- package/dist/core/active-scope.d.ts +3 -1
- package/dist/core/active-scope.js +3 -1
- package/dist/core/agent-memory-tools.d.ts +2 -0
- package/dist/core/agent-memory-tools.js +2 -0
- package/dist/core/ambient.d.ts +4 -3
- package/dist/core/ambient.js +8 -6
- package/dist/core/api-errors.d.ts +9 -3
- package/dist/core/api-errors.js +9 -3
- package/dist/core/capture-contract.d.ts +4 -1
- package/dist/core/capture-contract.js +27 -8
- package/dist/core/compare.d.ts +24 -8
- package/dist/core/compare.js +24 -8
- package/dist/core/config.d.ts +18 -9
- package/dist/core/config.js +38 -29
- package/dist/core/cosine.d.ts +4 -1
- package/dist/core/cosine.js +4 -1
- package/dist/core/handoff.d.ts +7 -2
- package/dist/core/handoff.js +4 -1
- package/dist/core/markdown.js +22 -17
- package/dist/core/memory-audit.js +14 -3
- package/dist/core/memory-quality.d.ts +12 -3
- package/dist/core/memory-quality.js +57 -21
- package/dist/core/memory.d.ts +87 -30
- package/dist/core/memory.js +82 -33
- package/dist/core/merged-row.d.ts +8 -2
- package/dist/core/merged-row.js +10 -3
- package/dist/core/package-root.d.ts +3 -1
- package/dist/core/package-root.js +3 -1
- package/dist/core/particle-refresh.d.ts +8 -0
- package/dist/core/particle-refresh.js +22 -0
- package/dist/core/physics-config.d.ts +4 -1
- package/dist/core/physics-config.js +6 -2
- package/dist/core/physics.d.ts +39 -11
- package/dist/core/physics.js +71 -21
- package/dist/core/project-identity.d.ts +34 -17
- package/dist/core/project-identity.js +35 -18
- package/dist/core/project-remote.d.ts +8 -4
- package/dist/core/project-remote.js +31 -14
- package/dist/core/recall-scope.d.ts +33 -11
- package/dist/core/recall-scope.js +42 -15
- package/dist/core/rejection-digest.d.ts +7 -0
- package/dist/core/rejection-digest.js +13 -0
- package/dist/core/salience.d.ts +3 -1
- package/dist/core/salience.js +10 -4
- package/dist/core/search-types.d.ts +15 -2
- package/dist/core/search-types.js +11 -0
- package/dist/dashboard/dashboard-actions.d.ts +2 -2
- package/dist/dashboard/dashboard-actions.js +18 -7
- package/dist/dashboard/dashboard-queries.js +2 -7
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
- package/dist/dashboard/dashboard-snapshot.js +5 -7
- package/dist/dashboard/dashboard.js +22 -8
- package/dist/db/backup.js +2 -2
- package/dist/db/busy.d.ts +10 -3
- package/dist/db/busy.js +27 -5
- package/dist/db/connect.d.ts +10 -2
- package/dist/db/connect.js +8 -2
- package/dist/db/continuity.d.ts +1 -1
- package/dist/db/continuity.js +27 -11
- package/dist/db/meta.d.ts +4 -1
- package/dist/db/meta.js +4 -1
- package/dist/db/migrate.d.ts +10 -5
- package/dist/db/migrate.js +40 -20
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/types.d.ts +2 -1
- package/dist/db/migrations/v11.js +1 -0
- package/dist/db/migrations/v12.js +2 -1
- package/dist/db/migrations/v14.js +2 -0
- package/dist/db/migrations/v15.js +4 -2
- package/dist/db/migrations/v16.js +6 -3
- package/dist/db/migrations/v17.js +2 -1
- package/dist/db/migrations/v19.js +4 -2
- package/dist/db/migrations/v20.js +2 -1
- package/dist/db/migrations/v22.js +12 -6
- package/dist/db/migrations/v23.js +6 -3
- package/dist/db/migrations/v24.js +6 -3
- package/dist/db/migrations/v25.js +4 -2
- package/dist/db/migrations/v26.js +4 -2
- package/dist/db/migrations/v27.js +6 -3
- package/dist/db/migrations/v28.js +4 -2
- package/dist/db/migrations/v29.js +4 -2
- package/dist/db/migrations/v30.js +6 -3
- package/dist/db/migrations/v31.js +4 -2
- package/dist/db/migrations/v32.js +6 -3
- package/dist/db/migrations/v33.js +4 -2
- package/dist/db/migrations/v34.js +2 -1
- package/dist/db/migrations/v35.js +2 -1
- package/dist/db/migrations/v36.js +2 -1
- package/dist/db/migrations/v37.js +10 -5
- package/dist/db/migrations/v38.js +10 -5
- package/dist/db/migrations/v39.js +14 -6
- package/dist/db/migrations/v40.js +4 -2
- package/dist/db/migrations/v41.js +4 -2
- package/dist/db/migrations/v42.js +2 -1
- package/dist/db/migrations/v44.js +4 -2
- package/dist/db/migrations/v45.js +4 -2
- package/dist/db/migrations/v49.js +2 -1
- package/dist/db/migrations/v50.js +4 -2
- package/dist/db/migrations/v51.js +4 -2
- package/dist/db/migrations/v52.js +2 -1
- package/dist/db/migrations/v53.js +8 -4
- package/dist/db/migrations/v54.js +2 -1
- package/dist/db/migrations/v55.js +4 -2
- package/dist/db/migrations/v56.d.ts +3 -0
- package/dist/db/migrations/v56.js +28 -0
- package/dist/db/open.d.ts +24 -12
- package/dist/db/open.js +25 -13
- package/dist/db/physics-state.d.ts +8 -8
- package/dist/db/physics-state.js +17 -50
- package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
- package/dist/db/raw-archive-mirror-cleanup.js +6 -4
- package/dist/db/request-stores.d.ts +20 -5
- package/dist/db/request-stores.js +15 -5
- package/dist/db/tables.d.ts +2 -1
- package/dist/db/tables.js +12 -4
- package/dist/db/vector-store.d.ts +13 -4
- package/dist/db/vector-store.js +35 -14
- package/dist/db/wal-checkpointer.d.ts +2 -1
- package/dist/db/wal-checkpointer.js +19 -7
- package/dist/doctor.d.ts +7 -1
- package/dist/doctor.js +128 -46
- package/dist/embeddings/local.d.ts +8 -4
- package/dist/embeddings/local.js +11 -7
- package/dist/embeddings/provider.d.ts +19 -10
- package/dist/embeddings/provider.js +32 -27
- package/dist/embeddings/transformers.d.ts +16 -4
- package/dist/embeddings/transformers.js +32 -15
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.js +2 -1
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +1 -1
- package/dist/entry/sqlite-handles.d.ts +10 -0
- package/dist/entry/sqlite-handles.js +9 -0
- package/dist/entry/store-kit.d.ts +50 -0
- package/dist/entry/store-kit.js +27 -0
- package/dist/entry/testing.d.ts +6 -0
- package/dist/entry/testing.js +7 -0
- package/dist/eval/eval-stats.d.ts +27 -8
- package/dist/eval/eval-stats.js +17 -5
- package/dist/eval/eval-suite.d.ts +3 -1
- package/dist/eval/eval-suite.js +409 -187
- package/dist/eval/eval.d.ts +8 -2
- package/dist/eval/eval.js +8 -2
- package/dist/eval/judgment.js +17 -7
- package/dist/graph/delta.d.ts +9 -42
- package/dist/graph/delta.js +17 -11
- package/dist/graph/extract.d.ts +10 -7
- package/dist/graph/extract.js +57 -25
- package/dist/graph/recall.d.ts +12 -4
- package/dist/graph/recall.js +30 -13
- package/dist/graph/stream.d.ts +18 -6
- package/dist/graph/stream.js +32 -10
- package/dist/graph/view.d.ts +19 -6
- package/dist/graph/view.js +42 -17
- package/dist/hooks/codex-session.js +2 -2
- package/dist/hooks/codex-wrapper.d.ts +3 -1
- package/dist/hooks/codex-wrapper.js +9 -4
- package/dist/hooks/copilot.d.ts +19 -5
- package/dist/hooks/copilot.js +54 -15
- package/dist/hooks/hook-blocks.d.ts +4 -1
- package/dist/hooks/hook-blocks.js +8 -3
- package/dist/hooks/json-hooks.d.ts +9 -5
- package/dist/hooks/json-hooks.js +72 -33
- package/dist/hooks/opencode.js +15 -5
- package/dist/hooks/shared.d.ts +27 -8
- package/dist/hooks/shared.js +57 -16
- package/dist/importers/core.d.ts +12 -4
- package/dist/importers/core.js +11 -10
- package/dist/importers/markdown-parse.d.ts +15 -5
- package/dist/importers/markdown-parse.js +16 -7
- package/dist/importers/markdown.js +6 -9
- package/dist/importers/sources.js +10 -23
- package/dist/importers/vault.d.ts +3 -3
- package/dist/importers/vault.js +61 -45
- package/dist/index.d.ts +33 -7
- package/dist/index.js +26 -8
- package/dist/learn/autolearn.d.ts +21 -6
- package/dist/learn/autolearn.js +57 -26
- package/dist/learn/churn-git.d.ts +4 -1
- package/dist/learn/churn-git.js +29 -5
- package/dist/learn/extract.d.ts +4 -1
- package/dist/learn/extract.js +17 -10
- package/dist/learn/forward-claim-detector.d.ts +17 -5
- package/dist/learn/forward-claim-detector.js +34 -15
- package/dist/learn/invalidation.d.ts +12 -6
- package/dist/learn/invalidation.js +62 -28
- package/dist/learn/roots.d.ts +3 -0
- package/dist/learn/roots.js +5 -0
- package/dist/mcp/admin-tools.d.ts +5 -5
- package/dist/mcp/admin-tools.js +28 -23
- package/dist/mcp/format.d.ts +1 -1
- package/dist/mcp/format.js +4 -2
- package/dist/mcp/framing.d.ts +3 -1
- package/dist/mcp/framing.js +20 -8
- package/dist/mcp/memory-tools.d.ts +3 -3
- package/dist/mcp/memory-tools.js +21 -20
- package/dist/mcp/protocol.d.ts +32 -16
- package/dist/mcp/protocol.js +12 -9
- package/dist/mcp/recall-tools.d.ts +3 -3
- package/dist/mcp/recall-tools.js +62 -74
- package/dist/mcp/request.d.ts +7 -5
- package/dist/mcp/request.js +61 -77
- package/dist/mcp/server.d.ts +3 -1
- package/dist/mcp/server.js +8 -3
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +4 -3
- package/dist/mcp/shared-gate.d.ts +3 -2
- package/dist/mcp/shared-gate.js +3 -2
- package/dist/mcp/stdio.d.ts +6 -3
- package/dist/mcp/stdio.js +59 -23
- package/dist/mcp/tool-args.d.ts +4 -1
- package/dist/mcp/tool-args.js +8 -3
- package/dist/mcp/tools.js +76 -32
- package/dist/objects/customer-notes.d.ts +12 -10
- package/dist/objects/customer-notes.js +21 -15
- package/dist/objects/decisions.d.ts +18 -10
- package/dist/objects/decisions.js +23 -17
- package/dist/objects/descriptor.js +2 -1
- package/dist/objects/fields.d.ts +4 -1
- package/dist/objects/fields.js +6 -2
- package/dist/objects/incidents.d.ts +14 -16
- package/dist/objects/incidents.js +29 -30
- package/dist/objects/lifecycle.d.ts +0 -4
- package/dist/objects/lifecycle.js +21 -24
- package/dist/objects/policies.d.ts +12 -16
- package/dist/objects/policies.js +17 -21
- package/dist/objects/processes.d.ts +16 -10
- package/dist/objects/processes.js +20 -15
- package/dist/objects/project-briefs.d.ts +13 -14
- package/dist/objects/project-briefs.js +33 -39
- package/dist/objects/skills.d.ts +10 -12
- package/dist/objects/skills.js +17 -22
- package/dist/postinstall.js +15 -7
- package/dist/predictions/planning-fallacy.d.ts +19 -6
- package/dist/predictions/planning-fallacy.js +4 -2
- package/dist/rerankers/clef.d.ts +8 -2
- package/dist/rerankers/clef.js +14 -9
- package/dist/rerankers/cross-encoder.d.ts +2 -1
- package/dist/rerankers/cross-encoder.js +19 -9
- package/dist/rerankers/index.js +2 -1
- package/dist/rerankers/jev.js +2 -1
- package/dist/rerankers/llm.d.ts +6 -2
- package/dist/rerankers/llm.js +8 -3
- package/dist/rerankers/remote.d.ts +3 -1
- package/dist/rerankers/remote.js +5 -2
- package/dist/rerankers/types.d.ts +6 -2
- package/dist/search/bm25-search.d.ts +3 -1
- package/dist/search/bm25-search.js +15 -2
- package/dist/search/boosts.js +4 -3
- package/dist/search/embed-memories.d.ts +12 -4
- package/dist/search/embed-memories.js +96 -58
- package/dist/search/engine.d.ts +11 -0
- package/dist/search/engine.js +14 -0
- package/dist/search/goal-boost.d.ts +10 -3
- package/dist/search/goal-boost.js +13 -6
- package/dist/search/hybrid-score.d.ts +4 -1
- package/dist/search/hybrid-score.js +4 -1
- package/dist/search/hybrid.d.ts +23 -8
- package/dist/search/hybrid.js +12 -7
- package/dist/search/multihop.js +14 -13
- package/dist/search/path-context.d.ts +10 -3
- package/dist/search/path-context.js +10 -3
- package/dist/search/physics-search.d.ts +9 -4
- package/dist/search/physics-search.js +38 -14
- package/dist/search/rerank.d.ts +2 -1
- package/dist/search/rerank.js +2 -1
- package/dist/search/rrf.d.ts +14 -5
- package/dist/search/rrf.js +11 -4
- package/dist/search/vector.d.ts +8 -2
- package/dist/search/vector.js +14 -8
- package/dist/server/auth.d.ts +19 -15
- package/dist/server/auth.js +68 -38
- package/dist/server/boot.d.ts +4 -1
- package/dist/server/boot.js +115 -67
- package/dist/server/client-ip.d.ts +17 -5
- package/dist/server/client-ip.js +56 -21
- package/dist/server/cursor.d.ts +10 -3
- package/dist/server/cursor.js +10 -3
- package/dist/server/deadline.d.ts +5 -2
- package/dist/server/deadline.js +10 -3
- package/dist/server/key-check-bounds.js +12 -4
- package/dist/server/lifecycle.d.ts +4 -1
- package/dist/server/lifecycle.js +10 -4
- package/dist/server/mcp-http.d.ts +2 -1
- package/dist/server/mcp-http.js +37 -22
- package/dist/server/rate-limit.d.ts +17 -5
- package/dist/server/rate-limit.js +55 -26
- package/dist/server/ready.js +7 -4
- package/dist/server/request.d.ts +15 -4
- package/dist/server/request.js +42 -15
- package/dist/server/route-checks.d.ts +4 -1
- package/dist/server/route-checks.js +8 -3
- package/dist/server/route-table.d.ts +8 -6
- package/dist/server/route-table.js +550 -97
- package/dist/server/routes/admin.d.ts +7 -7
- package/dist/server/routes/admin.js +36 -15
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +5 -4
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +12 -6
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +10 -4
- package/dist/server/routes/memories.d.ts +8 -8
- package/dist/server/routes/memories.js +12 -17
- package/dist/server/routes/object-routes.d.ts +8 -5
- package/dist/server/routes/object-routes.js +4 -2
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +11 -4
- package/dist/server/routes/predictions.d.ts +5 -5
- package/dist/server/routes/predictions.js +9 -4
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +15 -6
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +3 -2
- package/dist/server/routes/recall.d.ts +3 -3
- package/dist/server/routes/recall.js +21 -10
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +12 -4
- package/dist/server/server-detect.d.ts +24 -8
- package/dist/server/server-detect.js +57 -22
- package/dist/server/sleep-child.js +16 -10
- package/dist/server/sleep-offload.d.ts +8 -5
- package/dist/server/sleep-offload.js +40 -18
- package/dist/server/tls.d.ts +10 -2
- package/dist/server/tls.js +25 -5
- package/dist/server/types.d.ts +41 -24
- package/dist/server/validation.d.ts +4 -1
- package/dist/server/validation.js +22 -9
- package/dist/server.d.ts +17 -49
- package/dist/server.js +33 -40
- package/dist/sharing/global-store.d.ts +6 -12
- package/dist/sharing/global-store.js +8 -48
- package/dist/sharing/global-sync.d.ts +3 -1
- package/dist/sharing/global-sync.js +17 -7
- package/dist/sharing/project-merge.d.ts +25 -7
- package/dist/sharing/project-merge.js +49 -17
- package/dist/sharing/search-both.d.ts +8 -4
- package/dist/sharing/search-both.js +28 -14
- package/dist/sharing/share.d.ts +8 -4
- package/dist/sharing/share.js +40 -18
- package/dist/store/ambient.js +10 -5
- package/dist/store/audit-event.d.ts +2 -2
- package/dist/store/audit-event.js +8 -3
- package/dist/store/audit.d.ts +6 -3
- package/dist/store/audit.js +16 -6
- package/dist/store/auth.d.ts +4 -2
- package/dist/store/auth.js +63 -20
- package/dist/store/busy.d.ts +9 -0
- package/dist/store/busy.js +16 -0
- package/dist/store/candidates.d.ts +12 -5
- package/dist/store/candidates.js +90 -41
- package/dist/store/capture-write.d.ts +2 -1
- package/dist/store/capture-write.js +2 -1
- package/dist/store/card-detail.d.ts +4 -4
- package/dist/store/card-detail.js +15 -8
- package/dist/store/cards.d.ts +24 -10
- package/dist/store/cards.js +97 -63
- package/dist/store/compaction-caller.d.ts +2 -1
- package/dist/store/compaction-caller.js +2 -1
- package/dist/store/compactions-record.d.ts +14 -8
- package/dist/store/compactions-record.js +101 -37
- package/dist/store/compactions.js +35 -15
- package/dist/store/conflicts.d.ts +16 -5
- package/dist/store/conflicts.js +104 -48
- package/dist/store/connectors/dlq.d.ts +17 -5
- package/dist/store/connectors/dlq.js +58 -6
- package/dist/store/connectors/event-log.d.ts +122 -0
- package/dist/store/connectors/event-log.js +25 -0
- package/dist/store/connectors/github.d.ts +6 -3
- package/dist/store/connectors/github.js +30 -48
- package/dist/store/connectors/slack.d.ts +2 -1
- package/dist/store/connectors/slack.js +31 -47
- package/dist/store/dashboard-reads.d.ts +7 -3
- package/dist/store/dashboard-reads.js +32 -10
- package/dist/store/delete-and-batch.d.ts +17 -11
- package/dist/store/delete-and-batch.js +70 -28
- package/dist/store/delivery-recorder.d.ts +10 -7
- package/dist/store/delivery-recorder.js +70 -37
- package/dist/store/descendant-page.d.ts +2 -1
- package/dist/store/descendant-page.js +26 -10
- package/dist/store/diagnostics.d.ts +2 -1
- package/dist/store/diagnostics.js +2 -1
- package/dist/store/doctor-reads.d.ts +2 -1
- package/dist/store/doctor-reads.js +13 -5
- package/dist/store/dormant.d.ts +19 -11
- package/dist/store/dormant.js +45 -19
- package/dist/store/embeddings/index.d.ts +13 -9
- package/dist/store/embeddings/index.js +19 -12
- package/dist/store/entry-reads.d.ts +72 -21
- package/dist/store/entry-reads.js +215 -69
- package/dist/store/entry-row.d.ts +10 -6
- package/dist/store/entry-row.js +26 -14
- package/dist/store/entry-writes.d.ts +28 -13
- package/dist/store/entry-writes.js +61 -22
- package/dist/store/failure-log-at.js +1 -1
- package/dist/store/failure-log.d.ts +4 -2
- package/dist/store/failure-log.js +13 -6
- package/dist/store/gated-write.d.ts +3 -3
- package/dist/store/gated-write.js +3 -3
- package/dist/store/goals.d.ts +5 -4
- package/dist/store/goals.js +11 -12
- package/dist/store/graph-apply.d.ts +21 -0
- package/dist/{graph/write.js → store/graph-apply.js} +31 -11
- package/dist/store/graph-queue.d.ts +9 -6
- package/dist/store/graph-queue.js +15 -10
- package/dist/store/graph-reads.d.ts +16 -11
- package/dist/store/graph-reads.js +29 -19
- package/dist/store/graph-rows.d.ts +41 -3
- package/dist/store/graph-rows.js +10 -7
- package/dist/store/graph-view-rows.js +15 -7
- package/dist/store/graph-writes.d.ts +16 -10
- package/dist/store/graph-writes.js +59 -36
- package/dist/store/half-life.js +2 -2
- package/dist/store/handoffs.d.ts +13 -7
- package/dist/store/handoffs.js +44 -22
- package/dist/store/index-and-stats.d.ts +2 -2
- package/dist/store/index-and-stats.js +6 -5
- package/dist/store/index.d.ts +4 -2
- package/dist/store/index.js +2 -1
- package/dist/store/key-audit.d.ts +2 -1
- package/dist/store/key-audit.js +2 -1
- package/dist/store/key-writes.d.ts +2 -1
- package/dist/store/key-writes.js +9 -2
- package/dist/store/ledger-turn.d.ts +4 -1
- package/dist/store/ledger-turn.js +7 -2
- package/dist/store/mirrors.d.ts +11 -4
- package/dist/store/mirrors.js +96 -19
- package/dist/store/narrow.d.ts +6 -0
- package/dist/store/narrow.js +11 -0
- package/dist/store/open.d.ts +6 -3
- package/dist/store/open.js +20 -10
- package/dist/store/pilot-arm.d.ts +2 -1
- package/dist/store/pilot-arm.js +18 -6
- package/dist/store/planning-fallacy-evidence.d.ts +2 -2
- package/dist/store/planning-fallacy-evidence.js +8 -5
- package/dist/store/port/agent-import.d.ts +62 -0
- package/dist/store/port/agent-import.js +2 -0
- package/dist/store/port/consolidation.d.ts +129 -0
- package/dist/store/port/consolidation.js +2 -0
- package/dist/store/port/learning.d.ts +19 -0
- package/dist/store/port/learning.js +2 -0
- package/dist/store/port/local-files.d.ts +18 -0
- package/dist/store/port/local-files.js +2 -0
- package/dist/store/port/promotion.d.ts +20 -0
- package/dist/store/port/promotion.js +3 -0
- package/dist/store/port-groups.d.ts +160 -0
- package/dist/store/port-groups.js +2 -0
- package/dist/store/port.d.ts +261 -219
- package/dist/store/port.js +3 -9
- package/dist/store/predictions.d.ts +14 -10
- package/dist/store/predictions.js +37 -17
- package/dist/store/project-tags.d.ts +4 -1
- package/dist/store/project-tags.js +16 -5
- package/dist/store/quality-repair.d.ts +8 -4
- package/dist/store/quality-repair.js +53 -20
- package/dist/store/quarantine.d.ts +1 -0
- package/dist/store/quarantine.js +23 -9
- package/dist/store/raw-archive.d.ts +5 -4
- package/dist/store/raw-archive.js +11 -10
- package/dist/store/recall-trace.d.ts +22 -17
- package/dist/store/recall-trace.js +128 -64
- package/dist/store/rejected-values.d.ts +15 -10
- package/dist/store/rejected-values.js +46 -20
- package/dist/store/rejection.d.ts +12 -11
- package/dist/store/rejection.js +18 -19
- package/dist/store/report-reads.d.ts +2 -1
- package/dist/store/report-reads.js +2 -1
- package/dist/store/rows.d.ts +7 -5
- package/dist/store/rows.js +20 -13
- package/dist/store/rule-sql.d.ts +7 -3
- package/dist/store/rule-sql.js +26 -13
- package/dist/store/search-rows.d.ts +16 -11
- package/dist/store/search-rows.js +54 -32
- package/dist/store/sessions.d.ts +12 -10
- package/dist/store/sessions.js +40 -21
- package/dist/store/set-aside.d.ts +2 -2
- package/dist/store/set-aside.js +18 -5
- package/dist/store/sqlite/agent-import.d.ts +3 -0
- package/dist/store/sqlite/agent-import.js +77 -0
- package/dist/store/sqlite/cards-group.d.ts +6 -0
- package/dist/store/sqlite/cards-group.js +37 -0
- package/dist/store/sqlite/conflicts-group.d.ts +6 -0
- package/dist/store/sqlite/conflicts-group.js +18 -0
- package/dist/store/sqlite/connector-events-group.d.ts +2 -1
- package/dist/store/sqlite/connector-events-group.js +17 -6
- package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
- package/dist/store/sqlite/connector-writes-group.js +12 -5
- package/dist/store/sqlite/consolidation-group.d.ts +4 -0
- package/dist/store/sqlite/consolidation-group.js +64 -0
- package/dist/store/sqlite/dag-reads-group.js +1 -1
- package/dist/store/sqlite/dormant-group.d.ts +6 -0
- package/dist/store/sqlite/dormant-group.js +29 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +9 -6
- package/dist/store/sqlite/entry-writes-group.js +37 -14
- package/dist/store/sqlite/error-codec.d.ts +4 -2
- package/dist/store/sqlite/error-codec.js +32 -10
- package/dist/store/sqlite/executor-counts.js +2 -1
- package/dist/store/sqlite/executor.d.ts +8 -3
- package/dist/store/sqlite/executor.js +56 -18
- package/dist/store/sqlite/global-promote.d.ts +5 -0
- package/dist/store/sqlite/global-promote.js +48 -0
- package/dist/store/sqlite/goals-group.d.ts +6 -0
- package/dist/store/sqlite/goals-group.js +23 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
- package/dist/store/sqlite/graph-reads-group.js +2 -1
- package/dist/store/sqlite/held-connection.d.ts +8 -0
- package/dist/store/sqlite/held-connection.js +34 -7
- package/dist/store/sqlite/last-recall-group.d.ts +15 -0
- package/dist/store/sqlite/last-recall-group.js +62 -0
- package/dist/store/sqlite/learning-group.d.ts +4 -0
- package/dist/store/sqlite/learning-group.js +17 -0
- package/dist/store/sqlite/maintenance-groups.d.ts +6 -0
- package/dist/store/sqlite/maintenance-groups.js +61 -0
- package/dist/store/sqlite/object-rows.d.ts +6 -3
- package/dist/store/sqlite/object-rows.js +34 -5
- package/dist/store/sqlite/objects-group.d.ts +5 -4
- package/dist/store/sqlite/objects-group.js +97 -38
- package/dist/store/sqlite/predictions-group.d.ts +2 -1
- package/dist/store/sqlite/predictions-group.js +4 -2
- package/dist/store/sqlite/promotion-group.d.ts +3 -0
- package/dist/store/sqlite/promotion-group.js +10 -0
- package/dist/store/sqlite/quarantine-group.d.ts +2 -1
- package/dist/store/sqlite/quarantine-group.js +4 -2
- package/dist/store/sqlite/reports-group.d.ts +6 -0
- package/dist/store/sqlite/reports-group.js +33 -0
- package/dist/store/sqlite/request-scope.d.ts +6 -0
- package/dist/store/sqlite/request-scope.js +18 -0
- package/dist/store/sqlite/sessions-group.d.ts +6 -0
- package/dist/store/sqlite/sessions-group.js +46 -0
- package/dist/store/sqlite/store.d.ts +22 -18
- package/dist/store/sqlite/store.js +95 -33
- package/dist/store/sqlite/vector-pack.js +2 -1
- package/dist/store/sqlite/vector-reads-group.js +2 -1
- package/dist/store/sqlite/worker-jobs.d.ts +2 -1
- package/dist/store/sqlite/worker-jobs.js +19 -7
- package/dist/store/sqlite/worker-ops.d.ts +10 -5
- package/dist/store/sqlite/worker-ops.js +6 -3
- package/dist/store/sqlite/worker-store.d.ts +4 -3
- package/dist/store/sqlite/worker-store.js +24 -14
- package/dist/store/summaries.d.ts +25 -11
- package/dist/store/summaries.js +84 -27
- package/dist/store/summary-dirty.d.ts +2 -1
- package/dist/store/summary-dirty.js +2 -1
- package/dist/store/tenant.d.ts +3 -2
- package/dist/store/tenant.js +5 -4
- package/dist/store/token-ledger-rows.js +8 -4
- package/dist/store/token-ledger.d.ts +19 -13
- package/dist/store/token-ledger.js +27 -14
- package/dist/store/tombstone-checks.d.ts +4 -1
- package/dist/store/tombstone-checks.js +10 -1
- package/dist/store/usage-reports.js +2 -1
- package/dist/store/vector-index.d.ts +8 -5
- package/dist/store/vector-index.js +28 -11
- package/dist/store/working-memory.d.ts +6 -4
- package/dist/store/working-memory.js +14 -9
- package/dist/support-bundle.js +10 -5
- package/dist/trust/quarantine.d.ts +1 -2
- package/dist/trust/quarantine.js +1 -5
- package/dist/trust/reject-flow.d.ts +12 -3
- package/dist/trust/reject-flow.js +12 -4
- package/dist/util/anthropic-messages.d.ts +7 -2
- package/dist/util/anthropic-messages.js +18 -7
- package/dist/util/atomic-write.d.ts +8 -3
- package/dist/util/atomic-write.js +36 -21
- package/dist/util/compaction-items.d.ts +4 -1
- package/dist/util/compaction-items.js +8 -2
- package/dist/util/crash-handlers.d.ts +7 -2
- package/dist/util/crash-handlers.js +13 -4
- package/dist/util/env.d.ts +26 -5
- package/dist/util/env.js +87 -25
- package/dist/util/format.d.ts +2 -0
- package/dist/util/format.js +4 -0
- package/dist/util/home-path.js +12 -6
- package/dist/util/hook-payload.d.ts +3 -1
- package/dist/util/hook-payload.js +3 -1
- package/dist/util/http-retry.d.ts +12 -6
- package/dist/util/http-retry.js +16 -6
- package/dist/util/http-util.d.ts +20 -5
- package/dist/util/http-util.js +28 -9
- package/dist/util/json.d.ts +4 -1
- package/dist/util/json.js +4 -1
- package/dist/util/keyset.js +2 -1
- package/dist/util/limits.js +4 -2
- package/dist/util/log.d.ts +13 -5
- package/dist/util/log.js +29 -6
- package/dist/util/net.d.ts +5 -0
- package/dist/util/net.js +19 -0
- package/dist/util/real-path.d.ts +2 -1
- package/dist/util/real-path.js +4 -3
- package/dist/util/request-scope.d.ts +16 -4
- package/dist/util/request-scope.js +19 -6
- package/dist/util/same-text.d.ts +10 -3
- package/dist/util/same-text.js +10 -3
- package/dist/util/secret-detect.d.ts +24 -7
- package/dist/util/secret-detect.js +49 -14
- package/dist/util/spawn-argv.d.ts +11 -0
- package/dist/util/spawn-argv.js +66 -0
- package/dist/util/sql.d.ts +3 -0
- package/dist/util/sql.js +6 -0
- package/dist/util/sqlite-blocked.d.ts +15 -4
- package/dist/util/sqlite-blocked.js +19 -6
- package/dist/util/stored-json.d.ts +4 -1
- package/dist/util/stored-json.js +6 -2
- package/dist/util/stream-tee.d.ts +2 -1
- package/dist/util/stream-tee.js +8 -5
- package/dist/util/transcript-tail.d.ts +4 -1
- package/dist/util/transcript-tail.js +4 -1
- package/dist/util/vector-codec.d.ts +4 -0
- package/dist/util/vector-codec.js +15 -0
- package/dist/util/version.d.ts +8 -3
- package/dist/util/version.js +8 -3
- package/dist/util/write-budget.d.ts +7 -2
- package/dist/util/write-budget.js +5 -2
- package/dist/util/yaml.d.ts +4 -1
- package/dist/util/yaml.js +4 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +4 -1
- package/scripts/postinstall.cjs +3 -1
- package/dist/api/audit.js +0 -56
- package/dist/api/cards.d.ts +0 -42
- package/dist/api/conflicts.d.ts +0 -28
- package/dist/api/conflicts.js +0 -61
- package/dist/api/dormant.d.ts +0 -14
- package/dist/api/dormant.js +0 -58
- package/dist/api/goals.d.ts +0 -18
- package/dist/api/graph.d.ts +0 -8
- package/dist/api/graph.js +0 -7
- package/dist/api/learn.js +0 -124
- package/dist/api/memories.d.ts +0 -23
- package/dist/api/memories.js +0 -46
- package/dist/api/objects.d.ts +0 -9
- package/dist/api/on-store.d.ts +0 -16
- package/dist/api/on-store.js +0 -38
- package/dist/api/outcome.d.ts +0 -19
- package/dist/api/outcome.js +0 -21
- package/dist/api/predictions.d.ts +0 -11
- package/dist/api/promote.d.ts +0 -36
- package/dist/api/promote.js +0 -65
- package/dist/api/recall-core.d.ts +0 -4
- package/dist/api/recall-core.js +0 -120
- package/dist/api/recall-finish.d.ts +0 -53
- package/dist/api/recall-finish.js +0 -30
- package/dist/api/recall-history.d.ts +0 -64
- package/dist/api/recall-history.js +0 -159
- package/dist/api/recall-record.d.ts +0 -43
- package/dist/api/recall-record.js +0 -78
- package/dist/api/recall-request.js +0 -121
- package/dist/api/recall.d.ts +0 -6
- package/dist/api/refine.d.ts +0 -7
- package/dist/api/refine.js +0 -10
- package/dist/api/session-owners.d.ts +0 -4
- package/dist/api/session-owners.js +0 -17
- package/dist/api/sleep-run.d.ts +0 -26
- package/dist/api/sleep.js +0 -10
- package/dist/cli/lenient-id.d.ts +0 -2
- package/dist/cli/lenient-id.js +0 -13
- package/dist/graph/write.d.ts +0 -14
- package/dist/store/sqlite/busy.d.ts +0 -3
- package/dist/store/sqlite/busy.js +0 -8
- package/dist/store/sqlite/local.d.ts +0 -21
- package/dist/store/sqlite/local.js +0 -39
|
@@ -3,7 +3,8 @@ import { jaccardMinShared, overlapPartners } from './overlap-index.js';
|
|
|
3
3
|
import { isQuarantineScope } from '../trust/quarantine.js';
|
|
4
4
|
import { isPersonalScope } from '../core/recall-scope.js';
|
|
5
5
|
import { DECAY_THRESHOLD } from './decay.js';
|
|
6
|
-
// Gate contradictions on content overlap, not shared tags (`feedback`/`policy` are too coarse). The Jaccard threshold
|
|
6
|
+
// Gate contradictions on content overlap, not shared tags (`feedback`/`policy` are too coarse). The Jaccard threshold
|
|
7
|
+
// on stopword-filtered tokens
|
|
7
8
|
// only applies after a polarity signal, so it filters drive-by topic similarity, not semantic drift.
|
|
8
9
|
const CONFLICT_OVERLAP_THRESHOLD = 0.5;
|
|
9
10
|
// Minimum distinctive shared tokens before we trust an overlap score. Filters
|
|
@@ -45,8 +46,9 @@ rescuedIds = new Set()) {
|
|
|
45
46
|
continue;
|
|
46
47
|
if (!recalledTogether(survivors[i], survivors[j]))
|
|
47
48
|
continue;
|
|
48
|
-
if ([survivors[i], survivors[j]].some((e) => e.tags.includes('extracted') || e.tags.includes('session-digest')))
|
|
49
|
+
if ([survivors[i], survivors[j]].some((e) => e.tags.includes('extracted') || e.tags.includes('session-digest'))) {
|
|
49
50
|
continue;
|
|
51
|
+
}
|
|
50
52
|
const reasonAndScore = describeConflict(profiles[i], profiles[j]);
|
|
51
53
|
if (!reasonAndScore)
|
|
52
54
|
continue;
|
|
@@ -60,21 +62,29 @@ rescuedIds = new Set()) {
|
|
|
60
62
|
}
|
|
61
63
|
return detected;
|
|
62
64
|
}
|
|
63
|
-
/**
|
|
65
|
+
/**
|
|
66
|
+
* One project's ambient context can show both: same tenant, and the same project or a user-global row beside a
|
|
67
|
+
* project's.
|
|
68
|
+
*/
|
|
64
69
|
function recalledTogether(a, b) {
|
|
65
70
|
// A personal row pairs only inside its own scope; any other pair shows its id to someone else.
|
|
66
71
|
if ((isPersonalScope(a.scope) || isPersonalScope(b.scope)) && a.scope !== b.scope)
|
|
67
72
|
return false;
|
|
68
|
-
if (a.
|
|
73
|
+
if (a.tenant_id !== b.tenant_id)
|
|
69
74
|
return false;
|
|
70
75
|
const [x, y] = [a.origin_project ?? null, b.origin_project ?? null];
|
|
71
76
|
return x === y || (x === '' && y !== null) || (y === '' && x !== null);
|
|
72
77
|
}
|
|
73
78
|
function conflictProfile(text) {
|
|
74
79
|
const opening = openingWindow(text);
|
|
75
|
-
// Polarity is measured only in the first POLARITY_WINDOW_WORDS, so a stray negation deep in a prose memory doesn't
|
|
80
|
+
// Polarity is measured only in the first POLARITY_WINDOW_WORDS, so a stray negation deep in a prose memory doesn't
|
|
81
|
+
// flip the intent.
|
|
76
82
|
// Pad with spaces so space-delimited patterns match words at the start/end.
|
|
77
|
-
return {
|
|
83
|
+
return {
|
|
84
|
+
distinct: distinctiveTokens(text),
|
|
85
|
+
polarity: inferConflictPolarity(opening),
|
|
86
|
+
window: ' ' + opening.toLowerCase() + ' ',
|
|
87
|
+
};
|
|
78
88
|
}
|
|
79
89
|
function describeConflict(a, b) {
|
|
80
90
|
// Jaccard on stopword-stripped tokens. Defer the threshold check until we
|
|
@@ -122,20 +132,24 @@ function openingWindow(text) {
|
|
|
122
132
|
}
|
|
123
133
|
// Takes opening windows only, so " on " and " off " as prepositions deep in long prose don't read as enabled/disabled.
|
|
124
134
|
function classifyConflictType(a, b, aPolarity, bPolarity) {
|
|
125
|
-
// Whole-word boundaries so " on " alone doesn't match "on/off"; pair only `enabled` <-> `disabled` and explicit
|
|
135
|
+
// Whole-word boundaries so " on " alone doesn't match "on/off"; pair only `enabled` <-> `disabled` and explicit
|
|
136
|
+
// on/off in imperative context.
|
|
126
137
|
const enabledDisabled = (containsAny(a, [' enabled ', ' enable ']) && containsAny(b, [' disabled ', ' disable ']))
|
|
127
138
|
|| (containsAny(b, [' enabled ', ' enable ']) && containsAny(a, [' disabled ', ' disable ']));
|
|
128
139
|
if (enabledDisabled)
|
|
129
140
|
return 'enabled/disabled mismatch on overlapping statement';
|
|
130
|
-
const trueFalse = (containsAny(a, [' true ', ' true.', ' true,', ' yes ']) &&
|
|
131
|
-
|
|
141
|
+
const trueFalse = (containsAny(a, [' true ', ' true.', ' true,', ' yes ']) &&
|
|
142
|
+
containsAny(b, [' false ', ' false.', ' false,', ' no '])) ||
|
|
143
|
+
(containsAny(b, [' true ', ' true.', ' true,', ' yes ']) &&
|
|
144
|
+
containsAny(a, [' false ', ' false.', ' false,', ' no ']));
|
|
132
145
|
if (trueFalse)
|
|
133
146
|
return 'true/false mismatch on overlapping statement';
|
|
134
147
|
const alwaysNever = (containsAny(a, [' always ', ' must ']) && containsAny(b, [' never ', ' must not ']))
|
|
135
148
|
|| (containsAny(b, [' always ', ' must ']) && containsAny(a, [' never ', ' must not ']));
|
|
136
149
|
if (alwaysNever)
|
|
137
150
|
return 'always/never mismatch on overlapping statement';
|
|
138
|
-
if ((aPolarity === 'positive' && bPolarity === 'negative') ||
|
|
151
|
+
if ((aPolarity === 'positive' && bPolarity === 'negative') ||
|
|
152
|
+
(aPolarity === 'negative' && bPolarity === 'positive')) {
|
|
139
153
|
return 'negation polarity mismatch on overlapping statement';
|
|
140
154
|
}
|
|
141
155
|
return null;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
// The one LLM call behind every DAG summary, kept apart from the graph writes so its request bytes are tested on their
|
|
1
|
+
// The one LLM call behind every DAG summary, kept apart from the graph writes so its request bytes are tested on their
|
|
2
|
+
// own.
|
|
2
3
|
import { redactSecretsStrict } from '../util/secret-detect.js';
|
|
3
4
|
import { describeMessageFailure, sendAnthropicMessage } from '../util/anthropic-messages.js';
|
|
4
5
|
import { certainDefect } from '../core/memory-quality.js';
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { type MemoryEntry } from '../core/memory.js';
|
|
2
|
+
import type { Consolidation, LocalFiles } from '../store/port.js';
|
|
2
3
|
import { type DagSummaryOptions } from './dag-summary.js';
|
|
4
|
+
/** Sleep's store, with the folder whose config sets a new summary's half-life. */
|
|
5
|
+
type DagStore = Pick<LocalFiles, 'hippoRoot' | 'consolidation'>;
|
|
3
6
|
export interface FactCluster {
|
|
4
7
|
label: string;
|
|
5
8
|
members: MemoryEntry[];
|
|
@@ -14,7 +17,7 @@ export interface DagBuildResult {
|
|
|
14
17
|
* guard-exempt (same id + content), so only summary-creation refusals count. */
|
|
15
18
|
rejected: number;
|
|
16
19
|
}
|
|
17
|
-
export declare function buildDag(
|
|
20
|
+
export declare function buildDag(local: DagStore, facts: MemoryEntry[], opts: DagSummaryOptions): Promise<DagBuildResult>;
|
|
18
21
|
export interface DagRebuildResult {
|
|
19
22
|
attempted: number;
|
|
20
23
|
rebuilt: number;
|
|
@@ -23,9 +26,10 @@ export interface DagRebuildResult {
|
|
|
23
26
|
failed: number;
|
|
24
27
|
capped: boolean;
|
|
25
28
|
}
|
|
26
|
-
/** Sleep-cycle phase draining the dirty L2 summary queue; one throwing rebuild does not abort the rest.
|
|
27
|
-
*
|
|
28
|
-
|
|
29
|
+
/** Sleep-cycle phase draining the dirty L2 summary queue; one throwing rebuild does not abort the rest. A concurrent
|
|
30
|
+
* sleep's second writer gets changed=false (UPDATE requires summary_dirty=1) and is skipped silently; a tombstone hit
|
|
31
|
+
* counts as `refused`. */
|
|
32
|
+
export declare function rebuildDirtySummaries(store: Consolidation, opts: DagSummaryOptions & {
|
|
29
33
|
cap?: number;
|
|
30
34
|
}): Promise<DagRebuildResult>;
|
|
31
35
|
export interface EntityProfilesBuildResult {
|
|
@@ -39,5 +43,6 @@ export interface EntityProfilesBuildResult {
|
|
|
39
43
|
}
|
|
40
44
|
/** Build L3 entity profiles by clustering L2 summaries sharing entity tags (2+ L2s per entity).
|
|
41
45
|
* Each L2 link write marks the new L3 dirty, so clear it or the same cycle re-rebuilds it. */
|
|
42
|
-
export declare function buildEntityProfiles(
|
|
46
|
+
export declare function buildEntityProfiles(local: DagStore, l2Summaries: MemoryEntry[], opts: DagSummaryOptions): Promise<EntityProfilesBuildResult>;
|
|
47
|
+
export {};
|
|
43
48
|
//# sourceMappingURL=dag.d.ts.map
|
package/dist/consolidate/dag.js
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import { createMemory, Layer } from '../core/memory.js';
|
|
2
|
-
import { writeEntry, writeEntriesTogether } from '../store/entry-writes.js';
|
|
3
|
-
import { loadAllDirtySummaries, loadChildrenOfSummary, applyRebuildResult, clearSummaryDirtyAfterBuild, } from '../store/summaries.js';
|
|
4
2
|
import { RejectedValueError } from '../core/api-errors.js';
|
|
5
3
|
import { generateDagSummary } from './dag-summary.js';
|
|
6
4
|
import { overlapPartners } from './overlap-index.js';
|
|
@@ -17,7 +15,8 @@ export function clusterFacts(facts) {
|
|
|
17
15
|
return [];
|
|
18
16
|
const entityTags = facts.map((f) => f.tags.filter((t) => t.startsWith('speaker:') || t.startsWith('topic:')));
|
|
19
17
|
const tagSets = entityTags.map((tags) => new Set(tags));
|
|
20
|
-
// Every tag indexed, not a prefix: a repeated tag counts twice in `shared`, so the prefix-filter bound would not
|
|
18
|
+
// Every tag indexed, not a prefix: a repeated tag counts twice in `shared`, so the prefix-filter bound would not
|
|
19
|
+
// hold.
|
|
21
20
|
const partnersOf = overlapPartners(tagSets, () => 1);
|
|
22
21
|
const assigned = new Set();
|
|
23
22
|
const clusters = [];
|
|
@@ -45,12 +44,12 @@ export function clusterFacts(facts) {
|
|
|
45
44
|
}
|
|
46
45
|
return clusters;
|
|
47
46
|
}
|
|
48
|
-
// Partition before clustering so one LLM summary never mixes tenants; Map keeps insertion order, so a single-tenant
|
|
49
|
-
// buildEntityProfiles partitions its L2s with this same key.
|
|
47
|
+
// Partition before clustering so one LLM summary never mixes tenants; Map keeps insertion order, so a single-tenant
|
|
48
|
+
// store iterates as before. buildEntityProfiles partitions its L2s with this same key.
|
|
50
49
|
function partitionFactsByTenant(unparented) {
|
|
51
50
|
const unparentedByTenant = new Map();
|
|
52
51
|
for (const fact of unparented) {
|
|
53
|
-
const key = derivationPartitionKey(fact.
|
|
52
|
+
const key = derivationPartitionKey(fact.tenant_id, fact.scope, fact.origin_project);
|
|
54
53
|
const bucket = unparentedByTenant.get(key);
|
|
55
54
|
if (bucket)
|
|
56
55
|
bucket.push(fact);
|
|
@@ -62,12 +61,13 @@ function partitionFactsByTenant(unparented) {
|
|
|
62
61
|
/** The L2 summary entry for one cluster, landing in the facts' own tenant and scope. */
|
|
63
62
|
function createClusterSummaryEntry(summary, cluster, home) {
|
|
64
63
|
const memberCreatedAts = cluster.members.map((m) => m.created).sort();
|
|
65
|
-
// Every cluster member shares home.tenantId (tenant partition above), so the summary lands in the facts' tenant,
|
|
64
|
+
// Every cluster member shares home.tenantId (tenant partition above), so the summary lands in the facts' tenant,
|
|
65
|
+
// not 'default'.
|
|
66
66
|
const summaryEntry = createMemory(summary, {
|
|
67
67
|
layer: Layer.Semantic,
|
|
68
68
|
tags: [...cluster.entityTags, ...neverAutoShareTags(cluster.members), 'dag-summary'],
|
|
69
69
|
confidence: 'inferred',
|
|
70
|
-
|
|
70
|
+
dagLevel: 2,
|
|
71
71
|
tenantId: home.tenantId,
|
|
72
72
|
scope: home.scope,
|
|
73
73
|
baseHalfLifeDays: home.baseHalfLifeDays,
|
|
@@ -81,7 +81,7 @@ function createClusterSummaryEntry(summary, cluster, home) {
|
|
|
81
81
|
return summaryEntry;
|
|
82
82
|
}
|
|
83
83
|
/** Summarize one eligible cluster, write the summary, then re-parent its members under it. */
|
|
84
|
-
async function summarizeCluster(
|
|
84
|
+
async function summarizeCluster(store, cluster, home, opts, result) {
|
|
85
85
|
const summary = await generateDagSummary(cluster.label, cluster.members.map((m) => m.content), opts);
|
|
86
86
|
if (!summary)
|
|
87
87
|
return;
|
|
@@ -89,29 +89,29 @@ async function summarizeCluster(hippoRoot, cluster, home, opts, result) {
|
|
|
89
89
|
// A refused summary skips only this cluster. writeEntry's guard reads tenantId off the entry
|
|
90
90
|
// (home.tenantId), so it already checks this tenant's tombstones: no separate check here.
|
|
91
91
|
try {
|
|
92
|
-
writeEntry(
|
|
92
|
+
store.writeEntry(summaryEntry);
|
|
93
93
|
}
|
|
94
94
|
catch (err) {
|
|
95
95
|
if (err instanceof RejectedValueError) {
|
|
96
96
|
result.rejected++;
|
|
97
|
-
log.warn(`buildDag: cluster "${cluster.label}" skipped: summary matches a rejected value
|
|
97
|
+
log.warn(`buildDag: cluster "${cluster.label}" skipped: summary matches a rejected value`, errorFields(err));
|
|
98
98
|
return;
|
|
99
99
|
}
|
|
100
100
|
throw err;
|
|
101
101
|
}
|
|
102
102
|
result.summariesCreated++;
|
|
103
|
-
result.factsLinked +=
|
|
103
|
+
result.factsLinked += store.writeTogether(cluster.members.map((member) => ({ ...member, dag_parent_id: summaryEntry.id })));
|
|
104
104
|
// Member writes just marked this fresh summary dirty; clear it, or the same sleep cycle's
|
|
105
105
|
// rebuild pass would re-rebuild every new summary at twice the LLM cost.
|
|
106
|
-
|
|
106
|
+
store.clearSummaryDirty(summaryEntry.id, summaryEntry.tenant_id, 'buildDag');
|
|
107
107
|
}
|
|
108
|
-
export async function buildDag(
|
|
108
|
+
export async function buildDag(local, facts, opts) {
|
|
109
109
|
const result = { candidateClusters: 0, summariesCreated: 0, factsLinked: 0, rejected: 0 };
|
|
110
|
-
const baseHalfLifeDays = loadConfig(hippoRoot).defaultHalfLifeDays;
|
|
110
|
+
const baseHalfLifeDays = loadConfig(local.hippoRoot).defaultHalfLifeDays;
|
|
111
111
|
const unparented = facts.filter((f) => f.dag_level === 1 && !f.dag_parent_id && f.tags.includes('extracted'));
|
|
112
112
|
for (const [, tenantFacts] of partitionFactsByTenant(unparented)) {
|
|
113
113
|
const home = {
|
|
114
|
-
tenantId: tenantFacts[0].
|
|
114
|
+
tenantId: tenantFacts[0].tenant_id,
|
|
115
115
|
scope: derivationScope(tenantFacts[0].scope),
|
|
116
116
|
originProject: tenantFacts[0].origin_project,
|
|
117
117
|
baseHalfLifeDays,
|
|
@@ -120,16 +120,19 @@ export async function buildDag(hippoRoot, facts, opts) {
|
|
|
120
120
|
const eligibleClusters = clusters.filter((c) => c.members.length >= 3);
|
|
121
121
|
result.candidateClusters += eligibleClusters.length;
|
|
122
122
|
for (const cluster of eligibleClusters) {
|
|
123
|
-
await summarizeCluster(
|
|
123
|
+
await summarizeCluster(local.consolidation, cluster, home, opts, result);
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
126
|
return result;
|
|
127
127
|
}
|
|
128
128
|
/** Regenerate one dirty summary from its children and tally the outcome; throws reach the caller's isolation. */
|
|
129
|
-
async function rebuildOneSummary(
|
|
130
|
-
|
|
129
|
+
async function rebuildOneSummary(store, summary, opts, result, preloaded, queuedIds) {
|
|
130
|
+
// A queued child may have been rebuilt earlier in this drain, so its preloaded content is stale: reread then.
|
|
131
|
+
const children = preloaded.some((c) => queuedIds.has(c.id))
|
|
132
|
+
? store.childrenOfSummary(summary.id, summary.tenant_id)
|
|
133
|
+
: preloaded;
|
|
131
134
|
if (children.length === 0) {
|
|
132
|
-
clearZeroChildSummary(
|
|
135
|
+
clearZeroChildSummary(store, summary, result);
|
|
133
136
|
return;
|
|
134
137
|
}
|
|
135
138
|
const newContent = await generateDagSummary(summaryLabel(summary), children.map((c) => c.content), opts);
|
|
@@ -139,7 +142,7 @@ async function rebuildOneSummary(hippoRoot, summary, opts, result) {
|
|
|
139
142
|
return;
|
|
140
143
|
}
|
|
141
144
|
const childCreatedAts = children.map((c) => c.created).sort();
|
|
142
|
-
const { changed, refused } =
|
|
145
|
+
const { changed, refused } = store.applyRebuild(summary, {
|
|
143
146
|
content: newContent,
|
|
144
147
|
descendant_count: children.length,
|
|
145
148
|
earliest_at: childCreatedAts[0],
|
|
@@ -158,8 +161,8 @@ async function rebuildOneSummary(hippoRoot, summary, opts, result) {
|
|
|
158
161
|
// success, silently skip
|
|
159
162
|
}
|
|
160
163
|
/** Zero-child case: clear dirty + zero counts, no LLM call, no rebuild_count bump. */
|
|
161
|
-
function clearZeroChildSummary(
|
|
162
|
-
const { changed } =
|
|
164
|
+
function clearZeroChildSummary(store, summary, result) {
|
|
165
|
+
const { changed } = store.applyRebuild(summary, {
|
|
163
166
|
content: summary.content,
|
|
164
167
|
descendant_count: 0,
|
|
165
168
|
earliest_at: null,
|
|
@@ -180,12 +183,13 @@ function summaryLabel(summary) {
|
|
|
180
183
|
? entityTags.map((t) => t.split(':')[1]).join(': ')
|
|
181
184
|
: summary.content.slice(0, SUMMARY_FALLBACK_CHARS);
|
|
182
185
|
}
|
|
183
|
-
/** Sleep-cycle phase draining the dirty L2 summary queue; one throwing rebuild does not abort the rest.
|
|
184
|
-
*
|
|
185
|
-
|
|
186
|
+
/** Sleep-cycle phase draining the dirty L2 summary queue; one throwing rebuild does not abort the rest. A concurrent
|
|
187
|
+
* sleep's second writer gets changed=false (UPDATE requires summary_dirty=1) and is skipped silently; a tombstone hit
|
|
188
|
+
* counts as `refused`. */
|
|
189
|
+
export async function rebuildDirtySummaries(store, opts) {
|
|
186
190
|
const cap = opts.cap ?? DEFAULT_REBUILD_CAP;
|
|
187
191
|
// One past the cap tells whether more were waiting without reading the rest.
|
|
188
|
-
const dirty =
|
|
192
|
+
const dirty = store.dirtySummaries(cap + 1);
|
|
189
193
|
const capped = dirty.length > cap;
|
|
190
194
|
const queue = dirty.slice(0, cap);
|
|
191
195
|
const result = {
|
|
@@ -196,6 +200,8 @@ export async function rebuildDirtySummaries(hippoRoot, opts) {
|
|
|
196
200
|
failed: 0,
|
|
197
201
|
capped,
|
|
198
202
|
};
|
|
203
|
+
const childrenOf = store.childrenOfSummaries(queue);
|
|
204
|
+
const queuedIds = new Set(queue.map((s) => s.id));
|
|
199
205
|
for (const [index, summary] of queue.entries()) {
|
|
200
206
|
// Yield the macrotask queue every 25 summaries: each iteration is synchronous SQLite, so a batch of up to 1000
|
|
201
207
|
// would starve timers and IPC (server keep-alives, Vitest's birpc heartbeat).
|
|
@@ -203,13 +209,13 @@ export async function rebuildDirtySummaries(hippoRoot, opts) {
|
|
|
203
209
|
await new Promise((resolve) => setImmediate(resolve));
|
|
204
210
|
}
|
|
205
211
|
try {
|
|
206
|
-
await rebuildOneSummary(
|
|
212
|
+
await rebuildOneSummary(store, summary, opts, result, childrenOf(summary), queuedIds);
|
|
207
213
|
}
|
|
208
214
|
catch (err) {
|
|
209
215
|
// One throw doesn't abort the queue; log enough to triage an exotic
|
|
210
216
|
// failure (SQLite I/O, prepare), since audit() already catches its own.
|
|
211
217
|
result.failed++;
|
|
212
|
-
log.error(`rebuildDirtySummaries: summary ${summary.id} (tenant ${summary.
|
|
218
|
+
log.error(`rebuildDirtySummaries: summary ${summary.id} (tenant ${summary.tenant_id}) failed: ${errorMessage(err)}`, errorFields(err));
|
|
213
219
|
}
|
|
214
220
|
}
|
|
215
221
|
return result;
|
|
@@ -222,7 +228,7 @@ function createProfileEntry(summary, cluster, home) {
|
|
|
222
228
|
layer: Layer.Semantic,
|
|
223
229
|
tags: [...cluster.entityTags, ...neverAutoShareTags(cluster.members), 'dag-entity-profile'],
|
|
224
230
|
confidence: 'inferred',
|
|
225
|
-
|
|
231
|
+
dagLevel: 3,
|
|
226
232
|
tenantId: home.tenantId,
|
|
227
233
|
scope: home.scope,
|
|
228
234
|
baseHalfLifeDays: home.baseHalfLifeDays,
|
|
@@ -235,7 +241,7 @@ function createProfileEntry(summary, cluster, home) {
|
|
|
235
241
|
return profileEntry;
|
|
236
242
|
}
|
|
237
243
|
/** Profile one eligible cluster of L2s, write it, then re-link the L2s under it. */
|
|
238
|
-
async function profileCluster(
|
|
244
|
+
async function profileCluster(store, cluster, home, opts, result) {
|
|
239
245
|
const summary = await generateDagSummary(cluster.label, cluster.members.map((m) => m.content), opts);
|
|
240
246
|
if (!summary) {
|
|
241
247
|
result.failed++;
|
|
@@ -244,25 +250,25 @@ async function profileCluster(hippoRoot, cluster, home, opts, result) {
|
|
|
244
250
|
const profileEntry = createProfileEntry(summary, cluster, home);
|
|
245
251
|
// A refused profile skips only this cluster; the re-linking below never runs for it.
|
|
246
252
|
try {
|
|
247
|
-
writeEntry(
|
|
253
|
+
store.writeEntry(profileEntry);
|
|
248
254
|
}
|
|
249
255
|
catch (err) {
|
|
250
256
|
if (err instanceof RejectedValueError) {
|
|
251
257
|
result.rejected++;
|
|
252
|
-
log.warn(`buildEntityProfiles: cluster "${cluster.label}" skipped: profile matches a rejected value
|
|
258
|
+
log.warn(`buildEntityProfiles: cluster "${cluster.label}" skipped: profile matches a rejected value`, errorFields(err));
|
|
253
259
|
return;
|
|
254
260
|
}
|
|
255
261
|
throw err;
|
|
256
262
|
}
|
|
257
263
|
result.profilesCreated++;
|
|
258
|
-
result.l2sLinked +=
|
|
264
|
+
result.l2sLinked += store.writeTogether(cluster.members.map((member) => ({ ...member, dag_parent_id: profileEntry.id })));
|
|
259
265
|
// Re-linking just marked the fresh L3 dirty; clear it so this cycle's rebuild skips it.
|
|
260
266
|
// The distinct source tags the audit row.
|
|
261
|
-
|
|
267
|
+
store.clearSummaryDirty(profileEntry.id, home.tenantId, 'buildEntityProfiles', 'buildEntityProfiles-clean');
|
|
262
268
|
}
|
|
263
269
|
/** Build L3 entity profiles by clustering L2 summaries sharing entity tags (2+ L2s per entity).
|
|
264
270
|
* Each L2 link write marks the new L3 dirty, so clear it or the same cycle re-rebuilds it. */
|
|
265
|
-
export async function buildEntityProfiles(
|
|
271
|
+
export async function buildEntityProfiles(local, l2Summaries, opts) {
|
|
266
272
|
const result = {
|
|
267
273
|
candidateClusters: 0,
|
|
268
274
|
profilesCreated: 0,
|
|
@@ -270,12 +276,12 @@ export async function buildEntityProfiles(hippoRoot, l2Summaries, opts) {
|
|
|
270
276
|
failed: 0,
|
|
271
277
|
rejected: 0,
|
|
272
278
|
};
|
|
273
|
-
const baseHalfLifeDays = loadConfig(hippoRoot).defaultHalfLifeDays;
|
|
279
|
+
const baseHalfLifeDays = loadConfig(local.hippoRoot).defaultHalfLifeDays;
|
|
274
280
|
// Only L2 with no L3 parent yet (avoid re-clustering already-profiled L2s).
|
|
275
281
|
const unparented = l2Summaries.filter((s) => s.dag_level === 2 && !s.dag_parent_id);
|
|
276
282
|
for (const [, tenantL2s] of partitionFactsByTenant(unparented)) {
|
|
277
283
|
const home = {
|
|
278
|
-
tenantId: tenantL2s[0].
|
|
284
|
+
tenantId: tenantL2s[0].tenant_id,
|
|
279
285
|
scope: derivationScope(tenantL2s[0].scope),
|
|
280
286
|
originProject: tenantL2s[0].origin_project,
|
|
281
287
|
baseHalfLifeDays,
|
|
@@ -284,7 +290,7 @@ export async function buildEntityProfiles(hippoRoot, l2Summaries, opts) {
|
|
|
284
290
|
const eligible = clusters.filter((c) => c.members.length >= 2);
|
|
285
291
|
result.candidateClusters += eligible.length;
|
|
286
292
|
for (const cluster of eligible) {
|
|
287
|
-
await profileCluster(
|
|
293
|
+
await profileCluster(local.consolidation, cluster, home, opts, result);
|
|
288
294
|
}
|
|
289
295
|
}
|
|
290
296
|
return result;
|
|
@@ -4,7 +4,8 @@ import { rescueSet, rankNonPinnedByTenant, validateWeights } from './memory-valu
|
|
|
4
4
|
import { MEMORY_VALUE_WEIGHTS, SOURCE_ARTIFACT_SHA256 } from './memory-value-weights.js';
|
|
5
5
|
const STRENGTH_DECIMALS = 4;
|
|
6
6
|
export const DECAY_THRESHOLD = 0.05;
|
|
7
|
-
// Leaving active memory: a raw receipt stays (the append-only trigger aborts DELETE for the whole batch; stored
|
|
7
|
+
// Leaving active memory: a raw receipt stays (the append-only trigger aborts DELETE for the whole batch; stored
|
|
8
|
+
// strength refreshed) but sits out this cycle;
|
|
8
9
|
// others go dormant when config.dormant is on, else are deleted. Only called for rows `retirable` allows.
|
|
9
10
|
function retireFaded(run, entry, strength) {
|
|
10
11
|
const { result } = run;
|
|
@@ -14,7 +15,12 @@ function retireFaded(run, entry, strength) {
|
|
|
14
15
|
if (run.config.dormant.enabled && !detectSecret(entry).flagged) {
|
|
15
16
|
result.dormant++;
|
|
16
17
|
result.details.push(` 💤 dormant ${entry.id} ${why}`);
|
|
17
|
-
run.pendingDormant.push({
|
|
18
|
+
run.pendingDormant.push({
|
|
19
|
+
entry: { ...entry, strength },
|
|
20
|
+
strength,
|
|
21
|
+
reason: 'decay',
|
|
22
|
+
dormantAt: run.now.toISOString(),
|
|
23
|
+
});
|
|
18
24
|
return;
|
|
19
25
|
}
|
|
20
26
|
result.removed++;
|
|
@@ -31,7 +37,8 @@ function keepSurvivor(run, entry, strength) {
|
|
|
31
37
|
run.result.decayed++;
|
|
32
38
|
return updated;
|
|
33
39
|
}
|
|
34
|
-
// 1. Decay pass. Memory-value flag OFF runs the single-phase loop below; ON classifies every entry with zero commits,
|
|
40
|
+
// 1. Decay pass. Memory-value flag OFF runs the single-phase loop below; ON classifies every entry with zero commits,
|
|
41
|
+
// runs rescueSet per tenant, then commits.
|
|
35
42
|
// Rescued entries stay full survivors for this cycle's later passes.
|
|
36
43
|
export function decayPass(run) {
|
|
37
44
|
if (run.config.memoryValue.enabled)
|
|
@@ -85,14 +92,19 @@ function decayWithMemoryValue(run) {
|
|
|
85
92
|
let rescuedIds = new Set();
|
|
86
93
|
let rankById = new Map();
|
|
87
94
|
const { strengthById, condemnedIds } = classifyByStrength(run);
|
|
88
|
-
// Phase 2a: rescue decision (pure compute); runs under --dry-run too (only the pendingDeletes flush and the logRun
|
|
95
|
+
// Phase 2a: rescue decision (pure compute); runs under --dry-run too (only the pendingDeletes flush and the logRun
|
|
96
|
+
// audit write are !dryRun-gated).
|
|
89
97
|
// Fail-loud must not depend on condemnation traffic: validate the frozen weights even when nothing is condemned.
|
|
90
98
|
validateWeights();
|
|
91
99
|
if (condemnedIds.size > 0) {
|
|
92
100
|
// Rank per tenant ONCE: rankById feeds both rescueSet (via precomputedRanks) and the detail/audit
|
|
93
101
|
// context below, so the whole-store ranking runs once per sleep and only when something is condemned.
|
|
94
102
|
rankById = rankNonPinnedByTenant(all, now);
|
|
95
|
-
rescuedIds = rescueSet(all, condemnedIds, now, {
|
|
103
|
+
rescuedIds = rescueSet(all, condemnedIds, now, {
|
|
104
|
+
weights: MEMORY_VALUE_WEIGHTS,
|
|
105
|
+
digest: SOURCE_ARTIFACT_SHA256,
|
|
106
|
+
precomputedRanks: rankById,
|
|
107
|
+
});
|
|
96
108
|
reportNonFiniteScores(result, rankById);
|
|
97
109
|
}
|
|
98
110
|
// --- Phase 2b: commit, one pass over `all` in ITS ORIGINAL ORDER ---
|
|
@@ -101,7 +113,8 @@ function decayWithMemoryValue(run) {
|
|
|
101
113
|
const strength = strengthById.get(entry.id);
|
|
102
114
|
if (run.retirable(entry) && strength < DECAY_THRESHOLD) {
|
|
103
115
|
if (rescuedIds.has(entry.id)) {
|
|
104
|
-
// Rescued: standard survivor stored-strength refresh. Confidence is left alone: it is an epistemic tier, not a
|
|
116
|
+
// Rescued: standard survivor stored-strength refresh. Confidence is left alone: it is an epistemic tier, not a
|
|
117
|
+
// cached
|
|
105
118
|
// computation, so resolveConfidence derives it on read.
|
|
106
119
|
rescuedEntries.push(keepSurvivor(run, entry, strength));
|
|
107
120
|
reportRescue(result, entry, strength, rankById.get(entry.id));
|
|
@@ -1,5 +1,10 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
1
|
+
/**
|
|
2
|
+
* Store-level dedup: same text apart from spacing, keeping the stronger copy; split out so `api.sleep` can dedupe
|
|
3
|
+
* without cli -> api imports.
|
|
4
|
+
* Survivor order is total and tenant-scoped: strength bucket, retrieval_count, then compareEntryIdentity; raw and
|
|
5
|
+
* superseded rows are not candidates.
|
|
6
|
+
*/
|
|
7
|
+
import type { Consolidation } from '../store/port.js';
|
|
3
8
|
import { type MemoryEntry } from '../core/memory.js';
|
|
4
9
|
export interface DedupPair {
|
|
5
10
|
kept: string;
|
|
@@ -17,7 +22,9 @@ export interface DedupResult {
|
|
|
17
22
|
removed: number;
|
|
18
23
|
pairs: DedupPair[];
|
|
19
24
|
}
|
|
20
|
-
/**
|
|
25
|
+
/**
|
|
26
|
+
* Quantize strength to an integer bucket so ties are a true equivalence relation (equal iff same multiple of
|
|
27
|
+
* `STRENGTH_TIE_EPSILON`).
|
|
21
28
|
* Non-finite input maps to 0: a NaN bucket would make the comparator return NaN and break the total order. */
|
|
22
29
|
export declare function strengthBucket(strength: number | null | undefined): number;
|
|
23
30
|
/** Every row of the store, read once by a caller that also needs them, with the ids of rows backing an object. */
|
|
@@ -25,9 +32,11 @@ export interface LoadedStore {
|
|
|
25
32
|
readonly entries: readonly MemoryEntry[];
|
|
26
33
|
readonly backing: ReadonlySet<string>;
|
|
27
34
|
}
|
|
28
|
-
/**
|
|
35
|
+
/**
|
|
36
|
+
* Remove the weaker copy of same-text (apart from spacing) memories within one tenant; cross-tenant pairs are never
|
|
37
|
+
* duplicates (isolation boundary).
|
|
29
38
|
* Higher strength wins, then more retrievals; `threshold` is accepted for old callers and ignored. */
|
|
30
|
-
export declare function deduplicateStore(
|
|
39
|
+
export declare function deduplicateStore(store: Consolidation, options?: {
|
|
31
40
|
threshold?: number;
|
|
32
41
|
dryRun?: boolean;
|
|
33
42
|
actor?: string;
|
|
@@ -1,15 +1,22 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
1
|
+
/**
|
|
2
|
+
* Store-level dedup: same text apart from spacing, keeping the stronger copy; split out so `api.sleep` can dedupe
|
|
3
|
+
* without cli -> api imports.
|
|
4
|
+
* Survivor order is total and tenant-scoped: strength bucket, retrieval_count, then compareEntryIdentity; raw and
|
|
5
|
+
* superseded rows are not candidates.
|
|
6
|
+
*/
|
|
3
7
|
import { textOverlap } from '../util/tokenize.js';
|
|
4
|
-
import { loadCurrentDistilledEntries } from '../store/entry-reads.js';
|
|
5
|
-
import { deleteEntriesOneByOne, memoriesBackingObjects } from '../store/delete-and-batch.js';
|
|
6
8
|
import { compareEntryIdentity } from '../core/compare.js';
|
|
7
9
|
import { canAutoDelete } from '../core/memory.js';
|
|
8
10
|
import { derivationPartitionKey } from '../core/recall-scope.js';
|
|
9
11
|
import { duplicateKey } from '../util/same-text.js';
|
|
10
|
-
/**
|
|
12
|
+
/**
|
|
13
|
+
* Quantization step for strength-tie comparisons: the 0.01 epsilon applied by rounding instead of an abs-diff
|
|
14
|
+
* threshold, so the tiebreak is transitive.
|
|
15
|
+
*/
|
|
11
16
|
const STRENGTH_TIE_EPSILON = 0.01;
|
|
12
|
-
/**
|
|
17
|
+
/**
|
|
18
|
+
* Quantize strength to an integer bucket so ties are a true equivalence relation (equal iff same multiple of
|
|
19
|
+
* `STRENGTH_TIE_EPSILON`).
|
|
13
20
|
* Non-finite input maps to 0: a NaN bucket would make the comparator return NaN and break the total order. */
|
|
14
21
|
export function strengthBucket(strength) {
|
|
15
22
|
const s = strength ?? 0;
|
|
@@ -28,13 +35,14 @@ function survivorOrder(a, b) {
|
|
|
28
35
|
return retrievalDiff;
|
|
29
36
|
return compareEntryIdentity(a, b);
|
|
30
37
|
}
|
|
31
|
-
// Tenant partition: group by tenantId before sorting so a duplicate pair never forms across tenants; Map keeps
|
|
38
|
+
// Tenant partition: group by tenantId before sorting so a duplicate pair never forms across tenants; Map keeps
|
|
39
|
+
// insertion order,
|
|
32
40
|
// so a single-tenant store gets one group and the same result as a global pass.
|
|
33
41
|
function entriesByPartition(entries) {
|
|
34
42
|
const entriesByTenant = new Map();
|
|
35
43
|
for (const entry of entries) {
|
|
36
44
|
// EI2: also split by restricted scope, else a private copy can delete the readable one.
|
|
37
|
-
const key = derivationPartitionKey(entry.
|
|
45
|
+
const key = derivationPartitionKey(entry.tenant_id, entry.scope, entry.origin_project);
|
|
38
46
|
const bucket = entriesByTenant.get(key);
|
|
39
47
|
if (bucket)
|
|
40
48
|
bucket.push(entry);
|
|
@@ -73,33 +81,36 @@ function partitionPairs(tenantEntries, removed, backing) {
|
|
|
73
81
|
}
|
|
74
82
|
return [...groups.values()].flatMap((group) => group.pairs);
|
|
75
83
|
}
|
|
76
|
-
/** The rows
|
|
84
|
+
/** The rows currentDistilledEntries selects, picked from a whole-store read. */
|
|
77
85
|
const isCurrentDistilled = (e) => (e.kind ?? 'distilled') === 'distilled' && !e.superseded_by;
|
|
78
|
-
/**
|
|
86
|
+
/**
|
|
87
|
+
* Remove the weaker copy of same-text (apart from spacing) memories within one tenant; cross-tenant pairs are never
|
|
88
|
+
* duplicates (isolation boundary).
|
|
79
89
|
* Higher strength wins, then more retrievals; `threshold` is accepted for old callers and ignored. */
|
|
80
|
-
export function deduplicateStore(
|
|
90
|
+
export function deduplicateStore(store, options = {}) {
|
|
81
91
|
const dryRun = options.dryRun ?? false;
|
|
82
92
|
// Only current distilled rows compete: raw rows are append-only (the delete
|
|
83
93
|
// trigger would abort sleep mid-loop) and superseded rows are history.
|
|
84
|
-
const entries = options.loaded?.entries.filter(isCurrentDistilled) ??
|
|
94
|
+
const entries = options.loaded?.entries.filter(isCurrentDistilled) ?? store.currentDistilledEntries();
|
|
85
95
|
const entriesByTenant = entriesByPartition(entries);
|
|
86
|
-
// Shared across tenant groups: ids are globally unique UUIDs, so `removed` cannot collide across tenants and
|
|
96
|
+
// Shared across tenant groups: ids are globally unique UUIDs, so `removed` cannot collide across tenants and
|
|
97
|
+
// deleteEntry deletes by primary key alone.
|
|
87
98
|
const removed = new Set();
|
|
88
99
|
const pairs = [];
|
|
89
|
-
const backing = options.loaded?.backing ??
|
|
100
|
+
const backing = options.loaded?.backing ?? store.objectBackedIds();
|
|
90
101
|
for (const tenantEntries of entriesByTenant.values()) {
|
|
91
102
|
// The survivor total order (see the file-level docstring), scoped per
|
|
92
103
|
// tenant group: the total order holds within a tenant only, matching the partition above.
|
|
93
104
|
tenantEntries.sort(survivorOrder);
|
|
94
105
|
pairs.push(...partitionPairs(tenantEntries, removed, backing));
|
|
95
106
|
}
|
|
96
|
-
const done = dryRun ? pairs : deletePairs(
|
|
107
|
+
const done = dryRun ? pairs : deletePairs(store, pairs, options.actor);
|
|
97
108
|
return { removed: done.length, pairs: done };
|
|
98
109
|
}
|
|
99
110
|
/** The pairs whose loser was deleted; one store handle, one transaction per delete. */
|
|
100
|
-
function deletePairs(
|
|
111
|
+
function deletePairs(store, pairs, actor) {
|
|
101
112
|
const targets = pairs.map((p) => ({ id: p.removed, reason: `dedup: duplicate of ${p.kept}` }));
|
|
102
|
-
const gone =
|
|
113
|
+
const gone = store.deleteOneByOne(targets, { actor, automatic: true });
|
|
103
114
|
return pairs.filter((_, i) => gone[i]);
|
|
104
115
|
}
|
|
105
116
|
//# sourceMappingURL=dedupe.js.map
|
|
@@ -3,6 +3,9 @@ import type { DormantMove } from '../store/dormant.js';
|
|
|
3
3
|
import type { FlushComponent, LoadedRows } 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[];
|
|
6
|
-
/**
|
|
6
|
+
/**
|
|
7
|
+
* [child, parent] per queued op on a child whose DAG parent the run removes: the parent-dirty mark otherwise lands
|
|
8
|
+
* after the parent is gone.
|
|
9
|
+
*/
|
|
7
10
|
export declare function familyUnits(writes: readonly MemoryEntry[], deletes: readonly string[], dormant: readonly DormantMove[], snapshot: LoadedRows): string[][];
|
|
8
11
|
//# sourceMappingURL=flush-units.d.ts.map
|
|
@@ -42,7 +42,10 @@ function unionFind(units) {
|
|
|
42
42
|
}
|
|
43
43
|
return find;
|
|
44
44
|
}
|
|
45
|
-
/**
|
|
45
|
+
/**
|
|
46
|
+
* [child, parent] per queued op on a child whose DAG parent the run removes: the parent-dirty mark otherwise lands
|
|
47
|
+
* after the parent is gone.
|
|
48
|
+
*/
|
|
46
49
|
// SHORTCUT: a removed parent and all its changed children commit as one component, so
|
|
47
50
|
// one hold can pass holdMs by a family's size; split by child if a family grows large.
|
|
48
51
|
export function familyUnits(writes, deletes, dormant, snapshot) {
|