hippo-memory 1.69.0 → 1.71.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -2
- package/dist/agent-memories/apply.d.ts +3 -3
- package/dist/agent-memories/apply.js +16 -31
- package/dist/agent-memories/claude-code.d.ts +5 -5
- package/dist/agent-memories/claude-code.js +25 -12
- package/dist/agent-memories/copilot.js +3 -2
- package/dist/agent-memories/files.js +26 -14
- package/dist/agent-memories/gemini.js +6 -5
- package/dist/agent-memories/keys.js +3 -2
- package/dist/agent-memories/legacy.d.ts +2 -2
- package/dist/agent-memories/legacy.js +2 -2
- package/dist/agent-memories/markdown.d.ts +1 -3
- package/dist/agent-memories/markdown.js +1 -3
- package/dist/agent-memories/report.d.ts +1 -1
- package/dist/agent-memories/report.js +3 -2
- package/dist/agent-memories/source.d.ts +1 -1
- package/dist/agent-memories/source.js +6 -5
- package/dist/agent-memories/sync.d.ts +5 -3
- package/dist/agent-memories/sync.js +34 -38
- package/dist/agent-memories/types.d.ts +1 -1
- package/dist/api/assemble.d.ts +9 -46
- package/dist/api/assemble.js +44 -54
- package/dist/api/audit.d.ts +8 -7
- package/dist/api/audit.js +15 -21
- package/dist/api/auth.d.ts +17 -39
- package/dist/api/auth.js +76 -216
- package/dist/api/auto-sleep.d.ts +13 -0
- package/dist/api/auto-sleep.js +32 -0
- package/dist/{availability.d.ts → api/availability.d.ts} +4 -17
- package/dist/{availability.js → api/availability.js} +14 -44
- package/dist/{context-auto.js → api/context-auto.js} +2 -1
- package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
- package/dist/{context-render.js → api/context-render.js} +7 -6
- package/dist/api/context-select.d.ts +5 -5
- package/dist/api/context-select.js +39 -48
- package/dist/api/context-types.d.ts +15 -40
- package/dist/api/context.d.ts +7 -26
- package/dist/api/context.js +67 -97
- package/dist/api/dormant.d.ts +7 -23
- package/dist/api/dormant.js +40 -128
- package/dist/api/drill-down.d.ts +9 -48
- package/dist/api/drill-down.js +41 -90
- package/dist/api/forget.d.ts +5 -33
- package/dist/api/forget.js +17 -73
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +2 -2
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +28 -0
- package/dist/api/index.js +31 -0
- package/dist/api/instruction-detect.js +85 -0
- package/dist/api/learn.js +63 -55
- package/dist/api/ledger-db.d.ts +21 -0
- package/dist/api/ledger-db.js +81 -0
- package/dist/api/memories.d.ts +5 -0
- package/dist/api/memories.js +7 -0
- package/dist/api/objects.d.ts +9 -0
- package/dist/api/objects.js +11 -0
- package/dist/api/on-store.d.ts +16 -0
- package/dist/api/on-store.js +38 -0
- package/dist/api/outcome.d.ts +5 -42
- package/dist/api/outcome.js +15 -80
- package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
- package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
- package/dist/api/predictions.d.ts +9 -0
- package/dist/api/predictions.js +18 -0
- package/dist/api/promote.d.ts +16 -31
- package/dist/api/promote.js +38 -123
- package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +11 -11
- package/dist/{prompt-hook.js → api/prompt-hook.js} +42 -60
- package/dist/api/quarantine.d.ts +5 -5
- package/dist/api/quarantine.js +30 -106
- package/dist/api/recall-cli.d.ts +55 -0
- package/dist/api/recall-cli.js +94 -0
- package/dist/api/recall-core.d.ts +4 -0
- package/dist/api/recall-core.js +120 -0
- package/dist/api/recall-finish.d.ts +53 -0
- package/dist/api/recall-finish.js +30 -0
- package/dist/api/recall-history.d.ts +64 -0
- package/dist/api/recall-history.js +159 -0
- package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +7 -8
- package/dist/{recall-pipeline.js → api/recall-pipeline.js} +60 -48
- package/dist/api/recall-record.d.ts +10 -13
- package/dist/api/recall-record.js +10 -30
- package/dist/api/recall-request.d.ts +2 -2
- package/dist/api/recall-request.js +3 -3
- package/dist/api/recall-types.d.ts +101 -316
- package/dist/api/recall.d.ts +5 -33
- package/dist/api/recall.js +92 -91
- package/dist/api/refine.d.ts +7 -0
- package/dist/api/refine.js +10 -0
- package/dist/api/remember-local.d.ts +57 -0
- package/dist/api/remember-local.js +90 -0
- package/dist/api/remember.d.ts +27 -12
- package/dist/api/remember.js +42 -46
- package/dist/api/session-owners.d.ts +4 -0
- package/dist/api/session-owners.js +17 -0
- package/dist/api/sleep-run.d.ts +7 -9
- package/dist/api/sleep-run.js +78 -94
- package/dist/api/sleep.d.ts +10 -29
- package/dist/api/tokens.d.ts +5 -12
- package/dist/api/tokens.js +12 -31
- package/dist/api/types.d.ts +8 -31
- package/dist/api/types.js +5 -23
- package/dist/capture/caller-session.d.ts +2 -2
- package/dist/capture/caller-session.js +8 -8
- package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
- package/dist/{capture-error.js → capture/capture-error.js} +7 -7
- package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
- package/dist/capture/command.d.ts +5 -13
- package/dist/capture/command.js +57 -60
- package/dist/capture/compact-resume-caller.d.ts +1 -1
- package/dist/capture/compact-resume-caller.js +7 -7
- package/dist/capture/compact.d.ts +8 -16
- package/dist/capture/compact.js +56 -47
- package/dist/capture/compaction-items-caller.d.ts +1 -1
- package/dist/capture/compaction-items-caller.js +7 -5
- package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
- package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
- package/dist/{compaction-record.js → capture/compaction-record.js} +143 -157
- package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +1 -1
- package/dist/{compaction-spool.js → capture/compaction-spool.js} +18 -14
- package/dist/capture/copilot-transcript.js +1 -1
- package/dist/capture/extract.js +2 -2
- package/dist/capture/failure-caller.d.ts +2 -2
- package/dist/capture/failure-caller.js +6 -6
- package/dist/capture/failure-reading.d.ts +2 -5
- package/dist/capture/failure-reading.js +11 -12
- package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
- package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
- package/dist/capture/pre-compact-caller.d.ts +1 -1
- package/dist/capture/pre-compact-caller.js +2 -2
- package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +2 -6
- package/dist/{session-digest.js → capture/session-digest.js} +29 -29
- package/dist/capture/session-end-caller.d.ts +2 -2
- package/dist/capture/session-end-caller.js +1 -1
- package/dist/capture/session-texts.d.ts +1 -1
- package/dist/capture/session-texts.js +5 -5
- package/dist/capture/session-worker.js +6 -4
- package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
- package/dist/capture/transcript.d.ts +2 -10
- package/dist/capture/transcript.js +72 -92
- package/dist/capture/working-state.d.ts +0 -3
- package/dist/capture/working-state.js +7 -7
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +28 -0
- package/dist/cli/audit-prune.js +40 -0
- package/dist/cli/audit.d.ts +2 -2
- package/dist/cli/audit.js +92 -88
- package/dist/cli/auth.d.ts +2 -1
- package/dist/cli/auth.js +69 -53
- package/dist/cli/briefs.d.ts +4 -3
- package/dist/cli/briefs.js +76 -202
- package/dist/cli/card.d.ts +2 -1
- package/dist/cli/card.js +55 -54
- package/dist/cli/client.d.ts +28 -0
- package/dist/{client.js → cli/client.js} +25 -44
- package/dist/cli/compact-resume-payload.d.ts +8 -0
- package/dist/cli/compact-resume-payload.js +40 -0
- package/dist/cli/context.d.ts +1 -13
- package/dist/cli/context.js +51 -77
- package/dist/cli/continuity.d.ts +6 -5
- package/dist/cli/continuity.js +153 -145
- package/dist/cli/correction-latency.d.ts +24 -0
- package/dist/{correction-latency.js → cli/correction-latency.js} +2 -14
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +226 -222
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +70 -52
- package/dist/cli/decisions.d.ts +4 -3
- package/dist/cli/decisions.js +129 -253
- package/dist/cli/eval.d.ts +1 -3
- package/dist/cli/eval.js +56 -42
- package/dist/cli/exit.d.ts +6 -0
- package/dist/cli/exit.js +11 -0
- package/dist/cli/explain.d.ts +1 -2
- package/dist/cli/explain.js +39 -21
- package/dist/cli/flag-values.d.ts +30 -0
- package/dist/cli/flag-values.js +120 -0
- package/dist/cli/flags.d.ts +304 -0
- package/dist/cli/flags.js +169 -0
- package/dist/cli/github.d.ts +14 -0
- package/dist/cli/github.js +184 -0
- package/dist/cli/goals.d.ts +2 -1
- package/dist/cli/goals.js +76 -75
- package/dist/cli/hook-runtime.d.ts +31 -0
- package/dist/cli/hook-runtime.js +139 -0
- package/dist/cli/init.d.ts +2 -1
- package/dist/cli/init.js +153 -126
- package/dist/cli/install-steps.d.ts +7 -0
- package/dist/cli/install-steps.js +101 -0
- package/dist/cli/last-sleep.d.ts +3 -1
- package/dist/cli/last-sleep.js +12 -7
- package/dist/cli/maintenance.d.ts +5 -4
- package/dist/cli/maintenance.js +41 -42
- package/dist/cli/object-verbs.d.ts +40 -0
- package/dist/cli/object-verbs.js +66 -0
- package/dist/cli/owner-validation.d.ts +18 -0
- package/dist/cli/owner-validation.js +33 -0
- package/dist/cli/playbooks.d.ts +4 -3
- package/dist/cli/playbooks.js +98 -306
- package/dist/cli/print.d.ts +15 -0
- package/dist/cli/print.js +82 -0
- package/dist/cli/projects.d.ts +2 -3
- package/dist/cli/projects.js +56 -51
- package/dist/cli/provenance-coverage.d.ts +14 -0
- package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +2 -6
- package/dist/cli/quality-repair-once.js +4 -4
- package/dist/cli/recall.d.ts +2 -6
- package/dist/cli/recall.js +128 -253
- package/dist/cli/refine-llm.d.ts +35 -0
- package/dist/cli/refine-llm.js +128 -0
- package/dist/cli/remember.d.ts +4 -6
- package/dist/cli/remember.js +193 -230
- package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +4 -17
- package/dist/{scheduler.js → cli/scheduler.js} +22 -22
- package/dist/cli/serve.d.ts +1 -1
- package/dist/cli/serve.js +46 -7
- package/dist/cli/session-hooks.d.ts +11 -19
- package/dist/cli/session-hooks.js +263 -258
- package/dist/cli/setup.d.ts +4 -3
- package/dist/cli/setup.js +55 -37
- package/dist/cli/shared.d.ts +14 -118
- package/dist/cli/shared.js +26 -400
- package/dist/cli/slack.d.ts +2 -1
- package/dist/cli/slack.js +46 -74
- package/dist/cli/sleep-render.d.ts +4 -0
- package/dist/cli/sleep-render.js +61 -0
- package/dist/cli/sleep.d.ts +3 -8
- package/dist/cli/sleep.js +34 -91
- package/dist/cli/status.d.ts +9 -12
- package/dist/cli/status.js +86 -131
- package/dist/{stdin.d.ts → cli/stdin.d.ts} +4 -6
- package/dist/{stdin.js → cli/stdin.js} +8 -9
- package/dist/cli/transfer.d.ts +9 -9
- package/dist/cli/transfer.js +125 -122
- package/dist/cli/usage.js +13 -5
- package/dist/cli.d.ts +69 -167
- package/dist/cli.js +187 -296
- package/dist/connectors/dlq.d.ts +44 -0
- package/dist/connectors/dlq.js +30 -0
- package/dist/connectors/github/backfill.d.ts +6 -26
- package/dist/connectors/github/backfill.js +42 -114
- package/dist/connectors/github/deletion.d.ts +6 -21
- package/dist/connectors/github/deletion.js +17 -64
- package/dist/connectors/github/dlq.d.ts +12 -91
- package/dist/connectors/github/dlq.js +23 -140
- package/dist/connectors/github/ingest.d.ts +4 -37
- package/dist/connectors/github/ingest.js +24 -93
- package/dist/connectors/github/octokit-client.d.ts +5 -17
- package/dist/connectors/github/octokit-client.js +29 -25
- package/dist/connectors/github/ratelimit.d.ts +3 -14
- package/dist/connectors/github/ratelimit.js +3 -14
- package/dist/connectors/github/scope.d.ts +3 -5
- package/dist/connectors/github/scope.js +3 -5
- package/dist/connectors/github/signature.d.ts +4 -26
- package/dist/connectors/github/signature.js +4 -26
- package/dist/connectors/github/tenant-routing.d.ts +4 -26
- package/dist/connectors/github/tenant-routing.js +13 -61
- package/dist/connectors/github/transform.d.ts +1 -1
- package/dist/connectors/github/transform.js +2 -16
- package/dist/connectors/github/types.d.ts +4 -16
- package/dist/connectors/github/types.js +17 -27
- package/dist/connectors/github/webhook.d.ts +5 -18
- package/dist/connectors/github/webhook.js +86 -105
- package/dist/connectors/slack/backfill.d.ts +5 -18
- package/dist/connectors/slack/backfill.js +9 -42
- package/dist/connectors/slack/deletion.d.ts +4 -7
- package/dist/connectors/slack/deletion.js +20 -49
- package/dist/connectors/slack/dlq.d.ts +9 -68
- package/dist/connectors/slack/dlq.js +26 -136
- package/dist/connectors/slack/ingest.d.ts +4 -18
- package/dist/connectors/slack/ingest.js +26 -91
- package/dist/connectors/slack/scope.d.ts +2 -8
- package/dist/connectors/slack/scope.js +2 -8
- package/dist/connectors/slack/signature.d.ts +1 -6
- package/dist/connectors/slack/signature.js +2 -1
- package/dist/connectors/slack/tenant-routing.d.ts +4 -18
- package/dist/connectors/slack/tenant-routing.js +11 -31
- package/dist/connectors/slack/transform.d.ts +3 -19
- package/dist/connectors/slack/transform.js +2 -18
- package/dist/connectors/slack/types.d.ts +4 -10
- package/dist/connectors/slack/types.js +5 -16
- package/dist/connectors/slack/web-client.js +34 -28
- package/dist/connectors/slack/webhook.d.ts +5 -21
- package/dist/connectors/slack/webhook.js +80 -108
- package/dist/connectors/slack/workspaces.d.ts +8 -41
- package/dist/connectors/slack/workspaces.js +8 -58
- package/dist/consolidate/conflicts.d.ts +1 -1
- package/dist/consolidate/conflicts.js +10 -18
- package/dist/consolidate/dag-summary.d.ts +8 -0
- package/dist/consolidate/dag-summary.js +41 -0
- package/dist/{dag.d.ts → consolidate/dag.d.ts} +6 -29
- package/dist/{dag.js → consolidate/dag.js} +49 -131
- package/dist/consolidate/decay.d.ts +2 -2
- package/dist/consolidate/decay.js +35 -41
- package/dist/consolidate/dedupe.d.ts +29 -0
- package/dist/consolidate/dedupe.js +103 -0
- package/dist/consolidate/flush-units.d.ts +5 -6
- package/dist/consolidate/flush-units.js +3 -3
- package/dist/consolidate/half-life-migration.d.ts +34 -0
- package/dist/consolidate/half-life-migration.js +89 -0
- package/dist/consolidate/llm-passes.js +12 -29
- package/dist/consolidate/memory-value-weights.d.ts +8 -0
- package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +2 -13
- package/dist/consolidate/memory-value.d.ts +45 -0
- package/dist/consolidate/memory-value.js +164 -0
- package/dist/consolidate/merge.js +65 -83
- package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
- package/dist/{merged-row.js → consolidate/merged-row.js} +4 -3
- package/dist/consolidate/physics-pass.js +46 -48
- package/dist/consolidate/replay.d.ts +9 -0
- package/dist/consolidate/replay.js +84 -0
- package/dist/consolidate/run.d.ts +7 -13
- package/dist/consolidate/run.js +6 -37
- package/dist/consolidate/sleep.d.ts +2 -9
- package/dist/consolidate/sleep.js +69 -151
- package/dist/consolidate/trace.d.ts +19 -0
- package/dist/{trace.js → consolidate/trace.js} +7 -24
- package/dist/consolidate/traces.js +40 -51
- package/dist/core/ablation.d.ts +15 -0
- package/dist/core/ablation.js +49 -0
- package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
- package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
- package/dist/{ambient.d.ts → core/ambient.d.ts} +1 -8
- package/dist/{ambient.js → core/ambient.js} +13 -18
- package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +16 -3
- package/dist/{capture-contract.js → core/capture-contract.js} +67 -1
- package/dist/{card.d.ts → core/card.d.ts} +4 -1
- package/dist/{card.js → core/card.js} +8 -0
- package/dist/core/compare.d.ts +32 -0
- package/dist/core/compare.js +70 -0
- package/dist/{config.d.ts → core/config.d.ts} +14 -28
- package/dist/{config.js → core/config.js} +101 -75
- package/dist/{handoff.d.ts → core/handoff.d.ts} +1 -7
- package/dist/core/handoff.js +81 -0
- package/dist/{memory-quality.js → core/memory-quality.js} +2 -2
- package/dist/core/memory.d.ts +183 -0
- package/dist/core/memory.js +380 -0
- package/dist/core/package-root.d.ts +3 -0
- package/dist/core/package-root.js +5 -0
- package/dist/{physics-config.d.ts → core/physics-config.d.ts} +1 -4
- package/dist/{physics-config.js → core/physics-config.js} +3 -8
- package/dist/{physics.d.ts → core/physics.d.ts} +16 -62
- package/dist/{physics.js → core/physics.js} +60 -122
- package/dist/{project-identity.d.ts → core/project-identity.d.ts} +17 -63
- package/dist/{project-identity.js → core/project-identity.js} +22 -55
- package/dist/{project-remote.js → core/project-remote.js} +17 -6
- package/dist/{prompt-recall.js → core/prompt-recall.js} +1 -1
- package/dist/core/raw-append-only.d.ts +5 -0
- package/dist/core/raw-append-only.js +7 -0
- package/dist/{salience.d.ts → core/salience.d.ts} +1 -7
- package/dist/{salience.js → core/salience.js} +36 -27
- package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
- package/dist/{search/types.js → core/search-types.js} +1 -1
- package/dist/core/session-digest-row.d.ts +5 -0
- package/dist/core/session-digest-row.js +6 -0
- package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
- package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +7 -7
- package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
- package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
- package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +11 -10
- package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +110 -104
- package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +2 -1
- package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +1 -0
- package/dist/{dashboard.js → dashboard/dashboard.js} +172 -55
- package/dist/db/backup.js +1 -1
- package/dist/db/busy.d.ts +19 -2
- package/dist/db/busy.js +88 -14
- package/dist/db/connect.d.ts +11 -2
- package/dist/db/connect.js +43 -10
- package/dist/db/index.d.ts +9 -0
- package/dist/db/index.js +8 -0
- package/dist/db/meta.d.ts +4 -0
- package/dist/db/meta.js +11 -1
- package/dist/db/migrate.d.ts +8 -1
- package/dist/db/migrate.js +28 -33
- package/dist/db/migrations/types.d.ts +2 -5
- package/dist/db/migrations/v08.js +1 -1
- package/dist/db/migrations/v14.js +39 -36
- package/dist/db/migrations/v15.js +2 -8
- package/dist/db/migrations/v16.js +31 -29
- package/dist/db/migrations/v17.js +2 -3
- package/dist/db/migrations/v18.js +6 -5
- package/dist/db/migrations/v19.js +2 -5
- package/dist/db/migrations/v20.js +5 -8
- package/dist/db/migrations/v22.js +28 -38
- package/dist/db/migrations/v23.js +3 -14
- package/dist/db/migrations/v24.js +25 -22
- package/dist/db/migrations/v25.js +3 -8
- package/dist/db/migrations/v26.js +2 -13
- package/dist/db/migrations/v27.js +3 -11
- package/dist/db/migrations/v28.js +2 -14
- package/dist/db/migrations/v29.js +23 -32
- package/dist/db/migrations/v30.js +4 -16
- package/dist/db/migrations/v31.js +23 -31
- package/dist/db/migrations/v32.js +4 -22
- package/dist/db/migrations/v33.js +2 -15
- package/dist/db/migrations/v34.js +2 -11
- package/dist/db/migrations/v35.js +2 -11
- package/dist/db/migrations/v36.js +2 -11
- package/dist/db/migrations/v37.js +8 -33
- package/dist/db/migrations/v38.js +5 -38
- package/dist/db/migrations/v39.js +10 -21
- package/dist/db/migrations/v40.js +8 -14
- package/dist/db/migrations/v41.js +2 -24
- package/dist/db/migrations/v43.js +7 -6
- package/dist/db/migrations/v44.js +2 -8
- package/dist/db/migrations/v45.js +2 -7
- package/dist/db/migrations/v46.js +1 -1
- package/dist/db/migrations/v47.js +2 -3
- package/dist/db/migrations/v48.js +1 -1
- package/dist/db/migrations/v49.js +1 -1
- package/dist/db/migrations/v50.js +8 -7
- package/dist/db/migrations/v51.js +1 -1
- package/dist/db/migrations/v52.js +1 -1
- package/dist/db/open.d.ts +11 -1
- package/dist/db/open.js +37 -4
- package/dist/db/physics-state.d.ts +23 -0
- package/dist/{physics-state.js → db/physics-state.js} +34 -52
- package/dist/db/raw-archive-mirror-cleanup.d.ts +5 -0
- package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +10 -20
- package/dist/db/request-stores.d.ts +15 -2
- package/dist/db/request-stores.js +37 -15
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -0
- package/dist/{vector-store.d.ts → db/vector-store.d.ts} +6 -2
- package/dist/{vector-store.js → db/vector-store.js} +83 -51
- package/dist/db/wal-checkpointer.d.ts +11 -0
- package/dist/db/wal-checkpointer.js +92 -0
- package/dist/doctor.js +176 -152
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.d.ts +1 -1
- package/dist/entry/project-identity.js +1 -1
- package/dist/entry/session-text.d.ts +3 -3
- package/dist/entry/session-text.js +5 -4
- package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +15 -53
- package/dist/{eval-stats.js → eval/eval-stats.js} +24 -51
- package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +3 -14
- package/dist/{eval-suite.js → eval/eval-suite.js} +99 -57
- package/dist/{eval.d.ts → eval/eval.d.ts} +7 -25
- package/dist/{eval.js → eval/eval.js} +35 -55
- package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -6
- package/dist/{judgment.js → eval/judgment.js} +23 -20
- package/dist/extensions/openclaw-plugin/index.js +2 -3
- package/dist/graph/delta.d.ts +3 -2
- package/dist/graph/delta.js +9 -23
- package/dist/{graph-extract.d.ts → graph/extract.d.ts} +10 -32
- package/dist/{graph-extract.js → graph/extract.js} +40 -81
- package/dist/{graph-recall.d.ts → graph/recall.d.ts} +9 -22
- package/dist/{graph-recall.js → graph/recall.js} +65 -108
- package/dist/graph/stream.d.ts +38 -0
- package/dist/{graph-stream.js → graph/stream.js} +20 -41
- package/dist/graph/view.d.ts +50 -0
- package/dist/graph/view.js +265 -0
- package/dist/graph/write.d.ts +4 -76
- package/dist/graph/write.js +13 -397
- package/dist/hooks/codex-session.js +1 -1
- package/dist/hooks/codex-wrapper.js +16 -17
- package/dist/hooks/copilot.d.ts +1 -8
- package/dist/hooks/copilot.js +16 -16
- package/dist/{cli → hooks}/hook-blocks.d.ts +6 -2
- package/dist/{cli → hooks}/hook-blocks.js +38 -125
- package/dist/hooks/json-hooks.d.ts +5 -37
- package/dist/hooks/json-hooks.js +49 -179
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +44 -103
- package/dist/hooks/shared.d.ts +8 -21
- package/dist/hooks/shared.js +30 -25
- package/dist/importers/core.d.ts +13 -42
- package/dist/importers/core.js +48 -64
- package/dist/importers/markdown-parse.d.ts +9 -32
- package/dist/importers/markdown-parse.js +10 -44
- package/dist/importers/markdown.js +5 -13
- package/dist/importers/sources.js +57 -81
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +95 -172
- package/dist/index.d.ts +26 -22
- package/dist/index.js +25 -21
- package/dist/learn/autolearn.d.ts +29 -0
- package/dist/{autolearn.js → learn/autolearn.js} +26 -51
- package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
- package/dist/{churn-git.js → learn/churn-git.js} +6 -4
- package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
- package/dist/learn/extract.js +123 -0
- package/dist/learn/forward-claim-detector.d.ts +12 -0
- package/dist/learn/forward-claim-detector.js +60 -0
- package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +10 -18
- package/dist/{invalidation.js → learn/invalidation.js} +92 -125
- package/dist/mcp/admin-tools.d.ts +1 -1
- package/dist/mcp/admin-tools.js +39 -64
- package/dist/mcp/format.d.ts +5 -5
- package/dist/mcp/format.js +7 -6
- package/dist/mcp/framing.d.ts +6 -0
- package/dist/mcp/framing.js +11 -3
- package/dist/mcp/memory-tools.js +10 -35
- package/dist/mcp/protocol.d.ts +14 -36
- package/dist/mcp/protocol.js +10 -19
- package/dist/mcp/recall-tools.d.ts +2 -2
- package/dist/mcp/recall-tools.js +70 -52
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +71 -85
- package/dist/mcp/server.d.ts +3 -9
- package/dist/mcp/server.js +6 -17
- package/dist/mcp/session-state.d.ts +2 -3
- package/dist/mcp/session-state.js +7 -13
- package/dist/mcp/shared-gate.js +1 -1
- package/dist/mcp/stdio.d.ts +2 -6
- package/dist/mcp/stdio.js +112 -38
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +7 -5
- package/dist/objects/customer-notes.d.ts +44 -0
- package/dist/objects/customer-notes.js +71 -0
- package/dist/objects/decisions.d.ts +41 -0
- package/dist/objects/decisions.js +63 -0
- package/dist/objects/descriptor.d.ts +52 -0
- package/dist/objects/descriptor.js +4 -0
- package/dist/objects/fields.d.ts +15 -0
- package/dist/objects/fields.js +21 -0
- package/dist/objects/incidents.d.ts +45 -0
- package/dist/objects/incidents.js +96 -0
- package/dist/objects/lifecycle.d.ts +27 -0
- package/dist/objects/lifecycle.js +96 -0
- package/dist/objects/policies.d.ts +60 -0
- package/dist/objects/policies.js +102 -0
- package/dist/objects/processes.d.ts +43 -0
- package/dist/objects/processes.js +92 -0
- package/dist/objects/project-briefs.d.ts +63 -0
- package/dist/objects/project-briefs.js +194 -0
- package/dist/objects/skills.d.ts +51 -0
- package/dist/objects/skills.js +110 -0
- package/dist/postinstall.js +10 -21
- package/dist/predictions/planning-fallacy.d.ts +14 -109
- package/dist/predictions/planning-fallacy.js +4 -129
- package/dist/rerankers/clef.d.ts +2 -6
- package/dist/rerankers/clef.js +28 -76
- package/dist/rerankers/cross-encoder.d.ts +0 -7
- package/dist/rerankers/cross-encoder.js +18 -28
- package/dist/rerankers/index.js +8 -7
- package/dist/rerankers/jev.d.ts +1 -4
- package/dist/rerankers/jev.js +36 -52
- package/dist/rerankers/llm.d.ts +2 -13
- package/dist/rerankers/llm.js +42 -59
- package/dist/rerankers/outage-warning.d.ts +8 -0
- package/dist/rerankers/outage-warning.js +32 -0
- package/dist/rerankers/remote.d.ts +4 -0
- package/dist/rerankers/remote.js +25 -0
- package/dist/rerankers/types.d.ts +3 -15
- package/dist/search/as-of.d.ts +1 -1
- package/dist/search/bm25-search.d.ts +2 -2
- package/dist/search/bm25-search.js +7 -7
- package/dist/search/bm25.d.ts +1 -1
- package/dist/search/bm25.js +1 -1
- package/dist/search/boosts.d.ts +5 -3
- package/dist/search/boosts.js +36 -15
- package/dist/search/breakdown.d.ts +2 -2
- package/dist/search/breakdown.js +2 -1
- package/dist/search/explain.d.ts +1 -1
- package/dist/search/explain.js +3 -2
- package/dist/search/finalize.d.ts +2 -2
- package/dist/search/finalize.js +4 -3
- package/dist/search/fusion.d.ts +1 -1
- package/dist/search/fusion.js +3 -3
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +90 -0
- package/dist/search/hybrid-score.d.ts +2 -2
- package/dist/search/hybrid-score.js +1 -1
- package/dist/search/hybrid.d.ts +6 -4
- package/dist/search/hybrid.js +11 -8
- package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
- package/dist/{multihop.js → search/multihop.js} +9 -8
- package/dist/search/path-context.d.ts +11 -0
- package/dist/{path-context.js → search/path-context.js} +8 -19
- package/dist/search/physics-search.d.ts +4 -4
- package/dist/search/physics-search.js +25 -22
- package/dist/search/rerank.d.ts +3 -3
- package/dist/search/rerank.js +4 -3
- package/dist/search/rrf.d.ts +15 -0
- package/dist/search/rrf.js +36 -0
- package/dist/search/temporal.d.ts +1 -1
- package/dist/search/temporal.js +5 -2
- package/dist/search/vector.d.ts +10 -3
- package/dist/search/vector.js +51 -15
- package/dist/server/auth.d.ts +10 -29
- package/dist/server/auth.js +57 -42
- package/dist/server/boot.d.ts +5 -0
- package/dist/server/boot.js +432 -0
- package/dist/server/client-ip.d.ts +8 -20
- package/dist/server/client-ip.js +23 -34
- package/dist/server/cursor.d.ts +1 -1
- package/dist/server/cursor.js +2 -3
- package/dist/server/deadline.d.ts +13 -0
- package/dist/server/deadline.js +45 -0
- package/dist/server/defaults.d.ts +3 -0
- package/dist/server/defaults.js +4 -0
- package/dist/server/key-check-bounds.d.ts +9 -0
- package/dist/server/key-check-bounds.js +46 -0
- package/dist/server/lifecycle.d.ts +5 -4
- package/dist/server/lifecycle.js +20 -5
- package/dist/server/mcp-http.d.ts +1 -4
- package/dist/server/mcp-http.js +44 -68
- package/dist/server/rate-limit.d.ts +21 -0
- package/dist/{rate-limit.js → server/rate-limit.js} +4 -13
- package/dist/server/ready.d.ts +7 -0
- package/dist/server/ready.js +38 -0
- package/dist/server/request.d.ts +14 -12
- package/dist/server/request.js +71 -28
- package/dist/server/route-table.d.ts +15 -0
- package/dist/server/route-table.js +202 -0
- package/dist/server/routes/admin.js +29 -30
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +35 -105
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +45 -115
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +44 -105
- package/dist/server/routes/memories.js +21 -43
- package/dist/server/routes/object-routes.d.ts +35 -0
- package/dist/server/routes/object-routes.js +72 -0
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +42 -134
- package/dist/server/routes/predictions.js +35 -63
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +44 -134
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +41 -120
- package/dist/server/routes/recall.js +21 -44
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +40 -138
- package/dist/server/server-detect.d.ts +28 -0
- package/dist/server/server-detect.js +156 -0
- package/dist/server/sleep-child.d.ts +2 -0
- package/dist/server/sleep-child.js +19 -0
- package/dist/server/sleep-offload.d.ts +20 -0
- package/dist/server/sleep-offload.js +73 -0
- package/dist/server/tls.d.ts +6 -0
- package/dist/server/tls.js +24 -0
- package/dist/server/types.d.ts +35 -14
- package/dist/server/validation.d.ts +6 -5
- package/dist/server/validation.js +16 -34
- package/dist/server.d.ts +39 -61
- package/dist/server.js +26 -569
- package/dist/sharing/global-store.d.ts +19 -0
- package/dist/sharing/global-store.js +75 -0
- package/dist/sharing/global-sync.d.ts +6 -0
- package/dist/sharing/global-sync.js +80 -0
- package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +5 -6
- package/dist/{project-merge.js → sharing/project-merge.js} +34 -51
- package/dist/sharing/scope.d.ts +7 -0
- package/dist/{scope.js → sharing/scope.js} +5 -12
- package/dist/sharing/search-both.d.ts +60 -0
- package/dist/sharing/search-both.js +138 -0
- package/dist/sharing/share.d.ts +38 -0
- package/dist/sharing/share.js +226 -0
- package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
- package/dist/{ambient-store.js → store/ambient.js} +11 -16
- package/dist/store/audit-event.d.ts +15 -17
- package/dist/store/audit-event.js +9 -16
- package/dist/{audit.d.ts → store/audit.d.ts} +29 -8
- package/dist/{audit.js → store/audit.js} +95 -18
- package/dist/{auth.d.ts → store/auth.d.ts} +19 -36
- package/dist/{auth.js → store/auth.js} +108 -99
- package/dist/store/candidates.d.ts +41 -13
- package/dist/store/candidates.js +141 -60
- package/dist/{card-detail.d.ts → store/card-detail.d.ts} +5 -4
- package/dist/{card-detail.js → store/card-detail.js} +3 -2
- package/dist/{store-cards.d.ts → store/cards.d.ts} +26 -16
- package/dist/{store-cards.js → store/cards.js} +133 -248
- package/dist/store/compactions.d.ts +78 -0
- package/dist/store/compactions.js +93 -0
- package/dist/store/conflicts.d.ts +26 -26
- package/dist/store/conflicts.js +194 -222
- package/dist/store/connectors/github.d.ts +84 -0
- package/dist/store/connectors/github.js +180 -0
- package/dist/store/connectors/slack.d.ts +69 -0
- package/dist/store/connectors/slack.js +177 -0
- package/dist/store/dashboard-reads.d.ts +27 -0
- package/dist/store/dashboard-reads.js +88 -0
- package/dist/store/delete-and-batch.d.ts +27 -51
- package/dist/store/delete-and-batch.js +100 -92
- package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +16 -5
- package/dist/{delivery-recorder.js → store/delivery-recorder.js} +60 -38
- package/dist/store/descendant-page.d.ts +12 -0
- package/dist/store/descendant-page.js +99 -0
- package/dist/store/diagnostics.d.ts +47 -0
- package/dist/store/diagnostics.js +44 -0
- package/dist/store/doctor-reads.d.ts +16 -0
- package/dist/store/doctor-reads.js +19 -0
- package/dist/store/dormant.d.ts +105 -0
- package/dist/store/dormant.js +241 -0
- package/dist/store/embeddings/index.d.ts +36 -0
- package/dist/{embeddings.js → store/embeddings/index.js} +104 -224
- package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
- package/dist/{local-embedding.js → store/embeddings/local.js} +69 -75
- package/dist/store/embeddings/provider.d.ts +40 -0
- package/dist/{embedding-provider.js → store/embeddings/provider.js} +78 -91
- package/dist/store/entry-reads.d.ts +66 -63
- package/dist/store/entry-reads.js +159 -121
- package/dist/store/entry-row.d.ts +14 -37
- package/dist/store/entry-row.js +37 -45
- package/dist/store/entry-writes.d.ts +40 -17
- package/dist/store/entry-writes.js +105 -41
- package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
- package/dist/{failure-log.js → store/failure-log.js} +9 -2
- package/dist/store/goals.d.ts +96 -0
- package/dist/store/goals.js +260 -0
- package/dist/store/graph-queue.d.ts +13 -0
- package/dist/store/graph-queue.js +70 -0
- package/dist/store/graph-reads.d.ts +41 -0
- package/dist/{graph/read.js → store/graph-reads.js} +72 -162
- package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +71 -14
- package/dist/{graph/rows.js → store/graph-rows.js} +20 -12
- package/dist/store/graph-view-rows.d.ts +13 -0
- package/dist/store/graph-view-rows.js +68 -0
- package/dist/store/graph-writes.d.ts +33 -0
- package/dist/store/graph-writes.js +232 -0
- package/dist/store/half-life.d.ts +35 -0
- package/dist/store/half-life.js +75 -0
- package/dist/store/handoffs.d.ts +6 -12
- package/dist/store/handoffs.js +54 -63
- package/dist/store/index-and-stats.d.ts +14 -20
- package/dist/store/index-and-stats.js +74 -119
- package/dist/store/index.d.ts +4 -0
- package/dist/store/index.js +3 -0
- package/dist/store/key-audit.d.ts +2 -2
- package/dist/store/key-audit.js +4 -4
- package/dist/store/key-writes.d.ts +12 -5
- package/dist/store/key-writes.js +30 -4
- package/dist/store/ledger-turn.d.ts +17 -0
- package/dist/store/ledger-turn.js +27 -0
- package/dist/store/markdown.d.ts +3 -7
- package/dist/store/markdown.js +25 -23
- package/dist/store/mirrors.d.ts +7 -13
- package/dist/store/mirrors.js +52 -47
- package/dist/store/object-types.d.ts +189 -0
- package/dist/store/object-types.js +4 -0
- package/dist/store/open.d.ts +6 -4
- package/dist/store/open.js +30 -36
- package/dist/store/planning-fallacy-evidence.d.ts +14 -0
- package/dist/store/planning-fallacy-evidence.js +52 -0
- package/dist/store/port.d.ts +649 -0
- package/dist/store/port.js +17 -0
- package/dist/{predictions/store.d.ts → store/predictions.d.ts} +25 -52
- package/dist/{predictions/store.js → store/predictions.js} +88 -184
- package/dist/{quality-repair.js → store/quality-repair.js} +27 -57
- package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
- package/dist/{quarantine.js → store/quarantine.js} +64 -22
- package/dist/store/raw-archive.d.ts +14 -0
- package/dist/{raw-archive.js → store/raw-archive.js} +20 -31
- package/dist/store/recall-scope.d.ts +78 -0
- package/dist/{recall-scope.js → store/recall-scope.js} +23 -84
- package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -81
- package/dist/{recall-trace.js → store/recall-trace.js} +41 -122
- package/dist/store/rejected-values.d.ts +55 -0
- package/dist/store/rejected-values.js +150 -0
- package/dist/store/rejection.d.ts +54 -0
- package/dist/{rejection.js → store/rejection.js} +16 -67
- package/dist/store/report-reads.d.ts +6 -0
- package/dist/store/report-reads.js +29 -0
- package/dist/store/rows.d.ts +11 -22
- package/dist/store/rows.js +52 -43
- package/dist/store/rule-sql.d.ts +5 -0
- package/dist/store/rule-sql.js +37 -0
- package/dist/store/search-rows.d.ts +22 -42
- package/dist/store/search-rows.js +55 -78
- package/dist/store/sessions.d.ts +23 -49
- package/dist/store/sessions.js +96 -118
- package/dist/store/sqlite/commit-watch.d.ts +4 -0
- package/dist/store/sqlite/commit-watch.js +29 -0
- package/dist/store/sqlite/connector-events-group.d.ts +5 -0
- package/dist/store/sqlite/connector-events-group.js +50 -0
- package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
- package/dist/store/sqlite/connector-writes-group.js +65 -0
- package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
- package/dist/store/sqlite/dag-reads-group.js +45 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
- package/dist/store/{entry-writes-group.js → sqlite/entry-writes-group.js} +73 -60
- package/dist/store/sqlite/error-codec.d.ts +17 -0
- package/dist/store/sqlite/error-codec.js +61 -0
- package/dist/store/sqlite/executor-counts.d.ts +10 -0
- package/dist/store/sqlite/executor-counts.js +11 -0
- package/dist/store/sqlite/executor.d.ts +29 -0
- package/dist/store/sqlite/executor.js +287 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
- package/dist/store/sqlite/graph-reads-group.js +18 -0
- package/dist/store/sqlite/local.d.ts +21 -0
- package/dist/store/sqlite/local.js +39 -0
- package/dist/store/sqlite/object-rows.d.ts +102 -0
- package/dist/store/sqlite/object-rows.js +221 -0
- package/dist/store/sqlite/objects-group.d.ts +20 -0
- package/dist/store/sqlite/objects-group.js +316 -0
- package/dist/store/sqlite/predictions-group.d.ts +5 -0
- package/dist/store/sqlite/predictions-group.js +28 -0
- package/dist/store/sqlite/quarantine-group.d.ts +5 -0
- package/dist/store/sqlite/quarantine-group.js +38 -0
- package/dist/store/sqlite/store.d.ts +23 -0
- package/dist/store/sqlite/store.js +294 -0
- package/dist/store/sqlite/vector-pack.d.ts +18 -0
- package/dist/store/sqlite/vector-pack.js +46 -0
- package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
- package/dist/store/sqlite/vector-reads-group.js +23 -0
- package/dist/store/sqlite/worker-entry.d.ts +2 -0
- package/dist/store/sqlite/worker-entry.js +8 -0
- package/dist/store/sqlite/worker-jobs.d.ts +5 -0
- package/dist/store/sqlite/worker-jobs.js +116 -0
- package/dist/store/sqlite/worker-ops.d.ts +135 -0
- package/dist/store/sqlite/worker-ops.js +93 -0
- package/dist/store/sqlite/worker-store.d.ts +8 -0
- package/dist/store/sqlite/worker-store.js +79 -0
- package/dist/store/summaries.d.ts +11 -72
- package/dist/store/summaries.js +47 -186
- package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
- package/dist/{summary-dirty.js → store/summary-dirty.js} +1 -1
- package/dist/store/tenant-lookup.d.ts +6 -1
- package/dist/store/tenant-lookup.js +7 -0
- package/dist/store/tenant.d.ts +11 -0
- package/dist/store/tenant.js +28 -0
- package/dist/store/token-ledger-rows.d.ts +61 -0
- package/dist/store/token-ledger-rows.js +68 -0
- package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +14 -51
- package/dist/{token-ledger.js → store/token-ledger.js} +51 -129
- package/dist/store/tombstone-checks.d.ts +12 -0
- package/dist/store/tombstone-checks.js +31 -0
- package/dist/store/usage-reports.d.ts +7 -0
- package/dist/store/usage-reports.js +18 -0
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +170 -0
- package/dist/{working-memory.d.ts → store/working-memory.d.ts} +11 -26
- package/dist/store/working-memory.js +118 -0
- package/dist/{yaml.d.ts → store/yaml.d.ts} +1 -5
- package/dist/{yaml.js → store/yaml.js} +2 -6
- package/dist/support-bundle.d.ts +1 -1
- package/dist/support-bundle.js +19 -37
- package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
- package/dist/{gated-write.js → trust/gated-write.js} +6 -6
- package/dist/trust/quarantine.d.ts +4 -0
- package/dist/trust/quarantine.js +8 -0
- package/dist/trust/reject-flow.d.ts +23 -0
- package/dist/trust/reject-flow.js +65 -0
- package/dist/util/anthropic-messages.d.ts +31 -0
- package/dist/util/anthropic-messages.js +58 -0
- package/dist/util/atomic-write.d.ts +4 -0
- package/dist/util/atomic-write.js +138 -0
- package/dist/util/capped-json.d.ts +6 -0
- package/dist/util/capped-json.js +46 -0
- package/dist/util/crash-handlers.d.ts +12 -0
- package/dist/util/crash-handlers.js +72 -0
- package/dist/{env.d.ts → util/env.d.ts} +27 -7
- package/dist/{env.js → util/env.js} +33 -8
- package/dist/{home-path.d.ts → util/home-path.d.ts} +2 -1
- package/dist/util/home-path.js +69 -0
- package/dist/{http-retry.d.ts → util/http-retry.d.ts} +8 -2
- package/dist/util/http-retry.js +103 -0
- package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
- package/dist/{http-util.js → util/http-util.js} +31 -11
- package/dist/util/json.d.ts +17 -0
- package/dist/util/json.js +25 -0
- package/dist/{log.d.ts → util/log.d.ts} +7 -3
- package/dist/{log.js → util/log.js} +36 -11
- package/dist/util/real-path.d.ts +3 -0
- package/dist/util/real-path.js +15 -0
- package/dist/util/request-scope.d.ts +28 -0
- package/dist/util/request-scope.js +48 -0
- package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
- package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +5 -30
- package/dist/{secret-detect.js → util/secret-detect.js} +17 -42
- package/dist/util/stored-json.d.ts +9 -0
- package/dist/util/stored-json.js +8 -0
- package/dist/util/time.d.ts +2 -0
- package/dist/util/time.js +3 -0
- package/dist/util/token-text.d.ts +15 -0
- package/dist/util/token-text.js +20 -0
- package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +2 -0
- package/dist/util/transcript-tail.js +49 -0
- package/dist/util/version.d.ts +11 -0
- package/dist/util/version.js +26 -0
- package/extensions/openclaw-plugin/index.ts +2 -6
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
- package/dist/ablation.d.ts +0 -102
- package/dist/ablation.js +0 -136
- package/dist/api.d.ts +0 -26
- package/dist/api.js +0 -29
- package/dist/audit-prune.d.ts +0 -62
- package/dist/audit-prune.js +0 -107
- package/dist/autolearn.d.ts +0 -56
- package/dist/client.d.ts +0 -48
- package/dist/compare.d.ts +0 -86
- package/dist/compare.js +0 -117
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/connectors/github/cli-impl.js +0 -227
- package/dist/connectors/github/idempotency.d.ts +0 -19
- package/dist/connectors/github/idempotency.js +0 -27
- package/dist/connectors/slack/idempotency.d.ts +0 -17
- package/dist/connectors/slack/idempotency.js +0 -31
- package/dist/correction-latency.d.ts +0 -36
- package/dist/customer-notes.d.ts +0 -96
- package/dist/customer-notes.js +0 -336
- package/dist/db.d.ts +0 -9
- package/dist/db.js +0 -8
- package/dist/decisions.d.ts +0 -94
- package/dist/decisions.js +0 -326
- package/dist/dedupe.d.ts +0 -75
- package/dist/dedupe.js +0 -169
- package/dist/dormant.d.ts +0 -93
- package/dist/dormant.js +0 -137
- package/dist/embedding-provider.d.ts +0 -77
- package/dist/embeddings.d.ts +0 -101
- package/dist/extract.js +0 -133
- package/dist/forward-claim-detector.d.ts +0 -36
- package/dist/forward-claim-detector.js +0 -112
- package/dist/goals.d.ts +0 -173
- package/dist/goals.js +0 -448
- package/dist/graph/read.d.ts +0 -73
- package/dist/graph/rows.d.ts +0 -45
- package/dist/graph/types.js +0 -11
- package/dist/graph-stream.d.ts +0 -70
- package/dist/graph-view.d.ts +0 -73
- package/dist/graph-view.js +0 -333
- package/dist/half-life-migration.d.ts +0 -63
- package/dist/half-life-migration.js +0 -182
- package/dist/handoff.js +0 -68
- package/dist/home-path.js +0 -24
- package/dist/http-retry.js +0 -51
- package/dist/incidents.d.ts +0 -103
- package/dist/incidents.js +0 -349
- package/dist/instruction-detect.js +0 -27
- package/dist/json.d.ts +0 -7
- package/dist/json.js +0 -11
- package/dist/ledger-db.d.ts +0 -10
- package/dist/ledger-db.js +0 -42
- package/dist/memory-value-weights.d.ts +0 -19
- package/dist/memory-value.d.ts +0 -113
- package/dist/memory-value.js +0 -250
- package/dist/memory.d.ts +0 -294
- package/dist/memory.js +0 -522
- package/dist/owner-validation.d.ts +0 -42
- package/dist/owner-validation.js +0 -56
- package/dist/path-context.d.ts +0 -24
- package/dist/physics-state.d.ts +0 -39
- package/dist/policies.d.ts +0 -151
- package/dist/policies.js +0 -434
- package/dist/processes.d.ts +0 -108
- package/dist/processes.js +0 -371
- package/dist/project-briefs.d.ts +0 -128
- package/dist/project-briefs.js +0 -523
- package/dist/provenance-coverage.d.ts +0 -18
- package/dist/rate-limit.d.ts +0 -34
- package/dist/raw-archive-mirror-cleanup.d.ts +0 -20
- package/dist/raw-archive.d.ts +0 -24
- package/dist/recall-history.d.ts +0 -131
- package/dist/recall-history.js +0 -227
- package/dist/recall-scope.d.ts +0 -138
- package/dist/refine-llm.d.ts +0 -61
- package/dist/refine-llm.js +0 -167
- package/dist/reject-flow.d.ts +0 -69
- package/dist/reject-flow.js +0 -260
- package/dist/rejection.d.ts +0 -100
- package/dist/replay.d.ts +0 -41
- package/dist/replay.js +0 -122
- package/dist/rrf.d.ts +0 -43
- package/dist/rrf.js +0 -61
- package/dist/scope.d.ts +0 -14
- package/dist/server-detect.d.ts +0 -72
- package/dist/server-detect.js +0 -222
- package/dist/session-owners.d.ts +0 -7
- package/dist/session-owners.js +0 -54
- package/dist/shared.d.ts +0 -186
- package/dist/shared.js +0 -540
- package/dist/skills.d.ts +0 -101
- package/dist/skills.js +0 -367
- package/dist/store/entry-writes-group.d.ts +0 -9
- package/dist/store/vector-writes.d.ts +0 -6
- package/dist/store/vector-writes.js +0 -59
- package/dist/store-port.d.ts +0 -262
- package/dist/store-port.js +0 -178
- package/dist/tenant.d.ts +0 -25
- package/dist/tenant.js +0 -43
- package/dist/trace.d.ts +0 -34
- package/dist/transcript-tail.js +0 -48
- package/dist/version.d.ts +0 -26
- package/dist/version.js +0 -41
- package/dist/working-memory.js +0 -154
- /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
- /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
- /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
- /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
- /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
- /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
- /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
- /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
- /package/dist/{api-errors.js → core/api-errors.js} +0 -0
- /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
- /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
- /package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +0 -0
- /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
- /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
- /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
- /package/dist/{quality-repair.d.ts → store/quality-repair.d.ts} +0 -0
- /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
- /package/dist/{escape.js → util/escape.js} +0 -0
- /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
- /package/dist/{keyset.js → util/keyset.js} +0 -0
- /package/dist/{same-text.js → util/same-text.js} +0 -0
- /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
- /package/dist/{db → util}/sqlite-blocked.js +0 -0
- /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
- /package/dist/{tokenize.js → util/tokenize.js} +0 -0
- /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
- /package/dist/{write-budget.js → util/write-budget.js} +0 -0
|
@@ -1,28 +1,26 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
1
|
+
import { DEFAULT_TENANT_ID } from '../util/env.js';
|
|
2
|
+
import { RawAppendOnlyError } from '../core/raw-append-only.js';
|
|
3
|
+
import { AUTO_DELETABLE_SQL } from './rule-sql.js';
|
|
4
|
+
import { closeHippoDb, withWriteScope } from '../db/index.js';
|
|
5
|
+
import { checkRejectionGuard, RejectedValueError } from './rejection.js';
|
|
6
|
+
import { markSummaryDirtyInTx } from './summary-dirty.js';
|
|
7
|
+
import { insertDormantRow } from './dormant.js';
|
|
8
|
+
import { log } from '../util/log.js';
|
|
7
9
|
import { MEMORY_SELECT_COLUMNS, rowToEntry } from './rows.js';
|
|
8
10
|
import { audit } from './audit-event.js';
|
|
9
11
|
import { deleteFtsRow, replaceFtsRows, stampOriginProject, upsertMemoryRow } from './entry-row.js';
|
|
10
12
|
import { purgeMirrorBestEffort, mirrorBestEffort, writeMarkdownMirror } from './mirrors.js';
|
|
11
|
-
import { openStore } from './open.js';
|
|
12
|
-
import { clock } from '../write-budget.js';
|
|
13
|
+
import { onHandle, openStore } from './open.js';
|
|
14
|
+
import { clock } from '../util/write-budget.js';
|
|
13
15
|
/** Tables whose rows keep a first-class object's backing memory in `memory_id` (ON DELETE SET NULL); tests/dormant-memories.test.ts pins it to the schema. */
|
|
14
16
|
export const MEMORY_BACKED_TABLES = ['predictions', 'decisions', 'incidents', 'processes', 'policies', 'skills', 'project_briefs', 'customer_notes'];
|
|
15
17
|
/** Deleting a memory that backs an object nulls the object's link, and no restore can repair it, so no automatic pass may. */
|
|
16
18
|
const AUTOMATIC_DELETE_SQL = `${AUTO_DELETABLE_SQL}${MEMORY_BACKED_TABLES.map((t) => ` AND NOT EXISTS (SELECT 1 FROM ${t} WHERE ${t}.memory_id = memories.id)`).join('')}`;
|
|
17
19
|
/** Ids of memories that back a first-class object, for passes that plan deletes before making them. A table missing from an older schema is skipped. */
|
|
18
20
|
export function memoriesBackingObjects(hippoRoot) {
|
|
19
|
-
|
|
20
|
-
try {
|
|
21
|
+
return onHandle(hippoRoot, (db) => {
|
|
21
22
|
return memoriesBackingObjectsOn(db);
|
|
22
|
-
}
|
|
23
|
-
finally {
|
|
24
|
-
closeHippoDb(db);
|
|
25
|
-
}
|
|
23
|
+
});
|
|
26
24
|
}
|
|
27
25
|
/** memoriesBackingObjects on the caller's handle. */
|
|
28
26
|
export function memoriesBackingObjectsOn(db) {
|
|
@@ -42,16 +40,22 @@ export function memoriesBackingObjectsOn(db) {
|
|
|
42
40
|
}
|
|
43
41
|
return ids;
|
|
44
42
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
43
|
+
// The abort text of trg_memories_raw_append_only (migration v14), the one place src matches it.
|
|
44
|
+
const RAW_TRIGGER_TEXT = 'raw is append-only';
|
|
45
|
+
function isRawTriggerAbort(cause) {
|
|
46
|
+
return cause instanceof Error && cause.message.includes(RAW_TRIGGER_TEXT);
|
|
47
|
+
}
|
|
48
|
+
/** Runs the DELETE and returns the rows it removed; the raw-row trigger's abort becomes RawAppendOnlyError. */
|
|
49
|
+
function deleteMemoryRow(db, sql, id) {
|
|
50
|
+
try {
|
|
51
|
+
return Number(db.prepare(sql).run(id).changes ?? 0);
|
|
52
|
+
}
|
|
53
|
+
catch (cause) {
|
|
54
|
+
throw isRawTriggerAbort(cause) ? new RawAppendOnlyError(cause) : cause;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/** db-scoped delete core, composable inside a caller's transaction; NO filesystem I/O, mirrors are written post-commit. `suppressForgetAudit` is set by
|
|
58
|
+
* rejectValue and resolveConflict (own audit row). Returns `{tenantId, dagParentId}`, or null if absent or `automatic` refused it. */
|
|
55
59
|
export function deleteEntryCore(db, id, opts) {
|
|
56
60
|
// SAFETY: row's shape matches the three columns named in the SELECT above.
|
|
57
61
|
const row = db
|
|
@@ -60,52 +64,29 @@ export function deleteEntryCore(db, id, opts) {
|
|
|
60
64
|
if (!row?.id)
|
|
61
65
|
return null;
|
|
62
66
|
const guard = opts?.automatic ? ` AND ${AUTOMATIC_DELETE_SQL}` : '';
|
|
63
|
-
if (
|
|
67
|
+
if (deleteMemoryRow(db, `DELETE FROM memories WHERE id = ?${guard}`, id) === 0)
|
|
64
68
|
return null;
|
|
65
69
|
deleteFtsRow(db, id);
|
|
66
70
|
if (!opts?.suppressForgetAudit) {
|
|
67
|
-
audit(db, 'forget', id, opts?.reason ? { reason: opts.reason } : undefined, opts?.actor ?? 'cli', row.tenant_id);
|
|
71
|
+
audit(db, 'forget', { targetId: id, metadata: opts?.reason ? { reason: opts.reason } : undefined, actor: opts?.actor ?? 'cli', tenantId: row.tenant_id });
|
|
68
72
|
}
|
|
69
73
|
// Forgetting a child of a summary marks the parent dirty. Not atomic with the DELETE, but
|
|
70
74
|
// markSummaryDirtyInTx is idempotent, so the next child mutation re-marks the parent if this fails.
|
|
71
75
|
if (row.dag_parent_id) {
|
|
72
|
-
markSummaryDirtyInTx(db, row.dag_parent_id, row.tenant_id ??
|
|
76
|
+
markSummaryDirtyInTx(db, row.dag_parent_id, row.tenant_id ?? DEFAULT_TENANT_ID, opts?.actor ?? 'cli');
|
|
73
77
|
}
|
|
74
|
-
return { tenantId: row.tenant_id ??
|
|
78
|
+
return { tenantId: row.tenant_id ?? DEFAULT_TENANT_ID, dagParentId: row.dag_parent_id ?? null };
|
|
75
79
|
}
|
|
76
|
-
/**
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
* `opts.actor` defaults to 'cli'. The api.* layer threads `ctx.actor` so HTTP
|
|
80
|
-
* callers land with `api_key:<key_id>` in the audit log without a duplicate
|
|
81
|
-
* emit from the api wrapper.
|
|
82
|
-
*
|
|
83
|
-
* Thin wrapper over `deleteEntryCore` (open → core → mirrors → close);
|
|
84
|
-
* behavior is byte-identical to the pre-split implementation for every
|
|
85
|
-
* existing caller.
|
|
86
|
-
*/
|
|
80
|
+
/** Delete an entry from SQLite and mirrors; thin wrapper over `deleteEntryCore` (open, core, mirrors, close).
|
|
81
|
+
* `opts.actor` defaults to 'cli'; the api layer threads `ctx.actor` so HTTP callers land as `api_key:<key_id>` in the audit log. */
|
|
87
82
|
export function deleteEntry(hippoRoot, id, opts) {
|
|
88
|
-
|
|
89
|
-
try {
|
|
83
|
+
return onHandle(hippoRoot, (db) => {
|
|
90
84
|
return deleteEntryOn(db, hippoRoot, id, opts);
|
|
91
|
-
}
|
|
92
|
-
finally {
|
|
93
|
-
closeHippoDb(db);
|
|
94
|
-
}
|
|
85
|
+
}, openStore);
|
|
95
86
|
}
|
|
96
87
|
/** deleteEntry on the caller's open store, so a loop of deletes opens the store once; each delete still commits alone. */
|
|
97
|
-
|
|
98
|
-
db
|
|
99
|
-
let result;
|
|
100
|
-
try {
|
|
101
|
-
result = deleteEntryCore(db, id, opts);
|
|
102
|
-
db.exec('COMMIT');
|
|
103
|
-
}
|
|
104
|
-
catch (err) {
|
|
105
|
-
if (db.isTransaction !== false)
|
|
106
|
-
db.exec('ROLLBACK');
|
|
107
|
-
throw err;
|
|
108
|
-
}
|
|
88
|
+
function deleteEntryOn(db, hippoRoot, id, opts) {
|
|
89
|
+
const result = withWriteScope(db, 'delete_entry', () => deleteEntryCore(db, id, opts));
|
|
109
90
|
if (!result)
|
|
110
91
|
return false;
|
|
111
92
|
purgeMirrorBestEffort(hippoRoot, id, false, 'deleteEntry');
|
|
@@ -122,30 +103,21 @@ function mergeOwnChanges(base, ours, live) {
|
|
|
122
103
|
}
|
|
123
104
|
return row;
|
|
124
105
|
}
|
|
125
|
-
/** Writes, deletes and dormant moves in one transaction. With `snapshot
|
|
126
|
-
*
|
|
127
|
-
*
|
|
128
|
-
* `dormant` (src/dormant.ts): each move's snapshot is inserted into `dormant_memories` and its `memories` row
|
|
129
|
-
* leaves exactly like a delete (FTS row, DAG parent dirty-mark, mirrors), in the same transaction, so a memory
|
|
130
|
-
* is never in both places or in neither. Deletes and moves both skip rows that are no longer auto-deletable
|
|
131
|
-
* (pinned, raw, kept for good or backing an object since the caller decided). Returns the ids that left `memories`, deleted or moved. */
|
|
106
|
+
/** Writes, deletes and dormant moves in one transaction. With `snapshot`, a write keeps only the fields the caller changed and never resurrects a gone row.
|
|
107
|
+
* Dormant moves (src/store/dormant.ts) leave `memories` like a delete; both skip rows no longer auto-deletable. Returns ids that left `memories`. */
|
|
132
108
|
export function batchWriteAndDelete(hippoRoot, toWrite, toDeleteIds, opts) {
|
|
133
109
|
const dormant = opts?.dormant ?? [];
|
|
134
110
|
if (toWrite.length === 0 && toDeleteIds.length === 0 && dormant.length === 0)
|
|
135
111
|
return [];
|
|
136
|
-
|
|
137
|
-
try {
|
|
112
|
+
return onHandle(hippoRoot, (db) => {
|
|
138
113
|
// One component, so every op keeps the statement order this call has always had.
|
|
139
114
|
const all = { writes: toWrite, deletes: toDeleteIds, dormant };
|
|
140
115
|
return batchWriteAndDeleteOn(db, hippoRoot, [all], 0, { snapshot: opts?.snapshot, holdMs: Infinity }).removedIds;
|
|
141
|
-
}
|
|
142
|
-
finally {
|
|
143
|
-
closeHippoDb(db);
|
|
144
|
-
}
|
|
116
|
+
}, openStore);
|
|
145
117
|
}
|
|
146
118
|
const failedUnits = new WeakMap();
|
|
147
119
|
/** Tags a flush error with the ids of the component it stopped at, for the partial sleep audit row; the first tag wins. */
|
|
148
|
-
|
|
120
|
+
function noteFailedUnit(err, component) {
|
|
149
121
|
if (!component || failedUnits.has(err))
|
|
150
122
|
return;
|
|
151
123
|
const ids = [...component.writes.map((e) => e.id), ...component.deletes, ...component.dormant.map((m) => m.entry.id)];
|
|
@@ -157,15 +129,20 @@ export function failedUnitOf(err) {
|
|
|
157
129
|
}
|
|
158
130
|
/** batchWriteAndDelete on the caller's open store from component `from`, each component whole, closing the transaction at the
|
|
159
131
|
* first component boundary after `holdMs`. Returns the next component's index and the ids that left `memories`. */
|
|
160
|
-
|
|
132
|
+
function batchWriteAndDeleteOn(db, hippoRoot, components, from, opts) {
|
|
161
133
|
const now = opts.clock ?? clock;
|
|
134
|
+
const out = {
|
|
135
|
+
written: [],
|
|
136
|
+
removedIds: [],
|
|
137
|
+
rejectedSkips: 0,
|
|
138
|
+
fts: { rows: [], staleIds: [] },
|
|
139
|
+
dirty: { parents: new Set(), tenantById: new Map() }
|
|
140
|
+
};
|
|
141
|
+
let next = from;
|
|
162
142
|
// IMMEDIATE: the tombstone probes below read before the first write, and under a deferred BEGIN a
|
|
163
143
|
// concurrent `hippo reject` would make the lock upgrade fail with SQLITE_BUSY and roll back the batch.
|
|
164
|
-
db
|
|
165
|
-
|
|
166
|
-
const out = { written: [], removedIds: [], rejectedSkips: 0, fts: { rows: [], staleIds: [] }, dirty: { parents: new Set(), tenantById: new Map() } };
|
|
167
|
-
let next = from;
|
|
168
|
-
try {
|
|
144
|
+
withWriteScope(db, 'flush_chunk', () => {
|
|
145
|
+
const begunAt = now();
|
|
169
146
|
do {
|
|
170
147
|
const at = next++;
|
|
171
148
|
try {
|
|
@@ -182,19 +159,9 @@ export function batchWriteAndDeleteOn(db, hippoRoot, components, from, opts) {
|
|
|
182
159
|
// Fire dirty-mark for every collected parent INSIDE the BEGIN, so the
|
|
183
160
|
// dirty flag commits atomically with the writes + deletes.
|
|
184
161
|
for (const parentId of out.dirty.parents) {
|
|
185
|
-
markSummaryDirtyInTx(db, parentId, out.dirty.tenantById.get(parentId) ??
|
|
186
|
-
}
|
|
187
|
-
db.exec('COMMIT');
|
|
188
|
-
}
|
|
189
|
-
catch (error) {
|
|
190
|
-
if (db.isTransaction !== false) {
|
|
191
|
-
try {
|
|
192
|
-
db.exec('ROLLBACK');
|
|
193
|
-
}
|
|
194
|
-
catch { /* preserve the original throw and its unit tag */ }
|
|
162
|
+
markSummaryDirtyInTx(db, parentId, out.dirty.tenantById.get(parentId) ?? DEFAULT_TENANT_ID, 'batch');
|
|
195
163
|
}
|
|
196
|
-
|
|
197
|
-
}
|
|
164
|
+
});
|
|
198
165
|
reportChunk(hippoRoot, out);
|
|
199
166
|
return { next, removedIds: out.removedIds };
|
|
200
167
|
}
|
|
@@ -252,7 +219,7 @@ function selectAutoDeletableRows(db, ids, dirty) {
|
|
|
252
219
|
for (const row of rows) {
|
|
253
220
|
if (row.dag_parent_id) {
|
|
254
221
|
dirty.parents.add(row.dag_parent_id);
|
|
255
|
-
dirty.tenantById.set(row.dag_parent_id, row.tenant_id ??
|
|
222
|
+
dirty.tenantById.set(row.dag_parent_id, row.tenant_id ?? DEFAULT_TENANT_ID);
|
|
256
223
|
}
|
|
257
224
|
}
|
|
258
225
|
return rows;
|
|
@@ -293,7 +260,7 @@ function applyBatchWrites(db, stampedWrites, snapshot, out) {
|
|
|
293
260
|
}
|
|
294
261
|
/** True, after auditing the refusal, when the write would introduce a rejected value. */
|
|
295
262
|
function isRejectedBatchWrite(db, row) {
|
|
296
|
-
const entryTenantId = row.tenantId ??
|
|
263
|
+
const entryTenantId = row.tenantId ?? DEFAULT_TENANT_ID;
|
|
297
264
|
// checkRejectionGuard, not a bare tombstone probe: a tombstone can coexist with a live same-content row,
|
|
298
265
|
// and skipping every re-persist would starve it of decay/replay updates; only new or changed content is refused.
|
|
299
266
|
try {
|
|
@@ -301,11 +268,52 @@ function isRejectedBatchWrite(db, row) {
|
|
|
301
268
|
}
|
|
302
269
|
catch (err) {
|
|
303
270
|
if (err instanceof RejectedValueError) {
|
|
304
|
-
audit(db, 'reject_refusal', row.id, { digest: err.digest, reason: err.reason }, 'sleep-batch', entryTenantId);
|
|
271
|
+
audit(db, 'reject_refusal', { targetId: row.id, metadata: { digest: err.digest, reason: err.reason }, actor: 'sleep-batch', tenantId: entryTenantId });
|
|
305
272
|
return true;
|
|
306
273
|
}
|
|
307
274
|
throw err;
|
|
308
275
|
}
|
|
309
276
|
return false;
|
|
310
277
|
}
|
|
278
|
+
/** Deletes each target in its own transaction on one store handle; `true` where the row went. */
|
|
279
|
+
export function deleteEntriesOneByOne(hippoRoot, targets, opts) {
|
|
280
|
+
if (targets.length === 0)
|
|
281
|
+
return [];
|
|
282
|
+
return onHandle(hippoRoot, (db) => {
|
|
283
|
+
return targets.map((target) => deleteEntryOn(db, hippoRoot, target.id, { ...opts, reason: target.reason }));
|
|
284
|
+
}, openStore);
|
|
285
|
+
}
|
|
286
|
+
/** Commits whole components in transactions of about `budget.holdMs`, letting other writers in between; returns the ids that left `memories`.
|
|
287
|
+
* The snapshot keeps what other writers changed after the caller loaded its rows. */
|
|
288
|
+
export async function commitInChunks(hippoRoot, components, opts) {
|
|
289
|
+
if (components.length === 0)
|
|
290
|
+
return [];
|
|
291
|
+
const { snapshot, budget } = opts;
|
|
292
|
+
const removed = [];
|
|
293
|
+
// The wait is an option rather than a PRAGMA, so a shared hook handle keeps its own.
|
|
294
|
+
const db = openStore(hippoRoot, { busyWaitMs: opts.busyWaitMs });
|
|
295
|
+
let next = 0;
|
|
296
|
+
try {
|
|
297
|
+
let committedAt = 0;
|
|
298
|
+
while (next < components.length) {
|
|
299
|
+
if (next > 0)
|
|
300
|
+
await budget.pause(committedAt);
|
|
301
|
+
const chunk = batchWriteAndDeleteOn(db, hippoRoot, components, next, { snapshot, holdMs: budget.holdMs, clock: budget.clock });
|
|
302
|
+
committedAt = budget.clock();
|
|
303
|
+
next = chunk.next;
|
|
304
|
+
for (const id of chunk.removedIds)
|
|
305
|
+
removed.push(id);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
catch (err) {
|
|
309
|
+
// A unit that threw is already tagged; a throw outside one (a pause, BEGIN or COMMIT) names the chunk's first unit.
|
|
310
|
+
if (err instanceof Error)
|
|
311
|
+
noteFailedUnit(err, components[next]);
|
|
312
|
+
throw err;
|
|
313
|
+
}
|
|
314
|
+
finally {
|
|
315
|
+
closeHippoDb(db);
|
|
316
|
+
}
|
|
317
|
+
return removed;
|
|
318
|
+
}
|
|
311
319
|
//# sourceMappingURL=delete-and-batch.js.map
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import type { MemoryEntry } from '
|
|
2
|
-
import { type PromptRecallGate } from '
|
|
1
|
+
import type { MemoryEntry } from '../core/memory.js';
|
|
2
|
+
import { type PromptRecallGate } from '../core/prompt-recall.js';
|
|
3
3
|
export type DeliveryRuntime = 'claude-code' | 'codex' | 'copilot' | 'unknown';
|
|
4
|
-
export type DeliveryEventType = 'prompt-submit' | 'pinned-manual';
|
|
4
|
+
export type DeliveryEventType = 'prompt-submit' | 'pinned-manual' | 'pre-compact' | 'compact-resume' | 'session-end' | 'context';
|
|
5
|
+
/** True for the boundary types: a compaction's two hooks and the end of a session. */
|
|
6
|
+
export declare const isBoundaryEvent: (type: DeliveryEventType) => boolean;
|
|
5
7
|
export type DeliverySurface = 'hook' | 'context';
|
|
6
8
|
export type DeliveryWriteStore = 'local' | 'global';
|
|
7
9
|
export type DeliverySessionState = 'payload' | 'env' | 'missing' | 'subagent';
|
|
@@ -10,8 +12,8 @@ export type DeliveryPool = 'pin' | 'recent' | 'prompt-recall' | 'strength' | 'se
|
|
|
10
12
|
export type DeliveryStage = 'load' | 'eligible' | 'gate' | 'budget' | 'limit' | 'final';
|
|
11
13
|
export type DeliveryOutcome = 'emitted' | 'reused' | 'rejected';
|
|
12
14
|
export type DeliveryRejectReason = 'budget' | 'gate-below-threshold' | 'gate-max-items' | 'duplicate' | 'scope' | 'quality' | 'limit';
|
|
13
|
-
/** Row format version
|
|
14
|
-
export declare const DELIVERY_LEDGER_VERSION =
|
|
15
|
+
/** Row format version in `delivery_events.ledger_version`: 3 = written by a binary that can write session-end and context rows, so `event_type` has six values. */
|
|
16
|
+
export declare const DELIVERY_LEDGER_VERSION = 3;
|
|
15
17
|
/** Rejected candidate rows kept per event; the rest only add to `rejected_unlisted`. */
|
|
16
18
|
export declare const DELIVERY_REJECTED_ROW_CAP = 16;
|
|
17
19
|
export interface DeliveryCandidateInput {
|
|
@@ -96,6 +98,10 @@ export interface DeliveryObserver {
|
|
|
96
98
|
};
|
|
97
99
|
}[]): void;
|
|
98
100
|
selected(items: readonly DeliverySelected[]): void;
|
|
101
|
+
/** A searching call's query, `*` for none; kept as its hash, the one the recall trace stores. */
|
|
102
|
+
queried(query: string): void;
|
|
103
|
+
/** The recall trace a call that returned rows wrote; null when the write failed or the store answers no id. */
|
|
104
|
+
traced(traceId: number | null): void;
|
|
99
105
|
}
|
|
100
106
|
/** What the renderer sent, reported once at its exit. */
|
|
101
107
|
export interface DeliveryOutcomeInput {
|
|
@@ -123,7 +129,12 @@ export interface DeliveryRecorderInit {
|
|
|
123
129
|
envSessionId?: string;
|
|
124
130
|
/** Set by the caller's runtime flag; Copilot payloads carry hook_event_name too, so inference would say claude-code. */
|
|
125
131
|
runtime?: DeliveryRuntime;
|
|
132
|
+
/** Set by hooks that are not prompt or context calls; without it the payload's hook event decides. */
|
|
133
|
+
eventType?: DeliveryEventType;
|
|
126
134
|
}
|
|
135
|
+
export type DeliveryFault = 'observe' | 'build' | 'flush';
|
|
136
|
+
/** Makes every recorder created afterwards throw at one stage. Only tests call it; the shipped CLI and server have no route here. */
|
|
137
|
+
export declare function _setDeliveryFaultForTests(fault: DeliveryFault | null): void;
|
|
127
138
|
/** A recorder for one call; every observer method is guarded, and a throw marks it broken instead of escaping. */
|
|
128
139
|
export declare function createDeliveryRecorder(init: DeliveryRecorderInit): DeliveryRecorder;
|
|
129
140
|
//# sourceMappingURL=delivery-recorder.d.ts.map
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import { evalNow } from '../core/ablation.js';
|
|
2
|
+
import { scoreOverlap } from '../core/prompt-recall.js';
|
|
3
|
+
import { hookPayloadSessionId, hookPayloadString, isSubagentPayload } from './token-ledger.js';
|
|
4
|
+
import { blockHash, estimateTokens } from '../util/token-text.js';
|
|
5
|
+
import { errorMessage, log } from '../util/log.js';
|
|
6
|
+
/** True for the boundary types: a compaction's two hooks and the end of a session. */
|
|
7
|
+
export const isBoundaryEvent = (type) => type === 'pre-compact' || type === 'compact-resume' || type === 'session-end';
|
|
8
|
+
/** Only the per-prompt calls keep prompt facts; a boundary or a `hippo context` run is not a prompt. */
|
|
9
|
+
const carriesPrompt = (type) => type === 'prompt-submit' || type === 'pinned-manual';
|
|
10
|
+
/** Row format version in `delivery_events.ledger_version`: 3 = written by a binary that can write session-end and context rows, so `event_type` has six values. */
|
|
11
|
+
export const DELIVERY_LEDGER_VERSION = 3;
|
|
9
12
|
/** Rejected candidate rows kept per event; the rest only add to `rejected_unlisted`. */
|
|
10
13
|
export const DELIVERY_REJECTED_ROW_CAP = 16;
|
|
11
14
|
// Deeper stages were closer to being sent, so the row cap keeps them first.
|
|
@@ -37,22 +40,30 @@ function readPayload(init) {
|
|
|
37
40
|
: payloadSession !== null ? 'payload' : envSession !== null ? 'env' : 'missing';
|
|
38
41
|
return { payloadSession, envSession, prompt, hostTurnId, hookEvent, sessionState };
|
|
39
42
|
}
|
|
40
|
-
function rejectId(state, id,
|
|
43
|
+
function rejectId(state, id, rejection) {
|
|
44
|
+
const { stage, reason, score, tokens } = rejection;
|
|
41
45
|
const held = state.candidates.get(id);
|
|
42
46
|
// First rejection wins; an id never offered is not a candidate of this call.
|
|
43
47
|
if (!held || held.reason !== null)
|
|
44
48
|
return;
|
|
45
49
|
state.candidates.set(id, { ...held, stage, reason, score, tokens });
|
|
46
50
|
}
|
|
51
|
+
function pickedPool(p, held) {
|
|
52
|
+
if (p.promptRecall)
|
|
53
|
+
return 'prompt-recall';
|
|
54
|
+
// A ranked call's rows keep the ranking that chose them, a pinned hit included.
|
|
55
|
+
if (held?.pool === 'search' || held?.pool === 'strength')
|
|
56
|
+
return held.pool;
|
|
57
|
+
return held?.pool === 'pin' || p.entry.pinned ? 'pin' : 'recent';
|
|
58
|
+
}
|
|
47
59
|
function pickedRows(state) {
|
|
48
60
|
const staticReused = state.outcome.staticReused === true;
|
|
49
61
|
const rows = [];
|
|
50
62
|
for (const p of state.picked.values()) {
|
|
51
|
-
const held = state.candidates.get(p.entry.id);
|
|
52
63
|
rows.push({
|
|
53
64
|
memoryId: p.entry.id,
|
|
54
65
|
sourceStore: p.sourceStore,
|
|
55
|
-
pool: p.
|
|
66
|
+
pool: pickedPool(p, state.candidates.get(p.entry.id)),
|
|
56
67
|
stage: 'final',
|
|
57
68
|
outcome: staticReused && !p.promptRecall ? 'reused' : 'emitted',
|
|
58
69
|
reason: null,
|
|
@@ -89,22 +100,25 @@ function buildEvent(init, payload, state, ts, startedMs) {
|
|
|
89
100
|
const rejected = rejectedRows(state);
|
|
90
101
|
const rows = [...picked, ...rejected.rows];
|
|
91
102
|
const emitted = outcome.emittedText ?? null;
|
|
103
|
+
const eventType = init.eventType ?? (payload.hookEvent === 'UserPromptSubmit' ? 'prompt-submit' : 'pinned-manual');
|
|
104
|
+
// Whatever the payload holds, so a hook-run `hippo context` is never matched to an earlier row by its prompt.
|
|
105
|
+
const prompt = carriesPrompt(eventType) ? payload.prompt : null;
|
|
92
106
|
return {
|
|
93
107
|
ts,
|
|
94
108
|
tenantId: init.tenantId,
|
|
95
109
|
runtime: init.runtime ?? (payload.hostTurnId !== null ? 'codex' : payload.hookEvent !== null ? 'claude-code' : 'unknown'),
|
|
96
|
-
eventType
|
|
97
|
-
surface: 'hook',
|
|
110
|
+
eventType,
|
|
111
|
+
surface: eventType === 'context' ? 'context' : 'hook',
|
|
98
112
|
storeHash: init.storeHash,
|
|
99
113
|
writeStore: init.writeStore,
|
|
100
114
|
projectHash: facts !== null && facts.projectName !== '' ? blockHash(facts.projectName) : null,
|
|
101
115
|
sessionId: payload.payloadSession ?? payload.envSession,
|
|
102
116
|
sessionState: payload.sessionState,
|
|
103
117
|
hostTurnId: payload.hostTurnId,
|
|
104
|
-
promptHash:
|
|
105
|
-
promptLength:
|
|
106
|
-
queryHash:
|
|
107
|
-
recallTraceId:
|
|
118
|
+
promptHash: prompt !== null ? blockHash(prompt) : null,
|
|
119
|
+
promptLength: prompt?.length ?? 0,
|
|
120
|
+
queryHash: state.queryHash,
|
|
121
|
+
recallTraceId: state.recallTraceId,
|
|
108
122
|
blockState: state.disabledSeen ? 'disabled' : outcome.state,
|
|
109
123
|
promptRecall: facts?.promptRecall === true,
|
|
110
124
|
consideredCount: new Set([...state.candidates.keys(), ...state.picked.keys()]).size,
|
|
@@ -135,7 +149,7 @@ function candidateMethods(state, guard) {
|
|
|
135
149
|
id: e.id, sourceStore: storeOf(isGlobal), pool: 'recent', stage: null, reason: null, score: null, tokens: null,
|
|
136
150
|
});
|
|
137
151
|
}
|
|
138
|
-
rejectId(state, e.id, 'load', 'quality', null, null);
|
|
152
|
+
rejectId(state, e.id, { stage: 'load', reason: 'quality', score: null, tokens: null });
|
|
139
153
|
}),
|
|
140
154
|
offer: (entries, isGlobal, pool) => guard(() => {
|
|
141
155
|
for (const e of entries) {
|
|
@@ -150,12 +164,12 @@ function candidateMethods(state, guard) {
|
|
|
150
164
|
});
|
|
151
165
|
}
|
|
152
166
|
}),
|
|
153
|
-
reject: (e, stage, reason, score, tokens) => guard(() => rejectId(state, e.id, stage, reason, score ?? null, tokens ?? null)),
|
|
167
|
+
reject: (e, stage, reason, score, tokens) => guard(() => rejectId(state, e.id, { stage, reason, score: score ?? null, tokens: tokens ?? null })),
|
|
154
168
|
dropMissing: (before, after, stage, reason) => guard(() => {
|
|
155
169
|
const kept = new Set(after.map((e) => e.id));
|
|
156
170
|
for (const e of before)
|
|
157
171
|
if (!kept.has(e.id))
|
|
158
|
-
rejectId(state, e.id, stage, reason, null, null);
|
|
172
|
+
rejectId(state, e.id, { stage, reason, score: null, tokens: null });
|
|
159
173
|
}),
|
|
160
174
|
gated: (prompt, items, gate, kept) => guard(() => {
|
|
161
175
|
const keptIds = new Set(kept.map((g) => g.item.id));
|
|
@@ -164,7 +178,7 @@ function candidateMethods(state, guard) {
|
|
|
164
178
|
continue;
|
|
165
179
|
const { score, shared } = scoreOverlap(prompt, c.tokens, gate.metric);
|
|
166
180
|
const cleared = score >= gate.threshold && shared >= gate.minShared;
|
|
167
|
-
rejectId(state, c.id, 'gate', cleared ? 'gate-max-items' : 'gate-below-threshold', score, null);
|
|
181
|
+
rejectId(state, c.id, { stage: 'gate', reason: cleared ? 'gate-max-items' : 'gate-below-threshold', score, tokens: null });
|
|
168
182
|
}
|
|
169
183
|
}),
|
|
170
184
|
selected: (items) => guard(() => {
|
|
@@ -178,29 +192,22 @@ function candidateMethods(state, guard) {
|
|
|
178
192
|
}),
|
|
179
193
|
};
|
|
180
194
|
}
|
|
195
|
+
let injectedFault = null;
|
|
196
|
+
/** Makes every recorder created afterwards throw at one stage. Only tests call it; the shipped CLI and server have no route here. */
|
|
197
|
+
export function _setDeliveryFaultForTests(fault) {
|
|
198
|
+
injectedFault = fault;
|
|
199
|
+
}
|
|
181
200
|
/** A recorder for one call; every observer method is guarded, and a throw marks it broken instead of escaping. */
|
|
182
201
|
export function createDeliveryRecorder(init) {
|
|
183
202
|
const startedMs = Date.now();
|
|
184
203
|
const ts = evalNow().toISOString();
|
|
185
|
-
|
|
186
|
-
const fault = envTestDeliveryFault();
|
|
204
|
+
const fault = injectedFault;
|
|
187
205
|
const payload = readPayload(init);
|
|
188
206
|
const state = {
|
|
189
207
|
candidates: new Map(), picked: new Map(), filtered: new Set(), facts: null, shown: 0, dropped: 0,
|
|
190
|
-
disabledSeen: false, outcome: { state: 'empty' }, broken: null, flushed: false,
|
|
191
|
-
};
|
|
192
|
-
const guard = (fn) => {
|
|
193
|
-
if (state.broken !== null)
|
|
194
|
-
return;
|
|
195
|
-
try {
|
|
196
|
-
if (fault === 'observe')
|
|
197
|
-
throw new Error('injected observe fault');
|
|
198
|
-
fn();
|
|
199
|
-
}
|
|
200
|
-
catch (error) {
|
|
201
|
-
state.broken = error instanceof Error ? error.message : String(error);
|
|
202
|
-
}
|
|
208
|
+
disabledSeen: false, outcome: { state: 'empty' }, queryHash: null, recallTraceId: null, broken: null, flushed: false,
|
|
203
209
|
};
|
|
210
|
+
const guard = guardFor(state, fault);
|
|
204
211
|
const { qualityDropped, offer, reject, dropMissing, gated, selected } = candidateMethods(state, guard);
|
|
205
212
|
return {
|
|
206
213
|
root: init.root,
|
|
@@ -219,14 +226,15 @@ export function createDeliveryRecorder(init) {
|
|
|
219
226
|
dropMissing,
|
|
220
227
|
gated,
|
|
221
228
|
selected,
|
|
229
|
+
queried: (query) => guard(() => { state.queryHash = blockHash(query); }),
|
|
230
|
+
traced: (traceId) => guard(() => { state.recallTraceId = traceId; }),
|
|
222
231
|
delivered: (o) => guard(() => { state.outcome = { ...o }; }),
|
|
223
232
|
flush: (write) => {
|
|
224
233
|
if (state.flushed)
|
|
225
234
|
return;
|
|
226
235
|
state.flushed = true;
|
|
227
236
|
if (state.broken !== null) {
|
|
228
|
-
|
|
229
|
-
console.error(`[hippo] delivery ledger skipped: recorder failed: ${state.broken}`);
|
|
237
|
+
log.warn(`delivery ledger skipped: recorder failed: ${state.broken}`);
|
|
230
238
|
return;
|
|
231
239
|
}
|
|
232
240
|
if (fault === 'build')
|
|
@@ -238,4 +246,18 @@ export function createDeliveryRecorder(init) {
|
|
|
238
246
|
},
|
|
239
247
|
};
|
|
240
248
|
}
|
|
249
|
+
function guardFor(state, fault) {
|
|
250
|
+
return (fn) => {
|
|
251
|
+
if (state.broken !== null)
|
|
252
|
+
return;
|
|
253
|
+
try {
|
|
254
|
+
if (fault === 'observe')
|
|
255
|
+
throw new Error('injected observe fault');
|
|
256
|
+
fn();
|
|
257
|
+
}
|
|
258
|
+
catch (error) {
|
|
259
|
+
state.broken = errorMessage(error);
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
}
|
|
241
263
|
//# sourceMappingURL=delivery-recorder.js.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { DatabaseSyncLike } from '../db/index.js';
|
|
2
|
+
import type { MemoryEntry } from '../core/memory.js';
|
|
3
|
+
import type { DescendantPage, SummaryDescendants } from './port.js';
|
|
4
|
+
export interface PagedWalk {
|
|
5
|
+
readonly tenantId: string;
|
|
6
|
+
readonly summary: MemoryEntry;
|
|
7
|
+
readonly depth: number;
|
|
8
|
+
readonly page: DescendantPage;
|
|
9
|
+
}
|
|
10
|
+
/** The walk `summaryWithDescendants` documents, with `levels` cut to the first `page.rows` rows and each level's full count in `sizes`. */
|
|
11
|
+
export declare function pagedDescendants(db: DatabaseSyncLike, walk: PagedWalk, summaryAdmitted: boolean): SummaryDescendants;
|
|
12
|
+
//# sourceMappingURL=descendant-page.d.ts.map
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { chunked, selectEntriesByIds, TENANT_IS } from './entry-reads.js';
|
|
2
|
+
import { MEMORY_SELECT_COLUMNS, rowToEntry } from './rows.js';
|
|
3
|
+
const marks = (ids) => ids.map(() => '?').join(',');
|
|
4
|
+
/** The walk `summaryWithDescendants` documents, with `levels` cut to the first `page.rows` rows and each level's full count in `sizes`. */
|
|
5
|
+
export function pagedDescendants(db, walk, summaryAdmitted) {
|
|
6
|
+
const sizes = [];
|
|
7
|
+
const levels = [];
|
|
8
|
+
const seen = new Set([walk.summary.id]);
|
|
9
|
+
let room = Math.max(0, walk.page.rows);
|
|
10
|
+
let parents = summaryAdmitted ? [walk.summary.id] : [];
|
|
11
|
+
for (let level = 0; level < walk.depth && parents.length > 0; level++) {
|
|
12
|
+
const counted = level === walk.depth - 1 ? countedLevel(db, walk, parents, room) : null;
|
|
13
|
+
const read = counted ?? keyedLevel(db, walk, parents, { seen, room });
|
|
14
|
+
if (read.size === 0)
|
|
15
|
+
break;
|
|
16
|
+
sizes.push(read.size);
|
|
17
|
+
levels.push(read.rows);
|
|
18
|
+
room -= read.rows.length;
|
|
19
|
+
parents = read.ids;
|
|
20
|
+
}
|
|
21
|
+
return { summary: walk.summary, levels, sizes };
|
|
22
|
+
}
|
|
23
|
+
// Reads four short columns of every child, since the level below needs each admitted id as a parent.
|
|
24
|
+
function keyedLevel(db, walk, parents, at) {
|
|
25
|
+
const byParent = new Map();
|
|
26
|
+
for (const chunk of chunked([...parents])) {
|
|
27
|
+
// SAFETY: the SELECT names exactly ChildKey's four columns, and the WHERE keeps dag_parent_id a string.
|
|
28
|
+
const keys = db.prepare(`SELECT id, dag_parent_id, scope, origin_project FROM memories WHERE dag_parent_id IN (${marks(chunk)}) AND ${TENANT_IS} ORDER BY created ASC, id ASC`).all(...chunk, walk.tenantId);
|
|
29
|
+
for (const key of keys) {
|
|
30
|
+
const bucket = byParent.get(key.dag_parent_id);
|
|
31
|
+
if (bucket)
|
|
32
|
+
bucket.push(key);
|
|
33
|
+
else
|
|
34
|
+
byParent.set(key.dag_parent_id, [key]);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const ids = [];
|
|
38
|
+
for (const parentId of parents) {
|
|
39
|
+
for (const key of byParent.get(parentId) ?? []) {
|
|
40
|
+
if (at.seen.has(key.id) || !walk.page.admit(key))
|
|
41
|
+
continue;
|
|
42
|
+
at.seen.add(key.id);
|
|
43
|
+
ids.push(key.id);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const shown = ids.slice(0, Math.max(0, at.room));
|
|
47
|
+
const whole = selectEntriesByIds(db, shown, walk.tenantId);
|
|
48
|
+
return { ids, size: ids.length, rows: shown.flatMap((id) => whole.get(id) ?? []) };
|
|
49
|
+
}
|
|
50
|
+
/** The last level counted in SQL and read up to `room` rows; null when a row there is refused, which only the keyed read can leave out.
|
|
51
|
+
* A row has one parent and a parent is read at one level, so the summary is the only row an earlier level can already hold. */
|
|
52
|
+
function countedLevel(db, walk, parents, room) {
|
|
53
|
+
const perParent = new Map();
|
|
54
|
+
for (const chunk of chunked([...parents])) {
|
|
55
|
+
// SAFETY: the SELECT names exactly ChildGroup's four fields, and the WHERE keeps dag_parent_id a string.
|
|
56
|
+
const groups = db.prepare(`SELECT dag_parent_id, scope, origin_project, COUNT(*) AS n FROM memories WHERE dag_parent_id IN (${marks(chunk)}) AND ${TENANT_IS} AND id <> ? GROUP BY dag_parent_id, scope, origin_project`).all(...chunk, walk.tenantId, walk.summary.id);
|
|
57
|
+
for (const group of groups) {
|
|
58
|
+
if (!walk.page.admit(group))
|
|
59
|
+
return null;
|
|
60
|
+
perParent.set(group.dag_parent_id, (perParent.get(group.dag_parent_id) ?? 0) + Number(group.n));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
let size = 0;
|
|
64
|
+
for (const n of perParent.values())
|
|
65
|
+
size += n;
|
|
66
|
+
return { ids: [], size, rows: firstRows(db, walk, parents.filter((id) => perParent.has(id)), { perParent, room }) };
|
|
67
|
+
}
|
|
68
|
+
// Every parent before the one the page ends in is read whole in one statement; that last one is read under a LIMIT.
|
|
69
|
+
function firstRows(db, walk, parents, at) {
|
|
70
|
+
const whole = [];
|
|
71
|
+
let left = at.room;
|
|
72
|
+
for (const parentId of parents) {
|
|
73
|
+
if (left <= 0)
|
|
74
|
+
break;
|
|
75
|
+
const n = at.perParent.get(parentId) ?? 0;
|
|
76
|
+
if (n >= left)
|
|
77
|
+
return [...childrenInOrder(db, walk, whole, -1), ...childrenInOrder(db, walk, [parentId], left)];
|
|
78
|
+
whole.push(parentId);
|
|
79
|
+
left -= n;
|
|
80
|
+
}
|
|
81
|
+
return childrenInOrder(db, walk, whole, -1);
|
|
82
|
+
}
|
|
83
|
+
/** Children parent by parent, each parent's by created then id; a negative `limit` reads them all. */
|
|
84
|
+
function childrenInOrder(db, walk, parents, limit) {
|
|
85
|
+
const byParent = new Map();
|
|
86
|
+
for (const chunk of chunked([...parents])) {
|
|
87
|
+
// SAFETY: selects exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
|
|
88
|
+
const rows = db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE dag_parent_id IN (${marks(chunk)}) AND ${TENANT_IS} AND id <> ? ORDER BY created ASC, id ASC LIMIT ?`).all(...chunk, walk.tenantId, walk.summary.id, limit);
|
|
89
|
+
for (const row of rows) {
|
|
90
|
+
const bucket = byParent.get(row.dag_parent_id ?? '');
|
|
91
|
+
if (bucket)
|
|
92
|
+
bucket.push(rowToEntry(row));
|
|
93
|
+
else
|
|
94
|
+
byParent.set(row.dag_parent_id ?? '', [rowToEntry(row)]);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return parents.flatMap((id) => byParent.get(id) ?? []);
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=descendant-page.js.map
|