hippo-memory 2.0.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/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 -6
- package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
- package/dist/api/{audit.js → auth/audit.js} +11 -11
- package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -15
- package/dist/api/{auth.js → auth/auth.js} +46 -29
- package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
- package/dist/api/{quarantine.js → auth/quarantine.js} +8 -8
- 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 +10 -2
- package/dist/api/context-render.js +14 -7
- package/dist/api/context-select.d.ts +4 -1
- package/dist/api/context-select.js +23 -14
- package/dist/api/context-types.d.ts +38 -12
- package/dist/api/context.d.ts +8 -5
- package/dist/api/context.js +112 -57
- 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} +22 -15
- package/dist/api/memories/memories.d.ts +27 -0
- package/dist/api/{memories.js → memories/memories.js} +16 -21
- package/dist/api/memories/outcome.d.ts +22 -0
- package/dist/api/{outcome.js → memories/outcome.js} +14 -8
- package/dist/api/memories/promote.d.ts +40 -0
- package/dist/api/{promote.js → memories/promote.js} +35 -22
- 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} +16 -11
- package/dist/api/{remember-local.js → memories/remember-local.js} +34 -20
- package/dist/api/{remember.d.ts → memories/remember.d.ts} +19 -13
- package/dist/api/{remember.js → memories/remember.js} +42 -26
- 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 -8
- 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 -4
- package/dist/api/objects/predictions.d.ts +11 -0
- package/dist/api/{predictions.js → objects/predictions.js} +7 -6
- 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 +32 -19
- package/dist/api/prompt-hook.js +65 -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} +176 -92
- package/dist/api/recall/recall.d.ts +6 -0
- package/dist/api/{recall.js → recall/recall.js} +101 -60
- 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 -70
- package/dist/api/{recall-types.js → recall/types.js} +1 -1
- package/dist/api/session-end.d.ts +16 -12
- package/dist/api/session-end.js +46 -30
- 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} +51 -43
- 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 +28 -7
- 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 +33 -14
- 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 +15 -4
- package/dist/capture/compaction-spool.js +64 -17
- 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 +45 -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 +23 -23
- package/dist/cli/auth.js +19 -27
- 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 -4
- package/dist/cli/client.js +43 -13
- package/dist/cli/compact-resume-payload.d.ts +4 -1
- package/dist/cli/compact-resume-payload.js +12 -5
- package/dist/cli/context.js +42 -17
- package/dist/cli/continuity.d.ts +5 -5
- package/dist/cli/continuity.js +90 -107
- package/dist/cli/curate.d.ts +4 -3
- package/dist/cli/curate.js +46 -68
- package/dist/cli/dag.d.ts +1 -1
- package/dist/cli/dag.js +14 -17
- package/dist/cli/decisions.js +27 -26
- 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 +31 -9
- package/dist/cli/hook-runtime.js +40 -15
- package/dist/cli/incidents.d.ts +1 -1
- package/dist/cli/incidents.js +25 -25
- package/dist/cli/init.js +26 -11
- 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 +4 -4
- package/dist/cli/object-verbs.js +10 -13
- 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 +15 -19
- package/dist/cli/print.js +4 -2
- package/dist/cli/projects.js +21 -11
- package/dist/cli/quality-repair-once.js +5 -4
- package/dist/cli/recall.js +129 -93
- package/dist/cli/refine-llm.d.ts +15 -4
- package/dist/cli/refine-llm.js +16 -7
- package/dist/cli/remember.js +46 -50
- package/dist/cli/scheduler.d.ts +4 -1
- package/dist/cli/scheduler.js +9 -5
- package/dist/cli/serve.js +22 -17
- package/dist/cli/session-hooks.d.ts +2 -2
- package/dist/cli/session-hooks.js +87 -50
- package/dist/cli/setup.js +54 -32
- package/dist/cli/shared.d.ts +3 -1
- package/dist/cli/shared.js +24 -9
- 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 +14 -6
- 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 +1 -1
- package/dist/cli/transfer.js +71 -75
- package/dist/cli/verbs/memory.js +8 -6
- package/dist/cli/verbs/objects.js +10 -4
- package/dist/cli/versioned-verbs.d.ts +8 -7
- package/dist/cli/versioned-verbs.js +31 -21
- package/dist/cli.js +13 -16
- package/dist/connectors/dlq.d.ts +6 -6
- package/dist/connectors/dlq.js +12 -8
- 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 -5
- 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 -6
- 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 -6
- 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 +34 -23
- package/dist/connectors/ingest.d.ts +5 -3
- package/dist/connectors/ingest.js +3 -4
- 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 -6
- 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 -5
- 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 -6
- 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 +23 -9
- package/dist/consolidate/dag-summary.js +2 -1
- package/dist/consolidate/dag.d.ts +10 -5
- package/dist/consolidate/dag.js +37 -36
- package/dist/consolidate/decay.js +19 -6
- package/dist/consolidate/dedupe.d.ts +14 -5
- package/dist/consolidate/dedupe.js +27 -16
- 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 +36 -13
- package/dist/consolidate/merge.d.ts +4 -1
- package/dist/consolidate/merge.js +42 -32
- 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 +41 -38
- package/dist/consolidate/trace.d.ts +7 -2
- package/dist/consolidate/trace.js +7 -2
- package/dist/consolidate/traces.js +26 -29
- 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 +24 -14
- 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 +21 -16
- 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 +84 -27
- package/dist/core/memory.js +73 -29
- 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 +37 -11
- package/dist/core/physics.js +55 -20
- package/dist/core/project-identity.d.ts +34 -17
- package/dist/core/project-identity.js +33 -17
- 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.js +13 -2
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
- package/dist/dashboard/dashboard-snapshot.js +4 -4
- package/dist/dashboard/dashboard.js +6 -3
- 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 -3
- package/dist/db/connect.js +8 -3
- 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 +26 -13
- 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/v12.js +2 -1
- package/dist/db/migrations/v14.js +2 -1
- 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 -4
- package/dist/db/physics-state.js +13 -20
- 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 +19 -5
- package/dist/db/request-stores.js +14 -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 +34 -14
- package/dist/db/wal-checkpointer.d.ts +2 -1
- package/dist/db/wal-checkpointer.js +19 -7
- package/dist/doctor.d.ts +4 -1
- package/dist/doctor.js +121 -39
- package/dist/embeddings/local.d.ts +8 -4
- package/dist/embeddings/local.js +9 -5
- package/dist/embeddings/provider.d.ts +19 -10
- package/dist/embeddings/provider.js +31 -17
- 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 +19 -6
- package/dist/entry/store-kit.js +6 -4
- 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 +16 -6
- 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 +69 -34
- 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 +8 -7
- 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 +2 -2
- package/dist/importers/vault.js +43 -27
- package/dist/index.d.ts +32 -6
- package/dist/index.js +25 -7
- package/dist/learn/autolearn.d.ts +17 -6
- package/dist/learn/autolearn.js +53 -24
- 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 +16 -9
- 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 -7
- package/dist/learn/invalidation.js +56 -27
- 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 +18 -14
- 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 +57 -74
- 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 +52 -21
- 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 +9 -6
- 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 +10 -5
- package/dist/search/embed-memories.js +62 -36
- package/dist/search/engine.d.ts +4 -1
- package/dist/search/engine.js +6 -2
- 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 +9 -3
- package/dist/server/auth.d.ts +18 -14
- package/dist/server/auth.js +69 -38
- package/dist/server/boot.d.ts +3 -1
- package/dist/server/boot.js +95 -56
- package/dist/server/client-ip.d.ts +11 -4
- package/dist/server/client-ip.js +27 -10
- 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 +547 -93
- 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 -19
- 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 +41 -19
- package/dist/server/tls.d.ts +4 -1
- package/dist/server/tls.js +13 -5
- package/dist/server/types.d.ts +38 -26
- package/dist/server/validation.d.ts +4 -1
- package/dist/server/validation.js +22 -9
- package/dist/server.d.ts +15 -10
- package/dist/server.js +32 -12
- package/dist/sharing/global-store.d.ts +5 -10
- package/dist/sharing/global-store.js +8 -43
- package/dist/sharing/global-sync.d.ts +3 -1
- package/dist/sharing/global-sync.js +16 -6
- 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 +19 -12
- package/dist/sharing/share.d.ts +8 -4
- package/dist/sharing/share.js +39 -15
- package/dist/store/ambient.js +9 -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 +75 -36
- 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 +93 -60
- 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 +95 -32
- package/dist/store/compactions.js +35 -15
- package/dist/store/conflicts.d.ts +9 -4
- package/dist/store/conflicts.js +100 -45
- package/dist/store/connectors/dlq.d.ts +17 -5
- package/dist/store/connectors/dlq.js +56 -5
- package/dist/store/connectors/event-log.d.ts +111 -2
- package/dist/store/connectors/event-log.js +2 -1
- package/dist/store/connectors/github.d.ts +6 -3
- package/dist/store/connectors/github.js +24 -40
- package/dist/store/connectors/slack.d.ts +2 -1
- package/dist/store/connectors/slack.js +25 -37
- package/dist/store/dashboard-reads.d.ts +7 -3
- package/dist/store/dashboard-reads.js +32 -11
- package/dist/store/delete-and-batch.d.ts +17 -11
- package/dist/store/delete-and-batch.js +67 -26
- package/dist/store/delivery-recorder.d.ts +8 -5
- package/dist/store/delivery-recorder.js +70 -32
- package/dist/store/descendant-page.d.ts +2 -1
- package/dist/store/descendant-page.js +24 -9
- 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 +40 -18
- package/dist/store/embeddings/index.d.ts +13 -9
- package/dist/store/embeddings/index.js +19 -12
- package/dist/store/entry-reads.d.ts +49 -20
- package/dist/store/entry-reads.js +181 -66
- package/dist/store/entry-row.d.ts +10 -6
- package/dist/store/entry-row.js +17 -12
- package/dist/store/entry-writes.d.ts +22 -10
- package/dist/store/entry-writes.js +41 -14
- 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 +8 -10
- 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 +24 -15
- package/dist/store/graph-rows.d.ts +41 -3
- package/dist/store/graph-rows.js +10 -7
- package/dist/store/graph-view-rows.js +14 -7
- package/dist/store/graph-writes.d.ts +16 -10
- package/dist/store/graph-writes.js +59 -36
- package/dist/store/handoffs.d.ts +4 -4
- package/dist/store/handoffs.js +40 -19
- 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 +3 -1
- package/dist/store/index.js +1 -0
- 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 +88 -16
- package/dist/store/narrow.d.ts +6 -0
- package/dist/store/narrow.js +11 -0
- package/dist/store/open.d.ts +4 -2
- package/dist/store/open.js +18 -9
- 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 +215 -229
- 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 +126 -63
- package/dist/store/rejected-values.d.ts +15 -10
- package/dist/store/rejected-values.js +33 -12
- 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 +18 -11
- package/dist/store/rule-sql.d.ts +6 -4
- package/dist/store/rule-sql.js +16 -9
- package/dist/store/search-rows.d.ts +14 -9
- package/dist/store/search-rows.js +48 -23
- 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 +9 -4
- 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 +6 -3
- 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 +7 -1
- package/dist/store/sqlite/held-connection.js +34 -7
- package/dist/store/sqlite/last-recall-group.d.ts +4 -2
- package/dist/store/sqlite/last-recall-group.js +9 -4
- 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.js +2 -1
- 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 +84 -33
- 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 -11
- package/dist/store/sqlite/store.js +84 -11
- 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 +19 -12
- package/dist/store/summaries.js +36 -21
- 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 +6 -3
- 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 +24 -10
- 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 +4 -1
- package/dist/util/anthropic-messages.js +14 -5
- package/dist/util/atomic-write.d.ts +4 -2
- package/dist/util/atomic-write.js +25 -14
- 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 +16 -4
- package/dist/util/env.js +78 -25
- 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 +11 -3
- package/dist/util/request-scope.js +13 -4
- 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 +3 -1
- package/dist/util/spawn-argv.js +13 -4
- 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/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 +2 -1
- package/scripts/postinstall.cjs +3 -1
- 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 -8
- package/dist/api/learn.js +0 -125
- package/dist/api/memories.d.ts +0 -25
- package/dist/api/objects.d.ts +0 -9
- package/dist/api/outcome.d.ts +0 -19
- package/dist/api/predictions.d.ts +0 -11
- package/dist/api/promote.d.ts +0 -36
- package/dist/api/recall-core.d.ts +0 -4
- package/dist/api/recall-core.js +0 -125
- 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 -11
- 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 -4
- package/dist/store/sqlite/local.js +0 -8
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { closeHippoDb } from '../db/index.js';
|
|
1
|
+
import { closeHippoDb, ftsRowCounts, isFtsAvailable } from '../db/index.js';
|
|
2
2
|
import { MEMORY_SELECT_COLUMNS, rowToEntry, parseJsonArray } from './rows.js';
|
|
3
3
|
import { onHandle, openStore } from './open.js';
|
|
4
4
|
import { escapeLike } from '../util/escape.js';
|
|
@@ -8,9 +8,11 @@ import { chunked } from '../util/chunked.js';
|
|
|
8
8
|
import { DEFAULT_TENANT_ID } from '../util/env.js';
|
|
9
9
|
import { placeholders } from '../util/sql.js';
|
|
10
10
|
const MAX_IDS_PER_READ = 500;
|
|
11
|
-
// The plus keeps SQLite on the primary key for an id list: with
|
|
11
|
+
// The plus keeps SQLite on the primary key for an id list: with
|
|
12
|
+
// a bare tenant_id it walks every row of the tenant instead.
|
|
12
13
|
export const TENANT_IS = '+tenant_id = ?';
|
|
13
|
-
/** Read a memory entry by ID. With `tenantId` the read is tenant-scoped (cross-tenant returns null); omitted, no
|
|
14
|
+
/** Read a memory entry by ID. With `tenantId` the read is tenant-scoped (cross-tenant returns null); omitted, no
|
|
15
|
+
* tenant filter is applied. */
|
|
14
16
|
export function readEntry(hippoRoot, id, tenantId) {
|
|
15
17
|
return onHandle(hippoRoot, (db) => {
|
|
16
18
|
// SAFETY: both branches select exactly MEMORY_SELECT_COLUMNS, matching
|
|
@@ -21,30 +23,8 @@ export function readEntry(hippoRoot, id, tenantId) {
|
|
|
21
23
|
return row ? rowToEntry(row) : null;
|
|
22
24
|
}, openStore);
|
|
23
25
|
}
|
|
24
|
-
/**
|
|
25
|
-
|
|
26
|
-
const held = new Map();
|
|
27
|
-
const lookUp = (asked) => {
|
|
28
|
-
onHandle(hippoRoot, (db) => {
|
|
29
|
-
for (const chunk of chunked([...new Set(asked)])) {
|
|
30
|
-
for (const id of chunk)
|
|
31
|
-
held.set(id, false);
|
|
32
|
-
// SAFETY: rows' shape matches the single `id` column selected.
|
|
33
|
-
const rows = db.prepare(`SELECT id FROM memories WHERE id IN (${placeholders(chunk.length)}) AND ${TENANT_IS}`).all(...chunk, tenantId);
|
|
34
|
-
for (const row of rows)
|
|
35
|
-
held.set(row.id, true);
|
|
36
|
-
}
|
|
37
|
-
}, openStore);
|
|
38
|
-
};
|
|
39
|
-
if (ids.length > 0)
|
|
40
|
-
lookUp(ids);
|
|
41
|
-
return (id) => {
|
|
42
|
-
if (!held.has(id))
|
|
43
|
-
lookUp([id]);
|
|
44
|
-
return held.get(id) === true;
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
/** Rows by id on the caller's handle, one query per chunk; an id missing or in another tenant is absent from the map. */
|
|
26
|
+
/** Rows by id on the caller's handle, one query per chunk; an
|
|
27
|
+
* id missing or in another tenant is absent from the map. */
|
|
48
28
|
export function selectEntriesByIds(db, ids, tenantId) {
|
|
49
29
|
const byId = new Map();
|
|
50
30
|
const tenantClause = tenantId !== undefined ? ` AND ${TENANT_IS}` : '';
|
|
@@ -66,7 +46,10 @@ export function selectChildrenByParent(db, parentIds, tenantId) {
|
|
|
66
46
|
for (const chunk of chunked([...new Set(parentIds)])) {
|
|
67
47
|
const marks = placeholders(chunk.length);
|
|
68
48
|
// SAFETY: selects exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
|
|
69
|
-
const rows = db
|
|
49
|
+
const rows = db
|
|
50
|
+
.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories ` +
|
|
51
|
+
`WHERE dag_parent_id IN (${marks})${tenantClause} ORDER BY created ASC, id ASC`)
|
|
52
|
+
.all(...chunk, ...tenantArgs);
|
|
70
53
|
for (const row of rows) {
|
|
71
54
|
const entry = rowToEntry(row);
|
|
72
55
|
const parentId = entry.dag_parent_id ?? '';
|
|
@@ -79,7 +62,8 @@ export function selectChildrenByParent(db, parentIds, tenantId) {
|
|
|
79
62
|
}
|
|
80
63
|
return byParent;
|
|
81
64
|
}
|
|
82
|
-
/** Batched lookup, capped at 500 ids per call to keep IN(?,?,...) within SQLite limits; tenant filter enforced when
|
|
65
|
+
/** Batched lookup, capped at 500 ids per call to keep IN(?,?,...) within SQLite limits; tenant filter enforced when
|
|
66
|
+
* `tenantId` is passed. */
|
|
83
67
|
export function loadEntriesByIds(hippoRoot, ids, tenantId) {
|
|
84
68
|
if (ids.length === 0)
|
|
85
69
|
return [];
|
|
@@ -89,8 +73,14 @@ export function loadEntriesByIds(hippoRoot, ids, tenantId) {
|
|
|
89
73
|
// Without ORDER BY, rows follow SQLite's IN(...) scan order, undefined w.r.t. `ids`.
|
|
90
74
|
// SAFETY: both branches select exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
|
|
91
75
|
const rows = tenantId !== undefined
|
|
92
|
-
? db
|
|
93
|
-
|
|
76
|
+
? db
|
|
77
|
+
.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE id IN (${marks}) ` +
|
|
78
|
+
`AND ${TENANT_IS} ORDER BY created ASC, content ASC, id ASC`)
|
|
79
|
+
.all(...capped, tenantId)
|
|
80
|
+
: db
|
|
81
|
+
.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories ` +
|
|
82
|
+
`WHERE id IN (${marks}) ORDER BY created ASC, content ASC, id ASC`)
|
|
83
|
+
.all(...capped);
|
|
94
84
|
return rows.map(rowToEntry);
|
|
95
85
|
}, openStore);
|
|
96
86
|
}
|
|
@@ -98,13 +88,15 @@ function originClause(origins) {
|
|
|
98
88
|
return origins === undefined ? '' : ` AND (origin_project = '' OR ${originInSql(origins)})`;
|
|
99
89
|
}
|
|
100
90
|
/** All `kind='raw'` rows for a session, tenant-scoped, oldest-first, excluding superseded; `[]` for an empty sessionId.
|
|
101
|
-
* With `cap`, the NEWEST rows are loaded (DESC LIMIT, reversed client-side); ASC + LIMIT would drop the newest and
|
|
91
|
+
* With `cap`, the NEWEST rows are loaded (DESC LIMIT, reversed client-side); ASC + LIMIT would drop the newest and
|
|
92
|
+
* break fresh-tail in assemble. */
|
|
102
93
|
export function loadSessionRawMemories(hippoRoot, sessionId, tenantId, cap, origins) {
|
|
103
94
|
if (!sessionId)
|
|
104
95
|
return [];
|
|
105
96
|
return onHandle(hippoRoot, (db) => {
|
|
106
97
|
const params = [];
|
|
107
|
-
let sql = `SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE kind = 'raw'
|
|
98
|
+
let sql = `SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE kind = 'raw' ` +
|
|
99
|
+
`AND source_session_id = ? AND superseded_by IS NULL`;
|
|
108
100
|
params.push(sessionId);
|
|
109
101
|
if (tenantId !== undefined) {
|
|
110
102
|
sql += ' AND tenant_id = ?';
|
|
@@ -125,14 +117,17 @@ export function loadSessionRawMemories(hippoRoot, sessionId, tenantId, cap, orig
|
|
|
125
117
|
return rows.map(rowToEntry);
|
|
126
118
|
}, openStore);
|
|
127
119
|
}
|
|
128
|
-
/** Pre-cap, scope-aware row count for a session, so `assemble` reports the full size without leaking rows the caller
|
|
129
|
-
*
|
|
120
|
+
/** Pre-cap, scope-aware row count for a session, so `assemble` reports the full size without leaking rows the caller
|
|
121
|
+
* could not load. Mirrors
|
|
122
|
+
* `passesScopeFilterForRecall`'s default-deny: explicit scope matches exactly, none admits only `ownScope`.
|
|
123
|
+
* `tenantId` undefined counts cross-tenant. */
|
|
130
124
|
export function countSessionRawMemories(hippoRoot, sessionId, tenantId, scope, ownScope, origins) {
|
|
131
125
|
if (!sessionId)
|
|
132
126
|
return 0;
|
|
133
127
|
return onHandle(hippoRoot, (db) => {
|
|
134
128
|
const params = [];
|
|
135
|
-
let sql = `SELECT COUNT(*) AS c FROM memories WHERE kind = 'raw'
|
|
129
|
+
let sql = `SELECT COUNT(*) AS c FROM memories WHERE kind = 'raw' ` +
|
|
130
|
+
`AND source_session_id = ? AND superseded_by IS NULL`;
|
|
136
131
|
params.push(sessionId);
|
|
137
132
|
if (tenantId !== undefined) {
|
|
138
133
|
sql += ' AND tenant_id = ?';
|
|
@@ -154,8 +149,10 @@ export function countSessionRawMemories(hippoRoot, sessionId, tenantId, scope, o
|
|
|
154
149
|
return Number(row?.c ?? 0);
|
|
155
150
|
}, openStore);
|
|
156
151
|
}
|
|
157
|
-
/** Last N kind='raw' memories by `created` desc, tenant-scoped, max 200; pass
|
|
158
|
-
*
|
|
152
|
+
/** Last N kind='raw' memories by `created` desc, tenant-scoped, max 200; pass
|
|
153
|
+
* `sessionId` or concurrent sessions show up in each other's fresh tail. The
|
|
154
|
+
* tenant-wide shape is discouraged: `api.recall` throws `RecallContractError`
|
|
155
|
+
* for it when `HIPPO_REQUIRE_SESSION_SCOPED_FRESH_TAIL=1`. */
|
|
159
156
|
export function loadFreshRawMemories(hippoRoot, count, tenantId, sessionId, origins) {
|
|
160
157
|
if (count <= 0)
|
|
161
158
|
return [];
|
|
@@ -182,13 +179,15 @@ export function loadFreshRawMemories(hippoRoot, count, tenantId, sessionId, orig
|
|
|
182
179
|
return rows.map(rowToEntry);
|
|
183
180
|
}, openStore);
|
|
184
181
|
}
|
|
185
|
-
/** Load all entries from SQLite; omitting `tenantId` yields all rows (legacy). Recall paths that surface results to
|
|
182
|
+
/** Load all entries from SQLite; omitting `tenantId` yields all rows (legacy). Recall paths that surface results to
|
|
183
|
+
* a user MUST pass a resolved tenant. */
|
|
186
184
|
export function loadAllEntries(hippoRoot, tenantId) {
|
|
187
185
|
return onHandle(hippoRoot, (db) => {
|
|
188
186
|
return selectAllEntries(db, tenantId);
|
|
189
187
|
}, openStore);
|
|
190
188
|
}
|
|
191
|
-
/** Every tenant's memory ids in loadAllEntries' order, for a caller that reads the rows a page at a time instead of
|
|
189
|
+
/** Every tenant's memory ids in loadAllEntries' order, for a caller that reads the rows a page at a time instead of
|
|
190
|
+
* holding them all. */
|
|
192
191
|
export function loadAllEntryIds(hippoRoot) {
|
|
193
192
|
return onHandle(hippoRoot, (db) => {
|
|
194
193
|
// SAFETY: the SELECT names exactly the one column read.
|
|
@@ -204,15 +203,46 @@ export function countAllEntries(hippoRoot) {
|
|
|
204
203
|
}, openStore);
|
|
205
204
|
}
|
|
206
205
|
// The only code points whose JS toLowerCase yields ASCII, which SQLite's ASCII-only LIKE folding cannot see.
|
|
207
|
-
const FOLDS_TO_ASCII = ['
|
|
208
|
-
|
|
206
|
+
const FOLDS_TO_ASCII = ['İ', 'K'];
|
|
207
|
+
// Chars or bytes differ only when a non-ASCII char is present; the check never decodes the value.
|
|
208
|
+
const hasNonAscii = (column) => `length(${column}) != length(CAST(${column} AS BLOB))`;
|
|
209
|
+
/** The FTS5 phrase for `text`: its ASCII alphanumeric runs in order, which is how unicode61 splits it; null when it
|
|
210
|
+
* holds none (the phrase would be empty) or any non-ASCII char. */
|
|
211
|
+
function ftsPhrase(text) {
|
|
212
|
+
if (!/^[ -~]*$/.test(text))
|
|
213
|
+
return null;
|
|
214
|
+
const pieces = text.match(/[A-Za-z0-9]+/g);
|
|
215
|
+
return pieces === null ? null : `"${pieces.join(' ')}"`;
|
|
216
|
+
}
|
|
217
|
+
/** MATCH expression whose hits include every row the LIKE path would keep, or null when some token or the tag has no
|
|
218
|
+
* FTS form. Rows with non-ASCII text are added by the caller: JS tokenizers drop those chars, unicode61 keeps them. */
|
|
219
|
+
function ftsMentionQuery(tokens, tag) {
|
|
220
|
+
const parts = [];
|
|
221
|
+
for (const t of new Set(tokens)) {
|
|
222
|
+
const phrase = ftsPhrase(t);
|
|
223
|
+
if (phrase === null)
|
|
224
|
+
return null;
|
|
225
|
+
parts.push(phrase);
|
|
226
|
+
}
|
|
227
|
+
if (tag !== null) {
|
|
228
|
+
const phrase = ftsPhrase(tag);
|
|
229
|
+
if (phrase === null)
|
|
230
|
+
return null;
|
|
231
|
+
parts.push(`tags : ${phrase}`);
|
|
232
|
+
}
|
|
233
|
+
return parts.length === 0 ? null : parts.join(' OR ');
|
|
234
|
+
}
|
|
235
|
+
/** A superset, in loadAllEntries' order, of the rows whose lowercased content holds any of `tokens` or whose lowercased
|
|
236
|
+
* tags hold `tag`.
|
|
209
237
|
* The caller re-checks each row exactly; this only spares decoding rows that cannot match. */
|
|
210
238
|
export function loadEntriesMentioning(hippoRoot, tokens, tag, tenantId) {
|
|
211
239
|
const likes = [...new Set(tokens)].map((t) => `%${escapeLike(t)}%`);
|
|
212
240
|
const clauses = likes.map(() => `content LIKE ? ESCAPE '\\'`);
|
|
213
241
|
const params = [...likes];
|
|
214
|
-
// A tag needing JSON escapes or case folding past ASCII is not
|
|
215
|
-
|
|
242
|
+
// A tag needing JSON escapes or case folding past ASCII is not
|
|
243
|
+
// found by a substring of tags_json, so every tagged row stays in.
|
|
244
|
+
const plainTag = /^[ -~]*$/.test(tag) && !/["\\]/.test(tag);
|
|
245
|
+
if (plainTag) {
|
|
216
246
|
clauses.push(`tags_json LIKE ? ESCAPE '\\'`);
|
|
217
247
|
params.push(`%${escapeLike(tag)}%`);
|
|
218
248
|
}
|
|
@@ -223,23 +253,43 @@ export function loadEntriesMentioning(hippoRoot, tokens, tag, tenantId) {
|
|
|
223
253
|
params.push(ch, ch);
|
|
224
254
|
}
|
|
225
255
|
const tenantClause = tenantId !== undefined ? 'tenant_id = ? AND ' : '';
|
|
256
|
+
const tenantParams = tenantId !== undefined ? [tenantId] : [];
|
|
226
257
|
return onHandle(hippoRoot, (db) => {
|
|
258
|
+
const ftsQuery = plainTag && isFtsAvailable(db) && ftsInSync(db) ? ftsMentionQuery(tokens, tag) : null;
|
|
259
|
+
const where = ftsQuery === null
|
|
260
|
+
? clauses.join(' OR ')
|
|
261
|
+
: `id IN (SELECT id FROM memories_fts WHERE memories_fts MATCH ?) OR ${hasNonAscii('content')} OR ` +
|
|
262
|
+
hasNonAscii('tags_json');
|
|
227
263
|
// SAFETY: selects exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
|
|
228
|
-
const rows = db
|
|
264
|
+
const rows = db
|
|
265
|
+
.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories ` +
|
|
266
|
+
`WHERE ${tenantClause}(${where}) ORDER BY created ASC, id ASC`)
|
|
267
|
+
.all(...tenantParams, ...(ftsQuery === null ? params : [ftsQuery]));
|
|
229
268
|
return rows.map(rowToEntry);
|
|
230
269
|
}, openStore);
|
|
231
270
|
}
|
|
232
|
-
|
|
271
|
+
function ftsInSync(db) {
|
|
272
|
+
const counts = ftsRowCounts(db);
|
|
273
|
+
return counts !== null && counts.memories === counts.fts;
|
|
274
|
+
}
|
|
275
|
+
/** The rows in loadAllEntries' order (every tenant unless one is named), with only the columns that say whether
|
|
276
|
+
* another store already holds each. */
|
|
233
277
|
export function loadEntryTextKeys(hippoRoot, tenantId) {
|
|
234
278
|
return onHandle(hippoRoot, (db) => {
|
|
235
279
|
const where = tenantId !== undefined ? 'WHERE tenant_id = ? ' : '';
|
|
236
280
|
// SAFETY: rows' shape matches the four columns named in the SELECT.
|
|
237
281
|
const rows = db.prepare(`SELECT id, tenant_id, content, source FROM memories ${where}ORDER BY created ASC, id ASC`)
|
|
238
282
|
.all(...(tenantId !== undefined ? [tenantId] : []));
|
|
239
|
-
return rows.map((row) => ({
|
|
283
|
+
return rows.map((row) => ({
|
|
284
|
+
id: row.id,
|
|
285
|
+
tenant_id: row.tenant_id ?? DEFAULT_TENANT_ID,
|
|
286
|
+
content: row.content,
|
|
287
|
+
source: row.source,
|
|
288
|
+
}));
|
|
240
289
|
}, openStore);
|
|
241
290
|
}
|
|
242
|
-
/** Every entry plus a by-id lookup of each as loaded, rebuilt from its row on first use, so no deep copy of the
|
|
291
|
+
/** Every entry plus a by-id lookup of each as loaded, rebuilt from its row on first use, so no deep copy of the
|
|
292
|
+
* store is kept. */
|
|
243
293
|
export function loadAllEntriesWithBase(hippoRoot) {
|
|
244
294
|
const db = openStore(hippoRoot);
|
|
245
295
|
let rows;
|
|
@@ -284,7 +334,9 @@ export function loadEntriesPage(hippoRoot, tenantId, page) {
|
|
|
284
334
|
params.push(page.limit + 1);
|
|
285
335
|
return onHandle(hippoRoot, (db) => {
|
|
286
336
|
// SAFETY: selects exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
|
|
287
|
-
const rows = db
|
|
337
|
+
const rows = db
|
|
338
|
+
.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories ${clause}ORDER BY created ASC, id ASC LIMIT ?`)
|
|
339
|
+
.all(...params);
|
|
288
340
|
const entries = rows.slice(0, page.limit).map(rowToEntry);
|
|
289
341
|
const last = entries[entries.length - 1];
|
|
290
342
|
return { entries, next: rows.length > page.limit && last ? { created: last.created, id: last.id } : null };
|
|
@@ -294,29 +346,42 @@ export function loadEntriesPage(hippoRoot, tenantId, page) {
|
|
|
294
346
|
export function selectAllEntries(db, tenantId) {
|
|
295
347
|
return selectAllRows(db, tenantId).map(rowToEntry);
|
|
296
348
|
}
|
|
297
|
-
/** The columns a text match needs, for every row of a tenant in loadAllEntries' order: callers read whole rows only
|
|
349
|
+
/** The columns a text match needs, for every row of a tenant in loadAllEntries' order: callers read whole rows only
|
|
350
|
+
* for the ids that match. */
|
|
298
351
|
export function selectTenantTexts(db, tenantId) {
|
|
299
352
|
// SAFETY: rows' shape matches the four columns named in the SELECT.
|
|
300
|
-
return db
|
|
353
|
+
return db
|
|
354
|
+
.prepare('SELECT id, content, source, scope FROM memories WHERE tenant_id = ? ORDER BY created ASC, id ASC')
|
|
355
|
+
.all(tenantId);
|
|
301
356
|
}
|
|
302
|
-
/** Live rows whose source starts with `prefix`, on the caller's
|
|
357
|
+
/** Live rows whose source starts with `prefix`, on the caller's
|
|
358
|
+
* handle; LIKE folds case, so the prefix is checked again exactly. */
|
|
303
359
|
export function selectLiveEntriesBySourcePrefix(db, tenantId, prefix) {
|
|
304
360
|
// SAFETY: selects exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
|
|
305
|
-
const rows = db
|
|
361
|
+
const rows = db
|
|
362
|
+
.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE tenant_id = ? ` +
|
|
363
|
+
`AND superseded_by IS NULL AND source LIKE ? ESCAPE '\\'`)
|
|
364
|
+
.all(tenantId, `${escapeLike(prefix)}%`);
|
|
306
365
|
return rows.map(rowToEntry).filter((entry) => entry.source.startsWith(prefix));
|
|
307
366
|
}
|
|
308
|
-
// Content of every team-visible tenant row tagged `tag`, without reading the rest of the store; `origins` keeps one
|
|
309
|
-
//
|
|
367
|
+
// Content of every team-visible tenant row tagged `tag`, without reading the rest of the store; `origins` keeps one
|
|
368
|
+
// project's rows and user-global ones.
|
|
369
|
+
// No owner: a personal or connector-private row must never answer `duplicate` for, or stop, a team copy. `instr`
|
|
370
|
+
// prefilters; `includes` re-checks.
|
|
310
371
|
export function loadContentsWithTag(hippoRoot, tenantId, tag, origins) {
|
|
311
372
|
return onHandle(hippoRoot, (db) => {
|
|
312
373
|
const inProject = origins === undefined ? '' : ` AND (origin_project = '' OR ${originInSql(origins)})`;
|
|
313
374
|
const admit = scopeAdmitSql('');
|
|
314
375
|
/** SAFETY: rows' shape matches the two columns named in the SELECT below. */
|
|
315
|
-
const rows = db
|
|
376
|
+
const rows = db
|
|
377
|
+
.prepare(`SELECT content, tags_json FROM memories WHERE tenant_id = ? ` +
|
|
378
|
+
`AND instr(tags_json, ?) > 0${inProject} AND ${admit.sql}`)
|
|
379
|
+
.all(tenantId, JSON.stringify(tag), ...(origins ?? []), ...admit.params);
|
|
316
380
|
return rows.filter((r) => parseJsonArray(r.tags_json).includes(tag)).map((r) => r.content);
|
|
317
381
|
}, openStore);
|
|
318
382
|
}
|
|
319
|
-
/** Live raw rows whose artifact_ref matches a LIKE pattern,
|
|
383
|
+
/** Live raw rows whose artifact_ref matches a LIKE pattern,
|
|
384
|
+
* for one tenant; the store is set up first when it is new. */
|
|
320
385
|
export function loadVaultRawRows(hippoRoot, likeParam, tenantId) {
|
|
321
386
|
return onHandle(hippoRoot, (db) => {
|
|
322
387
|
// SAFETY: query selects exactly the columns of VaultRawRow, in the same
|
|
@@ -331,7 +396,8 @@ export function loadVaultRawRows(hippoRoot, likeParam, tenantId) {
|
|
|
331
396
|
export function selectPreviewRows(db, columns, tenantId) {
|
|
332
397
|
const tenant = columns.has('tenant_id') ? ' WHERE tenant_id = ?' : '';
|
|
333
398
|
const column = (name, fallback) => (columns.has(name) ? name : `${fallback} AS ${name}`);
|
|
334
|
-
const statement = db.prepare(`SELECT id, content, ${column('source', "''")},
|
|
399
|
+
const statement = db.prepare(`SELECT id, content, ${column('source', "''")}, ` +
|
|
400
|
+
`${column('confidence', 'NULL')}, ${column('extracted_from', 'NULL')}, ` +
|
|
335
401
|
`${column('dag_level', '0')}, ${column('tags_json', "'[]'")} FROM memories${tenant}`);
|
|
336
402
|
// SAFETY: the SELECT names every PreviewRow field, each a literal fallback when its column is missing.
|
|
337
403
|
return (tenant ? statement.all(tenantId) : statement.all());
|
|
@@ -343,12 +409,18 @@ export function entryIdTakenAt(db, id) {
|
|
|
343
409
|
/** The text, tenant and scope of memory `id`, or undefined when no row holds it. */
|
|
344
410
|
export function entryRejectRowAt(db, id) {
|
|
345
411
|
// SAFETY: row's shape matches the three columns named in the SELECT.
|
|
346
|
-
return db
|
|
347
|
-
.prepare(`SELECT content, tenant_id, scope FROM memories WHERE id = ?`)
|
|
348
|
-
.get(id);
|
|
412
|
+
return db.prepare(`SELECT content, tenant_id, scope FROM memories WHERE id = ?`).get(id);
|
|
349
413
|
}
|
|
350
414
|
/** Memory ids held by each typed-object table, with the status of the object that holds them. */
|
|
351
|
-
const OBJECT_TABLES = [
|
|
415
|
+
const OBJECT_TABLES = [
|
|
416
|
+
'decisions',
|
|
417
|
+
'incidents',
|
|
418
|
+
'processes',
|
|
419
|
+
'policies',
|
|
420
|
+
'skills',
|
|
421
|
+
'project_briefs',
|
|
422
|
+
'customer_notes',
|
|
423
|
+
];
|
|
352
424
|
export function objectMemoryRowsAt(db) {
|
|
353
425
|
const out = [];
|
|
354
426
|
for (const table of OBJECT_TABLES) {
|
|
@@ -357,7 +429,8 @@ export function objectMemoryRowsAt(db) {
|
|
|
357
429
|
}
|
|
358
430
|
return out;
|
|
359
431
|
}
|
|
360
|
-
/** Live rows of a tenant whose source does not start with `sourcePrefix`; `origins` (global store only) limits them
|
|
432
|
+
/** Live rows of a tenant whose source does not start with `sourcePrefix`; `origins` (global store only) limits them
|
|
433
|
+
* to user-global rows and those projects. */
|
|
361
434
|
export function selectRowsOutsideSourcePrefixAt(db, tenantId, sourcePrefix, origins) {
|
|
362
435
|
const visible = origins !== null ? ` AND (origin_project = '' OR ${originInSql(origins)})` : '';
|
|
363
436
|
const params = origins !== null ? [tenantId, sourcePrefix, ...origins] : [tenantId, sourcePrefix];
|
|
@@ -370,15 +443,18 @@ export function selectRowsOutsideSourcePrefixAt(db, tenantId, sourcePrefix, orig
|
|
|
370
443
|
export function loadLiveContentsBySourceAndTag(hippoRoot, tenantId, source, tag, exceptSessionId) {
|
|
371
444
|
return onHandle(hippoRoot, (db) => {
|
|
372
445
|
/** SAFETY: rows' shape matches the two columns named in the SELECT below. */
|
|
373
|
-
const rows = db
|
|
446
|
+
const rows = db
|
|
447
|
+
.prepare(`SELECT content, tags_json FROM memories
|
|
374
448
|
WHERE tenant_id = ? AND source = ? AND instr(tags_json, ?) > 0
|
|
375
449
|
AND COALESCE(extracted_from, '') = '' AND COALESCE(superseded_by, '') = ''
|
|
376
450
|
AND (source_session_id IS NULL OR source_session_id != ?)
|
|
377
|
-
ORDER BY created ASC, id ASC`)
|
|
451
|
+
ORDER BY created ASC, id ASC`)
|
|
452
|
+
.all(tenantId, source, JSON.stringify(tag), exceptSessionId);
|
|
378
453
|
return rows.filter((r) => parseJsonArray(r.tags_json).includes(tag)).map((r) => r.content);
|
|
379
454
|
}, openStore);
|
|
380
455
|
}
|
|
381
|
-
/** Every tenant's distilled rows nothing has superseded, in
|
|
456
|
+
/** Every tenant's distilled rows nothing has superseded, in
|
|
457
|
+
* loadAllEntries' order: the rows that can be each other's duplicate. */
|
|
382
458
|
export function loadCurrentDistilledEntries(hippoRoot) {
|
|
383
459
|
return onHandle(hippoRoot, (db) => {
|
|
384
460
|
// SAFETY: selects exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
|
|
@@ -388,4 +464,43 @@ export function loadCurrentDistilledEntries(hippoRoot) {
|
|
|
388
464
|
return rows.map(rowToEntry);
|
|
389
465
|
}, openStore);
|
|
390
466
|
}
|
|
467
|
+
/** Rows holding at least one signal, in loadAllEntries' order; omitting `tenantId` reads every tenant. A superset:
|
|
468
|
+
* callers re-check each row. */
|
|
469
|
+
export function loadEntriesWithSignals(hippoRoot, signals, tenantId) {
|
|
470
|
+
// A backslash may hide an escaped tag from instr, so such rows always pass; LIKE folds case, so the prefix match is
|
|
471
|
+
// wider than startsWith.
|
|
472
|
+
const anyOf = [
|
|
473
|
+
'pinned != 0', 'retrieval_count >= ?', `emotional_valence IN (${placeholders(signals.valences.length)})`,
|
|
474
|
+
"source LIKE ? ESCAPE '\\'", "instr(tags_json, '\\') > 0", ...signals.tags.map(() => 'instr(tags_json, ?) > 0'),
|
|
475
|
+
];
|
|
476
|
+
const params = [
|
|
477
|
+
signals.minRetrievals,
|
|
478
|
+
...signals.valences,
|
|
479
|
+
`${escapeLike(signals.sourcePrefix)}%`,
|
|
480
|
+
...signals.tags.map((t) => JSON.stringify(t)),
|
|
481
|
+
];
|
|
482
|
+
const tenant = tenantId !== undefined ? 'tenant_id = ? AND ' : '';
|
|
483
|
+
return onHandle(hippoRoot, (db) => {
|
|
484
|
+
// SAFETY: selects exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
|
|
485
|
+
const rows = db
|
|
486
|
+
.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories ` +
|
|
487
|
+
`WHERE ${tenant}(${anyOf.join(' OR ')}) ORDER BY created ASC, id ASC`)
|
|
488
|
+
.all(...(tenantId !== undefined ? [tenantId] : []), ...params);
|
|
489
|
+
return rows.map(rowToEntry);
|
|
490
|
+
}, openStore);
|
|
491
|
+
}
|
|
492
|
+
/** A tenant's rows from `origins` that nothing superseded and
|
|
493
|
+
* that are neither raw nor archived, in loadAllEntries' order. */
|
|
494
|
+
export function loadCurrentEntriesFromOrigins(hippoRoot, tenantId, origins) {
|
|
495
|
+
return onHandle(hippoRoot, (db) => {
|
|
496
|
+
// SAFETY: selects exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
|
|
497
|
+
const rows = db
|
|
498
|
+
.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories
|
|
499
|
+
WHERE tenant_id = ? AND ${originInSql(origins)} AND COALESCE(superseded_by, '') = ''
|
|
500
|
+
AND COALESCE(kind, 'distilled') NOT IN ('raw', 'archived')
|
|
501
|
+
ORDER BY created ASC, id ASC`)
|
|
502
|
+
.all(tenantId, ...origins);
|
|
503
|
+
return rows.map(rowToEntry);
|
|
504
|
+
}, openStore);
|
|
505
|
+
}
|
|
391
506
|
//# sourceMappingURL=entry-reads.js.map
|
|
@@ -7,17 +7,21 @@ export declare function upsertMemoryRow(db: ReturnType<typeof openHippoDb>, entr
|
|
|
7
7
|
export declare function syncFtsRow(db: ReturnType<typeof openHippoDb>, entry: MemoryEntry, isNewRow?: boolean): void;
|
|
8
8
|
export declare function ftsRowExists(db: ReturnType<typeof openHippoDb>, id: string): boolean;
|
|
9
9
|
export declare function deleteFtsRow(db: ReturnType<typeof openHippoDb>, id: string): void;
|
|
10
|
-
/** One set delete for `staleIds`, because `id` is UNINDEXED and each delete by id scans the whole index; then one
|
|
10
|
+
/** One set delete for `staleIds`, because `id` is UNINDEXED and each delete by id scans the whole index; then one
|
|
11
|
+
* insert per row. */
|
|
11
12
|
export declare function replaceFtsRows(db: ReturnType<typeof openHippoDb>, rows: readonly MemoryEntry[], staleIds: readonly string[]): void;
|
|
12
|
-
/** Row counts of a full-text index that has drifted from `memories`, re-synced after the count when `repair`; null when
|
|
13
|
+
/** Row counts of a full-text index that has drifted from `memories`, re-synced after the count when `repair`; null when
|
|
14
|
+
* the two agree or there is no index. */
|
|
13
15
|
export declare function ftsDrift(hippoRoot: string, repair: boolean): {
|
|
14
16
|
memories: number;
|
|
15
17
|
fts: number;
|
|
16
18
|
} | null;
|
|
17
|
-
/** Stamp origin_project from the store's own location (parent of `<project>/.hippo`; the home store is '' =
|
|
18
|
-
* NULL is PRESERVED: it means no known project and ambient context
|
|
19
|
+
/** Stamp origin_project from the store's own location (parent of `<project>/.hippo`; the home store is '' =
|
|
20
|
+
* user-global) when never stamped; returns a copy. NULL is PRESERVED: it means no known project and ambient context
|
|
21
|
+
* denies it, so a writeback must not launder it. */
|
|
19
22
|
export declare function stampOriginProject(hippoRoot: string, entry: MemoryEntry): MemoryEntry;
|
|
20
|
-
/** Import-time variant for a mirror with no origin field (an explicit null stays null), for rows predating the origin
|
|
21
|
-
* Like the v39 backfill, the provenance source (`shared:<project>:` / `promoted:<localRoot>`) wins over the
|
|
23
|
+
/** Import-time variant for a mirror with no origin field (an explicit null stays null), for rows predating the origin
|
|
24
|
+
* column. Like the v39 backfill, the provenance source (`shared:<project>:` / `promoted:<localRoot>`) wins over the
|
|
25
|
+
* destination store's location. */
|
|
22
26
|
export declare function stampOriginProjectForImport(hippoRoot: string, entry: MemoryEntry): MemoryEntry;
|
|
23
27
|
//# sourceMappingURL=entry-row.d.ts.map
|
package/dist/store/entry-row.js
CHANGED
|
@@ -2,7 +2,7 @@ import { DEFAULT_TENANT_ID } from '../util/env.js';
|
|
|
2
2
|
import { closeHippoDb, ftsRowCounts, openHippoDb, isFtsAvailable, repairFtsDrift } from '../db/index.js';
|
|
3
3
|
import { fallbackOrigin, originFromSource } from '../core/project-identity.js';
|
|
4
4
|
import { checkRejectionGuard } from './rejection.js';
|
|
5
|
-
import { errorMessage, log } from '../util/log.js';
|
|
5
|
+
import { errorMessage, log, errorFields } from '../util/log.js';
|
|
6
6
|
/** A 1.x JS caller's `tenantId` would otherwise fall through to the default tenant without a sound. */
|
|
7
7
|
function rejectLegacyTenantKey(entry) {
|
|
8
8
|
if (Object.hasOwn(entry, 'tenantId') && entry.tenant_id === undefined) {
|
|
@@ -37,7 +37,8 @@ const UPSERT_MEMORY_SQL = `
|
|
|
37
37
|
descendant_count, earliest_at, latest_at,
|
|
38
38
|
dag_level_3_built_at,
|
|
39
39
|
updated_at
|
|
40
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
|
|
40
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
|
|
41
|
+
?, ?, datetime('now'))
|
|
41
42
|
ON CONFLICT(id) DO UPDATE SET
|
|
42
43
|
created = excluded.created,
|
|
43
44
|
last_retrieved = excluded.last_retrieved,
|
|
@@ -129,7 +130,7 @@ export function syncFtsRow(db, entry, isNewRow = false) {
|
|
|
129
130
|
}
|
|
130
131
|
catch (err) {
|
|
131
132
|
// The memories table stays authoritative; a stale FTS row only costs recall quality, so the write goes on.
|
|
132
|
-
log.
|
|
133
|
+
log.warnThenSample('fts-sync', `FTS index update failed for ${entry.id}; keyword recall may miss it: ${errorMessage(err)}`, errorFields(err));
|
|
133
134
|
}
|
|
134
135
|
}
|
|
135
136
|
export function ftsRowExists(db, id) {
|
|
@@ -142,10 +143,11 @@ export function deleteFtsRow(db, id) {
|
|
|
142
143
|
db.prepare(`DELETE FROM memories_fts WHERE id = ?`).run(id);
|
|
143
144
|
}
|
|
144
145
|
catch (err) {
|
|
145
|
-
log.
|
|
146
|
+
log.warnThenSample('fts-delete', `FTS index delete failed for ${id}; recall may return a stale hit: ${errorMessage(err)}`, errorFields(err));
|
|
146
147
|
}
|
|
147
148
|
}
|
|
148
|
-
/** One set delete for `staleIds`, because `id` is UNINDEXED and each delete by id scans the whole index; then one
|
|
149
|
+
/** One set delete for `staleIds`, because `id` is UNINDEXED and each delete by id scans the whole index; then one
|
|
150
|
+
* insert per row. */
|
|
149
151
|
export function replaceFtsRows(db, rows, staleIds) {
|
|
150
152
|
if (!isFtsAvailable(db))
|
|
151
153
|
return;
|
|
@@ -157,7 +159,7 @@ export function replaceFtsRows(db, rows, staleIds) {
|
|
|
157
159
|
catch (err) {
|
|
158
160
|
// Their old rows are still indexed, so inserting them again would index an id twice; only new ids go in.
|
|
159
161
|
kept = new Set(staleIds);
|
|
160
|
-
log.
|
|
162
|
+
log.warnThenSample('fts-delete', `FTS index delete failed for ${staleIds.length} row(s); recall may return a stale hit: ${errorMessage(err)}`, errorFields(err));
|
|
161
163
|
}
|
|
162
164
|
}
|
|
163
165
|
const toInsert = rows.filter((row) => !kept.has(row.id));
|
|
@@ -169,11 +171,12 @@ export function replaceFtsRows(db, rows, staleIds) {
|
|
|
169
171
|
insert.run(row.id, row.content, row.tags.join(' '));
|
|
170
172
|
}
|
|
171
173
|
catch (err) {
|
|
172
|
-
log.
|
|
174
|
+
log.warnThenSample('fts-sync', `FTS index update failed for ${row.id}; keyword recall may miss it: ${errorMessage(err)}`, errorFields(err));
|
|
173
175
|
}
|
|
174
176
|
}
|
|
175
177
|
}
|
|
176
|
-
/** Row counts of a full-text index that has drifted from `memories`, re-synced after the count when `repair`; null when
|
|
178
|
+
/** Row counts of a full-text index that has drifted from `memories`, re-synced after the count when `repair`; null when
|
|
179
|
+
* the two agree or there is no index. */
|
|
177
180
|
export function ftsDrift(hippoRoot, repair) {
|
|
178
181
|
const db = openHippoDb(hippoRoot);
|
|
179
182
|
try {
|
|
@@ -190,15 +193,17 @@ export function ftsDrift(hippoRoot, repair) {
|
|
|
190
193
|
closeHippoDb(db);
|
|
191
194
|
}
|
|
192
195
|
}
|
|
193
|
-
/** Stamp origin_project from the store's own location (parent of `<project>/.hippo`; the home store is '' =
|
|
194
|
-
* NULL is PRESERVED: it means no known project and ambient context
|
|
196
|
+
/** Stamp origin_project from the store's own location (parent of `<project>/.hippo`; the home store is '' =
|
|
197
|
+
* user-global) when never stamped; returns a copy. NULL is PRESERVED: it means no known project and ambient context
|
|
198
|
+
* denies it, so a writeback must not launder it. */
|
|
195
199
|
export function stampOriginProject(hippoRoot, entry) {
|
|
196
200
|
if (entry.origin_project !== undefined)
|
|
197
201
|
return entry;
|
|
198
202
|
return { ...entry, origin_project: fallbackOrigin(hippoRoot) };
|
|
199
203
|
}
|
|
200
|
-
/** Import-time variant for a mirror with no origin field (an explicit null stays null), for rows predating the origin
|
|
201
|
-
* Like the v39 backfill, the provenance source (`shared:<project>:` / `promoted:<localRoot>`) wins over the
|
|
204
|
+
/** Import-time variant for a mirror with no origin field (an explicit null stays null), for rows predating the origin
|
|
205
|
+
* column. Like the v39 backfill, the provenance source (`shared:<project>:` / `promoted:<localRoot>`) wins over the
|
|
206
|
+
* destination store's location. */
|
|
202
207
|
export function stampOriginProjectForImport(hippoRoot, entry) {
|
|
203
208
|
if (entry.origin_project !== undefined)
|
|
204
209
|
return entry;
|
|
@@ -10,24 +10,34 @@ export interface WriteEntryInternalOptions extends WriteEntryOptions {
|
|
|
10
10
|
/** Runs in the same SAVEPOINT as the INSERT, so a throw rolls the row back. */
|
|
11
11
|
afterWrite?: (db: DatabaseSyncLike, memoryId: string) => void;
|
|
12
12
|
}
|
|
13
|
-
/** Write an entry to SQLite and refresh mirrors. `opts.actor` defaults to 'cli'; the api layer passes the resolved
|
|
14
|
-
* so the audit log gets one row per write. */
|
|
13
|
+
/** Write an entry to SQLite and refresh mirrors. `opts.actor` defaults to 'cli'; the api layer passes the resolved
|
|
14
|
+
* actor, so the audit log gets one row per write. */
|
|
15
15
|
export declare function writeEntry(hippoRoot: string, entry: MemoryEntry, opts?: WriteEntryOptions): void;
|
|
16
|
-
/**
|
|
17
|
-
export declare function
|
|
16
|
+
/** Writes a promoted copy; with `auditAs` the `promote` audit row joins the INSERT's SAVEPOINT, so both or neither. */
|
|
17
|
+
export declare function writePromotedEntry(hippoRoot: string, entry: MemoryEntry, opts: {
|
|
18
|
+
readonly actor?: string;
|
|
19
|
+
readonly sourceId: string;
|
|
20
|
+
readonly auditAs?: {
|
|
21
|
+
tenantId: string;
|
|
22
|
+
actor: string;
|
|
23
|
+
};
|
|
24
|
+
}): void;
|
|
18
25
|
/** writeEntry for each of `entries` in one transaction, so all land or none; each
|
|
19
26
|
* keeps its audit row, and mirrors follow the commit. Returns how many were written; an empty list opens no store. */
|
|
20
27
|
export declare function writeEntriesTogether(hippoRoot: string, entries: readonly MemoryEntry[]): number;
|
|
21
28
|
/** Runs `fill` in one transaction; each `put` writes one entry and returns false when the store rejects its value,
|
|
22
|
-
* leaving that row's refusal audit and the rest of the batch. Mirrors follow the commit. Returns how many were
|
|
29
|
+
* leaving that row's refusal audit and the rest of the batch. Mirrors follow the commit. Returns how many were
|
|
30
|
+
* written. */
|
|
23
31
|
export declare function writeEntriesSkippingRejected(hippoRoot: string, fill: (put: (entry: MemoryEntry) => boolean) => void, actor?: string): number;
|
|
24
32
|
/** Adds `tag` to each of a tenant's rows that lacks it, in `ids` order, each read fresh
|
|
25
33
|
* on one open store and committed alone; an id the tenant does not hold is skipped. */
|
|
26
34
|
export declare function addTagToEntries(hippoRoot: string, tenantId: string, ids: readonly string[], tag: string): void;
|
|
27
|
-
/** DB-only write path: upsert, afterWrite hook and audit row inside one withWriteScope; the caller owns `db` and must
|
|
28
|
-
* outer tx commits, so a rolled-back tx never leaves orphan markdown. The audit row
|
|
35
|
+
/** DB-only write path: upsert, afterWrite hook and audit row inside one withWriteScope; the caller owns `db` and must
|
|
36
|
+
* call `writeEntryMirrors` after any outer tx commits, so a rolled-back tx never leaves orphan markdown. The audit row
|
|
37
|
+
* commits atomically with the INSERT. */
|
|
29
38
|
export declare function writeEntryDbOnly(db: DatabaseSyncLike, entry: MemoryEntry, opts?: Pick<WriteEntryInternalOptions, 'actor' | 'afterWrite'>): void;
|
|
30
|
-
/** What follows a row's upsert inside its write scope: the remember row, last of the write's audit rows, then the
|
|
39
|
+
/** What follows a row's upsert inside its write scope: the remember row, last of the write's audit rows, then the
|
|
40
|
+
* summary parent's dirty mark. */
|
|
31
41
|
export declare function auditEntryWrite(db: DatabaseSyncLike, entry: MemoryEntry, actor: string): void;
|
|
32
42
|
/** Markdown mirror path, invoked AFTER commit (a rolled-back tx must leave no orphan markdown). */
|
|
33
43
|
export declare function writeEntryMirrors(hippoRoot: string, entry: MemoryEntry): void;
|
|
@@ -39,13 +49,15 @@ export interface StrengthenOptions {
|
|
|
39
49
|
/** Strengthen what a read returned: update only the four retrieval columns on the live row, never a stale copy.
|
|
40
50
|
* Best effort: a failure logs and never fails the read. Returns the ids found in this store. */
|
|
41
51
|
export declare function strengthenRetrieved(hippoRoot: string, ids: readonly string[], opts: StrengthenOptions): Set<string>;
|
|
42
|
-
/** strengthenRetrieved on an open handle in its own write scope, a savepoint inside a caller's transaction, so a
|
|
52
|
+
/** strengthenRetrieved on an open handle in its own write scope, a savepoint inside a caller's transaction, so a
|
|
53
|
+
* recall's last writes share one handle. */
|
|
43
54
|
export declare function strengthenRetrievedInOwnTx(db: DatabaseSyncLike, ids: readonly string[], opts: StrengthenOptions): Set<string>;
|
|
44
55
|
/** strengthenRetrieved on the caller's handle, inside the caller's transaction. Throws; the caller decides. */
|
|
45
56
|
export declare function strengthenRetrievedOn(db: DatabaseSyncLike, ids: readonly string[], opts: StrengthenOptions): Set<string>;
|
|
46
57
|
/** Rewrites a live row's tags and its full-text row on the caller's transaction, with no audit row. */
|
|
47
58
|
export declare function setEntryTagsInTx(db: DatabaseSyncLike, entry: MemoryEntry): void;
|
|
48
|
-
/** Removes a row from `memories` and full-text search on the caller's transaction, as sleep's dormant move does, and
|
|
59
|
+
/** Removes a row from `memories` and full-text search on the caller's transaction, as sleep's dormant move does, and
|
|
60
|
+
* marks its summary parent dirty. */
|
|
49
61
|
export declare function deleteEntryRowInTx(db: DatabaseSyncLike, entry: MemoryEntry, actor: string): void;
|
|
50
62
|
/** One half-life per memory id, on the caller's transaction. */
|
|
51
63
|
export declare function setHalfLivesAt(db: DatabaseSyncLike, rows: readonly {
|