hippo-memory 1.72.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -4
- package/dist/agent-memories/apply.d.ts +7 -5
- package/dist/agent-memories/apply.js +66 -39
- package/dist/agent-memories/claude-code.d.ts +8 -2
- package/dist/agent-memories/claude-code.js +26 -7
- package/dist/agent-memories/copilot.js +2 -1
- package/dist/agent-memories/files.js +2 -1
- package/dist/agent-memories/legacy.d.ts +6 -3
- package/dist/agent-memories/legacy.js +35 -14
- package/dist/agent-memories/markdown.d.ts +3 -1
- package/dist/agent-memories/markdown.js +3 -1
- package/dist/agent-memories/openclaw.js +5 -2
- package/dist/agent-memories/plan.js +11 -1
- package/dist/agent-memories/project-folds.js +2 -1
- package/dist/agent-memories/report.d.ts +4 -1
- package/dist/agent-memories/report.js +43 -9
- package/dist/agent-memories/source.d.ts +8 -2
- package/dist/agent-memories/source.js +11 -3
- package/dist/agent-memories/sync.d.ts +7 -2
- package/dist/agent-memories/sync.js +141 -101
- package/dist/api/assemble.d.ts +6 -4
- package/dist/api/assemble.js +11 -5
- package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
- package/dist/api/auth/audit.js +58 -0
- package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -16
- package/dist/api/{auth.js → auth/auth.js} +66 -54
- package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
- package/dist/api/{quarantine.js → auth/quarantine.js} +8 -7
- package/dist/api/auth/session-owners.d.ts +10 -0
- package/dist/api/auth/session-owners.js +35 -0
- package/dist/api/availability.d.ts +3 -1
- package/dist/api/availability.js +3 -1
- package/dist/api/busy.d.ts +2 -0
- package/dist/api/busy.js +2 -0
- package/dist/api/cli-surface.d.ts +6 -0
- package/dist/api/cli-surface.js +6 -0
- package/dist/api/config-of.d.ts +5 -0
- package/dist/api/config-of.js +6 -0
- package/dist/api/context-auto.d.ts +4 -1
- package/dist/api/context-auto.js +14 -4
- package/dist/api/context-render.js +14 -7
- package/dist/api/context-select.d.ts +4 -1
- package/dist/api/context-select.js +31 -34
- package/dist/api/context-types.d.ts +38 -12
- package/dist/api/context.d.ts +8 -5
- package/dist/api/context.js +120 -63
- package/dist/api/continuity.d.ts +24 -21
- package/dist/api/continuity.js +18 -20
- package/dist/api/correction-latency.d.ts +3 -1
- package/dist/api/correction-latency.js +3 -1
- package/dist/api/error-reply.d.ts +4 -1
- package/dist/api/error-reply.js +12 -3
- package/dist/api/index.d.ts +39 -23
- package/dist/api/index.js +21 -23
- package/dist/api/instruction-detect.d.ts +4 -1
- package/dist/api/instruction-detect.js +75 -20
- package/dist/api/ledger-db.d.ts +15 -11
- package/dist/api/ledger-db.js +21 -23
- package/dist/api/memories/conflicts.d.ts +33 -0
- package/dist/api/memories/conflicts.js +67 -0
- package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
- package/dist/api/{forget.js → memories/forget.js} +23 -17
- package/dist/api/memories/memories.d.ts +27 -0
- package/dist/api/memories/memories.js +52 -0
- package/dist/api/memories/outcome.d.ts +22 -0
- package/dist/api/memories/outcome.js +28 -0
- package/dist/api/memories/promote.d.ts +40 -0
- package/dist/api/memories/promote.js +76 -0
- package/dist/api/memories/refine.d.ts +10 -0
- package/dist/api/memories/refine.js +12 -0
- package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +17 -9
- package/dist/api/{remember-local.js → memories/remember-local.js} +46 -24
- package/dist/api/{remember.d.ts → memories/remember.d.ts} +22 -13
- package/dist/api/{remember.js → memories/remember.js} +50 -32
- package/dist/api/objects/cards.d.ts +39 -0
- package/dist/api/{cards.js → objects/cards.js} +12 -14
- package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
- package/dist/api/{drill-down.js → objects/drill-down.js} +7 -7
- package/dist/api/objects/goals.d.ts +18 -0
- package/dist/api/{goals.js → objects/goals.js} +12 -12
- package/dist/api/objects/graph.d.ts +11 -0
- package/dist/api/objects/graph.js +16 -0
- package/dist/api/objects/objects.d.ts +9 -0
- package/dist/api/{objects.js → objects/objects.js} +2 -3
- package/dist/api/objects/predictions.d.ts +11 -0
- package/dist/api/{predictions.js → objects/predictions.js} +7 -5
- package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
- package/dist/api/{projects.js → objects/projects.js} +8 -4
- package/dist/api/pilot-arm.d.ts +8 -4
- package/dist/api/pilot-arm.js +5 -4
- package/dist/api/prompt-hook.d.ts +35 -20
- package/dist/api/prompt-hook.js +66 -44
- package/dist/api/provenance-coverage.d.ts +3 -1
- package/dist/api/provenance-coverage.js +3 -1
- package/dist/api/recall/finish.d.ts +185 -0
- package/dist/api/recall/finish.js +301 -0
- package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
- package/dist/api/{recall-pipeline.js → recall/pipeline.js} +185 -101
- package/dist/api/recall/recall.d.ts +6 -0
- package/dist/api/{recall.js → recall/recall.js} +116 -72
- package/dist/api/recall/render.d.ts +39 -0
- package/dist/api/recall/render.js +60 -0
- package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
- package/dist/api/recall/request.js +261 -0
- package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
- package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
- package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -68
- package/dist/api/{recall-types.js → recall/types.js} +1 -1
- package/dist/api/session-end.d.ts +36 -8
- package/dist/api/session-end.js +71 -25
- package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
- package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
- package/dist/api/sleep/dormant.d.ts +25 -0
- package/dist/api/sleep/dormant.js +64 -0
- package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
- package/dist/api/sleep/learn.js +138 -0
- package/dist/api/sleep/sleep-run.d.ts +38 -0
- package/dist/api/{sleep-run.js → sleep/sleep-run.js} +54 -45
- package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
- package/dist/api/sleep/sleep.js +9 -0
- package/dist/api/status.d.ts +3 -1
- package/dist/api/status.js +3 -1
- package/dist/api/store-init.d.ts +4 -1
- package/dist/api/store-init.js +4 -1
- package/dist/api/tokens.d.ts +10 -9
- package/dist/api/tokens.js +9 -10
- package/dist/api/types.d.ts +27 -12
- package/dist/api/types.js +13 -4
- package/dist/capture/caller-session.d.ts +8 -2
- package/dist/capture/caller-session.js +16 -6
- package/dist/capture/capture-error.d.ts +3 -1
- package/dist/capture/capture-error.js +3 -1
- package/dist/capture/codex-patch.js +7 -2
- package/dist/capture/command.d.ts +4 -2
- package/dist/capture/command.js +34 -15
- package/dist/capture/compact-resume-caller.js +15 -8
- package/dist/capture/compact.d.ts +8 -5
- package/dist/capture/compact.js +34 -23
- package/dist/capture/compaction-items-caller.js +9 -3
- package/dist/capture/compaction-record.d.ts +4 -3
- package/dist/capture/compaction-record.js +20 -12
- package/dist/capture/compaction-spool.d.ts +18 -9
- package/dist/capture/compaction-spool.js +105 -63
- package/dist/capture/copilot-transcript.d.ts +11 -3
- package/dist/capture/copilot-transcript.js +16 -6
- package/dist/capture/extract.js +20 -8
- package/dist/capture/failure-caller.js +23 -12
- package/dist/capture/failure-reading.d.ts +10 -3
- package/dist/capture/failure-reading.js +24 -7
- package/dist/capture/pre-compact-caller.js +11 -4
- package/dist/capture/session-digest.d.ts +15 -4
- package/dist/capture/session-digest.js +39 -13
- package/dist/capture/session-end-caller.d.ts +4 -1
- package/dist/capture/session-end-caller.js +20 -8
- package/dist/capture/session-texts.d.ts +6 -2
- package/dist/capture/session-texts.js +22 -7
- package/dist/capture/session-worker.d.ts +4 -2
- package/dist/capture/session-worker.js +58 -17
- package/dist/capture/transcript.d.ts +13 -4
- package/dist/capture/transcript.js +32 -10
- package/dist/capture/working-state.d.ts +13 -4
- package/dist/capture/working-state.js +50 -56
- package/dist/cli/api-context.d.ts +14 -2
- package/dist/cli/api-context.js +45 -2
- package/dist/cli/audit.js +33 -33
- package/dist/cli/auth.js +23 -31
- package/dist/cli/briefs.d.ts +1 -1
- package/dist/cli/briefs.js +20 -15
- package/dist/cli/card.d.ts +1 -1
- package/dist/cli/card.js +56 -73
- package/dist/cli/client.d.ts +12 -5
- package/dist/cli/client.js +53 -23
- package/dist/cli/compact-resume-payload.d.ts +4 -1
- package/dist/cli/compact-resume-payload.js +12 -5
- package/dist/cli/context.js +43 -18
- package/dist/cli/continuity.d.ts +5 -5
- package/dist/cli/continuity.js +90 -107
- package/dist/cli/curate.d.ts +5 -4
- package/dist/cli/curate.js +55 -77
- package/dist/cli/dag.d.ts +1 -1
- package/dist/cli/dag.js +14 -17
- package/dist/cli/decisions.js +30 -30
- package/dist/cli/eval.js +16 -21
- package/dist/cli/exit.d.ts +4 -1
- package/dist/cli/exit.js +10 -2
- package/dist/cli/explain.js +12 -11
- package/dist/cli/flag-values.d.ts +1 -1
- package/dist/cli/flag-values.js +9 -18
- package/dist/cli/github.d.ts +6 -0
- package/dist/cli/github.js +25 -13
- package/dist/cli/goals.d.ts +1 -1
- package/dist/cli/goals.js +39 -56
- package/dist/cli/graph.d.ts +1 -1
- package/dist/cli/graph.js +15 -11
- package/dist/cli/hook-runtime.d.ts +34 -10
- package/dist/cli/hook-runtime.js +41 -16
- package/dist/cli/incidents.d.ts +1 -1
- package/dist/cli/incidents.js +25 -25
- package/dist/cli/init.d.ts +1 -1
- package/dist/cli/init.js +35 -20
- package/dist/cli/install-steps.d.ts +12 -3
- package/dist/cli/install-steps.js +42 -18
- package/dist/cli/last-sleep.d.ts +4 -1
- package/dist/cli/last-sleep.js +9 -4
- package/dist/cli/maintenance.d.ts +1 -1
- package/dist/cli/maintenance.js +11 -12
- package/dist/cli/notes.d.ts +1 -1
- package/dist/cli/notes.js +8 -5
- package/dist/cli/object-verbs.d.ts +5 -5
- package/dist/cli/object-verbs.js +13 -16
- package/dist/cli/open-browser.js +11 -2
- package/dist/cli/playbooks.d.ts +3 -3
- package/dist/cli/playbooks.js +40 -32
- package/dist/cli/predictions.js +17 -22
- package/dist/cli/print.js +4 -2
- package/dist/cli/projects.js +21 -11
- package/dist/cli/quality-repair-once.d.ts +1 -1
- package/dist/cli/quality-repair-once.js +7 -6
- package/dist/cli/recall.js +129 -93
- package/dist/cli/refine-llm.d.ts +15 -4
- package/dist/cli/refine-llm.js +17 -7
- package/dist/cli/remember.js +51 -55
- package/dist/cli/scheduler.d.ts +4 -1
- package/dist/cli/scheduler.js +9 -5
- package/dist/cli/serve.js +28 -18
- package/dist/cli/session-hooks.d.ts +2 -6
- package/dist/cli/session-hooks.js +140 -112
- package/dist/cli/setup.d.ts +1 -1
- package/dist/cli/setup.js +56 -34
- package/dist/cli/shared.d.ts +4 -2
- package/dist/cli/shared.js +26 -11
- package/dist/cli/slack.js +15 -24
- package/dist/cli/sleep-render.d.ts +3 -1
- package/dist/cli/sleep-render.js +8 -5
- package/dist/cli/sleep.js +16 -8
- package/dist/cli/status.d.ts +4 -4
- package/dist/cli/status.js +32 -27
- package/dist/cli/stdin.d.ts +10 -3
- package/dist/cli/stdin.js +10 -3
- package/dist/cli/transfer.d.ts +4 -4
- package/dist/cli/transfer.js +97 -82
- package/dist/cli/usage.d.ts +1 -1
- package/dist/cli/usage.js +1 -1
- package/dist/cli/verb-row.d.ts +2 -0
- package/dist/cli/verbs/health.js +2 -0
- package/dist/cli/verbs/memory.js +47 -53
- package/dist/cli/verbs/objects.js +16 -7
- package/dist/cli/verbs/sessions.js +4 -2
- package/dist/cli/versioned-verbs.d.ts +8 -7
- package/dist/cli/versioned-verbs.js +31 -21
- package/dist/cli.js +14 -18
- package/dist/connectors/dlq.d.ts +6 -6
- package/dist/connectors/dlq.js +12 -7
- package/dist/connectors/github/backfill.d.ts +4 -4
- package/dist/connectors/github/backfill.js +6 -4
- package/dist/connectors/github/deletion.d.ts +6 -4
- package/dist/connectors/github/deletion.js +5 -4
- package/dist/connectors/github/dlq.d.ts +8 -6
- package/dist/connectors/github/dlq.js +11 -5
- package/dist/connectors/github/ingest.d.ts +2 -2
- package/dist/connectors/github/ingest.js +9 -5
- package/dist/connectors/github/octokit-client.d.ts +3 -1
- package/dist/connectors/github/octokit-client.js +7 -2
- package/dist/connectors/github/ratelimit.d.ts +6 -2
- package/dist/connectors/github/ratelimit.js +6 -2
- package/dist/connectors/github/signature.d.ts +14 -3
- package/dist/connectors/github/signature.js +17 -3
- package/dist/connectors/github/tenant-routing.d.ts +6 -4
- package/dist/connectors/github/tenant-routing.js +6 -5
- package/dist/connectors/github/transform.js +50 -67
- package/dist/connectors/github/types.d.ts +10 -3
- package/dist/connectors/github/types.js +6 -2
- package/dist/connectors/github/webhook.d.ts +5 -5
- package/dist/connectors/github/webhook.js +36 -23
- package/dist/connectors/ingest.d.ts +5 -3
- package/dist/connectors/ingest.js +3 -3
- package/dist/connectors/slack/backfill.d.ts +5 -5
- package/dist/connectors/slack/backfill.js +3 -3
- package/dist/connectors/slack/deletion.d.ts +4 -4
- package/dist/connectors/slack/deletion.js +6 -5
- package/dist/connectors/slack/dlq.d.ts +4 -4
- package/dist/connectors/slack/dlq.js +6 -6
- package/dist/connectors/slack/ingest.d.ts +6 -4
- package/dist/connectors/slack/ingest.js +5 -4
- package/dist/connectors/slack/signature.d.ts +4 -1
- package/dist/connectors/slack/tenant-routing.d.ts +6 -4
- package/dist/connectors/slack/tenant-routing.js +6 -5
- package/dist/connectors/slack/transform.d.ts +6 -2
- package/dist/connectors/slack/transform.js +6 -2
- package/dist/connectors/slack/types.d.ts +3 -1
- package/dist/connectors/slack/web-client.js +8 -3
- package/dist/connectors/slack/webhook.d.ts +5 -5
- package/dist/connectors/slack/webhook.js +19 -11
- package/dist/connectors/slack/workspaces.d.ts +7 -3
- package/dist/connectors/slack/workspaces.js +7 -3
- package/dist/connectors/store.d.ts +8 -0
- package/dist/connectors/store.js +2 -0
- package/dist/consolidate/conflicts.js +24 -10
- package/dist/consolidate/dag-summary.js +2 -1
- package/dist/consolidate/dag.d.ts +10 -5
- package/dist/consolidate/dag.js +45 -39
- package/dist/consolidate/decay.js +19 -6
- package/dist/consolidate/dedupe.d.ts +14 -5
- package/dist/consolidate/dedupe.js +28 -17
- package/dist/consolidate/flush-units.d.ts +4 -1
- package/dist/consolidate/flush-units.js +4 -1
- package/dist/consolidate/half-life-migration.d.ts +18 -8
- package/dist/consolidate/half-life-migration.js +48 -18
- package/dist/consolidate/llm-passes.js +27 -11
- package/dist/consolidate/memory-value-weights.d.ts +6 -2
- package/dist/consolidate/memory-value-weights.js +6 -2
- package/dist/consolidate/memory-value.d.ts +30 -10
- package/dist/consolidate/memory-value.js +37 -14
- package/dist/consolidate/merge.d.ts +4 -1
- package/dist/consolidate/merge.js +47 -37
- package/dist/consolidate/overlap-index.d.ts +8 -2
- package/dist/consolidate/overlap-index.js +11 -4
- package/dist/consolidate/physics-pass.d.ts +3 -1
- package/dist/consolidate/physics-pass.js +10 -7
- package/dist/consolidate/replay.d.ts +11 -4
- package/dist/consolidate/replay.js +19 -7
- package/dist/consolidate/run.d.ts +13 -5
- package/dist/consolidate/run.js +4 -4
- package/dist/consolidate/sleep.d.ts +14 -6
- package/dist/consolidate/sleep.js +42 -39
- package/dist/consolidate/trace.d.ts +7 -2
- package/dist/consolidate/trace.js +7 -2
- package/dist/consolidate/traces.js +27 -30
- package/dist/core/ablation.d.ts +9 -3
- package/dist/core/ablation.js +14 -4
- package/dist/core/active-scope.d.ts +3 -1
- package/dist/core/active-scope.js +3 -1
- package/dist/core/agent-memory-tools.d.ts +2 -0
- package/dist/core/agent-memory-tools.js +2 -0
- package/dist/core/ambient.d.ts +4 -3
- package/dist/core/ambient.js +8 -6
- package/dist/core/api-errors.d.ts +9 -3
- package/dist/core/api-errors.js +9 -3
- package/dist/core/capture-contract.d.ts +4 -1
- package/dist/core/capture-contract.js +27 -8
- package/dist/core/compare.d.ts +24 -8
- package/dist/core/compare.js +24 -8
- package/dist/core/config.d.ts +18 -9
- package/dist/core/config.js +38 -29
- package/dist/core/cosine.d.ts +4 -1
- package/dist/core/cosine.js +4 -1
- package/dist/core/handoff.d.ts +7 -2
- package/dist/core/handoff.js +4 -1
- package/dist/core/markdown.js +22 -17
- package/dist/core/memory-audit.js +14 -3
- package/dist/core/memory-quality.d.ts +12 -3
- package/dist/core/memory-quality.js +57 -21
- package/dist/core/memory.d.ts +87 -30
- package/dist/core/memory.js +82 -33
- package/dist/core/merged-row.d.ts +8 -2
- package/dist/core/merged-row.js +10 -3
- package/dist/core/package-root.d.ts +3 -1
- package/dist/core/package-root.js +3 -1
- package/dist/core/particle-refresh.d.ts +8 -0
- package/dist/core/particle-refresh.js +22 -0
- package/dist/core/physics-config.d.ts +4 -1
- package/dist/core/physics-config.js +6 -2
- package/dist/core/physics.d.ts +39 -11
- package/dist/core/physics.js +71 -21
- package/dist/core/project-identity.d.ts +34 -17
- package/dist/core/project-identity.js +35 -18
- package/dist/core/project-remote.d.ts +8 -4
- package/dist/core/project-remote.js +31 -14
- package/dist/core/recall-scope.d.ts +33 -11
- package/dist/core/recall-scope.js +42 -15
- package/dist/core/rejection-digest.d.ts +7 -0
- package/dist/core/rejection-digest.js +13 -0
- package/dist/core/salience.d.ts +3 -1
- package/dist/core/salience.js +10 -4
- package/dist/core/search-types.d.ts +15 -2
- package/dist/core/search-types.js +11 -0
- package/dist/dashboard/dashboard-actions.d.ts +2 -2
- package/dist/dashboard/dashboard-actions.js +18 -7
- package/dist/dashboard/dashboard-queries.js +2 -7
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
- package/dist/dashboard/dashboard-snapshot.js +5 -7
- package/dist/dashboard/dashboard.js +22 -8
- package/dist/db/backup.js +2 -2
- package/dist/db/busy.d.ts +10 -3
- package/dist/db/busy.js +27 -5
- package/dist/db/connect.d.ts +10 -2
- package/dist/db/connect.js +8 -2
- package/dist/db/continuity.d.ts +1 -1
- package/dist/db/continuity.js +27 -11
- package/dist/db/meta.d.ts +4 -1
- package/dist/db/meta.js +4 -1
- package/dist/db/migrate.d.ts +10 -5
- package/dist/db/migrate.js +40 -20
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/types.d.ts +2 -1
- package/dist/db/migrations/v11.js +1 -0
- package/dist/db/migrations/v12.js +2 -1
- package/dist/db/migrations/v14.js +2 -0
- package/dist/db/migrations/v15.js +4 -2
- package/dist/db/migrations/v16.js +6 -3
- package/dist/db/migrations/v17.js +2 -1
- package/dist/db/migrations/v19.js +4 -2
- package/dist/db/migrations/v20.js +2 -1
- package/dist/db/migrations/v22.js +12 -6
- package/dist/db/migrations/v23.js +6 -3
- package/dist/db/migrations/v24.js +6 -3
- package/dist/db/migrations/v25.js +4 -2
- package/dist/db/migrations/v26.js +4 -2
- package/dist/db/migrations/v27.js +6 -3
- package/dist/db/migrations/v28.js +4 -2
- package/dist/db/migrations/v29.js +4 -2
- package/dist/db/migrations/v30.js +6 -3
- package/dist/db/migrations/v31.js +4 -2
- package/dist/db/migrations/v32.js +6 -3
- package/dist/db/migrations/v33.js +4 -2
- package/dist/db/migrations/v34.js +2 -1
- package/dist/db/migrations/v35.js +2 -1
- package/dist/db/migrations/v36.js +2 -1
- package/dist/db/migrations/v37.js +10 -5
- package/dist/db/migrations/v38.js +10 -5
- package/dist/db/migrations/v39.js +14 -6
- package/dist/db/migrations/v40.js +4 -2
- package/dist/db/migrations/v41.js +4 -2
- package/dist/db/migrations/v42.js +2 -1
- package/dist/db/migrations/v44.js +4 -2
- package/dist/db/migrations/v45.js +4 -2
- package/dist/db/migrations/v49.js +2 -1
- package/dist/db/migrations/v50.js +4 -2
- package/dist/db/migrations/v51.js +4 -2
- package/dist/db/migrations/v52.js +2 -1
- package/dist/db/migrations/v53.js +8 -4
- package/dist/db/migrations/v54.js +2 -1
- package/dist/db/migrations/v55.js +4 -2
- package/dist/db/migrations/v56.d.ts +3 -0
- package/dist/db/migrations/v56.js +28 -0
- package/dist/db/open.d.ts +24 -12
- package/dist/db/open.js +25 -13
- package/dist/db/physics-state.d.ts +8 -8
- package/dist/db/physics-state.js +17 -50
- package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
- package/dist/db/raw-archive-mirror-cleanup.js +6 -4
- package/dist/db/request-stores.d.ts +20 -5
- package/dist/db/request-stores.js +15 -5
- package/dist/db/tables.d.ts +2 -1
- package/dist/db/tables.js +12 -4
- package/dist/db/vector-store.d.ts +13 -4
- package/dist/db/vector-store.js +35 -14
- package/dist/db/wal-checkpointer.d.ts +2 -1
- package/dist/db/wal-checkpointer.js +19 -7
- package/dist/doctor.d.ts +7 -1
- package/dist/doctor.js +128 -46
- package/dist/embeddings/local.d.ts +8 -4
- package/dist/embeddings/local.js +11 -7
- package/dist/embeddings/provider.d.ts +19 -10
- package/dist/embeddings/provider.js +32 -27
- package/dist/embeddings/transformers.d.ts +16 -4
- package/dist/embeddings/transformers.js +32 -15
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.js +2 -1
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +1 -1
- package/dist/entry/sqlite-handles.d.ts +10 -0
- package/dist/entry/sqlite-handles.js +9 -0
- package/dist/entry/store-kit.d.ts +50 -0
- package/dist/entry/store-kit.js +27 -0
- package/dist/entry/testing.d.ts +6 -0
- package/dist/entry/testing.js +7 -0
- package/dist/eval/eval-stats.d.ts +27 -8
- package/dist/eval/eval-stats.js +17 -5
- package/dist/eval/eval-suite.d.ts +3 -1
- package/dist/eval/eval-suite.js +409 -187
- package/dist/eval/eval.d.ts +8 -2
- package/dist/eval/eval.js +8 -2
- package/dist/eval/judgment.js +17 -7
- package/dist/graph/delta.d.ts +9 -42
- package/dist/graph/delta.js +17 -11
- package/dist/graph/extract.d.ts +10 -7
- package/dist/graph/extract.js +57 -25
- package/dist/graph/recall.d.ts +12 -4
- package/dist/graph/recall.js +30 -13
- package/dist/graph/stream.d.ts +18 -6
- package/dist/graph/stream.js +32 -10
- package/dist/graph/view.d.ts +19 -6
- package/dist/graph/view.js +42 -17
- package/dist/hooks/codex-session.js +2 -2
- package/dist/hooks/codex-wrapper.d.ts +3 -1
- package/dist/hooks/codex-wrapper.js +9 -4
- package/dist/hooks/copilot.d.ts +19 -5
- package/dist/hooks/copilot.js +54 -15
- package/dist/hooks/hook-blocks.d.ts +4 -1
- package/dist/hooks/hook-blocks.js +8 -3
- package/dist/hooks/json-hooks.d.ts +9 -5
- package/dist/hooks/json-hooks.js +72 -33
- package/dist/hooks/opencode.js +15 -5
- package/dist/hooks/shared.d.ts +27 -8
- package/dist/hooks/shared.js +57 -16
- package/dist/importers/core.d.ts +12 -4
- package/dist/importers/core.js +11 -10
- package/dist/importers/markdown-parse.d.ts +15 -5
- package/dist/importers/markdown-parse.js +16 -7
- package/dist/importers/markdown.js +6 -9
- package/dist/importers/sources.js +10 -23
- package/dist/importers/vault.d.ts +3 -3
- package/dist/importers/vault.js +61 -45
- package/dist/index.d.ts +33 -7
- package/dist/index.js +26 -8
- package/dist/learn/autolearn.d.ts +21 -6
- package/dist/learn/autolearn.js +57 -26
- package/dist/learn/churn-git.d.ts +4 -1
- package/dist/learn/churn-git.js +29 -5
- package/dist/learn/extract.d.ts +4 -1
- package/dist/learn/extract.js +17 -10
- package/dist/learn/forward-claim-detector.d.ts +17 -5
- package/dist/learn/forward-claim-detector.js +34 -15
- package/dist/learn/invalidation.d.ts +12 -6
- package/dist/learn/invalidation.js +62 -28
- package/dist/learn/roots.d.ts +3 -0
- package/dist/learn/roots.js +5 -0
- package/dist/mcp/admin-tools.d.ts +5 -5
- package/dist/mcp/admin-tools.js +28 -23
- package/dist/mcp/format.d.ts +1 -1
- package/dist/mcp/format.js +4 -2
- package/dist/mcp/framing.d.ts +3 -1
- package/dist/mcp/framing.js +20 -8
- package/dist/mcp/memory-tools.d.ts +3 -3
- package/dist/mcp/memory-tools.js +21 -20
- package/dist/mcp/protocol.d.ts +32 -16
- package/dist/mcp/protocol.js +12 -9
- package/dist/mcp/recall-tools.d.ts +3 -3
- package/dist/mcp/recall-tools.js +62 -74
- package/dist/mcp/request.d.ts +7 -5
- package/dist/mcp/request.js +61 -77
- package/dist/mcp/server.d.ts +3 -1
- package/dist/mcp/server.js +8 -3
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +4 -3
- package/dist/mcp/shared-gate.d.ts +3 -2
- package/dist/mcp/shared-gate.js +3 -2
- package/dist/mcp/stdio.d.ts +6 -3
- package/dist/mcp/stdio.js +59 -23
- package/dist/mcp/tool-args.d.ts +4 -1
- package/dist/mcp/tool-args.js +8 -3
- package/dist/mcp/tools.js +76 -32
- package/dist/objects/customer-notes.d.ts +12 -10
- package/dist/objects/customer-notes.js +21 -15
- package/dist/objects/decisions.d.ts +18 -10
- package/dist/objects/decisions.js +23 -17
- package/dist/objects/descriptor.js +2 -1
- package/dist/objects/fields.d.ts +4 -1
- package/dist/objects/fields.js +6 -2
- package/dist/objects/incidents.d.ts +14 -16
- package/dist/objects/incidents.js +29 -30
- package/dist/objects/lifecycle.d.ts +0 -4
- package/dist/objects/lifecycle.js +21 -24
- package/dist/objects/policies.d.ts +12 -16
- package/dist/objects/policies.js +17 -21
- package/dist/objects/processes.d.ts +16 -10
- package/dist/objects/processes.js +20 -15
- package/dist/objects/project-briefs.d.ts +13 -14
- package/dist/objects/project-briefs.js +33 -39
- package/dist/objects/skills.d.ts +10 -12
- package/dist/objects/skills.js +17 -22
- package/dist/postinstall.js +15 -7
- package/dist/predictions/planning-fallacy.d.ts +19 -6
- package/dist/predictions/planning-fallacy.js +4 -2
- package/dist/rerankers/clef.d.ts +8 -2
- package/dist/rerankers/clef.js +14 -9
- package/dist/rerankers/cross-encoder.d.ts +2 -1
- package/dist/rerankers/cross-encoder.js +19 -9
- package/dist/rerankers/index.js +2 -1
- package/dist/rerankers/jev.js +2 -1
- package/dist/rerankers/llm.d.ts +6 -2
- package/dist/rerankers/llm.js +8 -3
- package/dist/rerankers/remote.d.ts +3 -1
- package/dist/rerankers/remote.js +5 -2
- package/dist/rerankers/types.d.ts +6 -2
- package/dist/search/bm25-search.d.ts +3 -1
- package/dist/search/bm25-search.js +15 -2
- package/dist/search/boosts.js +4 -3
- package/dist/search/embed-memories.d.ts +12 -4
- package/dist/search/embed-memories.js +96 -58
- package/dist/search/engine.d.ts +11 -0
- package/dist/search/engine.js +14 -0
- package/dist/search/goal-boost.d.ts +10 -3
- package/dist/search/goal-boost.js +13 -6
- package/dist/search/hybrid-score.d.ts +4 -1
- package/dist/search/hybrid-score.js +4 -1
- package/dist/search/hybrid.d.ts +23 -8
- package/dist/search/hybrid.js +12 -7
- package/dist/search/multihop.js +14 -13
- package/dist/search/path-context.d.ts +10 -3
- package/dist/search/path-context.js +10 -3
- package/dist/search/physics-search.d.ts +9 -4
- package/dist/search/physics-search.js +38 -14
- package/dist/search/rerank.d.ts +2 -1
- package/dist/search/rerank.js +2 -1
- package/dist/search/rrf.d.ts +14 -5
- package/dist/search/rrf.js +11 -4
- package/dist/search/vector.d.ts +8 -2
- package/dist/search/vector.js +14 -8
- package/dist/server/auth.d.ts +19 -15
- package/dist/server/auth.js +68 -38
- package/dist/server/boot.d.ts +4 -1
- package/dist/server/boot.js +115 -67
- package/dist/server/client-ip.d.ts +17 -5
- package/dist/server/client-ip.js +56 -21
- package/dist/server/cursor.d.ts +10 -3
- package/dist/server/cursor.js +10 -3
- package/dist/server/deadline.d.ts +5 -2
- package/dist/server/deadline.js +10 -3
- package/dist/server/key-check-bounds.js +12 -4
- package/dist/server/lifecycle.d.ts +4 -1
- package/dist/server/lifecycle.js +10 -4
- package/dist/server/mcp-http.d.ts +2 -1
- package/dist/server/mcp-http.js +37 -22
- package/dist/server/rate-limit.d.ts +17 -5
- package/dist/server/rate-limit.js +55 -26
- package/dist/server/ready.js +7 -4
- package/dist/server/request.d.ts +15 -4
- package/dist/server/request.js +42 -15
- package/dist/server/route-checks.d.ts +4 -1
- package/dist/server/route-checks.js +8 -3
- package/dist/server/route-table.d.ts +8 -6
- package/dist/server/route-table.js +550 -97
- package/dist/server/routes/admin.d.ts +7 -7
- package/dist/server/routes/admin.js +36 -15
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +5 -4
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +12 -6
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +10 -4
- package/dist/server/routes/memories.d.ts +8 -8
- package/dist/server/routes/memories.js +12 -17
- package/dist/server/routes/object-routes.d.ts +8 -5
- package/dist/server/routes/object-routes.js +4 -2
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +11 -4
- package/dist/server/routes/predictions.d.ts +5 -5
- package/dist/server/routes/predictions.js +9 -4
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +15 -6
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +3 -2
- package/dist/server/routes/recall.d.ts +3 -3
- package/dist/server/routes/recall.js +21 -10
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +12 -4
- package/dist/server/server-detect.d.ts +24 -8
- package/dist/server/server-detect.js +57 -22
- package/dist/server/sleep-child.js +16 -10
- package/dist/server/sleep-offload.d.ts +8 -5
- package/dist/server/sleep-offload.js +40 -18
- package/dist/server/tls.d.ts +10 -2
- package/dist/server/tls.js +25 -5
- package/dist/server/types.d.ts +41 -24
- package/dist/server/validation.d.ts +4 -1
- package/dist/server/validation.js +22 -9
- package/dist/server.d.ts +17 -49
- package/dist/server.js +33 -40
- package/dist/sharing/global-store.d.ts +6 -12
- package/dist/sharing/global-store.js +8 -48
- package/dist/sharing/global-sync.d.ts +3 -1
- package/dist/sharing/global-sync.js +17 -7
- package/dist/sharing/project-merge.d.ts +25 -7
- package/dist/sharing/project-merge.js +49 -17
- package/dist/sharing/search-both.d.ts +8 -4
- package/dist/sharing/search-both.js +28 -14
- package/dist/sharing/share.d.ts +8 -4
- package/dist/sharing/share.js +40 -18
- package/dist/store/ambient.js +10 -5
- package/dist/store/audit-event.d.ts +2 -2
- package/dist/store/audit-event.js +8 -3
- package/dist/store/audit.d.ts +6 -3
- package/dist/store/audit.js +16 -6
- package/dist/store/auth.d.ts +4 -2
- package/dist/store/auth.js +63 -20
- package/dist/store/busy.d.ts +9 -0
- package/dist/store/busy.js +16 -0
- package/dist/store/candidates.d.ts +12 -5
- package/dist/store/candidates.js +90 -41
- package/dist/store/capture-write.d.ts +2 -1
- package/dist/store/capture-write.js +2 -1
- package/dist/store/card-detail.d.ts +4 -4
- package/dist/store/card-detail.js +15 -8
- package/dist/store/cards.d.ts +24 -10
- package/dist/store/cards.js +97 -63
- package/dist/store/compaction-caller.d.ts +2 -1
- package/dist/store/compaction-caller.js +2 -1
- package/dist/store/compactions-record.d.ts +14 -8
- package/dist/store/compactions-record.js +101 -37
- package/dist/store/compactions.js +35 -15
- package/dist/store/conflicts.d.ts +16 -5
- package/dist/store/conflicts.js +104 -48
- package/dist/store/connectors/dlq.d.ts +17 -5
- package/dist/store/connectors/dlq.js +58 -6
- package/dist/store/connectors/event-log.d.ts +122 -0
- package/dist/store/connectors/event-log.js +25 -0
- package/dist/store/connectors/github.d.ts +6 -3
- package/dist/store/connectors/github.js +30 -48
- package/dist/store/connectors/slack.d.ts +2 -1
- package/dist/store/connectors/slack.js +31 -47
- package/dist/store/dashboard-reads.d.ts +7 -3
- package/dist/store/dashboard-reads.js +32 -10
- package/dist/store/delete-and-batch.d.ts +17 -11
- package/dist/store/delete-and-batch.js +70 -28
- package/dist/store/delivery-recorder.d.ts +10 -7
- package/dist/store/delivery-recorder.js +70 -37
- package/dist/store/descendant-page.d.ts +2 -1
- package/dist/store/descendant-page.js +26 -10
- package/dist/store/diagnostics.d.ts +2 -1
- package/dist/store/diagnostics.js +2 -1
- package/dist/store/doctor-reads.d.ts +2 -1
- package/dist/store/doctor-reads.js +13 -5
- package/dist/store/dormant.d.ts +19 -11
- package/dist/store/dormant.js +45 -19
- package/dist/store/embeddings/index.d.ts +13 -9
- package/dist/store/embeddings/index.js +19 -12
- package/dist/store/entry-reads.d.ts +72 -21
- package/dist/store/entry-reads.js +215 -69
- package/dist/store/entry-row.d.ts +10 -6
- package/dist/store/entry-row.js +26 -14
- package/dist/store/entry-writes.d.ts +28 -13
- package/dist/store/entry-writes.js +61 -22
- package/dist/store/failure-log-at.js +1 -1
- package/dist/store/failure-log.d.ts +4 -2
- package/dist/store/failure-log.js +13 -6
- package/dist/store/gated-write.d.ts +3 -3
- package/dist/store/gated-write.js +3 -3
- package/dist/store/goals.d.ts +5 -4
- package/dist/store/goals.js +11 -12
- package/dist/store/graph-apply.d.ts +21 -0
- package/dist/{graph/write.js → store/graph-apply.js} +31 -11
- package/dist/store/graph-queue.d.ts +9 -6
- package/dist/store/graph-queue.js +15 -10
- package/dist/store/graph-reads.d.ts +16 -11
- package/dist/store/graph-reads.js +29 -19
- package/dist/store/graph-rows.d.ts +41 -3
- package/dist/store/graph-rows.js +10 -7
- package/dist/store/graph-view-rows.js +15 -7
- package/dist/store/graph-writes.d.ts +16 -10
- package/dist/store/graph-writes.js +59 -36
- package/dist/store/half-life.js +2 -2
- package/dist/store/handoffs.d.ts +13 -7
- package/dist/store/handoffs.js +44 -22
- package/dist/store/index-and-stats.d.ts +2 -2
- package/dist/store/index-and-stats.js +6 -5
- package/dist/store/index.d.ts +4 -2
- package/dist/store/index.js +2 -1
- package/dist/store/key-audit.d.ts +2 -1
- package/dist/store/key-audit.js +2 -1
- package/dist/store/key-writes.d.ts +2 -1
- package/dist/store/key-writes.js +9 -2
- package/dist/store/ledger-turn.d.ts +4 -1
- package/dist/store/ledger-turn.js +7 -2
- package/dist/store/mirrors.d.ts +11 -4
- package/dist/store/mirrors.js +96 -19
- package/dist/store/narrow.d.ts +6 -0
- package/dist/store/narrow.js +11 -0
- package/dist/store/open.d.ts +6 -3
- package/dist/store/open.js +20 -10
- package/dist/store/pilot-arm.d.ts +2 -1
- package/dist/store/pilot-arm.js +18 -6
- package/dist/store/planning-fallacy-evidence.d.ts +2 -2
- package/dist/store/planning-fallacy-evidence.js +8 -5
- package/dist/store/port/agent-import.d.ts +62 -0
- package/dist/store/port/agent-import.js +2 -0
- package/dist/store/port/consolidation.d.ts +129 -0
- package/dist/store/port/consolidation.js +2 -0
- package/dist/store/port/learning.d.ts +19 -0
- package/dist/store/port/learning.js +2 -0
- package/dist/store/port/local-files.d.ts +18 -0
- package/dist/store/port/local-files.js +2 -0
- package/dist/store/port/promotion.d.ts +20 -0
- package/dist/store/port/promotion.js +3 -0
- package/dist/store/port-groups.d.ts +160 -0
- package/dist/store/port-groups.js +2 -0
- package/dist/store/port.d.ts +261 -219
- package/dist/store/port.js +3 -9
- package/dist/store/predictions.d.ts +14 -10
- package/dist/store/predictions.js +37 -17
- package/dist/store/project-tags.d.ts +4 -1
- package/dist/store/project-tags.js +16 -5
- package/dist/store/quality-repair.d.ts +8 -4
- package/dist/store/quality-repair.js +53 -20
- package/dist/store/quarantine.d.ts +1 -0
- package/dist/store/quarantine.js +23 -9
- package/dist/store/raw-archive.d.ts +5 -4
- package/dist/store/raw-archive.js +11 -10
- package/dist/store/recall-trace.d.ts +22 -17
- package/dist/store/recall-trace.js +128 -64
- package/dist/store/rejected-values.d.ts +15 -10
- package/dist/store/rejected-values.js +46 -20
- package/dist/store/rejection.d.ts +12 -11
- package/dist/store/rejection.js +18 -19
- package/dist/store/report-reads.d.ts +2 -1
- package/dist/store/report-reads.js +2 -1
- package/dist/store/rows.d.ts +7 -5
- package/dist/store/rows.js +20 -13
- package/dist/store/rule-sql.d.ts +7 -3
- package/dist/store/rule-sql.js +26 -13
- package/dist/store/search-rows.d.ts +16 -11
- package/dist/store/search-rows.js +54 -32
- package/dist/store/sessions.d.ts +12 -10
- package/dist/store/sessions.js +40 -21
- package/dist/store/set-aside.d.ts +2 -2
- package/dist/store/set-aside.js +18 -5
- package/dist/store/sqlite/agent-import.d.ts +3 -0
- package/dist/store/sqlite/agent-import.js +77 -0
- package/dist/store/sqlite/cards-group.d.ts +6 -0
- package/dist/store/sqlite/cards-group.js +37 -0
- package/dist/store/sqlite/conflicts-group.d.ts +6 -0
- package/dist/store/sqlite/conflicts-group.js +18 -0
- package/dist/store/sqlite/connector-events-group.d.ts +2 -1
- package/dist/store/sqlite/connector-events-group.js +17 -6
- package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
- package/dist/store/sqlite/connector-writes-group.js +12 -5
- package/dist/store/sqlite/consolidation-group.d.ts +4 -0
- package/dist/store/sqlite/consolidation-group.js +64 -0
- package/dist/store/sqlite/dag-reads-group.js +1 -1
- package/dist/store/sqlite/dormant-group.d.ts +6 -0
- package/dist/store/sqlite/dormant-group.js +29 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +9 -6
- package/dist/store/sqlite/entry-writes-group.js +37 -14
- package/dist/store/sqlite/error-codec.d.ts +4 -2
- package/dist/store/sqlite/error-codec.js +32 -10
- package/dist/store/sqlite/executor-counts.js +2 -1
- package/dist/store/sqlite/executor.d.ts +8 -3
- package/dist/store/sqlite/executor.js +56 -18
- package/dist/store/sqlite/global-promote.d.ts +5 -0
- package/dist/store/sqlite/global-promote.js +48 -0
- package/dist/store/sqlite/goals-group.d.ts +6 -0
- package/dist/store/sqlite/goals-group.js +23 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
- package/dist/store/sqlite/graph-reads-group.js +2 -1
- package/dist/store/sqlite/held-connection.d.ts +8 -0
- package/dist/store/sqlite/held-connection.js +34 -7
- package/dist/store/sqlite/last-recall-group.d.ts +15 -0
- package/dist/store/sqlite/last-recall-group.js +62 -0
- package/dist/store/sqlite/learning-group.d.ts +4 -0
- package/dist/store/sqlite/learning-group.js +17 -0
- package/dist/store/sqlite/maintenance-groups.d.ts +6 -0
- package/dist/store/sqlite/maintenance-groups.js +61 -0
- package/dist/store/sqlite/object-rows.d.ts +6 -3
- package/dist/store/sqlite/object-rows.js +34 -5
- package/dist/store/sqlite/objects-group.d.ts +5 -4
- package/dist/store/sqlite/objects-group.js +97 -38
- package/dist/store/sqlite/predictions-group.d.ts +2 -1
- package/dist/store/sqlite/predictions-group.js +4 -2
- package/dist/store/sqlite/promotion-group.d.ts +3 -0
- package/dist/store/sqlite/promotion-group.js +10 -0
- package/dist/store/sqlite/quarantine-group.d.ts +2 -1
- package/dist/store/sqlite/quarantine-group.js +4 -2
- package/dist/store/sqlite/reports-group.d.ts +6 -0
- package/dist/store/sqlite/reports-group.js +33 -0
- package/dist/store/sqlite/request-scope.d.ts +6 -0
- package/dist/store/sqlite/request-scope.js +18 -0
- package/dist/store/sqlite/sessions-group.d.ts +6 -0
- package/dist/store/sqlite/sessions-group.js +46 -0
- package/dist/store/sqlite/store.d.ts +22 -18
- package/dist/store/sqlite/store.js +95 -33
- package/dist/store/sqlite/vector-pack.js +2 -1
- package/dist/store/sqlite/vector-reads-group.js +2 -1
- package/dist/store/sqlite/worker-jobs.d.ts +2 -1
- package/dist/store/sqlite/worker-jobs.js +19 -7
- package/dist/store/sqlite/worker-ops.d.ts +10 -5
- package/dist/store/sqlite/worker-ops.js +6 -3
- package/dist/store/sqlite/worker-store.d.ts +4 -3
- package/dist/store/sqlite/worker-store.js +24 -14
- package/dist/store/summaries.d.ts +25 -11
- package/dist/store/summaries.js +84 -27
- package/dist/store/summary-dirty.d.ts +2 -1
- package/dist/store/summary-dirty.js +2 -1
- package/dist/store/tenant.d.ts +3 -2
- package/dist/store/tenant.js +5 -4
- package/dist/store/token-ledger-rows.js +8 -4
- package/dist/store/token-ledger.d.ts +19 -13
- package/dist/store/token-ledger.js +27 -14
- package/dist/store/tombstone-checks.d.ts +4 -1
- package/dist/store/tombstone-checks.js +10 -1
- package/dist/store/usage-reports.js +2 -1
- package/dist/store/vector-index.d.ts +8 -5
- package/dist/store/vector-index.js +28 -11
- package/dist/store/working-memory.d.ts +6 -4
- package/dist/store/working-memory.js +14 -9
- package/dist/support-bundle.js +10 -5
- package/dist/trust/quarantine.d.ts +1 -2
- package/dist/trust/quarantine.js +1 -5
- package/dist/trust/reject-flow.d.ts +12 -3
- package/dist/trust/reject-flow.js +12 -4
- package/dist/util/anthropic-messages.d.ts +7 -2
- package/dist/util/anthropic-messages.js +18 -7
- package/dist/util/atomic-write.d.ts +8 -3
- package/dist/util/atomic-write.js +36 -21
- package/dist/util/compaction-items.d.ts +4 -1
- package/dist/util/compaction-items.js +8 -2
- package/dist/util/crash-handlers.d.ts +7 -2
- package/dist/util/crash-handlers.js +13 -4
- package/dist/util/env.d.ts +26 -5
- package/dist/util/env.js +87 -25
- package/dist/util/format.d.ts +2 -0
- package/dist/util/format.js +4 -0
- package/dist/util/home-path.js +12 -6
- package/dist/util/hook-payload.d.ts +3 -1
- package/dist/util/hook-payload.js +3 -1
- package/dist/util/http-retry.d.ts +12 -6
- package/dist/util/http-retry.js +16 -6
- package/dist/util/http-util.d.ts +20 -5
- package/dist/util/http-util.js +28 -9
- package/dist/util/json.d.ts +4 -1
- package/dist/util/json.js +4 -1
- package/dist/util/keyset.js +2 -1
- package/dist/util/limits.js +4 -2
- package/dist/util/log.d.ts +13 -5
- package/dist/util/log.js +29 -6
- package/dist/util/net.d.ts +5 -0
- package/dist/util/net.js +19 -0
- package/dist/util/real-path.d.ts +2 -1
- package/dist/util/real-path.js +4 -3
- package/dist/util/request-scope.d.ts +16 -4
- package/dist/util/request-scope.js +19 -6
- package/dist/util/same-text.d.ts +10 -3
- package/dist/util/same-text.js +10 -3
- package/dist/util/secret-detect.d.ts +24 -7
- package/dist/util/secret-detect.js +49 -14
- package/dist/util/spawn-argv.d.ts +11 -0
- package/dist/util/spawn-argv.js +66 -0
- package/dist/util/sql.d.ts +3 -0
- package/dist/util/sql.js +6 -0
- package/dist/util/sqlite-blocked.d.ts +15 -4
- package/dist/util/sqlite-blocked.js +19 -6
- package/dist/util/stored-json.d.ts +4 -1
- package/dist/util/stored-json.js +6 -2
- package/dist/util/stream-tee.d.ts +2 -1
- package/dist/util/stream-tee.js +8 -5
- package/dist/util/transcript-tail.d.ts +4 -1
- package/dist/util/transcript-tail.js +4 -1
- package/dist/util/vector-codec.d.ts +4 -0
- package/dist/util/vector-codec.js +15 -0
- package/dist/util/version.d.ts +8 -3
- package/dist/util/version.js +8 -3
- package/dist/util/write-budget.d.ts +7 -2
- package/dist/util/write-budget.js +5 -2
- package/dist/util/yaml.d.ts +4 -1
- package/dist/util/yaml.js +4 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +4 -1
- package/scripts/postinstall.cjs +3 -1
- package/dist/api/audit.js +0 -56
- package/dist/api/cards.d.ts +0 -42
- package/dist/api/conflicts.d.ts +0 -28
- package/dist/api/conflicts.js +0 -61
- package/dist/api/dormant.d.ts +0 -14
- package/dist/api/dormant.js +0 -58
- package/dist/api/goals.d.ts +0 -18
- package/dist/api/graph.d.ts +0 -8
- package/dist/api/graph.js +0 -7
- package/dist/api/learn.js +0 -124
- package/dist/api/memories.d.ts +0 -23
- package/dist/api/memories.js +0 -46
- package/dist/api/objects.d.ts +0 -9
- package/dist/api/on-store.d.ts +0 -16
- package/dist/api/on-store.js +0 -38
- package/dist/api/outcome.d.ts +0 -19
- package/dist/api/outcome.js +0 -21
- package/dist/api/predictions.d.ts +0 -11
- package/dist/api/promote.d.ts +0 -36
- package/dist/api/promote.js +0 -65
- package/dist/api/recall-core.d.ts +0 -4
- package/dist/api/recall-core.js +0 -120
- package/dist/api/recall-finish.d.ts +0 -53
- package/dist/api/recall-finish.js +0 -30
- package/dist/api/recall-history.d.ts +0 -64
- package/dist/api/recall-history.js +0 -159
- package/dist/api/recall-record.d.ts +0 -43
- package/dist/api/recall-record.js +0 -78
- package/dist/api/recall-request.js +0 -121
- package/dist/api/recall.d.ts +0 -6
- package/dist/api/refine.d.ts +0 -7
- package/dist/api/refine.js +0 -10
- package/dist/api/session-owners.d.ts +0 -4
- package/dist/api/session-owners.js +0 -17
- package/dist/api/sleep-run.d.ts +0 -26
- package/dist/api/sleep.js +0 -10
- package/dist/cli/lenient-id.d.ts +0 -2
- package/dist/cli/lenient-id.js +0 -13
- package/dist/graph/write.d.ts +0 -14
- package/dist/store/sqlite/busy.d.ts +0 -3
- package/dist/store/sqlite/busy.js +0 -8
- package/dist/store/sqlite/local.d.ts +0 -21
- package/dist/store/sqlite/local.js +0 -39
|
@@ -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';
|
|
@@ -6,10 +6,13 @@ import { originInSql } from '../core/project-identity.js';
|
|
|
6
6
|
import { scopeAdmitSql } from './rule-sql.js';
|
|
7
7
|
import { chunked } from '../util/chunked.js';
|
|
8
8
|
import { DEFAULT_TENANT_ID } from '../util/env.js';
|
|
9
|
+
import { placeholders } from '../util/sql.js';
|
|
9
10
|
const MAX_IDS_PER_READ = 500;
|
|
10
|
-
// 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.
|
|
11
13
|
export const TENANT_IS = '+tenant_id = ?';
|
|
12
|
-
/** 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. */
|
|
13
16
|
export function readEntry(hippoRoot, id, tenantId) {
|
|
14
17
|
return onHandle(hippoRoot, (db) => {
|
|
15
18
|
// SAFETY: both branches select exactly MEMORY_SELECT_COLUMNS, matching
|
|
@@ -20,38 +23,16 @@ export function readEntry(hippoRoot, id, tenantId) {
|
|
|
20
23
|
return row ? rowToEntry(row) : null;
|
|
21
24
|
}, openStore);
|
|
22
25
|
}
|
|
23
|
-
/**
|
|
24
|
-
|
|
25
|
-
const held = new Map();
|
|
26
|
-
const lookUp = (asked) => {
|
|
27
|
-
onHandle(hippoRoot, (db) => {
|
|
28
|
-
for (const chunk of chunked([...new Set(asked)])) {
|
|
29
|
-
for (const id of chunk)
|
|
30
|
-
held.set(id, false);
|
|
31
|
-
// SAFETY: rows' shape matches the single `id` column selected.
|
|
32
|
-
const rows = db.prepare(`SELECT id FROM memories WHERE id IN (${chunk.map(() => '?').join(',')}) AND ${TENANT_IS}`).all(...chunk, tenantId);
|
|
33
|
-
for (const row of rows)
|
|
34
|
-
held.set(row.id, true);
|
|
35
|
-
}
|
|
36
|
-
}, openStore);
|
|
37
|
-
};
|
|
38
|
-
if (ids.length > 0)
|
|
39
|
-
lookUp(ids);
|
|
40
|
-
return (id) => {
|
|
41
|
-
if (!held.has(id))
|
|
42
|
-
lookUp([id]);
|
|
43
|
-
return held.get(id) === true;
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
/** 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. */
|
|
47
28
|
export function selectEntriesByIds(db, ids, tenantId) {
|
|
48
29
|
const byId = new Map();
|
|
49
30
|
const tenantClause = tenantId !== undefined ? ` AND ${TENANT_IS}` : '';
|
|
50
31
|
const tenantArgs = tenantId !== undefined ? [tenantId] : [];
|
|
51
32
|
for (const chunk of chunked([...new Set(ids)])) {
|
|
52
|
-
const
|
|
33
|
+
const marks = placeholders(chunk.length);
|
|
53
34
|
// SAFETY: selects exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
|
|
54
|
-
const rows = db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE id IN (${
|
|
35
|
+
const rows = db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE id IN (${marks})${tenantClause}`).all(...chunk, ...tenantArgs);
|
|
55
36
|
for (const row of rows)
|
|
56
37
|
byId.set(row.id, rowToEntry(row));
|
|
57
38
|
}
|
|
@@ -63,9 +44,12 @@ export function selectChildrenByParent(db, parentIds, tenantId) {
|
|
|
63
44
|
const tenantClause = tenantId !== undefined ? ` AND ${TENANT_IS}` : '';
|
|
64
45
|
const tenantArgs = tenantId !== undefined ? [tenantId] : [];
|
|
65
46
|
for (const chunk of chunked([...new Set(parentIds)])) {
|
|
66
|
-
const
|
|
47
|
+
const marks = placeholders(chunk.length);
|
|
67
48
|
// SAFETY: selects exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
|
|
68
|
-
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);
|
|
69
53
|
for (const row of rows) {
|
|
70
54
|
const entry = rowToEntry(row);
|
|
71
55
|
const parentId = entry.dag_parent_id ?? '';
|
|
@@ -78,18 +62,25 @@ export function selectChildrenByParent(db, parentIds, tenantId) {
|
|
|
78
62
|
}
|
|
79
63
|
return byParent;
|
|
80
64
|
}
|
|
81
|
-
/** 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. */
|
|
82
67
|
export function loadEntriesByIds(hippoRoot, ids, tenantId) {
|
|
83
68
|
if (ids.length === 0)
|
|
84
69
|
return [];
|
|
85
70
|
const capped = ids.slice(0, MAX_IDS_PER_READ);
|
|
86
71
|
return onHandle(hippoRoot, (db) => {
|
|
87
|
-
const
|
|
72
|
+
const marks = placeholders(capped.length);
|
|
88
73
|
// Without ORDER BY, rows follow SQLite's IN(...) scan order, undefined w.r.t. `ids`.
|
|
89
74
|
// SAFETY: both branches select exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
|
|
90
75
|
const rows = tenantId !== undefined
|
|
91
|
-
? db
|
|
92
|
-
|
|
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);
|
|
93
84
|
return rows.map(rowToEntry);
|
|
94
85
|
}, openStore);
|
|
95
86
|
}
|
|
@@ -97,13 +88,15 @@ function originClause(origins) {
|
|
|
97
88
|
return origins === undefined ? '' : ` AND (origin_project = '' OR ${originInSql(origins)})`;
|
|
98
89
|
}
|
|
99
90
|
/** All `kind='raw'` rows for a session, tenant-scoped, oldest-first, excluding superseded; `[]` for an empty sessionId.
|
|
100
|
-
* 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. */
|
|
101
93
|
export function loadSessionRawMemories(hippoRoot, sessionId, tenantId, cap, origins) {
|
|
102
94
|
if (!sessionId)
|
|
103
95
|
return [];
|
|
104
96
|
return onHandle(hippoRoot, (db) => {
|
|
105
97
|
const params = [];
|
|
106
|
-
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`;
|
|
107
100
|
params.push(sessionId);
|
|
108
101
|
if (tenantId !== undefined) {
|
|
109
102
|
sql += ' AND tenant_id = ?';
|
|
@@ -124,14 +117,17 @@ export function loadSessionRawMemories(hippoRoot, sessionId, tenantId, cap, orig
|
|
|
124
117
|
return rows.map(rowToEntry);
|
|
125
118
|
}, openStore);
|
|
126
119
|
}
|
|
127
|
-
/** Pre-cap, scope-aware row count for a session, so `assemble` reports the full size without leaking rows the caller
|
|
128
|
-
*
|
|
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. */
|
|
129
124
|
export function countSessionRawMemories(hippoRoot, sessionId, tenantId, scope, ownScope, origins) {
|
|
130
125
|
if (!sessionId)
|
|
131
126
|
return 0;
|
|
132
127
|
return onHandle(hippoRoot, (db) => {
|
|
133
128
|
const params = [];
|
|
134
|
-
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`;
|
|
135
131
|
params.push(sessionId);
|
|
136
132
|
if (tenantId !== undefined) {
|
|
137
133
|
sql += ' AND tenant_id = ?';
|
|
@@ -153,8 +149,10 @@ export function countSessionRawMemories(hippoRoot, sessionId, tenantId, scope, o
|
|
|
153
149
|
return Number(row?.c ?? 0);
|
|
154
150
|
}, openStore);
|
|
155
151
|
}
|
|
156
|
-
/** Last N kind='raw' memories by `created` desc, tenant-scoped, max 200; pass
|
|
157
|
-
*
|
|
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`. */
|
|
158
156
|
export function loadFreshRawMemories(hippoRoot, count, tenantId, sessionId, origins) {
|
|
159
157
|
if (count <= 0)
|
|
160
158
|
return [];
|
|
@@ -181,13 +179,15 @@ export function loadFreshRawMemories(hippoRoot, count, tenantId, sessionId, orig
|
|
|
181
179
|
return rows.map(rowToEntry);
|
|
182
180
|
}, openStore);
|
|
183
181
|
}
|
|
184
|
-
/** 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. */
|
|
185
184
|
export function loadAllEntries(hippoRoot, tenantId) {
|
|
186
185
|
return onHandle(hippoRoot, (db) => {
|
|
187
186
|
return selectAllEntries(db, tenantId);
|
|
188
187
|
}, openStore);
|
|
189
188
|
}
|
|
190
|
-
/** 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. */
|
|
191
191
|
export function loadAllEntryIds(hippoRoot) {
|
|
192
192
|
return onHandle(hippoRoot, (db) => {
|
|
193
193
|
// SAFETY: the SELECT names exactly the one column read.
|
|
@@ -203,15 +203,46 @@ export function countAllEntries(hippoRoot) {
|
|
|
203
203
|
}, openStore);
|
|
204
204
|
}
|
|
205
205
|
// The only code points whose JS toLowerCase yields ASCII, which SQLite's ASCII-only LIKE folding cannot see.
|
|
206
|
-
const FOLDS_TO_ASCII = ['
|
|
207
|
-
|
|
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`.
|
|
208
237
|
* The caller re-checks each row exactly; this only spares decoding rows that cannot match. */
|
|
209
238
|
export function loadEntriesMentioning(hippoRoot, tokens, tag, tenantId) {
|
|
210
239
|
const likes = [...new Set(tokens)].map((t) => `%${escapeLike(t)}%`);
|
|
211
240
|
const clauses = likes.map(() => `content LIKE ? ESCAPE '\\'`);
|
|
212
241
|
const params = [...likes];
|
|
213
|
-
// A tag needing JSON escapes or case folding past ASCII is not
|
|
214
|
-
|
|
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) {
|
|
215
246
|
clauses.push(`tags_json LIKE ? ESCAPE '\\'`);
|
|
216
247
|
params.push(`%${escapeLike(tag)}%`);
|
|
217
248
|
}
|
|
@@ -222,21 +253,43 @@ export function loadEntriesMentioning(hippoRoot, tokens, tag, tenantId) {
|
|
|
222
253
|
params.push(ch, ch);
|
|
223
254
|
}
|
|
224
255
|
const tenantClause = tenantId !== undefined ? 'tenant_id = ? AND ' : '';
|
|
256
|
+
const tenantParams = tenantId !== undefined ? [tenantId] : [];
|
|
225
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');
|
|
226
263
|
// SAFETY: selects exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
|
|
227
|
-
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]));
|
|
228
268
|
return rows.map(rowToEntry);
|
|
229
269
|
}, openStore);
|
|
230
270
|
}
|
|
231
|
-
|
|
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. */
|
|
277
|
+
export function loadEntryTextKeys(hippoRoot, tenantId) {
|
|
233
278
|
return onHandle(hippoRoot, (db) => {
|
|
279
|
+
const where = tenantId !== undefined ? 'WHERE tenant_id = ? ' : '';
|
|
234
280
|
// SAFETY: rows' shape matches the four columns named in the SELECT.
|
|
235
|
-
const rows = db.prepare(
|
|
236
|
-
|
|
281
|
+
const rows = db.prepare(`SELECT id, tenant_id, content, source FROM memories ${where}ORDER BY created ASC, id ASC`)
|
|
282
|
+
.all(...(tenantId !== undefined ? [tenantId] : []));
|
|
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
|
+
}));
|
|
237
289
|
}, openStore);
|
|
238
290
|
}
|
|
239
|
-
/** 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. */
|
|
240
293
|
export function loadAllEntriesWithBase(hippoRoot) {
|
|
241
294
|
const db = openStore(hippoRoot);
|
|
242
295
|
let rows;
|
|
@@ -264,28 +317,71 @@ function selectAllRows(db, tenantId) {
|
|
|
264
317
|
? db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE tenant_id = ? ORDER BY created ASC, id ASC`).all(tenantId)
|
|
265
318
|
: db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories ORDER BY created ASC, id ASC`).all();
|
|
266
319
|
}
|
|
320
|
+
/** Up to `limit` rows in loadAllEntries' order, starting after `after`; omitting `tenantId` reads every tenant. */
|
|
321
|
+
export function loadEntriesPage(hippoRoot, tenantId, page) {
|
|
322
|
+
const where = [];
|
|
323
|
+
const params = [];
|
|
324
|
+
if (tenantId !== undefined) {
|
|
325
|
+
where.push('tenant_id = ?');
|
|
326
|
+
params.push(tenantId);
|
|
327
|
+
}
|
|
328
|
+
if (page.after) {
|
|
329
|
+
where.push('(created > ? OR (created = ? AND id > ?))');
|
|
330
|
+
params.push(page.after.created, page.after.created, page.after.id);
|
|
331
|
+
}
|
|
332
|
+
const clause = where.length > 0 ? `WHERE ${where.join(' AND ')} ` : '';
|
|
333
|
+
// One extra row says whether another page follows without a count.
|
|
334
|
+
params.push(page.limit + 1);
|
|
335
|
+
return onHandle(hippoRoot, (db) => {
|
|
336
|
+
// SAFETY: selects exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
|
|
337
|
+
const rows = db
|
|
338
|
+
.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories ${clause}ORDER BY created ASC, id ASC LIMIT ?`)
|
|
339
|
+
.all(...params);
|
|
340
|
+
const entries = rows.slice(0, page.limit).map(rowToEntry);
|
|
341
|
+
const last = entries[entries.length - 1];
|
|
342
|
+
return { entries, next: rows.length > page.limit && last ? { created: last.created, id: last.id } : null };
|
|
343
|
+
}, openStore);
|
|
344
|
+
}
|
|
267
345
|
/** Every memory row on an open connection, so a caller can read inside its own transaction. */
|
|
268
346
|
export function selectAllEntries(db, tenantId) {
|
|
269
347
|
return selectAllRows(db, tenantId).map(rowToEntry);
|
|
270
348
|
}
|
|
271
|
-
/**
|
|
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. */
|
|
351
|
+
export function selectTenantTexts(db, tenantId) {
|
|
352
|
+
// SAFETY: rows' shape matches the four columns named in the SELECT.
|
|
353
|
+
return db
|
|
354
|
+
.prepare('SELECT id, content, source, scope FROM memories WHERE tenant_id = ? ORDER BY created ASC, id ASC')
|
|
355
|
+
.all(tenantId);
|
|
356
|
+
}
|
|
357
|
+
/** Live rows whose source starts with `prefix`, on the caller's
|
|
358
|
+
* handle; LIKE folds case, so the prefix is checked again exactly. */
|
|
272
359
|
export function selectLiveEntriesBySourcePrefix(db, tenantId, prefix) {
|
|
273
360
|
// SAFETY: selects exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
|
|
274
|
-
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)}%`);
|
|
275
365
|
return rows.map(rowToEntry).filter((entry) => entry.source.startsWith(prefix));
|
|
276
366
|
}
|
|
277
|
-
// Content of every team-visible tenant row tagged `tag`, without reading the rest of the store; `origins` keeps one
|
|
278
|
-
//
|
|
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.
|
|
279
371
|
export function loadContentsWithTag(hippoRoot, tenantId, tag, origins) {
|
|
280
372
|
return onHandle(hippoRoot, (db) => {
|
|
281
373
|
const inProject = origins === undefined ? '' : ` AND (origin_project = '' OR ${originInSql(origins)})`;
|
|
282
374
|
const admit = scopeAdmitSql('');
|
|
283
375
|
/** SAFETY: rows' shape matches the two columns named in the SELECT below. */
|
|
284
|
-
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);
|
|
285
380
|
return rows.filter((r) => parseJsonArray(r.tags_json).includes(tag)).map((r) => r.content);
|
|
286
381
|
}, openStore);
|
|
287
382
|
}
|
|
288
|
-
/** 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. */
|
|
289
385
|
export function loadVaultRawRows(hippoRoot, likeParam, tenantId) {
|
|
290
386
|
return onHandle(hippoRoot, (db) => {
|
|
291
387
|
// SAFETY: query selects exactly the columns of VaultRawRow, in the same
|
|
@@ -300,7 +396,8 @@ export function loadVaultRawRows(hippoRoot, likeParam, tenantId) {
|
|
|
300
396
|
export function selectPreviewRows(db, columns, tenantId) {
|
|
301
397
|
const tenant = columns.has('tenant_id') ? ' WHERE tenant_id = ?' : '';
|
|
302
398
|
const column = (name, fallback) => (columns.has(name) ? name : `${fallback} AS ${name}`);
|
|
303
|
-
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')}, ` +
|
|
304
401
|
`${column('dag_level', '0')}, ${column('tags_json', "'[]'")} FROM memories${tenant}`);
|
|
305
402
|
// SAFETY: the SELECT names every PreviewRow field, each a literal fallback when its column is missing.
|
|
306
403
|
return (tenant ? statement.all(tenantId) : statement.all());
|
|
@@ -312,12 +409,18 @@ export function entryIdTakenAt(db, id) {
|
|
|
312
409
|
/** The text, tenant and scope of memory `id`, or undefined when no row holds it. */
|
|
313
410
|
export function entryRejectRowAt(db, id) {
|
|
314
411
|
// SAFETY: row's shape matches the three columns named in the SELECT.
|
|
315
|
-
return db
|
|
316
|
-
.prepare(`SELECT content, tenant_id, scope FROM memories WHERE id = ?`)
|
|
317
|
-
.get(id);
|
|
412
|
+
return db.prepare(`SELECT content, tenant_id, scope FROM memories WHERE id = ?`).get(id);
|
|
318
413
|
}
|
|
319
414
|
/** Memory ids held by each typed-object table, with the status of the object that holds them. */
|
|
320
|
-
const OBJECT_TABLES = [
|
|
415
|
+
const OBJECT_TABLES = [
|
|
416
|
+
'decisions',
|
|
417
|
+
'incidents',
|
|
418
|
+
'processes',
|
|
419
|
+
'policies',
|
|
420
|
+
'skills',
|
|
421
|
+
'project_briefs',
|
|
422
|
+
'customer_notes',
|
|
423
|
+
];
|
|
321
424
|
export function objectMemoryRowsAt(db) {
|
|
322
425
|
const out = [];
|
|
323
426
|
for (const table of OBJECT_TABLES) {
|
|
@@ -326,7 +429,8 @@ export function objectMemoryRowsAt(db) {
|
|
|
326
429
|
}
|
|
327
430
|
return out;
|
|
328
431
|
}
|
|
329
|
-
/** 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. */
|
|
330
434
|
export function selectRowsOutsideSourcePrefixAt(db, tenantId, sourcePrefix, origins) {
|
|
331
435
|
const visible = origins !== null ? ` AND (origin_project = '' OR ${originInSql(origins)})` : '';
|
|
332
436
|
const params = origins !== null ? [tenantId, sourcePrefix, ...origins] : [tenantId, sourcePrefix];
|
|
@@ -339,15 +443,18 @@ export function selectRowsOutsideSourcePrefixAt(db, tenantId, sourcePrefix, orig
|
|
|
339
443
|
export function loadLiveContentsBySourceAndTag(hippoRoot, tenantId, source, tag, exceptSessionId) {
|
|
340
444
|
return onHandle(hippoRoot, (db) => {
|
|
341
445
|
/** SAFETY: rows' shape matches the two columns named in the SELECT below. */
|
|
342
|
-
const rows = db
|
|
446
|
+
const rows = db
|
|
447
|
+
.prepare(`SELECT content, tags_json FROM memories
|
|
343
448
|
WHERE tenant_id = ? AND source = ? AND instr(tags_json, ?) > 0
|
|
344
449
|
AND COALESCE(extracted_from, '') = '' AND COALESCE(superseded_by, '') = ''
|
|
345
450
|
AND (source_session_id IS NULL OR source_session_id != ?)
|
|
346
|
-
ORDER BY created ASC, id ASC`)
|
|
451
|
+
ORDER BY created ASC, id ASC`)
|
|
452
|
+
.all(tenantId, source, JSON.stringify(tag), exceptSessionId);
|
|
347
453
|
return rows.filter((r) => parseJsonArray(r.tags_json).includes(tag)).map((r) => r.content);
|
|
348
454
|
}, openStore);
|
|
349
455
|
}
|
|
350
|
-
/** 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. */
|
|
351
458
|
export function loadCurrentDistilledEntries(hippoRoot) {
|
|
352
459
|
return onHandle(hippoRoot, (db) => {
|
|
353
460
|
// SAFETY: selects exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
|
|
@@ -357,4 +464,43 @@ export function loadCurrentDistilledEntries(hippoRoot) {
|
|
|
357
464
|
return rows.map(rowToEntry);
|
|
358
465
|
}, openStore);
|
|
359
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
|
+
}
|
|
360
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,9 +2,16 @@ 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
|
+
/** A 1.x JS caller's `tenantId` would otherwise fall through to the default tenant without a sound. */
|
|
7
|
+
function rejectLegacyTenantKey(entry) {
|
|
8
|
+
if (Object.hasOwn(entry, 'tenantId') && entry.tenant_id === undefined) {
|
|
9
|
+
throw new TypeError('tenantId was renamed to tenant_id in 2.0');
|
|
10
|
+
}
|
|
11
|
+
}
|
|
6
12
|
export function upsertEntryRow(db, entry) {
|
|
7
|
-
|
|
13
|
+
rejectLegacyTenantKey(entry);
|
|
14
|
+
checkRejectionGuard(db, entry.tenant_id ?? DEFAULT_TENANT_ID, entry.id, entry.content);
|
|
8
15
|
syncFtsRow(db, entry, upsertMemoryRow(db, entry));
|
|
9
16
|
}
|
|
10
17
|
/** The row alone, with no rejection guard or full-text row, for `upsertEntryRow` and for
|
|
@@ -30,7 +37,8 @@ const UPSERT_MEMORY_SQL = `
|
|
|
30
37
|
descendant_count, earliest_at, latest_at,
|
|
31
38
|
dag_level_3_built_at,
|
|
32
39
|
updated_at
|
|
33
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
|
|
40
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
|
|
41
|
+
?, ?, datetime('now'))
|
|
34
42
|
ON CONFLICT(id) DO UPDATE SET
|
|
35
43
|
created = excluded.created,
|
|
36
44
|
last_retrieved = excluded.last_retrieved,
|
|
@@ -104,7 +112,7 @@ function memoryRowValues(entry) {
|
|
|
104
112
|
entry.scope ?? null,
|
|
105
113
|
entry.owner ?? null,
|
|
106
114
|
entry.artifact_ref ?? null,
|
|
107
|
-
entry.
|
|
115
|
+
entry.tenant_id ?? DEFAULT_TENANT_ID,
|
|
108
116
|
entry.origin_project ?? null,
|
|
109
117
|
entry.descendant_count ?? 0,
|
|
110
118
|
entry.earliest_at ?? null,
|
|
@@ -122,7 +130,7 @@ export function syncFtsRow(db, entry, isNewRow = false) {
|
|
|
122
130
|
}
|
|
123
131
|
catch (err) {
|
|
124
132
|
// The memories table stays authoritative; a stale FTS row only costs recall quality, so the write goes on.
|
|
125
|
-
log.
|
|
133
|
+
log.warnThenSample('fts-sync', `FTS index update failed for ${entry.id}; keyword recall may miss it: ${errorMessage(err)}`, errorFields(err));
|
|
126
134
|
}
|
|
127
135
|
}
|
|
128
136
|
export function ftsRowExists(db, id) {
|
|
@@ -135,10 +143,11 @@ export function deleteFtsRow(db, id) {
|
|
|
135
143
|
db.prepare(`DELETE FROM memories_fts WHERE id = ?`).run(id);
|
|
136
144
|
}
|
|
137
145
|
catch (err) {
|
|
138
|
-
log.
|
|
146
|
+
log.warnThenSample('fts-delete', `FTS index delete failed for ${id}; recall may return a stale hit: ${errorMessage(err)}`, errorFields(err));
|
|
139
147
|
}
|
|
140
148
|
}
|
|
141
|
-
/** 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. */
|
|
142
151
|
export function replaceFtsRows(db, rows, staleIds) {
|
|
143
152
|
if (!isFtsAvailable(db))
|
|
144
153
|
return;
|
|
@@ -150,7 +159,7 @@ export function replaceFtsRows(db, rows, staleIds) {
|
|
|
150
159
|
catch (err) {
|
|
151
160
|
// Their old rows are still indexed, so inserting them again would index an id twice; only new ids go in.
|
|
152
161
|
kept = new Set(staleIds);
|
|
153
|
-
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));
|
|
154
163
|
}
|
|
155
164
|
}
|
|
156
165
|
const toInsert = rows.filter((row) => !kept.has(row.id));
|
|
@@ -162,11 +171,12 @@ export function replaceFtsRows(db, rows, staleIds) {
|
|
|
162
171
|
insert.run(row.id, row.content, row.tags.join(' '));
|
|
163
172
|
}
|
|
164
173
|
catch (err) {
|
|
165
|
-
log.
|
|
174
|
+
log.warnThenSample('fts-sync', `FTS index update failed for ${row.id}; keyword recall may miss it: ${errorMessage(err)}`, errorFields(err));
|
|
166
175
|
}
|
|
167
176
|
}
|
|
168
177
|
}
|
|
169
|
-
/** 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. */
|
|
170
180
|
export function ftsDrift(hippoRoot, repair) {
|
|
171
181
|
const db = openHippoDb(hippoRoot);
|
|
172
182
|
try {
|
|
@@ -183,15 +193,17 @@ export function ftsDrift(hippoRoot, repair) {
|
|
|
183
193
|
closeHippoDb(db);
|
|
184
194
|
}
|
|
185
195
|
}
|
|
186
|
-
/** Stamp origin_project from the store's own location (parent of `<project>/.hippo`; the home store is '' =
|
|
187
|
-
* 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. */
|
|
188
199
|
export function stampOriginProject(hippoRoot, entry) {
|
|
189
200
|
if (entry.origin_project !== undefined)
|
|
190
201
|
return entry;
|
|
191
202
|
return { ...entry, origin_project: fallbackOrigin(hippoRoot) };
|
|
192
203
|
}
|
|
193
|
-
/** Import-time variant for a mirror with no origin field (an explicit null stays null), for rows predating the origin
|
|
194
|
-
* 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. */
|
|
195
207
|
export function stampOriginProjectForImport(hippoRoot, entry) {
|
|
196
208
|
if (entry.origin_project !== undefined)
|
|
197
209
|
return entry;
|