hippo-memory 1.70.0 → 1.72.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 +2 -2
- package/dist/agent-memories/apply.d.ts +0 -11
- package/dist/agent-memories/apply.js +6 -21
- package/dist/agent-memories/claude-code.d.ts +4 -2
- package/dist/agent-memories/claude-code.js +15 -6
- package/dist/agent-memories/codex.js +1 -1
- package/dist/agent-memories/copilot.d.ts +1 -3
- package/dist/agent-memories/copilot.js +1 -17
- package/dist/agent-memories/files.js +23 -12
- package/dist/agent-memories/markdown.d.ts +1 -3
- package/dist/agent-memories/markdown.js +1 -3
- package/dist/agent-memories/project-folds.d.ts +10 -0
- package/dist/agent-memories/project-folds.js +34 -0
- package/dist/agent-memories/report.js +2 -1
- package/dist/agent-memories/sync.d.ts +4 -2
- package/dist/agent-memories/sync.js +18 -11
- package/dist/api/assemble.d.ts +7 -44
- package/dist/api/assemble.js +3 -23
- package/dist/api/audit.d.ts +33 -1
- package/dist/api/audit.js +48 -1
- package/dist/api/auth.d.ts +20 -26
- package/dist/api/auth.js +43 -29
- package/dist/api/auto-sleep.d.ts +5 -2
- package/dist/api/auto-sleep.js +9 -5
- package/dist/api/availability.d.ts +2 -15
- package/dist/api/availability.js +4 -18
- package/dist/api/cards.d.ts +42 -0
- package/dist/api/cards.js +52 -0
- package/dist/api/conflicts.d.ts +28 -0
- package/dist/api/conflicts.js +61 -0
- package/dist/api/context-render.js +4 -3
- package/dist/api/context-select.js +12 -15
- package/dist/api/context-types.d.ts +10 -35
- package/dist/api/context.d.ts +5 -22
- package/dist/api/context.js +38 -46
- package/dist/api/continuity.d.ts +47 -0
- package/dist/api/continuity.js +66 -0
- package/dist/{cli → api}/correction-latency.d.ts +2 -14
- package/dist/{cli → api}/correction-latency.js +2 -14
- package/dist/api/dormant.d.ts +5 -21
- package/dist/api/dormant.js +11 -28
- package/dist/api/drill-down.d.ts +7 -46
- package/dist/api/drill-down.js +6 -27
- package/dist/api/embeddings.d.ts +17 -0
- package/dist/api/embeddings.js +28 -0
- package/dist/api/error-reply.d.ts +8 -0
- package/dist/api/error-reply.js +21 -0
- package/dist/api/forget.d.ts +11 -26
- package/dist/api/forget.js +23 -35
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +5 -9
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +6 -2
- package/dist/api/index.js +6 -2
- package/dist/api/instruction-detect.js +21 -6
- package/dist/api/learn.d.ts +4 -0
- package/dist/api/learn.js +53 -27
- package/dist/api/ledger-db.d.ts +2 -5
- package/dist/api/ledger-db.js +5 -35
- package/dist/api/memories.d.ts +23 -0
- package/dist/api/memories.js +46 -0
- package/dist/api/objects.d.ts +9 -0
- package/dist/api/objects.js +11 -0
- package/dist/api/on-store.js +5 -3
- package/dist/api/outcome.js +1 -1
- package/dist/api/pilot-arm.d.ts +1 -11
- package/dist/api/pilot-arm.js +5 -45
- package/dist/api/predictions.d.ts +11 -0
- package/dist/api/predictions.js +24 -0
- package/dist/api/projects.d.ts +21 -0
- package/dist/api/projects.js +24 -0
- package/dist/api/promote.d.ts +13 -17
- package/dist/api/promote.js +12 -20
- package/dist/api/prompt-hook.d.ts +19 -6
- package/dist/api/prompt-hook.js +54 -13
- package/dist/api/provenance-coverage.d.ts +14 -0
- package/dist/{cli → api}/provenance-coverage.js +2 -6
- package/dist/api/recall-cli.d.ts +58 -0
- package/dist/api/recall-cli.js +103 -0
- package/dist/api/recall-core.js +17 -9
- package/dist/api/recall-finish.d.ts +53 -0
- package/dist/api/recall-finish.js +30 -0
- package/dist/api/recall-history.d.ts +17 -84
- package/dist/api/recall-history.js +15 -88
- package/dist/api/recall-pipeline.d.ts +2 -3
- package/dist/api/recall-pipeline.js +21 -15
- package/dist/api/recall-request.js +1 -1
- package/dist/api/recall-types.d.ts +64 -304
- package/dist/api/recall.d.ts +3 -34
- package/dist/api/recall.js +63 -89
- package/dist/api/refine.d.ts +7 -0
- package/dist/api/refine.js +10 -0
- package/dist/api/remember-local.d.ts +57 -0
- package/dist/api/remember-local.js +90 -0
- package/dist/api/remember.d.ts +20 -2
- package/dist/api/remember.js +16 -3
- package/dist/api/session-end.d.ts +22 -0
- package/dist/api/session-end.js +101 -0
- package/dist/api/sleep-run.d.ts +2 -4
- package/dist/api/sleep-run.js +28 -28
- package/dist/api/sleep.d.ts +9 -28
- package/dist/api/status.d.ts +24 -0
- package/dist/api/status.js +40 -0
- package/dist/api/store-init.d.ts +4 -0
- package/dist/api/store-init.js +9 -0
- package/dist/api/tokens.d.ts +3 -10
- package/dist/api/tokens.js +4 -11
- package/dist/api/types.d.ts +8 -29
- package/dist/api/types.js +10 -23
- package/dist/capture/caller-session.d.ts +0 -3
- package/dist/capture/caller-session.js +1 -12
- package/dist/capture/capture-error.d.ts +2 -2
- package/dist/capture/capture-error.js +23 -18
- package/dist/capture/codex-patch.js +3 -1
- package/dist/capture/command.d.ts +4 -12
- package/dist/capture/command.js +39 -114
- package/dist/capture/compact.d.ts +4 -15
- package/dist/capture/compact.js +26 -30
- package/dist/capture/compaction-items-caller.js +11 -20
- package/dist/capture/compaction-record.d.ts +7 -93
- package/dist/capture/compaction-record.js +34 -399
- package/dist/capture/compaction-spool.d.ts +5 -3
- package/dist/capture/compaction-spool.js +21 -7
- package/dist/capture/copilot-transcript.d.ts +2 -1
- package/dist/capture/copilot-transcript.js +2 -1
- package/dist/capture/extract.d.ts +5 -2
- package/dist/capture/extract.js +4 -3
- package/dist/capture/failure-caller.d.ts +1 -1
- package/dist/capture/failure-caller.js +21 -16
- package/dist/capture/failure-reading.d.ts +2 -1
- package/dist/capture/failure-reading.js +7 -9
- package/dist/capture/pre-compact-caller.js +5 -4
- package/dist/capture/session-digest.d.ts +1 -1
- package/dist/capture/session-digest.js +17 -10
- package/dist/capture/session-end-caller.js +2 -1
- package/dist/capture/session-worker.js +3 -4
- package/dist/capture/transcript.d.ts +4 -11
- package/dist/capture/transcript.js +10 -21
- package/dist/capture/working-state.d.ts +4 -2
- package/dist/capture/working-state.js +4 -2
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +1 -59
- package/dist/cli/audit-prune.js +2 -61
- package/dist/cli/audit.d.ts +1 -1
- package/dist/cli/audit.js +42 -43
- package/dist/cli/auth.d.ts +2 -2
- package/dist/cli/auth.js +61 -44
- package/dist/cli/briefs.d.ts +1 -4
- package/dist/cli/briefs.js +42 -301
- package/dist/cli/card.d.ts +2 -2
- package/dist/cli/card.js +63 -56
- package/dist/cli/client.d.ts +12 -27
- package/dist/cli/client.js +41 -44
- package/dist/cli/compact-resume-payload.js +4 -3
- package/dist/cli/context.d.ts +2 -3
- package/dist/cli/context.js +22 -18
- package/dist/cli/continuity.d.ts +6 -6
- package/dist/cli/continuity.js +81 -86
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +88 -116
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +55 -34
- package/dist/cli/decisions.d.ts +2 -4
- package/dist/cli/decisions.js +18 -309
- package/dist/cli/eval.d.ts +1 -1
- package/dist/cli/eval.js +27 -26
- package/dist/cli/exit.d.ts +6 -0
- package/dist/cli/exit.js +11 -0
- package/dist/cli/explain.d.ts +2 -3
- package/dist/cli/explain.js +25 -27
- package/dist/cli/flag-values.d.ts +6 -1
- package/dist/cli/flag-values.js +42 -15
- package/dist/cli/flags.d.ts +0 -288
- package/dist/cli/flags.js +3 -138
- package/dist/cli/github.d.ts +14 -0
- package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
- package/dist/cli/goals.d.ts +2 -2
- package/dist/cli/goals.js +46 -50
- package/dist/cli/graph.d.ts +3 -0
- package/dist/cli/graph.js +83 -0
- package/dist/cli/hook-runtime.d.ts +12 -32
- package/dist/cli/hook-runtime.js +21 -64
- package/dist/cli/incidents.d.ts +3 -0
- package/dist/cli/incidents.js +112 -0
- package/dist/cli/init.d.ts +2 -2
- package/dist/cli/init.js +33 -30
- package/dist/cli/install-steps.d.ts +2 -1
- package/dist/cli/install-steps.js +13 -14
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +4 -1
- package/dist/cli/lenient-id.d.ts +2 -0
- package/dist/cli/lenient-id.js +13 -0
- package/dist/cli/maintenance.d.ts +5 -5
- package/dist/cli/maintenance.js +37 -43
- package/dist/cli/notes.d.ts +2 -0
- package/dist/cli/notes.js +41 -0
- package/dist/cli/object-verbs.js +4 -3
- package/dist/cli/open-browser.d.ts +14 -0
- package/dist/cli/open-browser.js +26 -0
- package/dist/cli/owner-validation.d.ts +5 -28
- package/dist/cli/owner-validation.js +5 -28
- package/dist/cli/playbooks.d.ts +3 -4
- package/dist/cli/playbooks.js +131 -300
- package/dist/cli/predictions.d.ts +3 -0
- package/dist/cli/predictions.js +175 -0
- package/dist/cli/print.d.ts +2 -5
- package/dist/cli/print.js +3 -5
- package/dist/cli/projects.d.ts +2 -2
- package/dist/cli/projects.js +31 -25
- package/dist/cli/quality-repair-once.d.ts +1 -1
- package/dist/cli/quality-repair-once.js +7 -6
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +67 -137
- package/dist/cli/refine-llm.d.ts +5 -31
- package/dist/cli/refine-llm.js +23 -50
- package/dist/cli/remember.d.ts +3 -3
- package/dist/cli/remember.js +134 -192
- package/dist/cli/scheduler.d.ts +2 -17
- package/dist/cli/scheduler.js +14 -19
- package/dist/cli/serve.js +23 -14
- package/dist/cli/session-hooks.d.ts +11 -19
- package/dist/cli/session-hooks.js +143 -214
- package/dist/cli/setup.d.ts +4 -4
- package/dist/cli/setup.js +35 -30
- package/dist/cli/shared.d.ts +7 -25
- package/dist/cli/shared.js +17 -60
- package/dist/cli/slack.d.ts +2 -2
- package/dist/cli/slack.js +19 -23
- package/dist/cli/sleep-render.js +6 -3
- package/dist/cli/sleep.d.ts +3 -2
- package/dist/cli/sleep.js +17 -49
- package/dist/cli/status.d.ts +11 -14
- package/dist/cli/status.js +74 -120
- package/dist/cli/stdin.d.ts +4 -6
- package/dist/cli/stdin.js +2 -3
- package/dist/cli/transfer.d.ts +9 -9
- package/dist/cli/transfer.js +87 -108
- package/dist/cli/usage.d.ts +0 -79
- package/dist/cli/usage.js +1 -689
- package/dist/cli/verb-row.d.ts +32 -0
- package/dist/cli/verb-row.js +6 -0
- package/dist/cli/verbs/health.d.ts +27 -0
- package/dist/cli/verbs/health.js +232 -0
- package/dist/cli/verbs/memory.d.ts +16 -0
- package/dist/cli/verbs/memory.js +244 -0
- package/dist/cli/verbs/objects.d.ts +20 -0
- package/dist/cli/verbs/objects.js +254 -0
- package/dist/cli/verbs/sessions.d.ts +31 -0
- package/dist/cli/verbs/sessions.js +312 -0
- package/dist/cli/verbs.d.ts +81 -0
- package/dist/cli/verbs.js +7 -0
- package/dist/cli/versioned-verbs.d.ts +51 -0
- package/dist/cli/versioned-verbs.js +79 -0
- package/dist/cli.d.ts +1 -654
- package/dist/cli.js +44 -510
- package/dist/connectors/dlq.d.ts +39 -3
- package/dist/connectors/dlq.js +37 -3
- package/dist/connectors/github/backfill.d.ts +5 -25
- package/dist/connectors/github/backfill.js +26 -52
- package/dist/connectors/github/deletion.d.ts +4 -18
- package/dist/connectors/github/deletion.js +2 -15
- package/dist/connectors/github/dlq.d.ts +8 -33
- package/dist/connectors/github/dlq.js +34 -93
- package/dist/connectors/github/ingest.d.ts +4 -12
- package/dist/connectors/github/ingest.js +5 -36
- package/dist/connectors/github/octokit-client.d.ts +4 -16
- package/dist/connectors/github/octokit-client.js +27 -24
- package/dist/connectors/github/ratelimit.d.ts +3 -14
- package/dist/connectors/github/ratelimit.js +3 -14
- package/dist/connectors/github/scope.d.ts +3 -5
- package/dist/connectors/github/scope.js +3 -5
- package/dist/connectors/github/signature.d.ts +4 -26
- package/dist/connectors/github/signature.js +4 -26
- package/dist/connectors/github/tenant-routing.d.ts +2 -24
- package/dist/connectors/github/tenant-routing.js +4 -26
- package/dist/connectors/github/transform.js +2 -16
- package/dist/connectors/github/types.d.ts +3 -15
- package/dist/connectors/github/types.js +2 -9
- package/dist/connectors/github/webhook.d.ts +3 -16
- package/dist/connectors/github/webhook.js +38 -23
- package/dist/connectors/ingest.d.ts +10 -0
- package/dist/connectors/ingest.js +28 -0
- package/dist/connectors/slack/backfill.d.ts +4 -17
- package/dist/connectors/slack/backfill.js +4 -13
- package/dist/connectors/slack/dlq.d.ts +2 -19
- package/dist/connectors/slack/dlq.js +51 -90
- package/dist/connectors/slack/ingest.d.ts +4 -9
- package/dist/connectors/slack/ingest.js +4 -30
- package/dist/connectors/slack/scope.d.ts +2 -8
- package/dist/connectors/slack/scope.js +2 -8
- package/dist/connectors/slack/signature.d.ts +1 -6
- package/dist/connectors/slack/tenant-routing.d.ts +2 -19
- package/dist/connectors/slack/tenant-routing.js +2 -21
- package/dist/connectors/slack/transform.d.ts +2 -18
- package/dist/connectors/slack/transform.js +2 -18
- package/dist/connectors/slack/types.d.ts +3 -9
- package/dist/connectors/slack/types.js +2 -4
- package/dist/connectors/slack/web-client.js +33 -27
- package/dist/connectors/slack/webhook.d.ts +3 -19
- package/dist/connectors/slack/webhook.js +6 -26
- package/dist/connectors/slack/workspaces.d.ts +4 -24
- package/dist/connectors/slack/workspaces.js +4 -24
- package/dist/consolidate/conflicts.js +7 -15
- package/dist/consolidate/dag-summary.d.ts +8 -0
- package/dist/consolidate/dag-summary.js +41 -0
- package/dist/consolidate/dag.d.ts +5 -28
- package/dist/consolidate/dag.js +29 -84
- package/dist/consolidate/decay.js +7 -19
- package/dist/consolidate/dedupe.d.ts +13 -52
- package/dist/consolidate/dedupe.js +18 -74
- package/dist/consolidate/flush-units.d.ts +3 -4
- package/dist/consolidate/flush-units.js +3 -3
- package/dist/consolidate/half-life-migration.d.ts +3 -26
- package/dist/consolidate/half-life-migration.js +11 -28
- package/dist/consolidate/llm-passes.js +49 -40
- package/dist/consolidate/memory-value-weights.d.ts +2 -13
- package/dist/consolidate/memory-value-weights.js +2 -13
- package/dist/consolidate/memory-value.d.ts +11 -84
- package/dist/consolidate/memory-value.js +18 -105
- package/dist/consolidate/merge.js +12 -33
- package/dist/consolidate/physics-pass.d.ts +6 -1
- package/dist/consolidate/physics-pass.js +27 -9
- package/dist/consolidate/replay.d.ts +6 -38
- package/dist/consolidate/replay.js +25 -56
- package/dist/consolidate/run.js +1 -1
- package/dist/consolidate/sleep.d.ts +1 -8
- package/dist/consolidate/sleep.js +13 -22
- package/dist/consolidate/trace.d.ts +3 -18
- package/dist/consolidate/trace.js +3 -18
- package/dist/consolidate/traces.js +9 -25
- package/dist/core/ablation.d.ts +14 -91
- package/dist/core/ablation.js +16 -91
- package/dist/core/active-scope.d.ts +7 -0
- package/dist/{sharing/scope.js → core/active-scope.js} +5 -12
- package/dist/core/ambient.d.ts +5 -8
- package/dist/core/ambient.js +40 -26
- package/dist/core/api-errors.d.ts +16 -0
- package/dist/core/api-errors.js +20 -0
- package/dist/core/capture-contract.d.ts +4 -2
- package/dist/core/capture-contract.js +4 -2
- package/dist/core/card.d.ts +4 -1
- package/dist/core/card.js +11 -1
- package/dist/core/compaction-timing.d.ts +7 -0
- package/dist/core/compaction-timing.js +9 -0
- package/dist/core/compare.d.ts +11 -67
- package/dist/core/compare.js +9 -63
- package/dist/core/config.d.ts +10 -24
- package/dist/core/config.js +20 -16
- package/dist/core/cosine.d.ts +3 -0
- package/dist/core/cosine.js +19 -0
- package/dist/core/handoff.d.ts +1 -7
- package/dist/core/handoff.js +1 -7
- package/dist/core/markdown.d.ts +6 -0
- package/dist/{store → core}/markdown.js +23 -22
- package/dist/core/memory-audit.d.ts +17 -0
- package/dist/core/memory-audit.js +54 -0
- package/dist/core/memory-quality.js +1 -1
- package/dist/core/memory.d.ts +51 -168
- package/dist/core/memory.js +76 -239
- package/dist/{consolidate → core}/merged-row.d.ts +1 -1
- package/dist/{consolidate → core}/merged-row.js +3 -2
- package/dist/core/package-root.d.ts +3 -0
- package/dist/core/package-root.js +5 -0
- package/dist/core/physics-config.d.ts +1 -4
- package/dist/core/physics-config.js +3 -8
- package/dist/core/physics.d.ts +15 -61
- package/dist/core/physics.js +65 -138
- package/dist/core/prediction.d.ts +3 -0
- package/dist/core/prediction.js +6 -0
- package/dist/core/project-identity.d.ts +20 -58
- package/dist/core/project-identity.js +27 -39
- package/dist/core/project-remote.js +13 -2
- package/dist/core/raw-append-only.d.ts +5 -0
- package/dist/core/raw-append-only.js +7 -0
- package/dist/core/recall-scope.d.ts +69 -0
- package/dist/core/recall-scope.js +138 -0
- package/dist/core/salience.d.ts +1 -7
- package/dist/core/salience.js +1 -7
- package/dist/dashboard/dashboard-actions.js +2 -2
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
- package/dist/dashboard/dashboard-snapshot.js +11 -2
- package/dist/dashboard/dashboard-types.d.ts +2 -1
- package/dist/dashboard/dashboard.d.ts +1 -0
- package/dist/dashboard/dashboard.js +50 -4
- package/dist/db/busy.d.ts +3 -8
- package/dist/db/busy.js +37 -33
- package/dist/db/connect.js +7 -8
- package/dist/db/index.d.ts +3 -3
- package/dist/db/index.js +3 -3
- package/dist/db/migrate.js +3 -3
- 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 -5
- package/dist/db/migrations/v14.js +2 -3
- package/dist/db/migrations/v15.js +2 -8
- package/dist/db/migrations/v16.js +2 -3
- package/dist/db/migrations/v17.js +2 -3
- package/dist/db/migrations/v19.js +2 -5
- package/dist/db/migrations/v20.js +2 -7
- package/dist/db/migrations/v22.js +4 -17
- package/dist/db/migrations/v23.js +3 -14
- package/dist/db/migrations/v24.js +2 -4
- package/dist/db/migrations/v25.js +3 -8
- package/dist/db/migrations/v26.js +2 -13
- package/dist/db/migrations/v27.js +3 -11
- package/dist/db/migrations/v28.js +2 -14
- package/dist/db/migrations/v29.js +4 -18
- package/dist/db/migrations/v30.js +4 -16
- package/dist/db/migrations/v31.js +2 -15
- package/dist/db/migrations/v32.js +4 -22
- package/dist/db/migrations/v33.js +2 -15
- package/dist/db/migrations/v34.js +2 -11
- package/dist/db/migrations/v35.js +2 -11
- package/dist/db/migrations/v36.js +2 -11
- package/dist/db/migrations/v37.js +8 -33
- package/dist/db/migrations/v38.js +5 -38
- package/dist/db/migrations/v39.js +9 -20
- package/dist/db/migrations/v40.js +2 -9
- package/dist/db/migrations/v41.js +2 -24
- package/dist/db/migrations/v43.js +1 -1
- package/dist/db/migrations/v44.js +2 -8
- package/dist/db/migrations/v45.js +2 -7
- package/dist/db/migrations/v47.js +2 -3
- package/dist/db/migrations/v51.js +1 -1
- package/dist/db/migrations/v55.d.ts +3 -0
- package/dist/db/migrations/v55.js +17 -0
- package/dist/db/open.d.ts +2 -2
- package/dist/db/open.js +21 -9
- package/dist/db/physics-state.d.ts +6 -22
- package/dist/db/physics-state.js +28 -39
- package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
- package/dist/db/raw-archive-mirror-cleanup.js +2 -17
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -2
- package/dist/db/vector-store.d.ts +2 -0
- package/dist/db/vector-store.js +25 -5
- package/dist/db/wal-checkpointer.js +2 -1
- package/dist/doctor.js +85 -27
- package/dist/embeddings/local.d.ts +62 -0
- package/dist/embeddings/local.js +146 -0
- package/dist/embeddings/provider.d.ts +43 -0
- package/dist/{store/embeddings → embeddings}/provider.js +58 -83
- package/dist/embeddings/transformers.d.ts +26 -0
- package/dist/embeddings/transformers.js +89 -0
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +3 -2
- package/dist/eval/eval-stats.d.ts +15 -53
- package/dist/eval/eval-stats.js +12 -42
- package/dist/eval/eval-suite.d.ts +2 -13
- package/dist/eval/eval-suite.js +91 -45
- package/dist/eval/eval.d.ts +6 -24
- package/dist/eval/eval.js +8 -35
- package/dist/eval/judgment.d.ts +0 -3
- package/dist/eval/judgment.js +30 -15
- package/dist/extensions/openclaw-plugin/index.js +1 -1
- package/dist/graph/extract.d.ts +5 -27
- package/dist/graph/extract.js +10 -36
- package/dist/graph/recall.d.ts +7 -20
- package/dist/graph/recall.js +15 -77
- package/dist/graph/stream.d.ts +7 -39
- package/dist/graph/stream.js +11 -34
- package/dist/graph/view.d.ts +9 -35
- package/dist/graph/view.js +24 -44
- package/dist/graph/write.d.ts +1 -1
- package/dist/graph/write.js +9 -9
- package/dist/hooks/codex-session.js +3 -2
- package/dist/hooks/codex-wrapper.js +4 -3
- package/dist/hooks/copilot.js +2 -1
- package/dist/hooks/hook-blocks.d.ts +6 -2
- package/dist/hooks/hook-blocks.js +37 -124
- package/dist/hooks/json-hooks.d.ts +4 -36
- package/dist/hooks/json-hooks.js +22 -59
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +17 -81
- package/dist/hooks/shared.d.ts +6 -21
- package/dist/hooks/shared.js +31 -33
- package/dist/importers/core.d.ts +12 -37
- package/dist/importers/core.js +10 -28
- package/dist/importers/markdown-parse.d.ts +8 -22
- package/dist/importers/markdown-parse.js +8 -25
- package/dist/importers/markdown.js +3 -12
- package/dist/importers/sources.js +12 -39
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +31 -85
- package/dist/index.d.ts +8 -3
- package/dist/index.js +8 -3
- package/dist/learn/autolearn.d.ts +23 -42
- package/dist/learn/autolearn.js +45 -52
- package/dist/learn/churn-git.js +13 -4
- package/dist/learn/extract.d.ts +3 -2
- package/dist/learn/extract.js +8 -8
- package/dist/learn/forward-claim-detector.d.ts +6 -30
- package/dist/learn/forward-claim-detector.js +18 -68
- package/dist/learn/invalidation.d.ts +6 -18
- package/dist/learn/invalidation.js +18 -31
- package/dist/mcp/admin-tools.d.ts +2 -2
- package/dist/mcp/admin-tools.js +30 -53
- package/dist/mcp/format.js +3 -2
- package/dist/mcp/framing.d.ts +1 -0
- package/dist/mcp/framing.js +1 -1
- package/dist/mcp/memory-tools.js +7 -10
- package/dist/mcp/protocol.d.ts +15 -29
- package/dist/mcp/protocol.js +26 -16
- package/dist/mcp/recall-tools.js +14 -11
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +12 -27
- package/dist/mcp/server.d.ts +3 -9
- package/dist/mcp/server.js +5 -16
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +5 -11
- package/dist/mcp/stdio.d.ts +2 -6
- package/dist/mcp/stdio.js +68 -16
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +47 -22
- package/dist/objects/customer-notes.d.ts +9 -44
- package/dist/objects/customer-notes.js +7 -48
- package/dist/objects/decisions.d.ts +14 -52
- package/dist/objects/decisions.js +15 -53
- package/dist/objects/descriptor.d.ts +1 -1
- package/dist/objects/incidents.d.ts +9 -40
- package/dist/objects/incidents.js +7 -41
- package/dist/objects/lifecycle.d.ts +1 -1
- package/dist/objects/lifecycle.js +2 -1
- package/dist/objects/policies.d.ts +13 -91
- package/dist/objects/policies.js +13 -99
- package/dist/objects/processes.d.ts +9 -54
- package/dist/objects/processes.js +7 -61
- package/dist/objects/project-briefs.d.ts +13 -57
- package/dist/objects/project-briefs.js +16 -78
- package/dist/objects/skills.d.ts +9 -44
- package/dist/objects/skills.js +8 -54
- package/dist/postinstall.js +7 -20
- package/dist/predictions/planning-fallacy.d.ts +11 -34
- package/dist/rerankers/clef.js +6 -37
- package/dist/rerankers/cross-encoder.d.ts +31 -2
- package/dist/rerankers/cross-encoder.js +65 -101
- package/dist/rerankers/index.js +5 -4
- package/dist/rerankers/jev.js +11 -10
- package/dist/rerankers/llm.d.ts +2 -11
- package/dist/rerankers/llm.js +14 -14
- package/dist/rerankers/outage-warning.d.ts +5 -2
- package/dist/rerankers/outage-warning.js +7 -4
- package/dist/rerankers/remote.d.ts +1 -0
- package/dist/rerankers/remote.js +2 -0
- package/dist/rerankers/types.d.ts +2 -14
- package/dist/search/bm25-search.js +1 -1
- package/dist/search/boosts.d.ts +0 -2
- package/dist/search/boosts.js +3 -3
- package/dist/search/embed-memories.d.ts +9 -0
- package/dist/search/embed-memories.js +377 -0
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +93 -0
- package/dist/search/hybrid.d.ts +11 -2
- package/dist/search/hybrid.js +9 -4
- package/dist/search/multihop.js +2 -3
- package/dist/search/path-context.d.ts +5 -18
- package/dist/search/path-context.js +5 -18
- package/dist/search/physics-search.d.ts +6 -3
- package/dist/search/physics-search.js +29 -19
- package/dist/search/rerank.js +1 -1
- package/dist/search/rrf.d.ts +7 -35
- package/dist/search/rrf.js +5 -30
- package/dist/search/vector.d.ts +13 -4
- package/dist/search/vector.js +40 -13
- package/dist/server/auth.d.ts +11 -28
- package/dist/server/auth.js +49 -32
- package/dist/server/boot.d.ts +2 -21
- package/dist/server/boot.js +69 -161
- package/dist/server/client-ip.d.ts +3 -21
- package/dist/server/client-ip.js +8 -30
- package/dist/server/deadline.d.ts +0 -2
- package/dist/server/deadline.js +1 -7
- package/dist/server/defaults.d.ts +4 -0
- package/dist/server/defaults.js +5 -0
- package/dist/server/key-check-bounds.d.ts +2 -1
- package/dist/server/lifecycle.d.ts +5 -4
- package/dist/server/lifecycle.js +19 -4
- package/dist/server/mcp-http.js +24 -53
- package/dist/server/rate-limit.d.ts +5 -18
- package/dist/server/rate-limit.js +4 -13
- package/dist/server/request.d.ts +4 -8
- package/dist/server/request.js +16 -19
- package/dist/server/route-checks.d.ts +7 -0
- package/dist/server/route-checks.js +42 -0
- package/dist/server/route-table.d.ts +9 -8
- package/dist/server/route-table.js +127 -139
- package/dist/server/routes/admin.d.ts +8 -8
- package/dist/server/routes/admin.js +35 -49
- package/dist/server/routes/customer-notes.d.ts +6 -6
- package/dist/server/routes/customer-notes.js +8 -14
- package/dist/server/routes/decisions.d.ts +6 -6
- package/dist/server/routes/decisions.js +12 -21
- package/dist/server/routes/incidents.d.ts +6 -6
- package/dist/server/routes/incidents.js +14 -25
- package/dist/server/routes/memories.d.ts +9 -9
- package/dist/server/routes/memories.js +20 -63
- package/dist/server/routes/object-routes.d.ts +6 -11
- package/dist/server/routes/object-routes.js +11 -22
- package/dist/server/routes/policies.d.ts +7 -7
- package/dist/server/routes/policies.js +12 -22
- package/dist/server/routes/predictions.d.ts +6 -6
- package/dist/server/routes/predictions.js +22 -38
- package/dist/server/routes/processes.d.ts +6 -6
- package/dist/server/routes/processes.js +17 -28
- package/dist/server/routes/project-briefs.d.ts +7 -7
- package/dist/server/routes/project-briefs.js +11 -20
- package/dist/server/routes/recall.d.ts +5 -5
- package/dist/server/routes/recall.js +16 -45
- package/dist/server/routes/skills.d.ts +7 -7
- package/dist/server/routes/skills.js +10 -22
- package/dist/server/server-detect.d.ts +15 -53
- package/dist/server/server-detect.js +55 -96
- package/dist/server/sleep-child.js +26 -7
- package/dist/server/sleep-offload.d.ts +11 -5
- package/dist/server/sleep-offload.js +21 -12
- package/dist/server/types.d.ts +32 -18
- package/dist/server/validation.d.ts +3 -2
- package/dist/server/validation.js +15 -33
- package/dist/server.d.ts +7 -6
- package/dist/server.js +8 -6
- package/dist/sharing/global-store.d.ts +19 -0
- package/dist/sharing/global-store.js +75 -0
- package/dist/sharing/global-sync.d.ts +6 -0
- package/dist/sharing/global-sync.js +73 -0
- package/dist/sharing/project-merge.d.ts +11 -19
- package/dist/sharing/project-merge.js +63 -125
- package/dist/sharing/search-both.d.ts +60 -0
- package/dist/sharing/search-both.js +138 -0
- package/dist/sharing/share.d.ts +40 -0
- package/dist/sharing/share.js +229 -0
- package/dist/store/ambient.js +9 -15
- package/dist/store/audit-event.d.ts +5 -13
- package/dist/store/audit-event.js +4 -12
- package/dist/store/audit.d.ts +2 -21
- package/dist/store/audit.js +8 -67
- package/dist/store/auth.d.ts +10 -8
- package/dist/store/auth.js +17 -12
- package/dist/store/candidates.d.ts +23 -5
- package/dist/store/candidates.js +119 -71
- package/dist/store/capture-write.d.ts +17 -0
- package/dist/store/capture-write.js +35 -0
- package/dist/store/card-detail.d.ts +2 -1
- package/dist/store/card-detail.js +2 -1
- package/dist/store/cards.d.ts +14 -9
- package/dist/store/cards.js +72 -126
- package/dist/store/compaction-caller.d.ts +18 -0
- package/dist/store/compaction-caller.js +29 -0
- package/dist/store/compactions-record.d.ts +115 -0
- package/dist/store/compactions-record.js +417 -0
- package/dist/store/compactions.js +6 -4
- package/dist/store/conflicts.d.ts +4 -21
- package/dist/store/conflicts.js +76 -152
- package/dist/store/connectors/dlq.d.ts +10 -0
- package/dist/store/connectors/dlq.js +32 -0
- package/dist/store/connectors/github.d.ts +14 -16
- package/dist/store/connectors/github.js +34 -57
- package/dist/store/connectors/slack.d.ts +2 -11
- package/dist/store/connectors/slack.js +18 -47
- package/dist/store/dashboard-reads.js +11 -14
- package/dist/store/delete-and-batch.d.ts +17 -31
- package/dist/store/delete-and-batch.js +84 -67
- package/dist/store/delivery-recorder.d.ts +15 -4
- package/dist/store/delivery-recorder.js +34 -17
- package/dist/store/descendant-page.js +6 -3
- package/dist/store/diagnostics.js +6 -13
- package/dist/store/dormant.d.ts +8 -30
- package/dist/store/dormant.js +18 -57
- package/dist/store/embeddings/index.d.ts +11 -90
- package/dist/store/embeddings/index.js +18 -523
- package/dist/store/entry-reads.d.ts +34 -61
- package/dist/store/entry-reads.js +111 -136
- package/dist/store/entry-row.d.ts +6 -35
- package/dist/store/entry-row.js +9 -37
- package/dist/store/entry-writes.d.ts +12 -18
- package/dist/store/entry-writes.js +46 -44
- package/dist/store/failure-log-at.d.ts +8 -0
- package/dist/store/failure-log-at.js +16 -0
- package/dist/store/failure-log.d.ts +2 -2
- package/dist/store/failure-log.js +5 -3
- package/dist/{trust → store}/gated-write.d.ts +3 -1
- package/dist/{trust → store}/gated-write.js +7 -5
- package/dist/store/goals.d.ts +3 -40
- package/dist/store/goals.js +41 -178
- package/dist/store/graph-queue.d.ts +6 -22
- package/dist/store/graph-queue.js +14 -45
- package/dist/store/graph-reads.d.ts +11 -35
- package/dist/store/graph-reads.js +24 -60
- package/dist/store/graph-rows.d.ts +3 -6
- package/dist/store/graph-rows.js +6 -9
- package/dist/store/graph-view-rows.d.ts +2 -1
- package/dist/store/graph-view-rows.js +2 -1
- package/dist/store/graph-writes.d.ts +10 -35
- package/dist/store/graph-writes.js +59 -106
- package/dist/store/half-life.d.ts +2 -1
- package/dist/store/half-life.js +14 -16
- package/dist/store/handoffs.d.ts +6 -12
- package/dist/store/handoffs.js +22 -40
- package/dist/store/index-and-stats.d.ts +6 -19
- package/dist/store/index-and-stats.js +36 -84
- package/dist/store/key-writes.js +1 -1
- package/dist/store/ledger-turn.d.ts +9 -0
- package/dist/store/ledger-turn.js +38 -0
- package/dist/store/mirrors.d.ts +2 -6
- package/dist/store/mirrors.js +24 -29
- package/dist/store/open.d.ts +0 -4
- package/dist/store/open.js +42 -62
- package/dist/store/pilot-arm.d.ts +12 -0
- package/dist/store/pilot-arm.js +42 -0
- package/dist/store/planning-fallacy-evidence.d.ts +2 -30
- package/dist/store/planning-fallacy-evidence.js +8 -37
- package/dist/store/port.d.ts +91 -82
- package/dist/store/port.js +8 -0
- package/dist/store/predictions.d.ts +12 -53
- package/dist/store/predictions.js +41 -125
- package/dist/store/project-tags.d.ts +62 -0
- package/dist/store/project-tags.js +67 -0
- package/dist/{cli → store}/quality-repair.js +15 -31
- package/dist/store/quarantine.js +2 -1
- package/dist/store/raw-archive.d.ts +4 -16
- package/dist/store/raw-archive.js +14 -29
- package/dist/store/recall-trace.d.ts +12 -77
- package/dist/store/recall-trace.js +37 -97
- package/dist/store/rejected-values.js +9 -20
- package/dist/store/rejection-probe.d.ts +4 -0
- package/dist/store/rejection-probe.js +19 -0
- package/dist/store/rejection.d.ts +10 -73
- package/dist/store/rejection.js +12 -84
- package/dist/store/report-reads.d.ts +6 -0
- package/dist/store/report-reads.js +29 -0
- package/dist/store/rows.d.ts +9 -19
- package/dist/store/rows.js +36 -34
- package/dist/store/rule-sql.d.ts +14 -0
- package/dist/store/rule-sql.js +56 -0
- package/dist/store/search-rows.d.ts +7 -38
- package/dist/store/search-rows.js +23 -54
- package/dist/store/sessions.d.ts +10 -47
- package/dist/store/sessions.js +21 -75
- package/dist/store/set-aside.d.ts +14 -0
- package/dist/store/set-aside.js +23 -0
- package/dist/store/sqlite/busy.d.ts +3 -0
- package/dist/store/sqlite/busy.js +8 -0
- package/dist/store/sqlite/connector-events-group.js +5 -8
- package/dist/store/sqlite/connector-writes-group.js +3 -3
- package/dist/store/sqlite/entry-writes-group.js +4 -4
- package/dist/store/sqlite/error-codec.js +8 -5
- package/dist/store/sqlite/executor.d.ts +2 -1
- package/dist/store/sqlite/executor.js +12 -5
- package/dist/store/sqlite/graph-reads-group.js +1 -1
- package/dist/store/sqlite/held-connection.d.ts +9 -0
- package/dist/store/sqlite/held-connection.js +41 -0
- package/dist/store/sqlite/local.d.ts +3 -3
- package/dist/store/sqlite/local.js +1 -0
- package/dist/store/sqlite/object-rows.d.ts +1 -1
- package/dist/store/sqlite/object-rows.js +6 -3
- package/dist/store/sqlite/objects-group.d.ts +1 -1
- package/dist/store/sqlite/objects-group.js +5 -3
- package/dist/store/sqlite/quarantine-group.js +2 -2
- package/dist/store/sqlite/store.d.ts +1 -4
- package/dist/store/sqlite/store.js +16 -15
- package/dist/store/sqlite/vector-reads-group.js +2 -2
- package/dist/store/sqlite/worker-jobs.js +1 -1
- package/dist/store/sqlite/worker-ops.d.ts +13 -2
- package/dist/store/sqlite/worker-ops.js +13 -2
- package/dist/store/sqlite/worker-store.js +5 -2
- package/dist/store/summaries.d.ts +11 -63
- package/dist/store/summaries.js +37 -148
- package/dist/store/summary-dirty.js +1 -1
- package/dist/store/tenant-lookup.d.ts +6 -1
- package/dist/store/tenant-lookup.js +7 -0
- package/dist/store/tenant.d.ts +2 -16
- package/dist/store/tenant.js +4 -19
- package/dist/store/token-ledger.d.ts +13 -50
- package/dist/store/token-ledger.js +19 -85
- package/dist/store/usage-reports.js +5 -13
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +171 -0
- package/dist/store/working-memory.d.ts +6 -25
- package/dist/store/working-memory.js +18 -52
- package/dist/support-bundle.js +9 -8
- package/dist/trust/reject-flow.js +3 -5
- package/dist/util/agent-homes.d.ts +15 -0
- package/dist/util/agent-homes.js +34 -0
- package/dist/util/anthropic-messages.d.ts +3 -0
- package/dist/util/anthropic-messages.js +35 -6
- package/dist/util/atomic-write.d.ts +2 -1
- package/dist/util/atomic-write.js +35 -4
- package/dist/util/capped-json.d.ts +6 -0
- package/dist/util/capped-json.js +46 -0
- package/dist/util/chunked.d.ts +3 -0
- package/dist/util/chunked.js +10 -0
- package/dist/util/crash-handlers.d.ts +8 -1
- package/dist/util/crash-handlers.js +52 -10
- package/dist/util/ellipsize.d.ts +3 -0
- package/dist/util/ellipsize.js +5 -0
- package/dist/util/env.d.ts +14 -6
- package/dist/util/env.js +15 -7
- package/dist/util/format.d.ts +3 -0
- package/dist/util/format.js +6 -0
- package/dist/util/home-path.d.ts +2 -1
- package/dist/util/home-path.js +4 -2
- package/dist/util/hook-payload.d.ts +8 -0
- package/dist/util/hook-payload.js +37 -0
- package/dist/util/http-retry.d.ts +9 -1
- package/dist/util/http-retry.js +67 -8
- package/dist/util/http-util.d.ts +0 -8
- package/dist/util/http-util.js +10 -21
- package/dist/util/limits.d.ts +7 -0
- package/dist/util/limits.js +14 -0
- package/dist/util/log.d.ts +7 -2
- package/dist/util/log.js +34 -9
- package/dist/util/request-scope.d.ts +5 -2
- package/dist/util/request-scope.js +13 -7
- package/dist/util/secret-detect.d.ts +5 -30
- package/dist/util/secret-detect.js +19 -40
- package/dist/util/sqlite-blocked.d.ts +2 -0
- package/dist/util/sqlite-blocked.js +5 -0
- package/dist/util/stored-json.d.ts +1 -1
- package/dist/util/stored-json.js +1 -1
- package/dist/util/stream-tee.d.ts +3 -0
- package/dist/util/stream-tee.js +35 -0
- package/dist/util/time.d.ts +4 -0
- package/dist/util/time.js +4 -0
- package/dist/util/token-text.d.ts +1 -4
- package/dist/util/token-text.js +1 -4
- package/dist/util/transcript-tail.d.ts +2 -0
- package/dist/util/transcript-tail.js +24 -23
- package/dist/util/version.d.ts +5 -20
- package/dist/util/version.js +5 -20
- package/dist/{store → util}/yaml.d.ts +1 -5
- package/dist/{store → util}/yaml.js +2 -6
- package/extensions/openclaw-plugin/index.ts +1 -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 -2
- package/dist/cli/provenance-coverage.d.ts +0 -18
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/sharing/scope.d.ts +0 -14
- package/dist/sharing/shared.d.ts +0 -187
- package/dist/sharing/shared.js +0 -563
- package/dist/store/embeddings/local.d.ts +0 -15
- package/dist/store/embeddings/local.js +0 -192
- package/dist/store/embeddings/provider.d.ts +0 -77
- package/dist/store/markdown.d.ts +0 -10
- package/dist/store/recall-scope.d.ts +0 -138
- package/dist/store/recall-scope.js +0 -216
- package/dist/store/vector-writes.d.ts +0 -13
- package/dist/store/vector-writes.js +0 -89
- /package/dist/{store → core}/object-types.d.ts +0 -0
- /package/dist/{store → core}/object-types.js +0 -0
- /package/dist/{cli → store}/quality-repair.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.js +0 -0
|
@@ -1,78 +1,50 @@
|
|
|
1
1
|
import type { MemoryEntry } from '../core/memory.js';
|
|
2
2
|
import { type DatabaseSyncLike } from '../db/index.js';
|
|
3
3
|
export declare const TENANT_IS = "+tenant_id = ?";
|
|
4
|
-
/**
|
|
5
|
-
* Read a memory entry by ID.
|
|
6
|
-
*
|
|
7
|
-
* When `tenantId` is provided, the read is scoped to that tenant (cross-tenant
|
|
8
|
-
* lookups return null). When omitted, no tenant filter is applied — preserves
|
|
9
|
-
* legacy single-tenant callers and the writeEntry/readEntry round-trip.
|
|
10
|
-
*/
|
|
4
|
+
/** Read a memory entry by ID. With `tenantId` the read is tenant-scoped (cross-tenant returns null); omitted, no tenant filter is applied. */
|
|
11
5
|
export declare function readEntry(hippoRoot: string, id: string, tenantId?: string): MemoryEntry | null;
|
|
12
|
-
/** Ids per `IN (...)` list: far under SQLite's bound-parameter limit, with room for the tenant filter. */
|
|
13
|
-
export declare const ID_CHUNK = 500;
|
|
14
|
-
/** `items` in consecutive slices of at most `size`. */
|
|
15
|
-
export declare function chunked<T>(items: readonly T[], size?: number): T[][];
|
|
16
6
|
/** Answers whether a tenant's rows in this store hold an id: `ids` are looked up now, one query per chunk, and any other id on its first ask. */
|
|
17
7
|
export declare function heldIdLookup(hippoRoot: string, tenantId: string, ids: readonly string[]): (id: string) => boolean;
|
|
18
8
|
/** Rows by id on the caller's handle, one query per chunk; an id missing or in another tenant is absent from the map. */
|
|
19
9
|
export declare function selectEntriesByIds(db: DatabaseSyncLike, ids: readonly string[], tenantId?: string): Map<string, MemoryEntry>;
|
|
20
10
|
/** Direct children of each parent, one query per chunk; each list is in `created ASC, id ASC` order. */
|
|
21
11
|
export declare function selectChildrenByParent(db: DatabaseSyncLike, parentIds: readonly string[], tenantId?: string): Map<string, MemoryEntry[]>;
|
|
22
|
-
/**
|
|
23
|
-
* Batched lookup. Caps at 500 ids per call to keep the IN(?,?,...) clause
|
|
24
|
-
* within SQLite limits. Tenant filter is enforced when `tenantId` is passed.
|
|
25
|
-
* Used by DAG-aware recall to fetch parent summaries for a set of overflowed leaves.
|
|
26
|
-
*/
|
|
12
|
+
/** Batched lookup, capped at 500 ids per call to keep IN(?,?,...) within SQLite limits; tenant filter enforced when `tenantId` is passed. */
|
|
27
13
|
export declare function loadEntriesByIds(hippoRoot: string, ids: readonly string[], tenantId?: string): MemoryEntry[];
|
|
28
|
-
/**
|
|
29
|
-
*
|
|
30
|
-
* oldest-first. Used by `api.assemble` to walk a session's chronological
|
|
31
|
-
* context. Excludes superseded rows.
|
|
32
|
-
*
|
|
33
|
-
* Cap semantics: when `cap` is provided, the NEWEST `cap` rows are loaded (DESC LIMIT server-side,
|
|
34
|
-
* reversed client-side); ASC + LIMIT would drop the newest rows and break fresh-tail in assemble.
|
|
35
|
-
*
|
|
36
|
-
* Returns `[]` for an empty sessionId. Final order: `created ASC, id ASC`.
|
|
37
|
-
*/
|
|
14
|
+
/** All `kind='raw'` rows for a session, tenant-scoped, oldest-first, excluding superseded; `[]` for an empty sessionId.
|
|
15
|
+
* With `cap`, the NEWEST rows are loaded (DESC LIMIT, reversed client-side); ASC + LIMIT would drop the newest and break fresh-tail in assemble. */
|
|
38
16
|
export declare function loadSessionRawMemories(hippoRoot: string, sessionId: string, tenantId?: string, cap?: number, origins?: readonly string[]): MemoryEntry[];
|
|
39
|
-
/**
|
|
40
|
-
*
|
|
41
|
-
* the full session size even when `rowCap` truncates the loaded window,
|
|
42
|
-
* WITHOUT leaking rows the caller wouldn't have been allowed to load.
|
|
43
|
-
*
|
|
44
|
-
* An unscoped COUNT would let a no-scope caller infer private rows by comparing `totalRaw`
|
|
45
|
-
* against `items.length`, so this SQL-encodes the default-deny rule `passesScopeFilterForRecall` applies in TS:
|
|
46
|
-
* - explicit scope passed: exact-match
|
|
47
|
-
* - no scope: `scopeAdmitSql`'s default deny, which admits `ownScope`, the caller's personal scope.
|
|
48
|
-
*
|
|
49
|
-
* `tenantId` is optional for back-compat. Pass `undefined` only when
|
|
50
|
-
* intentionally counting cross-tenant; `assemble()` passes `ctx.tenantId`.
|
|
51
|
-
*/
|
|
17
|
+
/** Pre-cap, scope-aware row count for a session, so `assemble` reports the full size without leaking rows the caller could not load. Mirrors
|
|
18
|
+
* `passesScopeFilterForRecall`'s default-deny: explicit scope matches exactly, none admits only `ownScope`. `tenantId` undefined counts cross-tenant. */
|
|
52
19
|
export declare function countSessionRawMemories(hippoRoot: string, sessionId: string, tenantId?: string, scope?: string, ownScope?: string, origins?: readonly string[]): number;
|
|
53
|
-
/**
|
|
54
|
-
*
|
|
55
|
-
* `sessionId` is supplied, also constrains to a specific session — that
|
|
56
|
-
* is the correct shape for "what did I just see in THIS session."
|
|
57
|
-
*
|
|
58
|
-
* Without `sessionId`, concurrent sessions in a tenant surface each other's rows as fresh tail;
|
|
59
|
-
* pass undefined only for "anything new across the whole tenant".
|
|
60
|
-
*
|
|
61
|
-
* Bounded count cap at 200 — beyond that the caller should filter via
|
|
62
|
-
* tags/scope rather than time-windowed recall.
|
|
63
|
-
*
|
|
64
|
-
* The tenant-wide shape is the back-compat default but discouraged; `api.recall` throws
|
|
65
|
-
* `RecallContractError` for it when `HIPPO_REQUIRE_SESSION_SCOPED_FRESH_TAIL=1` is set.
|
|
66
|
-
*/
|
|
20
|
+
/** Last N kind='raw' memories by `created` desc, tenant-scoped, max 200; pass `sessionId` or concurrent sessions show up in each other's fresh tail.
|
|
21
|
+
* The tenant-wide shape is discouraged: `api.recall` throws `RecallContractError` for it when `HIPPO_REQUIRE_SESSION_SCOPED_FRESH_TAIL=1`. */
|
|
67
22
|
export declare function loadFreshRawMemories(hippoRoot: string, count: number, tenantId?: string, sessionId?: string, origins?: readonly string[]): MemoryEntry[];
|
|
68
|
-
/**
|
|
69
|
-
* Load all entries from SQLite.
|
|
70
|
-
*
|
|
71
|
-
* When `tenantId` is provided, results are scoped to that tenant. Omitting it
|
|
72
|
-
* yields all rows (legacy behavior used by consolidate/autolearn etc.). Recall
|
|
73
|
-
* paths that surface results to a user MUST pass a resolved tenant.
|
|
74
|
-
*/
|
|
23
|
+
/** Load all entries from SQLite; omitting `tenantId` yields all rows (legacy). Recall paths that surface results to a user MUST pass a resolved tenant. */
|
|
75
24
|
export declare function loadAllEntries(hippoRoot: string, tenantId?: string): MemoryEntry[];
|
|
25
|
+
/** Every tenant's memory ids in loadAllEntries' order, for a caller that reads the rows a page at a time instead of holding them all. */
|
|
26
|
+
export declare function loadAllEntryIds(hippoRoot: string): string[];
|
|
27
|
+
/** How many memory rows the store holds across every tenant. */
|
|
28
|
+
export declare function countAllEntries(hippoRoot: string): number;
|
|
29
|
+
/** A superset, in loadAllEntries' order, of the rows whose lowercased content holds any of `tokens` or whose lowercased tags hold `tag`.
|
|
30
|
+
* The caller re-checks each row exactly; this only spares decoding rows that cannot match. */
|
|
31
|
+
export declare function loadEntriesMentioning(hippoRoot: string, tokens: readonly string[], tag: string, tenantId?: string): MemoryEntry[];
|
|
32
|
+
export interface EntryTextKey {
|
|
33
|
+
id: string;
|
|
34
|
+
tenantId: string;
|
|
35
|
+
content: string;
|
|
36
|
+
source: string;
|
|
37
|
+
}
|
|
38
|
+
/** Every tenant's rows in loadAllEntries' order, with only the columns that say whether another store already holds each. */
|
|
39
|
+
export declare function loadEntryTextKeys(hippoRoot: string): EntryTextKey[];
|
|
40
|
+
export interface EntriesWithBase {
|
|
41
|
+
entries: MemoryEntry[];
|
|
42
|
+
base: {
|
|
43
|
+
get(id: string): MemoryEntry | undefined;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/** Every entry plus a by-id lookup of each as loaded, rebuilt from its row on first use, so no deep copy of the store is kept. */
|
|
47
|
+
export declare function loadAllEntriesWithBase(hippoRoot: string): EntriesWithBase;
|
|
76
48
|
/** Every memory row on an open connection, so a caller can read inside its own transaction. */
|
|
77
49
|
export declare function selectAllEntries(db: DatabaseSyncLike, tenantId?: string): MemoryEntry[];
|
|
78
50
|
/** Live rows whose source starts with `prefix`, on the caller's handle; LIKE folds case, so the prefix is checked again exactly. */
|
|
@@ -115,7 +87,8 @@ export declare function selectRowsOutsideSourcePrefixAt(db: DatabaseSyncLike, te
|
|
|
115
87
|
content: string;
|
|
116
88
|
source: string;
|
|
117
89
|
}>;
|
|
118
|
-
/** Content of a tenant's live rows written by `source` and tagged `tag` that no extraction produced,
|
|
90
|
+
/** Content of a tenant's live rows written by `source` and tagged `tag` that no extraction produced,
|
|
91
|
+
* in loadAllEntries' order and in every scope; `exceptSessionId` drops one session's own rows. */
|
|
119
92
|
export declare function loadLiveContentsBySourceAndTag(hippoRoot: string, tenantId: string, source: string, tag: string, exceptSessionId: string): string[];
|
|
120
93
|
/** Every tenant's distilled rows nothing has superseded, in loadAllEntries' order: the rows that can be each other's duplicate. */
|
|
121
94
|
export declare function loadCurrentDistilledEntries(hippoRoot: string): MemoryEntry[];
|
|
@@ -1,48 +1,30 @@
|
|
|
1
1
|
import { closeHippoDb } from '../db/index.js';
|
|
2
2
|
import { MEMORY_SELECT_COLUMNS, rowToEntry, parseJsonArray } from './rows.js';
|
|
3
|
-
import { openStore } from './open.js';
|
|
3
|
+
import { onHandle, openStore } from './open.js';
|
|
4
4
|
import { escapeLike } from '../util/escape.js';
|
|
5
5
|
import { originInSql } from '../core/project-identity.js';
|
|
6
|
-
import { scopeAdmitSql } from './
|
|
6
|
+
import { scopeAdmitSql } from './rule-sql.js';
|
|
7
|
+
import { chunked } from '../util/chunked.js';
|
|
8
|
+
import { DEFAULT_TENANT_ID } from '../util/env.js';
|
|
7
9
|
const MAX_IDS_PER_READ = 500;
|
|
8
10
|
// The plus keeps SQLite on the primary key for an id list: with a bare tenant_id it walks every row of the tenant instead.
|
|
9
11
|
export const TENANT_IS = '+tenant_id = ?';
|
|
10
|
-
/**
|
|
11
|
-
* Read a memory entry by ID.
|
|
12
|
-
*
|
|
13
|
-
* When `tenantId` is provided, the read is scoped to that tenant (cross-tenant
|
|
14
|
-
* lookups return null). When omitted, no tenant filter is applied — preserves
|
|
15
|
-
* legacy single-tenant callers and the writeEntry/readEntry round-trip.
|
|
16
|
-
*/
|
|
12
|
+
/** Read a memory entry by ID. With `tenantId` the read is tenant-scoped (cross-tenant returns null); omitted, no tenant filter is applied. */
|
|
17
13
|
export function readEntry(hippoRoot, id, tenantId) {
|
|
18
|
-
|
|
19
|
-
try {
|
|
14
|
+
return onHandle(hippoRoot, (db) => {
|
|
20
15
|
// SAFETY: both branches select exactly MEMORY_SELECT_COLUMNS, matching
|
|
21
16
|
// MemoryRow's field set.
|
|
22
17
|
const row = tenantId !== undefined
|
|
23
18
|
? db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE id = ? AND tenant_id = ?`).get(id, tenantId)
|
|
24
19
|
: db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE id = ?`).get(id);
|
|
25
20
|
return row ? rowToEntry(row) : null;
|
|
26
|
-
}
|
|
27
|
-
finally {
|
|
28
|
-
closeHippoDb(db);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
/** Ids per `IN (...)` list: far under SQLite's bound-parameter limit, with room for the tenant filter. */
|
|
32
|
-
export const ID_CHUNK = 500;
|
|
33
|
-
/** `items` in consecutive slices of at most `size`. */
|
|
34
|
-
export function chunked(items, size = ID_CHUNK) {
|
|
35
|
-
const out = [];
|
|
36
|
-
for (let i = 0; i < items.length; i += size)
|
|
37
|
-
out.push(items.slice(i, i + size));
|
|
38
|
-
return out;
|
|
21
|
+
}, openStore);
|
|
39
22
|
}
|
|
40
23
|
/** Answers whether a tenant's rows in this store hold an id: `ids` are looked up now, one query per chunk, and any other id on its first ask. */
|
|
41
24
|
export function heldIdLookup(hippoRoot, tenantId, ids) {
|
|
42
25
|
const held = new Map();
|
|
43
26
|
const lookUp = (asked) => {
|
|
44
|
-
|
|
45
|
-
try {
|
|
27
|
+
onHandle(hippoRoot, (db) => {
|
|
46
28
|
for (const chunk of chunked([...new Set(asked)])) {
|
|
47
29
|
for (const id of chunk)
|
|
48
30
|
held.set(id, false);
|
|
@@ -51,10 +33,7 @@ export function heldIdLookup(hippoRoot, tenantId, ids) {
|
|
|
51
33
|
for (const row of rows)
|
|
52
34
|
held.set(row.id, true);
|
|
53
35
|
}
|
|
54
|
-
}
|
|
55
|
-
finally {
|
|
56
|
-
closeHippoDb(db);
|
|
57
|
-
}
|
|
36
|
+
}, openStore);
|
|
58
37
|
};
|
|
59
38
|
if (ids.length > 0)
|
|
60
39
|
lookUp(ids);
|
|
@@ -99,48 +78,30 @@ export function selectChildrenByParent(db, parentIds, tenantId) {
|
|
|
99
78
|
}
|
|
100
79
|
return byParent;
|
|
101
80
|
}
|
|
102
|
-
/**
|
|
103
|
-
* Batched lookup. Caps at 500 ids per call to keep the IN(?,?,...) clause
|
|
104
|
-
* within SQLite limits. Tenant filter is enforced when `tenantId` is passed.
|
|
105
|
-
* Used by DAG-aware recall to fetch parent summaries for a set of overflowed leaves.
|
|
106
|
-
*/
|
|
81
|
+
/** Batched lookup, capped at 500 ids per call to keep IN(?,?,...) within SQLite limits; tenant filter enforced when `tenantId` is passed. */
|
|
107
82
|
export function loadEntriesByIds(hippoRoot, ids, tenantId) {
|
|
108
83
|
if (ids.length === 0)
|
|
109
84
|
return [];
|
|
110
85
|
const capped = ids.slice(0, MAX_IDS_PER_READ);
|
|
111
|
-
|
|
112
|
-
try {
|
|
86
|
+
return onHandle(hippoRoot, (db) => {
|
|
113
87
|
const placeholders = capped.map(() => '?').join(',');
|
|
114
|
-
// Without ORDER BY, rows follow SQLite's IN(...) scan order,
|
|
115
|
-
// SAFETY: both branches select exactly MEMORY_SELECT_COLUMNS, matching
|
|
116
|
-
// MemoryRow's field set.
|
|
88
|
+
// Without ORDER BY, rows follow SQLite's IN(...) scan order, undefined w.r.t. `ids`.
|
|
89
|
+
// SAFETY: both branches select exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
|
|
117
90
|
const rows = tenantId !== undefined
|
|
118
91
|
? db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE id IN (${placeholders}) AND ${TENANT_IS} ORDER BY created ASC, content ASC, id ASC`).all(...capped, tenantId)
|
|
119
92
|
: db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE id IN (${placeholders}) ORDER BY created ASC, content ASC, id ASC`).all(...capped);
|
|
120
93
|
return rows.map(rowToEntry);
|
|
121
|
-
}
|
|
122
|
-
finally {
|
|
123
|
-
closeHippoDb(db);
|
|
124
|
-
}
|
|
94
|
+
}, openStore);
|
|
125
95
|
}
|
|
126
96
|
function originClause(origins) {
|
|
127
97
|
return origins === undefined ? '' : ` AND (origin_project = '' OR ${originInSql(origins)})`;
|
|
128
98
|
}
|
|
129
|
-
/**
|
|
130
|
-
*
|
|
131
|
-
* oldest-first. Used by `api.assemble` to walk a session's chronological
|
|
132
|
-
* context. Excludes superseded rows.
|
|
133
|
-
*
|
|
134
|
-
* Cap semantics: when `cap` is provided, the NEWEST `cap` rows are loaded (DESC LIMIT server-side,
|
|
135
|
-
* reversed client-side); ASC + LIMIT would drop the newest rows and break fresh-tail in assemble.
|
|
136
|
-
*
|
|
137
|
-
* Returns `[]` for an empty sessionId. Final order: `created ASC, id ASC`.
|
|
138
|
-
*/
|
|
99
|
+
/** 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 break fresh-tail in assemble. */
|
|
139
101
|
export function loadSessionRawMemories(hippoRoot, sessionId, tenantId, cap, origins) {
|
|
140
102
|
if (!sessionId)
|
|
141
103
|
return [];
|
|
142
|
-
|
|
143
|
-
try {
|
|
104
|
+
return onHandle(hippoRoot, (db) => {
|
|
144
105
|
const params = [];
|
|
145
106
|
let sql = `SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE kind = 'raw' AND source_session_id = ? AND superseded_by IS NULL`;
|
|
146
107
|
params.push(sessionId);
|
|
@@ -161,29 +122,14 @@ export function loadSessionRawMemories(hippoRoot, sessionId, tenantId, cap, orig
|
|
|
161
122
|
// SAFETY: sql starts from MEMORY_SELECT_COLUMNS, matching MemoryRow.
|
|
162
123
|
const rows = db.prepare(sql).all(...params);
|
|
163
124
|
return rows.map(rowToEntry);
|
|
164
|
-
}
|
|
165
|
-
finally {
|
|
166
|
-
closeHippoDb(db);
|
|
167
|
-
}
|
|
125
|
+
}, openStore);
|
|
168
126
|
}
|
|
169
|
-
/**
|
|
170
|
-
*
|
|
171
|
-
* the full session size even when `rowCap` truncates the loaded window,
|
|
172
|
-
* WITHOUT leaking rows the caller wouldn't have been allowed to load.
|
|
173
|
-
*
|
|
174
|
-
* An unscoped COUNT would let a no-scope caller infer private rows by comparing `totalRaw`
|
|
175
|
-
* against `items.length`, so this SQL-encodes the default-deny rule `passesScopeFilterForRecall` applies in TS:
|
|
176
|
-
* - explicit scope passed: exact-match
|
|
177
|
-
* - no scope: `scopeAdmitSql`'s default deny, which admits `ownScope`, the caller's personal scope.
|
|
178
|
-
*
|
|
179
|
-
* `tenantId` is optional for back-compat. Pass `undefined` only when
|
|
180
|
-
* intentionally counting cross-tenant; `assemble()` passes `ctx.tenantId`.
|
|
181
|
-
*/
|
|
127
|
+
/** Pre-cap, scope-aware row count for a session, so `assemble` reports the full size without leaking rows the caller could not load. Mirrors
|
|
128
|
+
* `passesScopeFilterForRecall`'s default-deny: explicit scope matches exactly, none admits only `ownScope`. `tenantId` undefined counts cross-tenant. */
|
|
182
129
|
export function countSessionRawMemories(hippoRoot, sessionId, tenantId, scope, ownScope, origins) {
|
|
183
130
|
if (!sessionId)
|
|
184
131
|
return 0;
|
|
185
|
-
|
|
186
|
-
try {
|
|
132
|
+
return onHandle(hippoRoot, (db) => {
|
|
187
133
|
const params = [];
|
|
188
134
|
let sql = `SELECT COUNT(*) AS c FROM memories WHERE kind = 'raw' AND source_session_id = ? AND superseded_by IS NULL`;
|
|
189
135
|
params.push(sessionId);
|
|
@@ -205,31 +151,15 @@ export function countSessionRawMemories(hippoRoot, sessionId, tenantId, scope, o
|
|
|
205
151
|
// SAFETY: row's shape matches the single `COUNT(*) AS c` column above.
|
|
206
152
|
const row = db.prepare(sql).get(...params);
|
|
207
153
|
return Number(row?.c ?? 0);
|
|
208
|
-
}
|
|
209
|
-
finally {
|
|
210
|
-
closeHippoDb(db);
|
|
211
|
-
}
|
|
154
|
+
}, openStore);
|
|
212
155
|
}
|
|
213
|
-
/**
|
|
214
|
-
*
|
|
215
|
-
* `sessionId` is supplied, also constrains to a specific session — that
|
|
216
|
-
* is the correct shape for "what did I just see in THIS session."
|
|
217
|
-
*
|
|
218
|
-
* Without `sessionId`, concurrent sessions in a tenant surface each other's rows as fresh tail;
|
|
219
|
-
* pass undefined only for "anything new across the whole tenant".
|
|
220
|
-
*
|
|
221
|
-
* Bounded count cap at 200 — beyond that the caller should filter via
|
|
222
|
-
* tags/scope rather than time-windowed recall.
|
|
223
|
-
*
|
|
224
|
-
* The tenant-wide shape is the back-compat default but discouraged; `api.recall` throws
|
|
225
|
-
* `RecallContractError` for it when `HIPPO_REQUIRE_SESSION_SCOPED_FRESH_TAIL=1` is set.
|
|
226
|
-
*/
|
|
156
|
+
/** Last N kind='raw' memories by `created` desc, tenant-scoped, max 200; pass `sessionId` or concurrent sessions show up in each other's fresh tail.
|
|
157
|
+
* The tenant-wide shape is discouraged: `api.recall` throws `RecallContractError` for it when `HIPPO_REQUIRE_SESSION_SCOPED_FRESH_TAIL=1`. */
|
|
227
158
|
export function loadFreshRawMemories(hippoRoot, count, tenantId, sessionId, origins) {
|
|
228
159
|
if (count <= 0)
|
|
229
160
|
return [];
|
|
230
161
|
const capped = Math.min(count, 200);
|
|
231
|
-
|
|
232
|
-
try {
|
|
162
|
+
return onHandle(hippoRoot, (db) => {
|
|
233
163
|
const params = [];
|
|
234
164
|
let sql = `SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE kind = 'raw' AND superseded_by IS NULL`;
|
|
235
165
|
if (tenantId !== undefined) {
|
|
@@ -249,35 +179,94 @@ export function loadFreshRawMemories(hippoRoot, count, tenantId, sessionId, orig
|
|
|
249
179
|
// SAFETY: sql starts from MEMORY_SELECT_COLUMNS, matching MemoryRow.
|
|
250
180
|
const rows = db.prepare(sql).all(...params);
|
|
251
181
|
return rows.map(rowToEntry);
|
|
182
|
+
}, openStore);
|
|
183
|
+
}
|
|
184
|
+
/** Load all entries from SQLite; omitting `tenantId` yields all rows (legacy). Recall paths that surface results to a user MUST pass a resolved tenant. */
|
|
185
|
+
export function loadAllEntries(hippoRoot, tenantId) {
|
|
186
|
+
return onHandle(hippoRoot, (db) => {
|
|
187
|
+
return selectAllEntries(db, tenantId);
|
|
188
|
+
}, openStore);
|
|
189
|
+
}
|
|
190
|
+
/** Every tenant's memory ids in loadAllEntries' order, for a caller that reads the rows a page at a time instead of holding them all. */
|
|
191
|
+
export function loadAllEntryIds(hippoRoot) {
|
|
192
|
+
return onHandle(hippoRoot, (db) => {
|
|
193
|
+
// SAFETY: the SELECT names exactly the one column read.
|
|
194
|
+
return db.prepare('SELECT id FROM memories ORDER BY created ASC, id ASC').all().map((row) => row.id);
|
|
195
|
+
}, openStore);
|
|
196
|
+
}
|
|
197
|
+
/** How many memory rows the store holds across every tenant. */
|
|
198
|
+
export function countAllEntries(hippoRoot) {
|
|
199
|
+
return onHandle(hippoRoot, (db) => {
|
|
200
|
+
// SAFETY: row's shape matches the single `COUNT(*) AS c` column.
|
|
201
|
+
const row = db.prepare('SELECT COUNT(*) AS c FROM memories').get();
|
|
202
|
+
return Number(row?.c ?? 0);
|
|
203
|
+
}, openStore);
|
|
204
|
+
}
|
|
205
|
+
// The only code points whose JS toLowerCase yields ASCII, which SQLite's ASCII-only LIKE folding cannot see.
|
|
206
|
+
const FOLDS_TO_ASCII = ['\u0130', '\u212A'];
|
|
207
|
+
/** A superset, in loadAllEntries' order, of the rows whose lowercased content holds any of `tokens` or whose lowercased tags hold `tag`.
|
|
208
|
+
* The caller re-checks each row exactly; this only spares decoding rows that cannot match. */
|
|
209
|
+
export function loadEntriesMentioning(hippoRoot, tokens, tag, tenantId) {
|
|
210
|
+
const likes = [...new Set(tokens)].map((t) => `%${escapeLike(t)}%`);
|
|
211
|
+
const clauses = likes.map(() => `content LIKE ? ESCAPE '\\'`);
|
|
212
|
+
const params = [...likes];
|
|
213
|
+
// A tag needing JSON escapes or case folding past ASCII is not found by a substring of tags_json, so every tagged row stays in.
|
|
214
|
+
if (/^[\x20-\x7e]*$/.test(tag) && !/["\\]/.test(tag)) {
|
|
215
|
+
clauses.push(`tags_json LIKE ? ESCAPE '\\'`);
|
|
216
|
+
params.push(`%${escapeLike(tag)}%`);
|
|
252
217
|
}
|
|
253
|
-
|
|
254
|
-
|
|
218
|
+
else
|
|
219
|
+
clauses.push(`COALESCE(tags_json, '[]') != '[]'`);
|
|
220
|
+
for (const ch of FOLDS_TO_ASCII) {
|
|
221
|
+
clauses.push('instr(content, ?) > 0', 'instr(tags_json, ?) > 0');
|
|
222
|
+
params.push(ch, ch);
|
|
255
223
|
}
|
|
224
|
+
const tenantClause = tenantId !== undefined ? 'tenant_id = ? AND ' : '';
|
|
225
|
+
return onHandle(hippoRoot, (db) => {
|
|
226
|
+
// SAFETY: selects exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
|
|
227
|
+
const rows = db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE ${tenantClause}(${clauses.join(' OR ')}) ORDER BY created ASC, id ASC`).all(...(tenantId !== undefined ? [tenantId] : []), ...params);
|
|
228
|
+
return rows.map(rowToEntry);
|
|
229
|
+
}, openStore);
|
|
256
230
|
}
|
|
257
|
-
/**
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
231
|
+
/** Every tenant's rows in loadAllEntries' order, with only the columns that say whether another store already holds each. */
|
|
232
|
+
export function loadEntryTextKeys(hippoRoot) {
|
|
233
|
+
return onHandle(hippoRoot, (db) => {
|
|
234
|
+
// SAFETY: rows' shape matches the four columns named in the SELECT.
|
|
235
|
+
const rows = db.prepare('SELECT id, tenant_id, content, source FROM memories ORDER BY created ASC, id ASC').all();
|
|
236
|
+
return rows.map((row) => ({ id: row.id, tenantId: row.tenant_id ?? DEFAULT_TENANT_ID, content: row.content, source: row.source }));
|
|
237
|
+
}, openStore);
|
|
238
|
+
}
|
|
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 store is kept. */
|
|
240
|
+
export function loadAllEntriesWithBase(hippoRoot) {
|
|
265
241
|
const db = openStore(hippoRoot);
|
|
242
|
+
let rows;
|
|
266
243
|
try {
|
|
267
|
-
|
|
244
|
+
rows = selectAllRows(db);
|
|
268
245
|
}
|
|
269
246
|
finally {
|
|
270
247
|
closeHippoDb(db);
|
|
271
248
|
}
|
|
249
|
+
const byId = new Map(rows.map((row) => [row.id, row]));
|
|
250
|
+
const built = new Map();
|
|
251
|
+
const get = (id) => {
|
|
252
|
+
let entry = built.get(id);
|
|
253
|
+
const row = byId.get(id);
|
|
254
|
+
if (!entry && row)
|
|
255
|
+
built.set(id, (entry = rowToEntry(row)));
|
|
256
|
+
return entry;
|
|
257
|
+
};
|
|
258
|
+
return { entries: rows.map(rowToEntry), base: { get } };
|
|
272
259
|
}
|
|
273
|
-
|
|
274
|
-
export function selectAllEntries(db, tenantId) {
|
|
260
|
+
function selectAllRows(db, tenantId) {
|
|
275
261
|
// SAFETY: both branches select exactly MEMORY_SELECT_COLUMNS, matching
|
|
276
262
|
// MemoryRow's field set.
|
|
277
|
-
|
|
263
|
+
return tenantId !== undefined
|
|
278
264
|
? db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE tenant_id = ? ORDER BY created ASC, id ASC`).all(tenantId)
|
|
279
265
|
: db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories ORDER BY created ASC, id ASC`).all();
|
|
280
|
-
|
|
266
|
+
}
|
|
267
|
+
/** Every memory row on an open connection, so a caller can read inside its own transaction. */
|
|
268
|
+
export function selectAllEntries(db, tenantId) {
|
|
269
|
+
return selectAllRows(db, tenantId).map(rowToEntry);
|
|
281
270
|
}
|
|
282
271
|
/** Live rows whose source starts with `prefix`, on the caller's handle; LIKE folds case, so the prefix is checked again exactly. */
|
|
283
272
|
export function selectLiveEntriesBySourcePrefix(db, tenantId, prefix) {
|
|
@@ -288,38 +277,31 @@ export function selectLiveEntriesBySourcePrefix(db, tenantId, prefix) {
|
|
|
288
277
|
// Content of every team-visible tenant row tagged `tag`, without reading the rest of the store; `origins` keeps one project's rows and user-global ones.
|
|
289
278
|
// No owner: a personal or connector-private row must never answer `duplicate` for, or stop, a team copy. `instr` prefilters; `includes` re-checks.
|
|
290
279
|
export function loadContentsWithTag(hippoRoot, tenantId, tag, origins) {
|
|
291
|
-
|
|
292
|
-
try {
|
|
280
|
+
return onHandle(hippoRoot, (db) => {
|
|
293
281
|
const inProject = origins === undefined ? '' : ` AND (origin_project = '' OR ${originInSql(origins)})`;
|
|
294
282
|
const admit = scopeAdmitSql('');
|
|
295
283
|
/** SAFETY: rows' shape matches the two columns named in the SELECT below. */
|
|
296
284
|
const rows = db.prepare(`SELECT content, tags_json FROM memories WHERE tenant_id = ? AND instr(tags_json, ?) > 0${inProject} AND ${admit.sql}`).all(tenantId, JSON.stringify(tag), ...(origins ?? []), ...admit.params);
|
|
297
285
|
return rows.filter((r) => parseJsonArray(r.tags_json).includes(tag)).map((r) => r.content);
|
|
298
|
-
}
|
|
299
|
-
finally {
|
|
300
|
-
closeHippoDb(db);
|
|
301
|
-
}
|
|
286
|
+
}, openStore);
|
|
302
287
|
}
|
|
303
288
|
/** Live raw rows whose artifact_ref matches a LIKE pattern, for one tenant; the store is set up first when it is new. */
|
|
304
289
|
export function loadVaultRawRows(hippoRoot, likeParam, tenantId) {
|
|
305
|
-
|
|
306
|
-
try {
|
|
290
|
+
return onHandle(hippoRoot, (db) => {
|
|
307
291
|
// SAFETY: query selects exactly the columns of VaultRawRow, in the same
|
|
308
292
|
// names, from the memories table this module owns.
|
|
309
293
|
return db
|
|
310
294
|
.prepare(`SELECT id, artifact_ref, tags_json, scope FROM memories
|
|
311
295
|
WHERE artifact_ref LIKE ? ESCAPE '\\' AND tenant_id = ? AND kind = 'raw'`)
|
|
312
296
|
.all(likeParam, tenantId);
|
|
313
|
-
}
|
|
314
|
-
finally {
|
|
315
|
-
closeHippoDb(db);
|
|
316
|
-
}
|
|
297
|
+
}, openStore);
|
|
317
298
|
}
|
|
318
299
|
/** Reads memories from a store whose schema may predate some columns; `columns` is the table's real column set. */
|
|
319
300
|
export function selectPreviewRows(db, columns, tenantId) {
|
|
320
301
|
const tenant = columns.has('tenant_id') ? ' WHERE tenant_id = ?' : '';
|
|
321
302
|
const column = (name, fallback) => (columns.has(name) ? name : `${fallback} AS ${name}`);
|
|
322
|
-
const statement = db.prepare(`SELECT id, content, ${column('source', "''")}, ${column('confidence', 'NULL')}, ${column('extracted_from', 'NULL')},
|
|
303
|
+
const statement = db.prepare(`SELECT id, content, ${column('source', "''")}, ${column('confidence', 'NULL')}, ${column('extracted_from', 'NULL')}, ` +
|
|
304
|
+
`${column('dag_level', '0')}, ${column('tags_json', "'[]'")} FROM memories${tenant}`);
|
|
323
305
|
// SAFETY: the SELECT names every PreviewRow field, each a literal fallback when its column is missing.
|
|
324
306
|
return (tenant ? statement.all(tenantId) : statement.all());
|
|
325
307
|
}
|
|
@@ -352,10 +334,10 @@ export function selectRowsOutsideSourcePrefixAt(db, tenantId, sourcePrefix, orig
|
|
|
352
334
|
return db.prepare(`SELECT id, content, source FROM memories
|
|
353
335
|
WHERE tenant_id = ? AND superseded_by IS NULL AND substr(source, 1, ${sourcePrefix.length}) != ?${visible}`).all(...params);
|
|
354
336
|
}
|
|
355
|
-
/** Content of a tenant's live rows written by `source` and tagged `tag` that no extraction produced,
|
|
337
|
+
/** Content of a tenant's live rows written by `source` and tagged `tag` that no extraction produced,
|
|
338
|
+
* in loadAllEntries' order and in every scope; `exceptSessionId` drops one session's own rows. */
|
|
356
339
|
export function loadLiveContentsBySourceAndTag(hippoRoot, tenantId, source, tag, exceptSessionId) {
|
|
357
|
-
|
|
358
|
-
try {
|
|
340
|
+
return onHandle(hippoRoot, (db) => {
|
|
359
341
|
/** SAFETY: rows' shape matches the two columns named in the SELECT below. */
|
|
360
342
|
const rows = db.prepare(`SELECT content, tags_json FROM memories
|
|
361
343
|
WHERE tenant_id = ? AND source = ? AND instr(tags_json, ?) > 0
|
|
@@ -363,23 +345,16 @@ export function loadLiveContentsBySourceAndTag(hippoRoot, tenantId, source, tag,
|
|
|
363
345
|
AND (source_session_id IS NULL OR source_session_id != ?)
|
|
364
346
|
ORDER BY created ASC, id ASC`).all(tenantId, source, JSON.stringify(tag), exceptSessionId);
|
|
365
347
|
return rows.filter((r) => parseJsonArray(r.tags_json).includes(tag)).map((r) => r.content);
|
|
366
|
-
}
|
|
367
|
-
finally {
|
|
368
|
-
closeHippoDb(db);
|
|
369
|
-
}
|
|
348
|
+
}, openStore);
|
|
370
349
|
}
|
|
371
350
|
/** Every tenant's distilled rows nothing has superseded, in loadAllEntries' order: the rows that can be each other's duplicate. */
|
|
372
351
|
export function loadCurrentDistilledEntries(hippoRoot) {
|
|
373
|
-
|
|
374
|
-
try {
|
|
352
|
+
return onHandle(hippoRoot, (db) => {
|
|
375
353
|
// SAFETY: selects exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
|
|
376
354
|
const rows = db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories
|
|
377
355
|
WHERE COALESCE(kind, 'distilled') = 'distilled' AND COALESCE(superseded_by, '') = ''
|
|
378
356
|
ORDER BY created ASC, id ASC`).all();
|
|
379
357
|
return rows.map(rowToEntry);
|
|
380
|
-
}
|
|
381
|
-
finally {
|
|
382
|
-
closeHippoDb(db);
|
|
383
|
-
}
|
|
358
|
+
}, openStore);
|
|
384
359
|
}
|
|
385
360
|
//# sourceMappingURL=entry-reads.js.map
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { MemoryEntry } from '../core/memory.js';
|
|
2
2
|
import { openHippoDb } from '../db/index.js';
|
|
3
3
|
export declare function upsertEntryRow(db: ReturnType<typeof openHippoDb>, entry: MemoryEntry): void;
|
|
4
|
-
/** The row alone, with no rejection guard or full-text row, for `upsertEntryRow` and for
|
|
4
|
+
/** The row alone, with no rejection guard or full-text row, for `upsertEntryRow` and for
|
|
5
|
+
* `batchWriteAndDelete`, which probes tombstones and indexes per batch. Returns whether the row is new. */
|
|
5
6
|
export declare function upsertMemoryRow(db: ReturnType<typeof openHippoDb>, entry: MemoryEntry): boolean;
|
|
6
7
|
export declare function syncFtsRow(db: ReturnType<typeof openHippoDb>, entry: MemoryEntry, isNewRow?: boolean): void;
|
|
7
8
|
export declare function ftsRowExists(db: ReturnType<typeof openHippoDb>, id: string): boolean;
|
|
@@ -13,40 +14,10 @@ export declare function ftsDrift(hippoRoot: string, repair: boolean): {
|
|
|
13
14
|
memories: number;
|
|
14
15
|
fts: number;
|
|
15
16
|
} | null;
|
|
16
|
-
/**
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* `opts.actor` defaults to 'cli' so unauthenticated direct-CLI callers still
|
|
20
|
-
* get the right audit attribution. The HTTP server and api.* layer pass
|
|
21
|
-
* the resolved actor (`api_key:<key_id>` / `localhost:cli`) so audit events
|
|
22
|
-
* land with one row per write, no double-emit.
|
|
23
|
-
*
|
|
24
|
-
* `opts.afterWrite` is invoked inside the same SAVEPOINT as the memories
|
|
25
|
-
* INSERT (mirrors archiveRawMemory's shape in raw-archive.ts). On callback
|
|
26
|
-
* throw, the SAVEPOINT rolls back — the memory row never lands, and the
|
|
27
|
-
* filesystem mirrors / audit emit never run. Used by connectors to
|
|
28
|
-
* stamp idempotency rows atomically with the memory write.
|
|
29
|
-
*/
|
|
30
|
-
/**
|
|
31
|
-
* Stamp origin_project from the store's own location when the entry has
|
|
32
|
-
* never been stamped (v39 memory scope isolation). The store dir is
|
|
33
|
-
* `<project>/.hippo`, so its parent resolves to the owning project; the
|
|
34
|
-
* home/global store resolves to '' (user-global). Callers that know a better
|
|
35
|
-
* origin (shareMemory, syncGlobalToLocal) set entry.origin_project before
|
|
36
|
-
* writing and this is a no-op. Returns a stamped copy; never mutates.
|
|
37
|
-
*
|
|
38
|
-
* NULL is PRESERVED, not re-stamped: it means no known project (a legacy row with no evidence, or a write to a
|
|
39
|
-
* shared store that named none) and ambient context denies it, so a writeback must not launder it.
|
|
40
|
-
*/
|
|
17
|
+
/** Stamp origin_project from the store's own location (parent of `<project>/.hippo`; the home store is '' = user-global) when never stamped; returns a copy.
|
|
18
|
+
* NULL is PRESERVED: it means no known project and ambient context denies it, so a writeback must not launder it. */
|
|
41
19
|
export declare function stampOriginProject(hippoRoot: string, entry: MemoryEntry): MemoryEntry;
|
|
42
|
-
/**
|
|
43
|
-
*
|
|
44
|
-
* for rows that predate the origin column - the legacy-markdown bootstrap and
|
|
45
|
-
* rebuildIndex import, which are the markdown-store equivalent of the v39 SQL
|
|
46
|
-
* backfill. Same evidence order as the migration: the provenance source
|
|
47
|
-
* (`shared:<project>:` / `promoted:<localRoot>`) wins over the destination
|
|
48
|
-
* store's location, so a shared row imported into the global store keeps its
|
|
49
|
-
* owning project instead of becoming user-global.
|
|
50
|
-
*/
|
|
20
|
+
/** Import-time variant for a mirror with no origin field (an explicit null stays null), for rows predating the origin column.
|
|
21
|
+
* Like the v39 backfill, the provenance source (`shared:<project>:` / `promoted:<localRoot>`) wins over the destination store's location. */
|
|
51
22
|
export declare function stampOriginProjectForImport(hippoRoot: string, entry: MemoryEntry): MemoryEntry;
|
|
52
23
|
//# sourceMappingURL=entry-row.d.ts.map
|
package/dist/store/entry-row.js
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
|
+
import { DEFAULT_TENANT_ID } from '../util/env.js';
|
|
1
2
|
import { closeHippoDb, ftsRowCounts, openHippoDb, isFtsAvailable, repairFtsDrift } from '../db/index.js';
|
|
2
3
|
import { fallbackOrigin, originFromSource } from '../core/project-identity.js';
|
|
3
4
|
import { checkRejectionGuard } from './rejection.js';
|
|
4
5
|
import { errorMessage, log } from '../util/log.js';
|
|
5
6
|
export function upsertEntryRow(db, entry) {
|
|
6
|
-
checkRejectionGuard(db, entry.tenantId ??
|
|
7
|
+
checkRejectionGuard(db, entry.tenantId ?? DEFAULT_TENANT_ID, entry.id, entry.content);
|
|
7
8
|
syncFtsRow(db, entry, upsertMemoryRow(db, entry));
|
|
8
9
|
}
|
|
9
|
-
/** The row alone, with no rejection guard or full-text row, for `upsertEntryRow` and for
|
|
10
|
+
/** The row alone, with no rejection guard or full-text row, for `upsertEntryRow` and for
|
|
11
|
+
* `batchWriteAndDelete`, which probes tombstones and indexes per batch. Returns whether the row is new. */
|
|
10
12
|
export function upsertMemoryRow(db, entry) {
|
|
11
13
|
const isNewRow = db.prepare(`SELECT 1 FROM memories WHERE id = ?`).get(entry.id) === undefined;
|
|
12
14
|
db.prepare(UPSERT_MEMORY_SQL).run(...memoryRowValues(entry));
|
|
@@ -102,7 +104,7 @@ function memoryRowValues(entry) {
|
|
|
102
104
|
entry.scope ?? null,
|
|
103
105
|
entry.owner ?? null,
|
|
104
106
|
entry.artifact_ref ?? null,
|
|
105
|
-
entry.tenantId ??
|
|
107
|
+
entry.tenantId ?? DEFAULT_TENANT_ID,
|
|
106
108
|
entry.origin_project ?? null,
|
|
107
109
|
entry.descendant_count ?? 0,
|
|
108
110
|
entry.earliest_at ?? null,
|
|
@@ -181,45 +183,15 @@ export function ftsDrift(hippoRoot, repair) {
|
|
|
181
183
|
closeHippoDb(db);
|
|
182
184
|
}
|
|
183
185
|
}
|
|
184
|
-
/**
|
|
185
|
-
*
|
|
186
|
-
*
|
|
187
|
-
* `opts.actor` defaults to 'cli' so unauthenticated direct-CLI callers still
|
|
188
|
-
* get the right audit attribution. The HTTP server and api.* layer pass
|
|
189
|
-
* the resolved actor (`api_key:<key_id>` / `localhost:cli`) so audit events
|
|
190
|
-
* land with one row per write, no double-emit.
|
|
191
|
-
*
|
|
192
|
-
* `opts.afterWrite` is invoked inside the same SAVEPOINT as the memories
|
|
193
|
-
* INSERT (mirrors archiveRawMemory's shape in raw-archive.ts). On callback
|
|
194
|
-
* throw, the SAVEPOINT rolls back — the memory row never lands, and the
|
|
195
|
-
* filesystem mirrors / audit emit never run. Used by connectors to
|
|
196
|
-
* stamp idempotency rows atomically with the memory write.
|
|
197
|
-
*/
|
|
198
|
-
/**
|
|
199
|
-
* Stamp origin_project from the store's own location when the entry has
|
|
200
|
-
* never been stamped (v39 memory scope isolation). The store dir is
|
|
201
|
-
* `<project>/.hippo`, so its parent resolves to the owning project; the
|
|
202
|
-
* home/global store resolves to '' (user-global). Callers that know a better
|
|
203
|
-
* origin (shareMemory, syncGlobalToLocal) set entry.origin_project before
|
|
204
|
-
* writing and this is a no-op. Returns a stamped copy; never mutates.
|
|
205
|
-
*
|
|
206
|
-
* NULL is PRESERVED, not re-stamped: it means no known project (a legacy row with no evidence, or a write to a
|
|
207
|
-
* shared store that named none) and ambient context denies it, so a writeback must not launder it.
|
|
208
|
-
*/
|
|
186
|
+
/** Stamp origin_project from the store's own location (parent of `<project>/.hippo`; the home store is '' = user-global) when never stamped; returns a copy.
|
|
187
|
+
* NULL is PRESERVED: it means no known project and ambient context denies it, so a writeback must not launder it. */
|
|
209
188
|
export function stampOriginProject(hippoRoot, entry) {
|
|
210
189
|
if (entry.origin_project !== undefined)
|
|
211
190
|
return entry;
|
|
212
191
|
return { ...entry, origin_project: fallbackOrigin(hippoRoot) };
|
|
213
192
|
}
|
|
214
|
-
/**
|
|
215
|
-
*
|
|
216
|
-
* for rows that predate the origin column - the legacy-markdown bootstrap and
|
|
217
|
-
* rebuildIndex import, which are the markdown-store equivalent of the v39 SQL
|
|
218
|
-
* backfill. Same evidence order as the migration: the provenance source
|
|
219
|
-
* (`shared:<project>:` / `promoted:<localRoot>`) wins over the destination
|
|
220
|
-
* store's location, so a shared row imported into the global store keeps its
|
|
221
|
-
* owning project instead of becoming user-global.
|
|
222
|
-
*/
|
|
193
|
+
/** Import-time variant for a mirror with no origin field (an explicit null stays null), for rows predating the origin column.
|
|
194
|
+
* Like the v39 backfill, the provenance source (`shared:<project>:` / `promoted:<localRoot>`) wins over the destination store's location. */
|
|
223
195
|
export function stampOriginProjectForImport(hippoRoot, entry) {
|
|
224
196
|
if (entry.origin_project !== undefined)
|
|
225
197
|
return entry;
|