hippo-memory 1.69.0 → 1.70.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -2
- package/dist/agent-memories/apply.d.ts +3 -3
- package/dist/agent-memories/apply.js +16 -31
- package/dist/agent-memories/claude-code.d.ts +1 -3
- package/dist/agent-memories/claude-code.js +11 -7
- package/dist/agent-memories/copilot.js +3 -2
- package/dist/agent-memories/files.js +3 -2
- package/dist/agent-memories/gemini.js +6 -5
- package/dist/agent-memories/keys.js +3 -2
- package/dist/agent-memories/legacy.d.ts +2 -2
- package/dist/agent-memories/legacy.js +2 -2
- package/dist/agent-memories/report.d.ts +1 -1
- package/dist/agent-memories/report.js +1 -1
- package/dist/agent-memories/source.d.ts +1 -1
- package/dist/agent-memories/source.js +6 -5
- package/dist/agent-memories/sync.d.ts +1 -1
- package/dist/agent-memories/sync.js +24 -33
- package/dist/agent-memories/types.d.ts +1 -1
- package/dist/api/assemble.d.ts +2 -2
- package/dist/api/assemble.js +42 -32
- package/dist/api/audit.d.ts +4 -7
- package/dist/api/audit.js +6 -20
- package/dist/api/auth.d.ts +5 -18
- package/dist/api/auth.js +44 -194
- package/dist/api/auto-sleep.d.ts +13 -0
- package/dist/api/auto-sleep.js +32 -0
- package/dist/{availability.d.ts → api/availability.d.ts} +2 -2
- package/dist/{availability.js → api/availability.js} +12 -29
- package/dist/{context-auto.js → api/context-auto.js} +2 -1
- package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
- package/dist/{context-render.js → api/context-render.js} +7 -6
- package/dist/api/context-select.d.ts +5 -5
- package/dist/api/context-select.js +37 -45
- package/dist/api/context-types.d.ts +5 -5
- package/dist/api/context.d.ts +2 -4
- package/dist/api/context.js +48 -61
- package/dist/api/dormant.d.ts +3 -3
- package/dist/api/dormant.js +38 -107
- package/dist/api/drill-down.d.ts +2 -2
- package/dist/api/drill-down.js +37 -65
- package/dist/api/forget.d.ts +2 -11
- package/dist/api/forget.js +13 -46
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +2 -2
- package/dist/api/index.d.ts +26 -0
- package/dist/api/index.js +29 -0
- package/dist/api/instruction-detect.js +74 -0
- package/dist/api/learn.js +63 -55
- package/dist/api/ledger-db.d.ts +20 -0
- package/dist/api/ledger-db.js +79 -0
- package/dist/api/on-store.d.ts +16 -0
- package/dist/api/on-store.js +36 -0
- package/dist/api/outcome.d.ts +5 -42
- package/dist/api/outcome.js +15 -80
- package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
- package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
- package/dist/api/promote.d.ts +4 -15
- package/dist/api/promote.js +29 -106
- package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +7 -7
- package/dist/{prompt-hook.js → api/prompt-hook.js} +34 -53
- package/dist/api/quarantine.d.ts +5 -5
- package/dist/api/quarantine.js +30 -106
- package/dist/api/recall-core.d.ts +4 -0
- package/dist/api/recall-core.js +112 -0
- package/dist/{recall-history.js → api/recall-history.js} +30 -25
- package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +5 -5
- package/dist/{recall-pipeline.js → api/recall-pipeline.js} +47 -42
- package/dist/api/recall-record.d.ts +10 -13
- package/dist/api/recall-record.js +10 -30
- package/dist/api/recall-request.d.ts +2 -2
- package/dist/api/recall-request.js +3 -3
- package/dist/api/recall-types.d.ts +41 -16
- package/dist/api/recall.d.ts +1 -1
- package/dist/api/recall.js +39 -37
- package/dist/api/remember.d.ts +10 -12
- package/dist/api/remember.js +29 -45
- package/dist/api/session-owners.d.ts +4 -0
- package/dist/api/session-owners.js +17 -0
- package/dist/api/sleep-run.d.ts +7 -7
- package/dist/api/sleep-run.js +63 -75
- package/dist/api/sleep.d.ts +1 -1
- package/dist/api/tokens.d.ts +2 -2
- package/dist/api/tokens.js +9 -21
- package/dist/api/types.d.ts +2 -2
- package/dist/api/types.js +1 -1
- package/dist/capture/caller-session.d.ts +2 -2
- package/dist/capture/caller-session.js +8 -8
- package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
- package/dist/{capture-error.js → capture/capture-error.js} +7 -7
- package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
- package/dist/capture/command.d.ts +1 -1
- package/dist/capture/command.js +54 -41
- package/dist/capture/compact-resume-caller.d.ts +1 -1
- package/dist/capture/compact-resume-caller.js +7 -7
- package/dist/capture/compact.d.ts +4 -1
- package/dist/capture/compact.js +40 -22
- package/dist/capture/compaction-items-caller.d.ts +1 -1
- package/dist/capture/compaction-items-caller.js +7 -5
- package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
- package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
- package/dist/{compaction-record.js → capture/compaction-record.js} +48 -94
- package/dist/{compaction-spool.js → capture/compaction-spool.js} +17 -13
- package/dist/capture/copilot-transcript.js +1 -1
- package/dist/capture/extract.js +2 -2
- package/dist/capture/failure-caller.d.ts +2 -2
- package/dist/capture/failure-caller.js +6 -6
- package/dist/capture/failure-reading.d.ts +2 -5
- package/dist/capture/failure-reading.js +11 -12
- package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
- package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
- package/dist/capture/pre-compact-caller.d.ts +1 -1
- package/dist/capture/pre-compact-caller.js +2 -2
- package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +1 -5
- package/dist/{session-digest.js → capture/session-digest.js} +17 -23
- package/dist/capture/session-end-caller.d.ts +2 -2
- package/dist/capture/session-end-caller.js +1 -1
- package/dist/capture/session-texts.d.ts +1 -1
- package/dist/capture/session-texts.js +5 -5
- package/dist/capture/session-worker.js +6 -4
- package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
- package/dist/capture/transcript.js +68 -74
- package/dist/capture/working-state.d.ts +0 -3
- package/dist/capture/working-state.js +7 -7
- package/dist/{audit-prune.d.ts → cli/audit-prune.d.ts} +1 -2
- package/dist/{audit-prune.js → cli/audit-prune.js} +5 -39
- package/dist/cli/audit.d.ts +2 -2
- package/dist/cli/audit.js +77 -72
- package/dist/cli/auth.d.ts +2 -1
- package/dist/cli/auth.js +18 -20
- package/dist/cli/briefs.d.ts +4 -3
- package/dist/cli/briefs.js +59 -181
- package/dist/cli/card.d.ts +2 -1
- package/dist/cli/card.js +25 -23
- package/dist/{client.d.ts → cli/client.d.ts} +1 -1
- package/dist/{client.js → cli/client.js} +1 -1
- package/dist/cli/compact-resume-payload.d.ts +8 -0
- package/dist/cli/compact-resume-payload.js +39 -0
- package/dist/cli/context.d.ts +2 -13
- package/dist/cli/context.js +41 -71
- package/dist/cli/continuity.d.ts +6 -5
- package/dist/cli/continuity.js +109 -99
- package/dist/{correction-latency.d.ts → cli/correction-latency.d.ts} +1 -1
- package/dist/cli/curate.d.ts +9 -9
- package/dist/cli/curate.js +177 -149
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +46 -34
- package/dist/cli/decisions.d.ts +4 -3
- package/dist/cli/decisions.js +108 -218
- package/dist/cli/eval.d.ts +1 -3
- package/dist/cli/eval.js +43 -31
- package/dist/cli/explain.d.ts +1 -1
- package/dist/cli/explain.js +35 -19
- package/dist/cli/flag-values.d.ts +25 -0
- package/dist/cli/flag-values.js +103 -0
- package/dist/cli/flags.d.ts +303 -0
- package/dist/cli/flags.js +169 -0
- package/dist/cli/goals.d.ts +2 -1
- package/dist/cli/goals.js +39 -34
- package/dist/cli/hook-runtime.d.ts +49 -0
- package/dist/cli/hook-runtime.js +155 -0
- package/dist/cli/init.d.ts +2 -1
- package/dist/cli/init.js +151 -118
- package/dist/cli/install-steps.d.ts +7 -0
- package/dist/cli/install-steps.js +110 -0
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +9 -7
- package/dist/cli/maintenance.d.ts +5 -4
- package/dist/cli/maintenance.js +31 -27
- package/dist/cli/object-verbs.d.ts +40 -0
- package/dist/cli/object-verbs.js +65 -0
- package/dist/{owner-validation.d.ts → cli/owner-validation.d.ts} +0 -1
- package/dist/{owner-validation.js → cli/owner-validation.js} +2 -2
- package/dist/cli/playbooks.d.ts +4 -3
- package/dist/cli/playbooks.js +77 -280
- package/dist/cli/print.d.ts +18 -0
- package/dist/cli/print.js +85 -0
- package/dist/cli/projects.d.ts +2 -3
- package/dist/cli/projects.js +56 -49
- package/dist/{provenance-coverage.d.ts → cli/provenance-coverage.d.ts} +1 -1
- package/dist/cli/quality-repair-once.js +4 -4
- package/dist/{quality-repair.js → cli/quality-repair.js} +23 -37
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +101 -150
- package/dist/{refine-llm.d.ts → cli/refine-llm.d.ts} +1 -1
- package/dist/{refine-llm.js → cli/refine-llm.js} +70 -82
- package/dist/cli/remember.d.ts +1 -3
- package/dist/cli/remember.js +124 -103
- package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +3 -1
- package/dist/{scheduler.js → cli/scheduler.js} +13 -7
- package/dist/cli/serve.d.ts +1 -1
- package/dist/cli/serve.js +34 -4
- package/dist/cli/session-hooks.d.ts +4 -4
- package/dist/cli/session-hooks.js +190 -184
- package/dist/cli/setup.d.ts +2 -1
- package/dist/cli/setup.js +41 -21
- package/dist/cli/shared.d.ts +5 -95
- package/dist/cli/shared.js +18 -369
- package/dist/cli/slack.d.ts +2 -1
- package/dist/cli/slack.js +31 -55
- package/dist/cli/sleep-render.d.ts +4 -0
- package/dist/cli/sleep-render.js +61 -0
- package/dist/cli/sleep.d.ts +2 -8
- package/dist/cli/sleep.js +20 -76
- package/dist/cli/status.d.ts +3 -3
- package/dist/cli/status.js +39 -41
- package/dist/{stdin.js → cli/stdin.js} +6 -6
- package/dist/cli/transfer.d.ts +4 -4
- package/dist/cli/transfer.js +68 -42
- package/dist/cli/usage.js +4 -2
- package/dist/cli.d.ts +289 -5
- package/dist/cli.js +184 -117
- package/dist/connectors/dlq.d.ts +44 -0
- package/dist/connectors/dlq.js +30 -0
- package/dist/connectors/github/backfill.d.ts +1 -1
- package/dist/connectors/github/backfill.js +29 -66
- package/dist/connectors/github/cli-impl.js +59 -74
- package/dist/connectors/github/deletion.d.ts +5 -6
- package/dist/connectors/github/deletion.js +18 -52
- package/dist/connectors/github/dlq.d.ts +7 -61
- package/dist/connectors/github/dlq.js +19 -119
- package/dist/connectors/github/ingest.d.ts +2 -31
- package/dist/connectors/github/ingest.js +20 -83
- package/dist/connectors/github/octokit-client.d.ts +1 -1
- package/dist/connectors/github/octokit-client.js +2 -1
- package/dist/connectors/github/tenant-routing.d.ts +2 -2
- package/dist/connectors/github/tenant-routing.js +10 -36
- package/dist/connectors/github/transform.d.ts +1 -1
- package/dist/connectors/github/types.d.ts +1 -1
- package/dist/connectors/github/types.js +15 -18
- package/dist/connectors/github/webhook.d.ts +3 -2
- package/dist/connectors/github/webhook.js +84 -87
- package/dist/connectors/slack/backfill.d.ts +1 -1
- package/dist/connectors/slack/backfill.js +5 -29
- package/dist/connectors/slack/deletion.d.ts +4 -7
- package/dist/connectors/slack/deletion.js +20 -49
- package/dist/connectors/slack/dlq.d.ts +7 -49
- package/dist/connectors/slack/dlq.js +25 -118
- package/dist/connectors/slack/ingest.d.ts +5 -18
- package/dist/connectors/slack/ingest.js +27 -91
- package/dist/connectors/slack/signature.js +2 -1
- package/dist/connectors/slack/tenant-routing.d.ts +4 -1
- package/dist/connectors/slack/tenant-routing.js +13 -14
- package/dist/connectors/slack/transform.d.ts +1 -1
- package/dist/connectors/slack/types.d.ts +1 -1
- package/dist/connectors/slack/types.js +3 -12
- package/dist/connectors/slack/web-client.js +2 -2
- package/dist/connectors/slack/webhook.d.ts +3 -2
- package/dist/connectors/slack/webhook.js +75 -82
- package/dist/connectors/slack/workspaces.d.ts +4 -17
- package/dist/connectors/slack/workspaces.js +4 -34
- package/dist/consolidate/conflicts.d.ts +1 -1
- package/dist/consolidate/conflicts.js +4 -4
- package/dist/{dag.d.ts → consolidate/dag.d.ts} +1 -1
- package/dist/{dag.js → consolidate/dag.js} +60 -81
- package/dist/consolidate/decay.d.ts +2 -2
- package/dist/consolidate/decay.js +28 -22
- package/dist/{dedupe.js → consolidate/dedupe.js} +11 -19
- package/dist/consolidate/flush-units.d.ts +2 -2
- package/dist/{half-life-migration.d.ts → consolidate/half-life-migration.d.ts} +3 -9
- package/dist/consolidate/half-life-migration.js +106 -0
- package/dist/consolidate/llm-passes.js +8 -8
- package/dist/{memory-value.d.ts → consolidate/memory-value.d.ts} +7 -2
- package/dist/{memory-value.js → consolidate/memory-value.js} +9 -7
- package/dist/consolidate/merge.js +57 -54
- package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
- package/dist/{merged-row.js → consolidate/merged-row.js} +2 -2
- package/dist/consolidate/physics-pass.js +46 -46
- package/dist/{replay.d.ts → consolidate/replay.d.ts} +1 -1
- package/dist/{replay.js → consolidate/replay.js} +2 -2
- package/dist/consolidate/run.d.ts +7 -13
- package/dist/consolidate/run.js +6 -37
- package/dist/consolidate/sleep.d.ts +1 -1
- package/dist/consolidate/sleep.js +64 -134
- package/dist/{trace.js → consolidate/trace.js} +4 -6
- package/dist/consolidate/traces.js +34 -29
- package/dist/{ablation.js → core/ablation.js} +1 -1
- package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
- package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
- package/dist/{ambient.js → core/ambient.js} +12 -10
- package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +13 -2
- package/dist/{capture-contract.js → core/capture-contract.js} +64 -0
- package/dist/{compare.d.ts → core/compare.d.ts} +2 -0
- package/dist/{compare.js → core/compare.js} +10 -3
- package/dist/{config.d.ts → core/config.d.ts} +6 -6
- package/dist/{config.js → core/config.js} +99 -72
- package/dist/core/handoff.js +87 -0
- package/dist/{memory-quality.js → core/memory-quality.js} +1 -1
- package/dist/{memory.d.ts → core/memory.d.ts} +17 -5
- package/dist/{memory.js → core/memory.js} +110 -82
- package/dist/{physics.d.ts → core/physics.d.ts} +1 -1
- package/dist/{physics.js → core/physics.js} +2 -1
- package/dist/{project-identity.d.ts → core/project-identity.d.ts} +0 -5
- package/dist/{project-identity.js → core/project-identity.js} +5 -17
- package/dist/{project-remote.js → core/project-remote.js} +4 -4
- package/dist/{prompt-recall.js → core/prompt-recall.js} +1 -1
- package/dist/{salience.js → core/salience.js} +35 -20
- package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
- package/dist/{search/types.js → core/search-types.js} +1 -1
- package/dist/core/session-digest-row.d.ts +5 -0
- package/dist/core/session-digest-row.js +6 -0
- package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
- package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +5 -5
- package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
- package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
- package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +9 -9
- package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +101 -104
- package/dist/{dashboard.js → dashboard/dashboard.js} +124 -53
- package/dist/db/backup.js +1 -1
- package/dist/db/busy.d.ts +18 -1
- package/dist/db/busy.js +74 -9
- package/dist/db/connect.d.ts +10 -2
- package/dist/db/connect.js +43 -10
- package/dist/db/index.d.ts +9 -0
- package/dist/db/index.js +8 -0
- package/dist/db/meta.d.ts +4 -0
- package/dist/db/meta.js +11 -1
- package/dist/db/migrate.d.ts +8 -1
- package/dist/db/migrate.js +25 -30
- package/dist/db/migrations/v08.js +1 -1
- package/dist/db/migrations/v14.js +39 -35
- package/dist/db/migrations/v16.js +29 -26
- package/dist/db/migrations/v18.js +6 -5
- package/dist/db/migrations/v20.js +4 -2
- package/dist/db/migrations/v22.js +39 -36
- package/dist/db/migrations/v24.js +27 -22
- package/dist/db/migrations/v29.js +37 -32
- package/dist/db/migrations/v31.js +36 -31
- package/dist/db/migrations/v35.js +1 -1
- package/dist/db/migrations/v39.js +1 -1
- package/dist/db/migrations/v40.js +15 -14
- package/dist/db/migrations/v43.js +7 -6
- package/dist/db/migrations/v44.js +1 -1
- package/dist/db/migrations/v45.js +1 -1
- package/dist/db/migrations/v46.js +1 -1
- package/dist/db/migrations/v47.js +1 -1
- package/dist/db/migrations/v48.js +1 -1
- package/dist/db/migrations/v49.js +1 -1
- package/dist/db/migrations/v50.js +8 -7
- package/dist/db/migrations/v52.js +1 -1
- package/dist/db/open.d.ts +9 -1
- package/dist/db/open.js +21 -4
- package/dist/{physics-state.d.ts → db/physics-state.d.ts} +3 -3
- package/dist/{physics-state.js → db/physics-state.js} +9 -16
- package/dist/{raw-archive-mirror-cleanup.d.ts → db/raw-archive-mirror-cleanup.d.ts} +5 -5
- package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +11 -6
- package/dist/db/request-stores.d.ts +15 -2
- package/dist/db/request-stores.js +37 -15
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -0
- package/dist/{vector-store.d.ts → db/vector-store.d.ts} +4 -2
- package/dist/{vector-store.js → db/vector-store.js} +76 -51
- package/dist/db/wal-checkpointer.d.ts +11 -0
- package/dist/db/wal-checkpointer.js +92 -0
- package/dist/doctor.js +105 -136
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.d.ts +1 -1
- package/dist/entry/project-identity.js +1 -1
- package/dist/entry/session-text.d.ts +3 -3
- package/dist/entry/session-text.js +3 -3
- package/dist/{eval-stats.js → eval/eval-stats.js} +12 -9
- package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +1 -1
- package/dist/{eval-suite.js → eval/eval-suite.js} +25 -23
- package/dist/{eval.d.ts → eval/eval.d.ts} +1 -1
- package/dist/{eval.js → eval/eval.js} +29 -22
- package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -3
- package/dist/{judgment.js → eval/judgment.js} +4 -9
- package/dist/extensions/openclaw-plugin/index.js +1 -2
- package/dist/graph/delta.d.ts +3 -2
- package/dist/graph/delta.js +9 -23
- package/dist/{graph-extract.d.ts → graph/extract.d.ts} +6 -6
- package/dist/{graph-extract.js → graph/extract.js} +37 -52
- package/dist/{graph-recall.d.ts → graph/recall.d.ts} +2 -2
- package/dist/{graph-recall.js → graph/recall.js} +55 -36
- package/dist/{graph-stream.d.ts → graph/stream.d.ts} +2 -2
- package/dist/{graph-stream.js → graph/stream.js} +9 -7
- package/dist/{graph-view.d.ts → graph/view.d.ts} +6 -3
- package/dist/{graph-view.js → graph/view.js} +127 -167
- package/dist/graph/write.d.ts +4 -76
- package/dist/graph/write.js +13 -397
- package/dist/hooks/codex-session.js +1 -1
- package/dist/hooks/codex-wrapper.js +14 -15
- package/dist/hooks/copilot.d.ts +1 -8
- package/dist/hooks/copilot.js +14 -15
- package/dist/{cli → hooks}/hook-blocks.js +1 -1
- package/dist/hooks/json-hooks.d.ts +1 -1
- package/dist/hooks/json-hooks.js +31 -122
- package/dist/hooks/opencode.js +35 -27
- package/dist/hooks/shared.d.ts +0 -4
- package/dist/hooks/shared.js +1 -5
- package/dist/importers/core.d.ts +2 -6
- package/dist/importers/core.js +41 -39
- package/dist/importers/markdown-parse.d.ts +1 -10
- package/dist/importers/markdown-parse.js +2 -19
- package/dist/importers/markdown.js +2 -1
- package/dist/importers/sources.js +50 -46
- package/dist/importers/vault.js +71 -92
- package/dist/index.d.ts +22 -22
- package/dist/index.js +21 -21
- package/dist/{autolearn.d.ts → learn/autolearn.d.ts} +2 -2
- package/dist/{autolearn.js → learn/autolearn.js} +13 -11
- package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
- package/dist/{churn-git.js → learn/churn-git.js} +6 -4
- package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
- package/dist/learn/extract.js +125 -0
- package/dist/{forward-claim-detector.d.ts → learn/forward-claim-detector.d.ts} +1 -1
- package/dist/{forward-claim-detector.js → learn/forward-claim-detector.js} +1 -1
- package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +4 -0
- package/dist/{invalidation.js → learn/invalidation.js} +83 -99
- package/dist/mcp/admin-tools.d.ts +1 -1
- package/dist/mcp/admin-tools.js +37 -60
- package/dist/mcp/format.d.ts +5 -5
- package/dist/mcp/format.js +7 -6
- package/dist/mcp/framing.d.ts +6 -0
- package/dist/mcp/framing.js +11 -3
- package/dist/mcp/memory-tools.js +7 -27
- package/dist/mcp/protocol.d.ts +6 -10
- package/dist/mcp/protocol.js +8 -14
- package/dist/mcp/recall-tools.d.ts +2 -2
- package/dist/mcp/recall-tools.js +68 -50
- package/dist/mcp/request.js +62 -60
- package/dist/mcp/server.js +1 -1
- package/dist/mcp/session-state.d.ts +1 -2
- package/dist/mcp/session-state.js +2 -2
- package/dist/mcp/shared-gate.js +1 -1
- package/dist/mcp/stdio.js +69 -31
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +2 -2
- package/dist/{customer-notes.d.ts → objects/customer-notes.d.ts} +7 -24
- package/dist/objects/customer-notes.js +112 -0
- package/dist/{decisions.d.ts → objects/decisions.d.ts} +13 -28
- package/dist/objects/decisions.js +101 -0
- package/dist/objects/descriptor.d.ts +52 -0
- package/dist/objects/descriptor.js +4 -0
- package/dist/objects/fields.d.ts +15 -0
- package/dist/objects/fields.js +21 -0
- package/dist/{incidents.d.ts → objects/incidents.d.ts} +17 -44
- package/dist/objects/incidents.js +130 -0
- package/dist/objects/lifecycle.d.ts +27 -0
- package/dist/objects/lifecycle.js +96 -0
- package/dist/{policies.d.ts → objects/policies.d.ts} +14 -27
- package/dist/objects/policies.js +189 -0
- package/dist/{processes.d.ts → objects/processes.d.ts} +14 -34
- package/dist/objects/processes.js +146 -0
- package/dist/{project-briefs.d.ts → objects/project-briefs.d.ts} +19 -40
- package/dist/objects/project-briefs.js +255 -0
- package/dist/{skills.d.ts → objects/skills.d.ts} +11 -26
- package/dist/objects/skills.js +156 -0
- package/dist/postinstall.js +4 -2
- package/dist/predictions/planning-fallacy.d.ts +4 -76
- package/dist/predictions/planning-fallacy.js +4 -129
- package/dist/rerankers/clef.d.ts +2 -6
- package/dist/rerankers/clef.js +27 -47
- package/dist/rerankers/cross-encoder.d.ts +0 -7
- package/dist/rerankers/cross-encoder.js +15 -23
- package/dist/rerankers/index.js +8 -7
- package/dist/rerankers/jev.d.ts +1 -4
- package/dist/rerankers/jev.js +30 -49
- package/dist/rerankers/llm.d.ts +2 -4
- package/dist/rerankers/llm.js +33 -50
- package/dist/rerankers/outage-warning.d.ts +7 -0
- package/dist/rerankers/outage-warning.js +31 -0
- package/dist/rerankers/remote.d.ts +3 -0
- package/dist/rerankers/remote.js +23 -0
- package/dist/rerankers/types.d.ts +1 -1
- package/dist/search/as-of.d.ts +1 -1
- package/dist/search/bm25-search.d.ts +2 -2
- package/dist/search/bm25-search.js +7 -7
- package/dist/search/bm25.d.ts +1 -1
- package/dist/search/bm25.js +1 -1
- package/dist/search/boosts.d.ts +5 -1
- package/dist/search/boosts.js +34 -13
- package/dist/search/breakdown.d.ts +2 -2
- package/dist/search/breakdown.js +2 -1
- package/dist/search/explain.d.ts +1 -1
- package/dist/search/explain.js +3 -2
- package/dist/search/finalize.d.ts +2 -2
- package/dist/search/finalize.js +4 -3
- package/dist/search/fusion.d.ts +1 -1
- package/dist/search/fusion.js +3 -3
- package/dist/search/hybrid-score.d.ts +2 -2
- package/dist/search/hybrid-score.js +1 -1
- package/dist/search/hybrid.d.ts +4 -4
- package/dist/search/hybrid.js +11 -8
- package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
- package/dist/{multihop.js → search/multihop.js} +7 -5
- package/dist/{path-context.js → search/path-context.js} +3 -1
- package/dist/search/physics-search.d.ts +4 -4
- package/dist/search/physics-search.js +15 -15
- package/dist/search/rerank.d.ts +3 -3
- package/dist/search/rerank.js +4 -3
- package/dist/search/temporal.d.ts +1 -1
- package/dist/search/temporal.js +5 -2
- package/dist/search/vector.d.ts +3 -3
- package/dist/search/vector.js +17 -11
- package/dist/server/auth.d.ts +1 -1
- package/dist/server/auth.js +26 -18
- package/dist/server/boot.d.ts +24 -0
- package/dist/server/boot.js +465 -0
- package/dist/server/client-ip.d.ts +5 -1
- package/dist/server/client-ip.js +18 -6
- package/dist/server/cursor.d.ts +1 -1
- package/dist/server/cursor.js +2 -3
- package/dist/server/deadline.d.ts +13 -0
- package/dist/server/deadline.js +45 -0
- package/dist/server/key-check-bounds.d.ts +8 -0
- package/dist/server/key-check-bounds.js +46 -0
- package/dist/server/lifecycle.js +1 -1
- package/dist/server/mcp-http.d.ts +1 -4
- package/dist/server/mcp-http.js +34 -24
- package/dist/server/ready.d.ts +7 -0
- package/dist/server/ready.js +38 -0
- package/dist/server/request.d.ts +10 -4
- package/dist/server/request.js +63 -12
- package/dist/server/route-table.d.ts +15 -0
- package/dist/server/route-table.js +209 -0
- package/dist/server/routes/admin.js +13 -8
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +32 -97
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +42 -105
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +42 -95
- package/dist/server/routes/memories.js +12 -14
- package/dist/server/routes/object-routes.d.ts +40 -0
- package/dist/server/routes/object-routes.js +80 -0
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +40 -124
- package/dist/server/routes/predictions.js +29 -45
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +38 -118
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +38 -110
- package/dist/server/routes/recall.js +14 -12
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +37 -125
- package/dist/{server-detect.js → server/server-detect.js} +1 -1
- package/dist/server/sleep-child.d.ts +2 -0
- package/dist/server/sleep-child.js +19 -0
- package/dist/server/sleep-offload.d.ts +20 -0
- package/dist/server/sleep-offload.js +70 -0
- package/dist/server/tls.d.ts +6 -0
- package/dist/server/tls.js +24 -0
- package/dist/server/types.d.ts +27 -8
- package/dist/server/validation.d.ts +3 -4
- package/dist/server/validation.js +6 -11
- package/dist/server.d.ts +39 -61
- package/dist/server.js +24 -568
- package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +1 -1
- package/dist/{project-merge.js → sharing/project-merge.js} +26 -45
- package/dist/{scope.js → sharing/scope.js} +1 -1
- package/dist/{shared.d.ts → sharing/shared.d.ts} +10 -9
- package/dist/{shared.js → sharing/shared.js} +100 -77
- package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
- package/dist/{ambient-store.js → store/ambient.js} +10 -10
- package/dist/store/audit-event.d.ts +11 -5
- package/dist/store/audit-event.js +5 -4
- package/dist/{audit.d.ts → store/audit.d.ts} +27 -3
- package/dist/{audit.js → store/audit.js} +91 -6
- package/dist/{auth.d.ts → store/auth.d.ts} +15 -32
- package/dist/{auth.js → store/auth.js} +100 -92
- package/dist/store/candidates.d.ts +23 -12
- package/dist/store/candidates.js +87 -35
- package/dist/{card-detail.d.ts → store/card-detail.d.ts} +3 -3
- package/dist/{card-detail.js → store/card-detail.js} +1 -1
- package/dist/{store-cards.d.ts → store/cards.d.ts} +14 -9
- package/dist/{store-cards.js → store/cards.js} +85 -146
- package/dist/store/compactions.d.ts +78 -0
- package/dist/store/compactions.js +93 -0
- package/dist/store/conflicts.d.ts +22 -5
- package/dist/store/conflicts.js +160 -109
- package/dist/store/connectors/github.d.ts +84 -0
- package/dist/store/connectors/github.js +180 -0
- package/dist/store/connectors/slack.d.ts +69 -0
- package/dist/store/connectors/slack.js +177 -0
- package/dist/store/dashboard-reads.d.ts +27 -0
- package/dist/store/dashboard-reads.js +92 -0
- package/dist/store/delete-and-batch.d.ts +20 -24
- package/dist/store/delete-and-batch.js +64 -40
- package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +12 -5
- package/dist/{delivery-recorder.js → store/delivery-recorder.js} +42 -30
- package/dist/store/descendant-page.d.ts +12 -0
- package/dist/store/descendant-page.js +99 -0
- package/dist/store/diagnostics.d.ts +47 -0
- package/dist/store/diagnostics.js +51 -0
- package/dist/store/doctor-reads.d.ts +16 -0
- package/dist/store/doctor-reads.js +19 -0
- package/dist/{dormant.d.ts → store/dormant.d.ts} +46 -12
- package/dist/{dormant.js → store/dormant.js} +151 -6
- package/dist/{embeddings.d.ts → store/embeddings/index.d.ts} +10 -6
- package/dist/{embeddings.js → store/embeddings/index.js} +60 -44
- package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
- package/dist/{local-embedding.js → store/embeddings/local.js} +68 -57
- package/dist/{embedding-provider.d.ts → store/embeddings/provider.d.ts} +2 -2
- package/dist/{embedding-provider.js → store/embeddings/provider.js} +47 -32
- package/dist/store/entry-reads.d.ts +46 -7
- package/dist/store/entry-reads.js +120 -21
- package/dist/store/entry-row.d.ts +8 -2
- package/dist/store/entry-row.js +28 -8
- package/dist/store/entry-writes.d.ts +33 -4
- package/dist/store/entry-writes.js +108 -26
- package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
- package/dist/{failure-log.js → store/failure-log.js} +9 -2
- package/dist/{goals.d.ts → store/goals.d.ts} +6 -46
- package/dist/{goals.js → store/goals.js} +45 -94
- package/dist/store/graph-queue.d.ts +29 -0
- package/dist/store/graph-queue.js +101 -0
- package/dist/{graph/read.d.ts → store/graph-reads.d.ts} +26 -34
- package/dist/{graph/read.js → store/graph-reads.js} +63 -115
- package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +68 -8
- package/dist/{graph/rows.js → store/graph-rows.js} +14 -3
- package/dist/store/graph-view-rows.d.ts +12 -0
- package/dist/store/graph-view-rows.js +67 -0
- package/dist/store/graph-writes.d.ts +58 -0
- package/dist/store/graph-writes.js +256 -0
- package/dist/store/half-life.d.ts +34 -0
- package/dist/store/half-life.js +77 -0
- package/dist/store/handoffs.d.ts +1 -1
- package/dist/store/handoffs.js +39 -30
- package/dist/store/index-and-stats.d.ts +8 -1
- package/dist/store/index-and-stats.js +51 -48
- package/dist/store/index.d.ts +4 -0
- package/dist/store/index.js +3 -0
- package/dist/store/key-audit.d.ts +2 -2
- package/dist/store/key-audit.js +4 -4
- package/dist/store/key-writes.d.ts +12 -5
- package/dist/store/key-writes.js +30 -4
- package/dist/store/ledger-turn.d.ts +17 -0
- package/dist/store/ledger-turn.js +27 -0
- package/dist/store/markdown.d.ts +1 -1
- package/dist/store/markdown.js +4 -3
- package/dist/store/mirrors.d.ts +5 -7
- package/dist/store/mirrors.js +39 -25
- package/dist/store/object-types.d.ts +189 -0
- package/dist/store/object-types.js +4 -0
- package/dist/store/open.d.ts +6 -4
- package/dist/store/open.js +24 -23
- package/dist/store/planning-fallacy-evidence.d.ts +42 -0
- package/dist/store/planning-fallacy-evidence.js +81 -0
- package/dist/store/port.d.ts +646 -0
- package/dist/store/port.js +17 -0
- package/dist/{predictions/store.d.ts → store/predictions.d.ts} +15 -2
- package/dist/{predictions/store.js → store/predictions.js} +52 -67
- package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
- package/dist/{quarantine.js → store/quarantine.js} +64 -22
- package/dist/{raw-archive.d.ts → store/raw-archive.d.ts} +3 -1
- package/dist/{raw-archive.js → store/raw-archive.js} +6 -2
- package/dist/{recall-scope.d.ts → store/recall-scope.d.ts} +2 -2
- package/dist/{recall-scope.js → store/recall-scope.js} +3 -3
- package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -14
- package/dist/{recall-trace.js → store/recall-trace.js} +38 -43
- package/dist/store/rejected-values.d.ts +55 -0
- package/dist/store/rejected-values.js +162 -0
- package/dist/{rejection.d.ts → store/rejection.d.ts} +2 -2
- package/dist/{rejection.js → store/rejection.js} +3 -2
- package/dist/store/rows.d.ts +2 -3
- package/dist/store/rows.js +18 -11
- package/dist/store/search-rows.d.ts +15 -4
- package/dist/store/search-rows.js +41 -28
- package/dist/store/sessions.d.ts +13 -2
- package/dist/store/sessions.js +79 -45
- package/dist/store/sqlite/commit-watch.d.ts +4 -0
- package/dist/store/sqlite/commit-watch.js +29 -0
- package/dist/store/sqlite/connector-events-group.d.ts +5 -0
- package/dist/store/sqlite/connector-events-group.js +50 -0
- package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
- package/dist/store/sqlite/connector-writes-group.js +65 -0
- package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
- package/dist/store/sqlite/dag-reads-group.js +45 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
- package/dist/store/{entry-writes-group.js → sqlite/entry-writes-group.js} +73 -60
- package/dist/store/sqlite/error-codec.d.ts +17 -0
- package/dist/store/sqlite/error-codec.js +59 -0
- package/dist/store/sqlite/executor-counts.d.ts +10 -0
- package/dist/store/sqlite/executor-counts.js +11 -0
- package/dist/store/sqlite/executor.d.ts +28 -0
- package/dist/store/sqlite/executor.js +286 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
- package/dist/store/sqlite/graph-reads-group.js +18 -0
- package/dist/store/sqlite/local.d.ts +21 -0
- package/dist/store/sqlite/local.js +38 -0
- package/dist/store/sqlite/object-rows.d.ts +102 -0
- package/dist/store/sqlite/object-rows.js +218 -0
- package/dist/store/sqlite/objects-group.d.ts +20 -0
- package/dist/store/sqlite/objects-group.js +314 -0
- package/dist/store/sqlite/predictions-group.d.ts +5 -0
- package/dist/store/sqlite/predictions-group.js +28 -0
- package/dist/store/sqlite/quarantine-group.d.ts +5 -0
- package/dist/store/sqlite/quarantine-group.js +38 -0
- package/dist/store/sqlite/store.d.ts +26 -0
- package/dist/store/sqlite/store.js +295 -0
- package/dist/store/sqlite/vector-pack.d.ts +18 -0
- package/dist/store/sqlite/vector-pack.js +46 -0
- package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
- package/dist/store/sqlite/vector-reads-group.js +23 -0
- package/dist/store/sqlite/worker-entry.d.ts +2 -0
- package/dist/store/sqlite/worker-entry.js +8 -0
- package/dist/store/sqlite/worker-jobs.d.ts +5 -0
- package/dist/store/sqlite/worker-jobs.js +116 -0
- package/dist/store/sqlite/worker-ops.d.ts +124 -0
- package/dist/store/sqlite/worker-ops.js +82 -0
- package/dist/store/sqlite/worker-store.d.ts +8 -0
- package/dist/store/sqlite/worker-store.js +76 -0
- package/dist/store/summaries.d.ts +2 -11
- package/dist/store/summaries.js +17 -44
- package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
- package/dist/store/tenant-lookup.d.ts +1 -1
- package/dist/{tenant.d.ts → store/tenant.d.ts} +2 -2
- package/dist/{tenant.js → store/tenant.js} +1 -1
- package/dist/store/token-ledger-rows.d.ts +61 -0
- package/dist/store/token-ledger-rows.js +68 -0
- package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +2 -9
- package/dist/{token-ledger.js → store/token-ledger.js} +31 -78
- package/dist/store/tombstone-checks.d.ts +12 -0
- package/dist/store/tombstone-checks.js +31 -0
- package/dist/store/usage-reports.d.ts +7 -0
- package/dist/store/usage-reports.js +26 -0
- package/dist/store/vector-writes.d.ts +10 -3
- package/dist/store/vector-writes.js +35 -5
- package/dist/{working-memory.d.ts → store/working-memory.d.ts} +5 -1
- package/dist/{working-memory.js → store/working-memory.js} +39 -41
- package/dist/support-bundle.d.ts +1 -1
- package/dist/support-bundle.js +13 -33
- package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
- package/dist/{gated-write.js → trust/gated-write.js} +6 -6
- package/dist/trust/quarantine.d.ts +4 -0
- package/dist/trust/quarantine.js +8 -0
- package/dist/trust/reject-flow.d.ts +23 -0
- package/dist/trust/reject-flow.js +67 -0
- package/dist/util/anthropic-messages.d.ts +31 -0
- package/dist/util/anthropic-messages.js +46 -0
- package/dist/util/atomic-write.d.ts +3 -0
- package/dist/util/atomic-write.js +107 -0
- package/dist/util/crash-handlers.d.ts +5 -0
- package/dist/util/crash-handlers.js +30 -0
- package/dist/{env.d.ts → util/env.d.ts} +15 -2
- package/dist/{env.js → util/env.js} +20 -2
- package/dist/util/home-path.js +67 -0
- package/dist/{http-retry.d.ts → util/http-retry.d.ts} +6 -2
- package/dist/{http-retry.js → util/http-retry.js} +38 -7
- package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
- package/dist/{http-util.js → util/http-util.js} +31 -11
- package/dist/util/json.d.ts +17 -0
- package/dist/util/json.js +25 -0
- package/dist/{log.d.ts → util/log.d.ts} +5 -2
- package/dist/{log.js → util/log.js} +12 -3
- package/dist/util/real-path.d.ts +3 -0
- package/dist/util/real-path.js +15 -0
- package/dist/util/request-scope.d.ts +27 -0
- package/dist/util/request-scope.js +47 -0
- package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
- package/dist/{secret-detect.js → util/secret-detect.js} +5 -4
- package/dist/util/stored-json.d.ts +9 -0
- package/dist/util/stored-json.js +8 -0
- package/dist/util/time.d.ts +2 -0
- package/dist/util/time.js +3 -0
- package/dist/util/token-text.d.ts +18 -0
- package/dist/util/token-text.js +23 -0
- package/dist/{version.d.ts → util/version.d.ts} +1 -1
- package/dist/{version.js → util/version.js} +1 -1
- package/extensions/openclaw-plugin/index.ts +1 -5
- 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/api.d.ts +0 -26
- package/dist/api.js +0 -29
- package/dist/connectors/github/idempotency.d.ts +0 -19
- package/dist/connectors/github/idempotency.js +0 -27
- package/dist/connectors/slack/idempotency.d.ts +0 -17
- package/dist/connectors/slack/idempotency.js +0 -31
- package/dist/customer-notes.js +0 -336
- package/dist/db.d.ts +0 -9
- package/dist/db.js +0 -8
- package/dist/decisions.js +0 -326
- package/dist/extract.js +0 -133
- package/dist/graph/rows.d.ts +0 -45
- package/dist/graph/types.js +0 -11
- package/dist/half-life-migration.js +0 -182
- package/dist/handoff.js +0 -68
- package/dist/home-path.js +0 -24
- package/dist/incidents.js +0 -349
- package/dist/instruction-detect.js +0 -27
- package/dist/json.d.ts +0 -7
- package/dist/json.js +0 -11
- package/dist/ledger-db.d.ts +0 -10
- package/dist/ledger-db.js +0 -42
- package/dist/policies.js +0 -434
- package/dist/processes.js +0 -371
- package/dist/project-briefs.js +0 -523
- package/dist/reject-flow.d.ts +0 -69
- package/dist/reject-flow.js +0 -260
- package/dist/session-owners.d.ts +0 -7
- package/dist/session-owners.js +0 -54
- package/dist/skills.js +0 -367
- package/dist/store/entry-writes-group.d.ts +0 -9
- package/dist/store-port.d.ts +0 -262
- package/dist/store-port.js +0 -178
- /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
- /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
- /package/dist/{recall-history.d.ts → api/recall-history.d.ts} +0 -0
- /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
- /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
- /package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +0 -0
- /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
- /package/dist/{correction-latency.js → cli/correction-latency.js} +0 -0
- /package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +0 -0
- /package/dist/{quality-repair.d.ts → cli/quality-repair.d.ts} +0 -0
- /package/dist/{stdin.d.ts → cli/stdin.d.ts} +0 -0
- /package/dist/{dedupe.d.ts → consolidate/dedupe.d.ts} +0 -0
- /package/dist/{memory-value-weights.d.ts → consolidate/memory-value-weights.d.ts} +0 -0
- /package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +0 -0
- /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
- /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
- /package/dist/{trace.d.ts → consolidate/trace.d.ts} +0 -0
- /package/dist/{ablation.d.ts → core/ablation.d.ts} +0 -0
- /package/dist/{ambient.d.ts → core/ambient.d.ts} +0 -0
- /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
- /package/dist/{api-errors.js → core/api-errors.js} +0 -0
- /package/dist/{card.d.ts → core/card.d.ts} +0 -0
- /package/dist/{card.js → core/card.js} +0 -0
- /package/dist/{handoff.d.ts → core/handoff.d.ts} +0 -0
- /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
- /package/dist/{physics-config.d.ts → core/physics-config.d.ts} +0 -0
- /package/dist/{physics-config.js → core/physics-config.js} +0 -0
- /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
- /package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +0 -0
- /package/dist/{salience.d.ts → core/salience.d.ts} +0 -0
- /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
- /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
- /package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +0 -0
- /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
- /package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +0 -0
- /package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +0 -0
- /package/dist/{cli → hooks}/hook-blocks.d.ts +0 -0
- /package/dist/{path-context.d.ts → search/path-context.d.ts} +0 -0
- /package/dist/{rrf.d.ts → search/rrf.d.ts} +0 -0
- /package/dist/{rrf.js → search/rrf.js} +0 -0
- /package/dist/{rate-limit.d.ts → server/rate-limit.d.ts} +0 -0
- /package/dist/{rate-limit.js → server/rate-limit.js} +0 -0
- /package/dist/{server-detect.d.ts → server/server-detect.d.ts} +0 -0
- /package/dist/{scope.d.ts → sharing/scope.d.ts} +0 -0
- /package/dist/{summary-dirty.js → store/summary-dirty.js} +0 -0
- /package/dist/{yaml.d.ts → store/yaml.d.ts} +0 -0
- /package/dist/{yaml.js → store/yaml.js} +0 -0
- /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
- /package/dist/{escape.js → util/escape.js} +0 -0
- /package/dist/{home-path.d.ts → util/home-path.d.ts} +0 -0
- /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
- /package/dist/{keyset.js → util/keyset.js} +0 -0
- /package/dist/{same-text.js → util/same-text.js} +0 -0
- /package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +0 -0
- /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
- /package/dist/{db → util}/sqlite-blocked.js +0 -0
- /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
- /package/dist/{tokenize.js → util/tokenize.js} +0 -0
- /package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +0 -0
- /package/dist/{transcript-tail.js → util/transcript-tail.js} +0 -0
- /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
- /package/dist/{write-budget.js → util/write-budget.js} +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
// The local Transformers.js embedder, a leaf so embedding-provider.ts can wrap it without importing embeddings.ts.
|
|
2
|
-
import { envModelCache } from '
|
|
2
|
+
import { envModelCache } from '../../util/env.js';
|
|
3
3
|
import * as fs from 'fs';
|
|
4
4
|
import * as path from 'path';
|
|
5
5
|
import { createRequire } from 'module';
|
|
6
|
-
import { loadConfig } from '
|
|
7
|
-
import { log } from '
|
|
6
|
+
import { loadConfig } from '../../core/config.js';
|
|
7
|
+
import { errorMessage, log } from '../../util/log.js';
|
|
8
8
|
const _require = createRequire(import.meta.url);
|
|
9
9
|
let _embeddingAvailable = null;
|
|
10
10
|
// A pipeline is expensive to load, so one instance per model is kept for the process.
|
|
@@ -77,61 +77,72 @@ async function loadPipeline(model) {
|
|
|
77
77
|
return _pipelineInstances.get(model);
|
|
78
78
|
if (_pipelineLoading.has(model))
|
|
79
79
|
return _pipelineLoading.get(model);
|
|
80
|
-
const loading = (
|
|
80
|
+
const loading = createPipeline(model);
|
|
81
|
+
_pipelineLoading.set(model, loading);
|
|
82
|
+
return loading;
|
|
83
|
+
}
|
|
84
|
+
/** The model's pipeline, or null with the reason recorded in `_pipelineErrors`. */
|
|
85
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
86
|
+
async function createPipeline(model) {
|
|
87
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
88
|
+
const pkg = resolveTransformersPackage();
|
|
89
|
+
if (!pkg) {
|
|
90
|
+
_pipelineErrors.set(model, 'no transformers package is installed');
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
const pipelineFn = await importPipelineFactory(pkg, model);
|
|
94
|
+
if (!pipelineFn)
|
|
95
|
+
return null;
|
|
96
|
+
// The offline bundle used in egress-blocked sandboxes ships only the FP32 model, so use whichever file is on disk.
|
|
97
|
+
const cacheRoot = envModelCache();
|
|
98
|
+
const quantized = !cacheRoot
|
|
99
|
+
|| fs.existsSync(path.join(cacheRoot, model, 'onnx', 'model_quantized.onnx'));
|
|
100
|
+
try {
|
|
101
|
+
const instance = await pipelineFn('feature-extraction', model, { quantized });
|
|
102
|
+
_pipelineInstances.set(model, instance);
|
|
103
|
+
return instance;
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
const reason = `embedding pipeline load failed (${model}): ${String(err)}`;
|
|
107
|
+
log.debug(reason);
|
|
108
|
+
_pipelineErrors.set(model, reason);
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
finally {
|
|
112
|
+
_pipelineLoading.delete(model);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/** The package's `pipeline` function, or null with the reason recorded in `_pipelineErrors`. */
|
|
116
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
117
|
+
async function importPipelineFactory(pkg, model) {
|
|
118
|
+
let pipelineFn = null;
|
|
119
|
+
try {
|
|
120
|
+
// SAFETY: the resolved module's shape is untyped by design (optional peer
|
|
121
|
+
// dependency); pipelineFn/mod.env are read defensively below and any
|
|
122
|
+
// failure to find a usable pipeline falls through to `return null`.
|
|
81
123
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
82
|
-
const
|
|
83
|
-
if (
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
try {
|
|
89
|
-
// SAFETY: the resolved module's shape is untyped by design (optional peer
|
|
90
|
-
// dependency); pipelineFn/mod.env are read defensively below and any
|
|
91
|
-
// failure to find a usable pipeline falls through to `return null`.
|
|
92
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
93
|
-
const mod = await _dynImport(pkg);
|
|
94
|
-
if (envModelCache()) {
|
|
95
|
-
if (mod.env) {
|
|
96
|
-
mod.env.cacheDir = envModelCache();
|
|
97
|
-
mod.env.localModelPath = envModelCache();
|
|
98
|
-
mod.env.allowRemoteModels = false;
|
|
99
|
-
}
|
|
124
|
+
const mod = await _dynImport(pkg);
|
|
125
|
+
if (envModelCache()) {
|
|
126
|
+
if (mod.env) {
|
|
127
|
+
mod.env.cacheDir = envModelCache();
|
|
128
|
+
mod.env.localModelPath = envModelCache();
|
|
129
|
+
mod.env.allowRemoteModels = false;
|
|
100
130
|
}
|
|
101
|
-
pipelineFn = mod.pipeline ?? mod.default?.pipeline;
|
|
102
|
-
}
|
|
103
|
-
catch (err) {
|
|
104
|
-
// String(err) keeps a Node error's [ERR_...] code, which callers match on.
|
|
105
|
-
const reason = `transformers import failed (${pkg}): ${String(err)}`;
|
|
106
|
-
log.debug(reason);
|
|
107
|
-
_pipelineErrors.set(model, reason);
|
|
108
|
-
return null;
|
|
109
|
-
}
|
|
110
|
-
if (!pipelineFn) {
|
|
111
|
-
_pipelineErrors.set(model, `${pkg} exports no pipeline function`);
|
|
112
|
-
return null;
|
|
113
|
-
}
|
|
114
|
-
// The offline bundle used in egress-blocked sandboxes ships only the FP32 model, so use whichever file is on disk.
|
|
115
|
-
const cacheRoot = envModelCache();
|
|
116
|
-
const quantized = !cacheRoot
|
|
117
|
-
|| fs.existsSync(path.join(cacheRoot, model, 'onnx', 'model_quantized.onnx'));
|
|
118
|
-
try {
|
|
119
|
-
const instance = await pipelineFn('feature-extraction', model, { quantized });
|
|
120
|
-
_pipelineInstances.set(model, instance);
|
|
121
|
-
return instance;
|
|
122
|
-
}
|
|
123
|
-
catch (err) {
|
|
124
|
-
const reason = `embedding pipeline load failed (${model}): ${String(err)}`;
|
|
125
|
-
log.debug(reason);
|
|
126
|
-
_pipelineErrors.set(model, reason);
|
|
127
|
-
return null;
|
|
128
|
-
}
|
|
129
|
-
finally {
|
|
130
|
-
_pipelineLoading.delete(model);
|
|
131
131
|
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
132
|
+
pipelineFn = mod.pipeline ?? mod.default?.pipeline;
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
// String(err) keeps a Node error's [ERR_...] code, which callers match on.
|
|
136
|
+
const reason = `transformers import failed (${pkg}): ${String(err)}`;
|
|
137
|
+
log.debug(reason);
|
|
138
|
+
_pipelineErrors.set(model, reason);
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
if (!pipelineFn) {
|
|
142
|
+
_pipelineErrors.set(model, `${pkg} exports no pipeline function`);
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
return pipelineFn;
|
|
135
146
|
}
|
|
136
147
|
/** Throws, with the reason, when the model's pipeline cannot load: a provider-level failure, not a per-item skip. */
|
|
137
148
|
export async function requireLocalPipeline(model) {
|
|
@@ -174,8 +185,8 @@ export async function getEmbedding(text, model = DEFAULT_EMBEDDING_MODEL, role)
|
|
|
174
185
|
}
|
|
175
186
|
catch (err) {
|
|
176
187
|
// The caller sees `[]` and names the memory; the reason only shows at debug.
|
|
177
|
-
log.debug(`local embedding failed: ${
|
|
188
|
+
log.debug(`local embedding failed: ${errorMessage(err)}`);
|
|
178
189
|
return [];
|
|
179
190
|
}
|
|
180
191
|
}
|
|
181
|
-
//# sourceMappingURL=local
|
|
192
|
+
//# sourceMappingURL=local.js.map
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
* `fetch` and are integration-verified in Workstream C (real API calls are
|
|
27
27
|
* egress-blocked in the build sandbox).
|
|
28
28
|
*/
|
|
29
|
-
import { type EmbeddingRole } from './local
|
|
29
|
+
import { type EmbeddingRole } from './local.js';
|
|
30
30
|
export type EmbeddingProviderKind = 'local' | 'openai' | 'voyage' | 'cohere';
|
|
31
31
|
export declare const API_PROVIDER_KINDS: readonly EmbeddingProviderKind[];
|
|
32
32
|
export interface EmbeddingProvider {
|
|
@@ -74,4 +74,4 @@ export declare function resolveEmbeddingIdentity(hippoRoot: string, opts?: Resol
|
|
|
74
74
|
* api -> key present. Use at the call sites that decide whether to embed.
|
|
75
75
|
*/
|
|
76
76
|
export declare function isEmbeddingConfigured(hippoRoot: string): boolean;
|
|
77
|
-
//# sourceMappingURL=
|
|
77
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -26,11 +26,13 @@
|
|
|
26
26
|
* `fetch` and are integration-verified in Workstream C (real API calls are
|
|
27
27
|
* egress-blocked in the build sandbox).
|
|
28
28
|
*/
|
|
29
|
-
import { envByName } from '
|
|
30
|
-
import { getEmbedding, isEmbeddingAvailable, requireLocalPipeline, resolveEmbeddingModel, DEFAULT_EMBEDDING_MODEL, } from './local
|
|
31
|
-
import { loadConfig } from '
|
|
32
|
-
import {
|
|
33
|
-
import {
|
|
29
|
+
import { envByName } from '../../util/env.js';
|
|
30
|
+
import { getEmbedding, isEmbeddingAvailable, requireLocalPipeline, resolveEmbeddingModel, DEFAULT_EMBEDDING_MODEL, } from './local.js';
|
|
31
|
+
import { loadConfig } from '../../core/config.js';
|
|
32
|
+
import { errorMessage, log } from '../../util/log.js';
|
|
33
|
+
import { redactSecretsStrict } from '../../util/secret-detect.js';
|
|
34
|
+
import { fetchWithRetry } from '../../util/http-retry.js';
|
|
35
|
+
const ERROR_DETAIL_CHARS = 300;
|
|
34
36
|
export const API_PROVIDER_KINDS = ['openai', 'voyage', 'cohere'];
|
|
35
37
|
function isApiProviderKind(x) {
|
|
36
38
|
return x === 'openai' || x === 'voyage' || x === 'cohere';
|
|
@@ -129,6 +131,13 @@ function redact(text, secret) {
|
|
|
129
131
|
return text;
|
|
130
132
|
return text.split(secret).join('***');
|
|
131
133
|
}
|
|
134
|
+
/** A cause with the key cut out: the caught error's own text or cause chain can echo the Authorization header. */
|
|
135
|
+
function redactedCause(err, key) {
|
|
136
|
+
const copy = new Error(redact(errorMessage(err), key));
|
|
137
|
+
if (err instanceof Error)
|
|
138
|
+
copy.name = err.name;
|
|
139
|
+
return copy;
|
|
140
|
+
}
|
|
132
141
|
function l2normalize(v) {
|
|
133
142
|
let norm = 0;
|
|
134
143
|
for (const x of v)
|
|
@@ -179,11 +188,29 @@ class ApiEmbeddingProvider {
|
|
|
179
188
|
return out;
|
|
180
189
|
}
|
|
181
190
|
async embedChunk(chunk, key, role) {
|
|
191
|
+
const spec = API_PROVIDER_SPECS[this.kind];
|
|
192
|
+
const resp = await this.postChunk(chunk, key, role);
|
|
193
|
+
const json = await this.responseJson(resp, key);
|
|
194
|
+
const vectors = spec.extractVectors(json);
|
|
195
|
+
// A 200 response with the wrong number of vectors (or any empty/malformed
|
|
196
|
+
// vector) is a provider/proxy contract violation, NOT a per-item miss. Throw
|
|
197
|
+
// so a reindex aborts atomically (preserving the prior usable index) and the
|
|
198
|
+
// explicit backfill surfaces it, instead of silently saving []-padded rows.
|
|
199
|
+
if (vectors.length !== chunk.length) {
|
|
200
|
+
throw new Error(redact(`${this.kind} embeddings returned ${vectors.length} vectors for ${chunk.length} inputs`, key));
|
|
201
|
+
}
|
|
202
|
+
for (let i = 0; i < vectors.length; i++) {
|
|
203
|
+
if (!vectors[i] || vectors[i].length === 0) {
|
|
204
|
+
throw new Error(redact(`${this.kind} embeddings returned an empty vector at index ${i}`, key));
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return vectors;
|
|
208
|
+
}
|
|
209
|
+
async postChunk(chunk, key, role) {
|
|
182
210
|
const spec = API_PROVIDER_SPECS[this.kind];
|
|
183
211
|
const url = `${this.baseUrl.replace(/\/$/, '')}/${spec.path}`;
|
|
184
|
-
let resp;
|
|
185
212
|
try {
|
|
186
|
-
|
|
213
|
+
return await fetchWithRetry(url, {
|
|
187
214
|
method: 'POST',
|
|
188
215
|
headers: {
|
|
189
216
|
'content-type': 'application/json',
|
|
@@ -193,9 +220,12 @@ class ApiEmbeddingProvider {
|
|
|
193
220
|
}, { timeoutMs: REQUEST_TIMEOUT_MS });
|
|
194
221
|
}
|
|
195
222
|
catch (err) {
|
|
196
|
-
const msg =
|
|
197
|
-
throw new Error(redact(`embedding request to ${this.kind} failed: ${msg}`, key));
|
|
223
|
+
const msg = errorMessage(err);
|
|
224
|
+
throw new Error(redact(`embedding request to ${this.kind} failed: ${msg}`, key), { cause: redactedCause(err, key) });
|
|
198
225
|
}
|
|
226
|
+
}
|
|
227
|
+
/** The body of an OK reply; any other status, or a body that is not JSON, throws with the key cut out. */
|
|
228
|
+
async responseJson(resp, key) {
|
|
199
229
|
if (!resp.ok) {
|
|
200
230
|
let detail = '';
|
|
201
231
|
try {
|
|
@@ -204,30 +234,15 @@ class ApiEmbeddingProvider {
|
|
|
204
234
|
catch {
|
|
205
235
|
/* ignore body read error */
|
|
206
236
|
}
|
|
207
|
-
throw new Error(redact(`${this.kind} embeddings HTTP ${resp.status}: ${detail.slice(0,
|
|
237
|
+
throw new Error(redact(`${this.kind} embeddings HTTP ${resp.status}: ${detail.slice(0, ERROR_DETAIL_CHARS)}`, key));
|
|
208
238
|
}
|
|
209
|
-
let json;
|
|
210
239
|
try {
|
|
211
|
-
|
|
240
|
+
return await resp.json();
|
|
212
241
|
}
|
|
213
242
|
catch (err) {
|
|
214
|
-
const msg =
|
|
215
|
-
throw new Error(redact(`${this.kind} embeddings returned invalid JSON: ${msg}`, key));
|
|
216
|
-
}
|
|
217
|
-
const vectors = spec.extractVectors(json);
|
|
218
|
-
// A 200 response with the wrong number of vectors (or any empty/malformed
|
|
219
|
-
// vector) is a provider/proxy contract violation, NOT a per-item miss. Throw
|
|
220
|
-
// so a reindex aborts atomically (preserving the prior usable index) and the
|
|
221
|
-
// explicit backfill surfaces it, instead of silently saving []-padded rows.
|
|
222
|
-
if (vectors.length !== chunk.length) {
|
|
223
|
-
throw new Error(redact(`${this.kind} embeddings returned ${vectors.length} vectors for ${chunk.length} inputs`, key));
|
|
224
|
-
}
|
|
225
|
-
for (let i = 0; i < vectors.length; i++) {
|
|
226
|
-
if (!vectors[i] || vectors[i].length === 0) {
|
|
227
|
-
throw new Error(redact(`${this.kind} embeddings returned an empty vector at index ${i}`, key));
|
|
228
|
-
}
|
|
243
|
+
const msg = errorMessage(err);
|
|
244
|
+
throw new Error(redact(`${this.kind} embeddings returned invalid JSON: ${msg}`, key), { cause: redactedCause(err, key) });
|
|
229
245
|
}
|
|
230
|
-
return vectors;
|
|
231
246
|
}
|
|
232
247
|
}
|
|
233
248
|
function readEmbeddingsConfig(hippoRoot) {
|
|
@@ -306,10 +321,10 @@ export function isEmbeddingConfigured(hippoRoot) {
|
|
|
306
321
|
try {
|
|
307
322
|
return resolveEmbeddingProvider(hippoRoot).isAvailable();
|
|
308
323
|
}
|
|
309
|
-
catch {
|
|
310
|
-
//
|
|
311
|
-
|
|
324
|
+
catch (err) {
|
|
325
|
+
// An invalid embedding config must not crash the best-effort ingestion guard, so it reads as not configured.
|
|
326
|
+
log.debug(`embedding config unusable: ${errorMessage(err)}`);
|
|
312
327
|
return false;
|
|
313
328
|
}
|
|
314
329
|
}
|
|
315
|
-
//# sourceMappingURL=
|
|
330
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type { MemoryEntry } from '../memory.js';
|
|
2
|
-
import { type DatabaseSyncLike } from '../db.js';
|
|
1
|
+
import type { MemoryEntry } from '../core/memory.js';
|
|
2
|
+
import { type DatabaseSyncLike } from '../db/index.js';
|
|
3
|
+
export declare const TENANT_IS = "+tenant_id = ?";
|
|
3
4
|
/**
|
|
4
5
|
* Read a memory entry by ID.
|
|
5
6
|
*
|
|
@@ -12,6 +13,8 @@ export declare function readEntry(hippoRoot: string, id: string, tenantId?: stri
|
|
|
12
13
|
export declare const ID_CHUNK = 500;
|
|
13
14
|
/** `items` in consecutive slices of at most `size`. */
|
|
14
15
|
export declare function chunked<T>(items: readonly T[], size?: number): T[][];
|
|
16
|
+
/** 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
|
+
export declare function heldIdLookup(hippoRoot: string, tenantId: string, ids: readonly string[]): (id: string) => boolean;
|
|
15
18
|
/** Rows by id on the caller's handle, one query per chunk; an id missing or in another tenant is absent from the map. */
|
|
16
19
|
export declare function selectEntriesByIds(db: DatabaseSyncLike, ids: readonly string[], tenantId?: string): Map<string, MemoryEntry>;
|
|
17
20
|
/** Direct children of each parent, one query per chunk; each list is in `created ASC, id ASC` order. */
|
|
@@ -62,11 +65,6 @@ export declare function countSessionRawMemories(hippoRoot: string, sessionId: st
|
|
|
62
65
|
* `RecallContractError` for it when `HIPPO_REQUIRE_SESSION_SCOPED_FRESH_TAIL=1` is set.
|
|
63
66
|
*/
|
|
64
67
|
export declare function loadFreshRawMemories(hippoRoot: string, count: number, tenantId?: string, sessionId?: string, origins?: readonly string[]): MemoryEntry[];
|
|
65
|
-
/**
|
|
66
|
-
* Direct DAG children of a parent summary. Tenant scoped. Returns only rows
|
|
67
|
-
* whose `dag_parent_id` matches `parentId`; does NOT walk recursively.
|
|
68
|
-
*/
|
|
69
|
-
export declare function loadChildrenOf(hippoRoot: string, parentId: string, tenantId?: string): MemoryEntry[];
|
|
70
68
|
/**
|
|
71
69
|
* Load all entries from SQLite.
|
|
72
70
|
*
|
|
@@ -80,4 +78,45 @@ export declare function selectAllEntries(db: DatabaseSyncLike, tenantId?: string
|
|
|
80
78
|
/** Live rows whose source starts with `prefix`, on the caller's handle; LIKE folds case, so the prefix is checked again exactly. */
|
|
81
79
|
export declare function selectLiveEntriesBySourcePrefix(db: DatabaseSyncLike, tenantId: string, prefix: string): MemoryEntry[];
|
|
82
80
|
export declare function loadContentsWithTag(hippoRoot: string, tenantId: string, tag: string, origins?: readonly string[]): string[];
|
|
81
|
+
export interface VaultRawRow {
|
|
82
|
+
id: string;
|
|
83
|
+
artifact_ref: string;
|
|
84
|
+
tags_json: string;
|
|
85
|
+
scope: string | null;
|
|
86
|
+
}
|
|
87
|
+
/** Live raw rows whose artifact_ref matches a LIKE pattern, for one tenant; the store is set up first when it is new. */
|
|
88
|
+
export declare function loadVaultRawRows(hippoRoot: string, likeParam: string, tenantId: string): VaultRawRow[];
|
|
89
|
+
export interface PreviewRow {
|
|
90
|
+
id: string;
|
|
91
|
+
content: string;
|
|
92
|
+
source: string | null;
|
|
93
|
+
confidence: MemoryEntry['confidence'] | null;
|
|
94
|
+
extracted_from: string | null;
|
|
95
|
+
dag_level: number | null;
|
|
96
|
+
tags_json: string | null;
|
|
97
|
+
}
|
|
98
|
+
/** Reads memories from a store whose schema may predate some columns; `columns` is the table's real column set. */
|
|
99
|
+
export declare function selectPreviewRows(db: DatabaseSyncLike, columns: ReadonlySet<string>, tenantId: string): PreviewRow[];
|
|
100
|
+
/** True when a memory row, of any tenant, already holds `id`. */
|
|
101
|
+
export declare function entryIdTakenAt(db: DatabaseSyncLike, id: string): boolean;
|
|
102
|
+
/** The text, tenant and scope of memory `id`, or undefined when no row holds it. */
|
|
103
|
+
export declare function entryRejectRowAt(db: DatabaseSyncLike, id: string): {
|
|
104
|
+
content: string;
|
|
105
|
+
tenant_id: string;
|
|
106
|
+
scope: string | null;
|
|
107
|
+
} | undefined;
|
|
108
|
+
export declare function objectMemoryRowsAt(db: DatabaseSyncLike): Array<{
|
|
109
|
+
memory_id: string;
|
|
110
|
+
status: string;
|
|
111
|
+
}>;
|
|
112
|
+
/** Live rows of a tenant whose source does not start with `sourcePrefix`; `origins` (global store only) limits them to user-global rows and those projects. */
|
|
113
|
+
export declare function selectRowsOutsideSourcePrefixAt(db: DatabaseSyncLike, tenantId: string, sourcePrefix: string, origins: readonly string[] | null): Array<{
|
|
114
|
+
id: string;
|
|
115
|
+
content: string;
|
|
116
|
+
source: string;
|
|
117
|
+
}>;
|
|
118
|
+
/** Content of a tenant's live rows written by `source` and tagged `tag` that no extraction produced, in loadAllEntries' order and in every scope; `exceptSessionId` drops one session's own rows. */
|
|
119
|
+
export declare function loadLiveContentsBySourceAndTag(hippoRoot: string, tenantId: string, source: string, tag: string, exceptSessionId: string): string[];
|
|
120
|
+
/** Every tenant's distilled rows nothing has superseded, in loadAllEntries' order: the rows that can be each other's duplicate. */
|
|
121
|
+
export declare function loadCurrentDistilledEntries(hippoRoot: string): MemoryEntry[];
|
|
83
122
|
//# sourceMappingURL=entry-reads.d.ts.map
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import { closeHippoDb } from '../db.js';
|
|
1
|
+
import { closeHippoDb } from '../db/index.js';
|
|
2
2
|
import { MEMORY_SELECT_COLUMNS, rowToEntry, parseJsonArray } from './rows.js';
|
|
3
3
|
import { openStore } from './open.js';
|
|
4
|
-
import { escapeLike } from '../escape.js';
|
|
5
|
-
import { originInSql } from '../project-identity.js';
|
|
6
|
-
import { scopeAdmitSql } from '
|
|
4
|
+
import { escapeLike } from '../util/escape.js';
|
|
5
|
+
import { originInSql } from '../core/project-identity.js';
|
|
6
|
+
import { scopeAdmitSql } from './recall-scope.js';
|
|
7
|
+
const MAX_IDS_PER_READ = 500;
|
|
8
|
+
// 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
|
+
export const TENANT_IS = '+tenant_id = ?';
|
|
7
10
|
/**
|
|
8
11
|
* Read a memory entry by ID.
|
|
9
12
|
*
|
|
@@ -34,10 +37,37 @@ export function chunked(items, size = ID_CHUNK) {
|
|
|
34
37
|
out.push(items.slice(i, i + size));
|
|
35
38
|
return out;
|
|
36
39
|
}
|
|
40
|
+
/** 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
|
+
export function heldIdLookup(hippoRoot, tenantId, ids) {
|
|
42
|
+
const held = new Map();
|
|
43
|
+
const lookUp = (asked) => {
|
|
44
|
+
const db = openStore(hippoRoot);
|
|
45
|
+
try {
|
|
46
|
+
for (const chunk of chunked([...new Set(asked)])) {
|
|
47
|
+
for (const id of chunk)
|
|
48
|
+
held.set(id, false);
|
|
49
|
+
// SAFETY: rows' shape matches the single `id` column selected.
|
|
50
|
+
const rows = db.prepare(`SELECT id FROM memories WHERE id IN (${chunk.map(() => '?').join(',')}) AND ${TENANT_IS}`).all(...chunk, tenantId);
|
|
51
|
+
for (const row of rows)
|
|
52
|
+
held.set(row.id, true);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
closeHippoDb(db);
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
if (ids.length > 0)
|
|
60
|
+
lookUp(ids);
|
|
61
|
+
return (id) => {
|
|
62
|
+
if (!held.has(id))
|
|
63
|
+
lookUp([id]);
|
|
64
|
+
return held.get(id) === true;
|
|
65
|
+
};
|
|
66
|
+
}
|
|
37
67
|
/** Rows by id on the caller's handle, one query per chunk; an id missing or in another tenant is absent from the map. */
|
|
38
68
|
export function selectEntriesByIds(db, ids, tenantId) {
|
|
39
69
|
const byId = new Map();
|
|
40
|
-
const tenantClause = tenantId !== undefined ?
|
|
70
|
+
const tenantClause = tenantId !== undefined ? ` AND ${TENANT_IS}` : '';
|
|
41
71
|
const tenantArgs = tenantId !== undefined ? [tenantId] : [];
|
|
42
72
|
for (const chunk of chunked([...new Set(ids)])) {
|
|
43
73
|
const placeholders = chunk.map(() => '?').join(',');
|
|
@@ -51,7 +81,7 @@ export function selectEntriesByIds(db, ids, tenantId) {
|
|
|
51
81
|
/** Direct children of each parent, one query per chunk; each list is in `created ASC, id ASC` order. */
|
|
52
82
|
export function selectChildrenByParent(db, parentIds, tenantId) {
|
|
53
83
|
const byParent = new Map();
|
|
54
|
-
const tenantClause = tenantId !== undefined ?
|
|
84
|
+
const tenantClause = tenantId !== undefined ? ` AND ${TENANT_IS}` : '';
|
|
55
85
|
const tenantArgs = tenantId !== undefined ? [tenantId] : [];
|
|
56
86
|
for (const chunk of chunked([...new Set(parentIds)])) {
|
|
57
87
|
const placeholders = chunk.map(() => '?').join(',');
|
|
@@ -77,7 +107,7 @@ export function selectChildrenByParent(db, parentIds, tenantId) {
|
|
|
77
107
|
export function loadEntriesByIds(hippoRoot, ids, tenantId) {
|
|
78
108
|
if (ids.length === 0)
|
|
79
109
|
return [];
|
|
80
|
-
const capped = ids.slice(0,
|
|
110
|
+
const capped = ids.slice(0, MAX_IDS_PER_READ);
|
|
81
111
|
const db = openStore(hippoRoot);
|
|
82
112
|
try {
|
|
83
113
|
const placeholders = capped.map(() => '?').join(',');
|
|
@@ -85,7 +115,7 @@ export function loadEntriesByIds(hippoRoot, ids, tenantId) {
|
|
|
85
115
|
// SAFETY: both branches select exactly MEMORY_SELECT_COLUMNS, matching
|
|
86
116
|
// MemoryRow's field set.
|
|
87
117
|
const rows = tenantId !== undefined
|
|
88
|
-
? db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE id IN (${placeholders}) AND
|
|
118
|
+
? 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)
|
|
89
119
|
: db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE id IN (${placeholders}) ORDER BY created ASC, content ASC, id ASC`).all(...capped);
|
|
90
120
|
return rows.map(rowToEntry);
|
|
91
121
|
}
|
|
@@ -224,19 +254,6 @@ export function loadFreshRawMemories(hippoRoot, count, tenantId, sessionId, orig
|
|
|
224
254
|
closeHippoDb(db);
|
|
225
255
|
}
|
|
226
256
|
}
|
|
227
|
-
/**
|
|
228
|
-
* Direct DAG children of a parent summary. Tenant scoped. Returns only rows
|
|
229
|
-
* whose `dag_parent_id` matches `parentId`; does NOT walk recursively.
|
|
230
|
-
*/
|
|
231
|
-
export function loadChildrenOf(hippoRoot, parentId, tenantId) {
|
|
232
|
-
const db = openStore(hippoRoot);
|
|
233
|
-
try {
|
|
234
|
-
return selectChildrenByParent(db, [parentId], tenantId).get(parentId) ?? [];
|
|
235
|
-
}
|
|
236
|
-
finally {
|
|
237
|
-
closeHippoDb(db);
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
257
|
/**
|
|
241
258
|
* Load all entries from SQLite.
|
|
242
259
|
*
|
|
@@ -283,4 +300,86 @@ export function loadContentsWithTag(hippoRoot, tenantId, tag, origins) {
|
|
|
283
300
|
closeHippoDb(db);
|
|
284
301
|
}
|
|
285
302
|
}
|
|
303
|
+
/** Live raw rows whose artifact_ref matches a LIKE pattern, for one tenant; the store is set up first when it is new. */
|
|
304
|
+
export function loadVaultRawRows(hippoRoot, likeParam, tenantId) {
|
|
305
|
+
const db = openStore(hippoRoot);
|
|
306
|
+
try {
|
|
307
|
+
// SAFETY: query selects exactly the columns of VaultRawRow, in the same
|
|
308
|
+
// names, from the memories table this module owns.
|
|
309
|
+
return db
|
|
310
|
+
.prepare(`SELECT id, artifact_ref, tags_json, scope FROM memories
|
|
311
|
+
WHERE artifact_ref LIKE ? ESCAPE '\\' AND tenant_id = ? AND kind = 'raw'`)
|
|
312
|
+
.all(likeParam, tenantId);
|
|
313
|
+
}
|
|
314
|
+
finally {
|
|
315
|
+
closeHippoDb(db);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
/** Reads memories from a store whose schema may predate some columns; `columns` is the table's real column set. */
|
|
319
|
+
export function selectPreviewRows(db, columns, tenantId) {
|
|
320
|
+
const tenant = columns.has('tenant_id') ? ' WHERE tenant_id = ?' : '';
|
|
321
|
+
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')}, ${column('dag_level', '0')}, ${column('tags_json', "'[]'")} FROM memories${tenant}`);
|
|
323
|
+
// SAFETY: the SELECT names every PreviewRow field, each a literal fallback when its column is missing.
|
|
324
|
+
return (tenant ? statement.all(tenantId) : statement.all());
|
|
325
|
+
}
|
|
326
|
+
/** True when a memory row, of any tenant, already holds `id`. */
|
|
327
|
+
export function entryIdTakenAt(db, id) {
|
|
328
|
+
return db.prepare(`SELECT 1 FROM memories WHERE id = ?`).get(id) !== undefined;
|
|
329
|
+
}
|
|
330
|
+
/** The text, tenant and scope of memory `id`, or undefined when no row holds it. */
|
|
331
|
+
export function entryRejectRowAt(db, id) {
|
|
332
|
+
// SAFETY: row's shape matches the three columns named in the SELECT.
|
|
333
|
+
return db
|
|
334
|
+
.prepare(`SELECT content, tenant_id, scope FROM memories WHERE id = ?`)
|
|
335
|
+
.get(id);
|
|
336
|
+
}
|
|
337
|
+
/** Memory ids held by each typed-object table, with the status of the object that holds them. */
|
|
338
|
+
const OBJECT_TABLES = ['decisions', 'incidents', 'processes', 'policies', 'skills', 'project_briefs', 'customer_notes'];
|
|
339
|
+
export function objectMemoryRowsAt(db) {
|
|
340
|
+
const out = [];
|
|
341
|
+
for (const table of OBJECT_TABLES) {
|
|
342
|
+
// SAFETY: SELECT of two TEXT columns, filtered to a non-null memory_id.
|
|
343
|
+
out.push(...db.prepare(`SELECT memory_id, status FROM ${table} WHERE memory_id IS NOT NULL`).all());
|
|
344
|
+
}
|
|
345
|
+
return out;
|
|
346
|
+
}
|
|
347
|
+
/** Live rows of a tenant whose source does not start with `sourcePrefix`; `origins` (global store only) limits them to user-global rows and those projects. */
|
|
348
|
+
export function selectRowsOutsideSourcePrefixAt(db, tenantId, sourcePrefix, origins) {
|
|
349
|
+
const visible = origins !== null ? ` AND (origin_project = '' OR ${originInSql(origins)})` : '';
|
|
350
|
+
const params = origins !== null ? [tenantId, sourcePrefix, ...origins] : [tenantId, sourcePrefix];
|
|
351
|
+
// SAFETY: the SELECT names the three columns of the row type.
|
|
352
|
+
return db.prepare(`SELECT id, content, source FROM memories
|
|
353
|
+
WHERE tenant_id = ? AND superseded_by IS NULL AND substr(source, 1, ${sourcePrefix.length}) != ?${visible}`).all(...params);
|
|
354
|
+
}
|
|
355
|
+
/** Content of a tenant's live rows written by `source` and tagged `tag` that no extraction produced, in loadAllEntries' order and in every scope; `exceptSessionId` drops one session's own rows. */
|
|
356
|
+
export function loadLiveContentsBySourceAndTag(hippoRoot, tenantId, source, tag, exceptSessionId) {
|
|
357
|
+
const db = openStore(hippoRoot);
|
|
358
|
+
try {
|
|
359
|
+
/** SAFETY: rows' shape matches the two columns named in the SELECT below. */
|
|
360
|
+
const rows = db.prepare(`SELECT content, tags_json FROM memories
|
|
361
|
+
WHERE tenant_id = ? AND source = ? AND instr(tags_json, ?) > 0
|
|
362
|
+
AND COALESCE(extracted_from, '') = '' AND COALESCE(superseded_by, '') = ''
|
|
363
|
+
AND (source_session_id IS NULL OR source_session_id != ?)
|
|
364
|
+
ORDER BY created ASC, id ASC`).all(tenantId, source, JSON.stringify(tag), exceptSessionId);
|
|
365
|
+
return rows.filter((r) => parseJsonArray(r.tags_json).includes(tag)).map((r) => r.content);
|
|
366
|
+
}
|
|
367
|
+
finally {
|
|
368
|
+
closeHippoDb(db);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
/** Every tenant's distilled rows nothing has superseded, in loadAllEntries' order: the rows that can be each other's duplicate. */
|
|
372
|
+
export function loadCurrentDistilledEntries(hippoRoot) {
|
|
373
|
+
const db = openStore(hippoRoot);
|
|
374
|
+
try {
|
|
375
|
+
// SAFETY: selects exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
|
|
376
|
+
const rows = db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories
|
|
377
|
+
WHERE COALESCE(kind, 'distilled') = 'distilled' AND COALESCE(superseded_by, '') = ''
|
|
378
|
+
ORDER BY created ASC, id ASC`).all();
|
|
379
|
+
return rows.map(rowToEntry);
|
|
380
|
+
}
|
|
381
|
+
finally {
|
|
382
|
+
closeHippoDb(db);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
286
385
|
//# sourceMappingURL=entry-reads.js.map
|
|
@@ -1,12 +1,18 @@
|
|
|
1
|
-
import type { MemoryEntry } from '../memory.js';
|
|
2
|
-
import { openHippoDb } from '../db.js';
|
|
1
|
+
import type { MemoryEntry } from '../core/memory.js';
|
|
2
|
+
import { openHippoDb } from '../db/index.js';
|
|
3
3
|
export declare function upsertEntryRow(db: ReturnType<typeof openHippoDb>, entry: MemoryEntry): void;
|
|
4
4
|
/** The row alone, with no rejection guard or full-text row, for `upsertEntryRow` and for `batchWriteAndDelete`, which probes tombstones and indexes per batch. Returns whether the row is new. */
|
|
5
5
|
export declare function upsertMemoryRow(db: ReturnType<typeof openHippoDb>, entry: MemoryEntry): boolean;
|
|
6
6
|
export declare function syncFtsRow(db: ReturnType<typeof openHippoDb>, entry: MemoryEntry, isNewRow?: boolean): void;
|
|
7
|
+
export declare function ftsRowExists(db: ReturnType<typeof openHippoDb>, id: string): boolean;
|
|
7
8
|
export declare function deleteFtsRow(db: ReturnType<typeof openHippoDb>, id: string): void;
|
|
8
9
|
/** One set delete for `staleIds`, because `id` is UNINDEXED and each delete by id scans the whole index; then one insert per row. */
|
|
9
10
|
export declare function replaceFtsRows(db: ReturnType<typeof openHippoDb>, rows: readonly MemoryEntry[], staleIds: readonly string[]): void;
|
|
11
|
+
/** Row counts of a full-text index that has drifted from `memories`, re-synced after the count when `repair`; null when the two agree or there is no index. */
|
|
12
|
+
export declare function ftsDrift(hippoRoot: string, repair: boolean): {
|
|
13
|
+
memories: number;
|
|
14
|
+
fts: number;
|
|
15
|
+
} | null;
|
|
10
16
|
/**
|
|
11
17
|
* Write a memory entry to SQLite and refresh compatibility mirrors.
|
|
12
18
|
*
|
package/dist/store/entry-row.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { isFtsAvailable } from '../db.js';
|
|
2
|
-
import { fallbackOrigin, originFromSource } from '../project-identity.js';
|
|
3
|
-
import { checkRejectionGuard } from '
|
|
4
|
-
import { log } from '../log.js';
|
|
1
|
+
import { closeHippoDb, ftsRowCounts, openHippoDb, isFtsAvailable, repairFtsDrift } from '../db/index.js';
|
|
2
|
+
import { fallbackOrigin, originFromSource } from '../core/project-identity.js';
|
|
3
|
+
import { checkRejectionGuard } from './rejection.js';
|
|
4
|
+
import { errorMessage, log } from '../util/log.js';
|
|
5
5
|
export function upsertEntryRow(db, entry) {
|
|
6
6
|
checkRejectionGuard(db, entry.tenantId ?? 'default', entry.id, entry.content);
|
|
7
7
|
syncFtsRow(db, entry, upsertMemoryRow(db, entry));
|
|
@@ -120,9 +120,12 @@ export function syncFtsRow(db, entry, isNewRow = false) {
|
|
|
120
120
|
}
|
|
121
121
|
catch (err) {
|
|
122
122
|
// The memories table stays authoritative; a stale FTS row only costs recall quality, so the write goes on.
|
|
123
|
-
log.warnThenDebug('fts-sync', `FTS index update failed for ${entry.id}; keyword recall may miss it: ${
|
|
123
|
+
log.warnThenDebug('fts-sync', `FTS index update failed for ${entry.id}; keyword recall may miss it: ${errorMessage(err)}`);
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
|
+
export function ftsRowExists(db, id) {
|
|
127
|
+
return db.prepare('SELECT id FROM memories_fts WHERE id = ?').get(id) !== undefined;
|
|
128
|
+
}
|
|
126
129
|
export function deleteFtsRow(db, id) {
|
|
127
130
|
if (!isFtsAvailable(db))
|
|
128
131
|
return;
|
|
@@ -130,7 +133,7 @@ export function deleteFtsRow(db, id) {
|
|
|
130
133
|
db.prepare(`DELETE FROM memories_fts WHERE id = ?`).run(id);
|
|
131
134
|
}
|
|
132
135
|
catch (err) {
|
|
133
|
-
log.warnThenDebug('fts-delete', `FTS index delete failed for ${id}; recall may return a stale hit: ${
|
|
136
|
+
log.warnThenDebug('fts-delete', `FTS index delete failed for ${id}; recall may return a stale hit: ${errorMessage(err)}`);
|
|
134
137
|
}
|
|
135
138
|
}
|
|
136
139
|
/** One set delete for `staleIds`, because `id` is UNINDEXED and each delete by id scans the whole index; then one insert per row. */
|
|
@@ -145,7 +148,7 @@ export function replaceFtsRows(db, rows, staleIds) {
|
|
|
145
148
|
catch (err) {
|
|
146
149
|
// Their old rows are still indexed, so inserting them again would index an id twice; only new ids go in.
|
|
147
150
|
kept = new Set(staleIds);
|
|
148
|
-
log.warnThenDebug('fts-delete', `FTS index delete failed for ${staleIds.length} row(s); recall may return a stale hit: ${
|
|
151
|
+
log.warnThenDebug('fts-delete', `FTS index delete failed for ${staleIds.length} row(s); recall may return a stale hit: ${errorMessage(err)}`);
|
|
149
152
|
}
|
|
150
153
|
}
|
|
151
154
|
const toInsert = rows.filter((row) => !kept.has(row.id));
|
|
@@ -157,10 +160,27 @@ export function replaceFtsRows(db, rows, staleIds) {
|
|
|
157
160
|
insert.run(row.id, row.content, row.tags.join(' '));
|
|
158
161
|
}
|
|
159
162
|
catch (err) {
|
|
160
|
-
log.warnThenDebug('fts-sync', `FTS index update failed for ${row.id}; keyword recall may miss it: ${
|
|
163
|
+
log.warnThenDebug('fts-sync', `FTS index update failed for ${row.id}; keyword recall may miss it: ${errorMessage(err)}`);
|
|
161
164
|
}
|
|
162
165
|
}
|
|
163
166
|
}
|
|
167
|
+
/** Row counts of a full-text index that has drifted from `memories`, re-synced after the count when `repair`; null when the two agree or there is no index. */
|
|
168
|
+
export function ftsDrift(hippoRoot, repair) {
|
|
169
|
+
const db = openHippoDb(hippoRoot);
|
|
170
|
+
try {
|
|
171
|
+
if (!isFtsAvailable(db))
|
|
172
|
+
return null;
|
|
173
|
+
const counts = ftsRowCounts(db);
|
|
174
|
+
if (counts === null || counts.memories === counts.fts)
|
|
175
|
+
return null;
|
|
176
|
+
if (repair)
|
|
177
|
+
repairFtsDrift(db);
|
|
178
|
+
return counts;
|
|
179
|
+
}
|
|
180
|
+
finally {
|
|
181
|
+
closeHippoDb(db);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
164
184
|
/**
|
|
165
185
|
* Write a memory entry to SQLite and refresh compatibility mirrors.
|
|
166
186
|
*
|