hippo-memory 1.68.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 +6 -3
- 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.d.ts +3 -1
- package/dist/agent-memories/copilot.js +5 -4
- 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 +14 -4
- package/dist/api/context-select.js +50 -60
- package/dist/api/context-types.d.ts +5 -5
- package/dist/api/context.d.ts +2 -4
- package/dist/api/context.js +113 -85
- 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 +4 -13
- package/dist/api/forget.js +13 -35
- 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 +9 -46
- package/dist/api/outcome.js +15 -57
- 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 +7 -18
- package/dist/api/promote.js +30 -152
- 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 +12 -13
- package/dist/api/remember.js +38 -27
- 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 +59 -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.d.ts +3 -0
- package/dist/capture/copilot-transcript.js +9 -2
- 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.d.ts +13 -0
- package/dist/capture/session-worker.js +196 -0
- 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 +265 -191
- package/dist/cli/setup.d.ts +2 -1
- package/dist/cli/setup.js +111 -45
- 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 +8 -3
- 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 -82
- 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 -48
- 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 -90
- 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} +16 -3
- package/dist/core/capture-contract.js +149 -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} +19 -5
- package/dist/{memory.js → core/memory.js} +117 -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.d.ts → core/prompt-recall.d.ts} +5 -0
- package/dist/{prompt-recall.js → core/prompt-recall.js} +14 -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 +48 -13
- package/dist/hooks/copilot.js +124 -39
- package/dist/{cli → hooks}/hook-blocks.js +1 -1
- package/dist/hooks/json-hooks.d.ts +3 -1
- package/dist/hooks/json-hooks.js +40 -122
- package/dist/hooks/opencode.js +35 -27
- package/dist/hooks/shared.d.ts +7 -5
- package/dist/hooks/shared.js +19 -8
- 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.d.ts +2 -2
- package/dist/mcp/memory-tools.js +12 -31
- 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 +65 -63
- 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 +21 -20
- 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} +3 -2
- 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 +41 -50
- package/dist/server.js +26 -560
- 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 +12 -6
- package/dist/store/audit-event.js +6 -5
- 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 +6 -3
- package/dist/store/handoffs.js +70 -31
- 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 +8 -4
- package/dist/store/open.js +34 -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} +5 -3
- package/dist/{raw-archive.js → store/raw-archive.js} +11 -5
- package/dist/{recall-scope.d.ts → store/recall-scope.d.ts} +4 -7
- package/dist/{recall-scope.js → store/recall-scope.js} +8 -9
- 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 +43 -36
- package/dist/store/sessions.d.ts +18 -2
- package/dist/store/sessions.js +83 -46
- 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/sqlite/entry-writes-group.js +170 -0
- 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} +17 -2
- package/dist/{env.js → util/env.js} +22 -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/capture-contract.js +0 -49
- 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-port.d.ts +0 -191
- package/dist/store-port.js +0 -166
- /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/{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
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
// hippo.db's half of the EntryWrites store group: the queries remember, outcome, supersede, archive and forget run today.
|
|
2
|
+
import { ConflictError, NotFoundError } from '../../core/api-errors.js';
|
|
3
|
+
import { appendAuditEvent } from '../audit.js';
|
|
4
|
+
import { isSqliteBusy, withWriteScope } from '../../db/index.js';
|
|
5
|
+
import { errorMessage, log } from '../../util/log.js';
|
|
6
|
+
import { entryAfterOutcome } from '../../core/memory.js';
|
|
7
|
+
import { archiveRawMemory } from '../raw-archive.js';
|
|
8
|
+
import { ownScopeTouches } from '../recall-scope.js';
|
|
9
|
+
import { recordTraceOutcome } from '../recall-trace.js';
|
|
10
|
+
import { RejectedValueError } from '../rejection.js';
|
|
11
|
+
import { markSummaryDirtyInTx } from '../summary-dirty.js';
|
|
12
|
+
import { auditRejectionRefusal } from '../audit-event.js';
|
|
13
|
+
import { deleteEntryCore } from '../delete-and-batch.js';
|
|
14
|
+
import { selectEntriesByIds } from '../entry-reads.js';
|
|
15
|
+
import { stampOriginProject } from '../entry-row.js';
|
|
16
|
+
import { writeEntryDbOnly, writeEntryMirrors } from '../entry-writes.js';
|
|
17
|
+
import { updateStatsUnlessBusy } from '../index-and-stats.js';
|
|
18
|
+
import { purgeMirrorBestEffort, removeEntryMirrors } from '../mirrors.js';
|
|
19
|
+
import { onHandle, openStore } from '../open.js';
|
|
20
|
+
import { selectMemoryReach } from '../tenant-lookup.js';
|
|
21
|
+
/** Each call on its own handle; mirrors and the forgotten counter follow the commit, so a rolled-back write leaves neither. */
|
|
22
|
+
export function sqliteEntryWrites(hippoRoot) {
|
|
23
|
+
return {
|
|
24
|
+
writeEntry(write) {
|
|
25
|
+
writeEntryAt(hippoRoot, write);
|
|
26
|
+
},
|
|
27
|
+
applyOutcome(outcome) {
|
|
28
|
+
return applyOutcomeAt(hippoRoot, outcome);
|
|
29
|
+
},
|
|
30
|
+
supersede(write) {
|
|
31
|
+
const successor = stampOriginProject(hippoRoot, write.successor);
|
|
32
|
+
onHandle(hippoRoot, (db) => commitSupersede(db, { ...write, successor }));
|
|
33
|
+
writeEntryMirrors(hippoRoot, successor);
|
|
34
|
+
},
|
|
35
|
+
archiveRaw(archive) {
|
|
36
|
+
return archiveRawAt(hippoRoot, archive);
|
|
37
|
+
},
|
|
38
|
+
forget(removal) {
|
|
39
|
+
onHandle(hippoRoot, (db) => withWriteScope(db, 'forget_in_reach', () => {
|
|
40
|
+
assertInReach(db, removal, removal.id);
|
|
41
|
+
if (!deleteEntryCore(db, removal.id, { actor: removal.actor }))
|
|
42
|
+
throw notFound(removal.id);
|
|
43
|
+
}), openStore);
|
|
44
|
+
purgeMirrorBestEffort(hippoRoot, removal.id, false, 'deleteEntry');
|
|
45
|
+
updateStatsUnlessBusy(hippoRoot, { forgotten: 1 }, `removed ${removal.id}`);
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/** A store-side hook writes on the row's handle inside its write scope, so its throw undoes the row. */
|
|
50
|
+
export function writeEntryAt(hippoRoot, { entry, actor }, afterWrite) {
|
|
51
|
+
const stamped = stampOriginProject(hippoRoot, entry);
|
|
52
|
+
onHandle(hippoRoot, (db) => writeInOwnTenant(db, stamped, actor, afterWrite), openStore);
|
|
53
|
+
writeEntryMirrors(hippoRoot, stamped);
|
|
54
|
+
}
|
|
55
|
+
/** A trace link follows the commit on the same handle and names only the ids applied, so a rolled-back outcome leaves none. */
|
|
56
|
+
export function applyOutcomeAt(hippoRoot, outcome, traceId) {
|
|
57
|
+
const applied = onHandle(hippoRoot, (db) => {
|
|
58
|
+
const rows = applyOutcomeOn(db, outcome);
|
|
59
|
+
const memoryIds = rows.map((entry) => entry.id);
|
|
60
|
+
if (traceId !== undefined && rows.length > 0) {
|
|
61
|
+
recordTraceOutcome(db, { traceId, tenantId: outcome.tenantId, outcome: outcome.good ? 'positive' : 'negative', memoryIds });
|
|
62
|
+
}
|
|
63
|
+
return rows;
|
|
64
|
+
}, openStore);
|
|
65
|
+
for (const entry of applied)
|
|
66
|
+
writeEntryMirrors(hippoRoot, entry);
|
|
67
|
+
return applied.map((entry) => entry.id);
|
|
68
|
+
}
|
|
69
|
+
/** Reach is checked inside the archive's write scope. A store-side hook writes on the same handle inside that scope, so its throw undoes the archive. */
|
|
70
|
+
export function archiveRawAt(hippoRoot, archive, afterArchive) {
|
|
71
|
+
const archivedAt = onHandle(hippoRoot, (db) => {
|
|
72
|
+
const at = withWriteScope(db, 'archive_raw_in_reach', () => {
|
|
73
|
+
assertInReach(db, archive, archive.id);
|
|
74
|
+
return archiveRawMemory(db, archive.id, { reason: archive.reason, who: archive.actor, afterArchive });
|
|
75
|
+
});
|
|
76
|
+
cleanArchivedMirrors(db, hippoRoot, archive.id);
|
|
77
|
+
return at;
|
|
78
|
+
});
|
|
79
|
+
updateStatsUnlessBusy(hippoRoot, { forgotten: 1 }, `removed ${archive.id}`);
|
|
80
|
+
return archivedAt;
|
|
81
|
+
}
|
|
82
|
+
function notFound(id) {
|
|
83
|
+
return new NotFoundError(`memory not found: ${id}`);
|
|
84
|
+
}
|
|
85
|
+
/** Another tenant's row, or another person's personal row, answers as missing, so a caller learns nothing about it. */
|
|
86
|
+
function assertInReach(db, target, id) {
|
|
87
|
+
const reach = selectMemoryReach(db, id);
|
|
88
|
+
if (reach?.tenantId !== target.tenantId || !ownScopeTouches(target.ownScope, reach.scope))
|
|
89
|
+
throw notFound(id);
|
|
90
|
+
}
|
|
91
|
+
/** hippo.db's upsert would move the row into the writer's tenant, so a store write refuses an id another tenant holds. */
|
|
92
|
+
function assertIdInTenant(db, entry) {
|
|
93
|
+
const holder = selectMemoryReach(db, entry.id)?.tenantId;
|
|
94
|
+
if (holder !== undefined && holder !== entry.tenantId)
|
|
95
|
+
throw new ConflictError(`Memory ${entry.id} belongs to another tenant`);
|
|
96
|
+
}
|
|
97
|
+
/** The refusal row lands after `write` has rolled back, in a fresh implicit transaction the aborted one cannot undo. */
|
|
98
|
+
export function auditingRefusal(db, actor, write) {
|
|
99
|
+
try {
|
|
100
|
+
return write();
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
if (err instanceof RejectedValueError)
|
|
104
|
+
auditRejectionRefusal(db, err, actor);
|
|
105
|
+
throw err;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/** writeEntryAt on the caller's handle, so a sibling group can read on it after the scope has unwound. */
|
|
109
|
+
export function writeInOwnTenant(db, entry, actor, afterWrite) {
|
|
110
|
+
auditingRefusal(db, actor, () => withWriteScope(db, 'write_entry_in_tenant', () => {
|
|
111
|
+
assertIdInTenant(db, entry);
|
|
112
|
+
writeEntryDbOnly(db, entry, { actor, afterWrite });
|
|
113
|
+
}));
|
|
114
|
+
}
|
|
115
|
+
/** The reads, rewrites and outcome rows share one BEGIN IMMEDIATE transaction, hippo.db's form of the port's row lock; the caller writes the mirrors after. */
|
|
116
|
+
function applyOutcomeOn(db, outcome) {
|
|
117
|
+
return auditingRefusal(db, outcome.actor, () => withWriteScope(db, 'apply_outcome', () => {
|
|
118
|
+
const live = selectEntriesByIds(db, outcome.ids, outcome.tenantId);
|
|
119
|
+
const applied = [];
|
|
120
|
+
for (const id of outcome.ids) {
|
|
121
|
+
const entry = live.get(id);
|
|
122
|
+
if (!entry || !ownScopeTouches(outcome.ownScope, entry.scope))
|
|
123
|
+
continue;
|
|
124
|
+
const updated = entryAfterOutcome(entry, outcome.good);
|
|
125
|
+
writeEntryDbOnly(db, updated, { actor: outcome.actor });
|
|
126
|
+
live.set(id, updated);
|
|
127
|
+
appendAuditEvent(db, { tenantId: outcome.tenantId, actor: outcome.actor, op: 'outcome', targetId: id, metadata: { good: outcome.good } });
|
|
128
|
+
applied.push(updated);
|
|
129
|
+
}
|
|
130
|
+
return applied;
|
|
131
|
+
}));
|
|
132
|
+
}
|
|
133
|
+
/** Reach, the CAS on the old row, the successor's insert and the supersede row in one BEGIN IMMEDIATE transaction. Two racing supersedes: one CAS wins. */
|
|
134
|
+
function commitSupersede(db, write) {
|
|
135
|
+
const { tenantId, actor, oldId, successor } = write;
|
|
136
|
+
// The refusal row lands after the scope has rolled back, in a fresh implicit transaction the aborted one cannot undo.
|
|
137
|
+
auditingRefusal(db, actor, () => withWriteScope(db, 'supersede', () => {
|
|
138
|
+
assertInReach(db, write, oldId);
|
|
139
|
+
// SAFETY: RETURNING names one column, dag_parent_id; no row means another writer got there first.
|
|
140
|
+
const won = db.prepare('UPDATE memories SET superseded_by = ? WHERE id = ? AND tenant_id = ? AND superseded_by IS NULL RETURNING dag_parent_id')
|
|
141
|
+
.get(successor.id, oldId, tenantId);
|
|
142
|
+
if (!won)
|
|
143
|
+
throw new ConflictError(`Memory ${oldId} already superseded by another writer`);
|
|
144
|
+
// After the CAS, so a lost race marks no parent for rebuild.
|
|
145
|
+
if (won.dag_parent_id)
|
|
146
|
+
markSummaryDirtyInTx(db, won.dag_parent_id, tenantId, actor);
|
|
147
|
+
assertIdInTenant(db, successor);
|
|
148
|
+
writeEntryDbOnly(db, successor, { actor });
|
|
149
|
+
appendAuditEvent(db, { tenantId, actor, op: 'supersede', targetId: oldId, metadata: { newId: successor.id } });
|
|
150
|
+
}));
|
|
151
|
+
}
|
|
152
|
+
/** A mirror left on disk would bring the archived row back on the next import; on failure the reaper retries, as mirror_cleaned_at stays NULL. */
|
|
153
|
+
function cleanArchivedMirrors(db, hippoRoot, id) {
|
|
154
|
+
try {
|
|
155
|
+
removeEntryMirrors(hippoRoot, id);
|
|
156
|
+
}
|
|
157
|
+
catch (mirrorErr) {
|
|
158
|
+
log.error(`archiveRaw: mirror cleanup failed for ${id} (will retry via reaper on next openHippoDb): ${errorMessage(mirrorErr)}`);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
try {
|
|
162
|
+
db.prepare(`UPDATE raw_archive SET mirror_cleaned_at = ? WHERE memory_id = ?`).run(new Date().toISOString(), id);
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
if (!isSqliteBusy(err))
|
|
166
|
+
throw err;
|
|
167
|
+
log.warnThenDebug('archive-mirror-stamp-busy', `archived ${id}; the store was busy, so the mirror reaper will re-check it on the next open`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=entry-writes-group.js.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
type FieldValue = string | number | boolean | null;
|
|
2
|
+
/** One error as a thread message can carry it. */
|
|
3
|
+
export interface WireError {
|
|
4
|
+
/** Constructor names from the thrown class up to Error: several classes set no `name`, so a name alone cannot pick the class. */
|
|
5
|
+
readonly classes: readonly string[];
|
|
6
|
+
readonly message: string;
|
|
7
|
+
readonly stack: string | undefined;
|
|
8
|
+
/** Own enumerable fields with a primitive value: `status`, `errcode`, `storeKind`, a `name` its constructor set. */
|
|
9
|
+
readonly fields: Readonly<Record<string, FieldValue>>;
|
|
10
|
+
readonly cause: WireError | undefined;
|
|
11
|
+
}
|
|
12
|
+
/** Worker side. A thrown value that is not an Error carries its text and no class. */
|
|
13
|
+
export declare function encodeError<E>(err: E, depth?: number): WireError;
|
|
14
|
+
/** Server side: an instance of the thrown class, or of its nearest ancestor in the table, with the worker's stack, cause and fields. */
|
|
15
|
+
export declare function decodeError(wire: WireError): Error;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=error-codec.d.ts.map
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// A thrown error crosses the worker boundary as plain data and arrives as an instance of its class: the server's mappers test `instanceof`, `errcode` and fields.
|
|
2
|
+
import { BadRequestError, ConflictError, ForbiddenError, NotFoundError } from '../../core/api-errors.js';
|
|
3
|
+
import { IncompatibleBinaryError, StoreBusyError } from '../../db/index.js';
|
|
4
|
+
import { BodyTimeoutError, BodyTooLargeError, HttpError } from '../../util/http-util.js';
|
|
5
|
+
import { errorMessage, log } from '../../util/log.js';
|
|
6
|
+
import { ScopeForbiddenError } from '../recall-scope.js';
|
|
7
|
+
import { RejectedValueError } from '../rejection.js';
|
|
8
|
+
import { OtherStoreFolderError, SqliteBlockedError, StoreNotPortedError } from '../../util/sqlite-blocked.js';
|
|
9
|
+
// Every class the server maps by, at or below the store layer. Abstract ApiError is absent: only its four subclasses are thrown.
|
|
10
|
+
const CLASSES = [
|
|
11
|
+
Error, TypeError, RangeError, SyntaxError, ReferenceError, EvalError, URIError,
|
|
12
|
+
HttpError, BodyTooLargeError, BodyTimeoutError,
|
|
13
|
+
BadRequestError, ForbiddenError, NotFoundError, ConflictError, RejectedValueError, ScopeForbiddenError,
|
|
14
|
+
SqliteBlockedError, StoreNotPortedError, OtherStoreFolderError,
|
|
15
|
+
StoreBusyError, IncompatibleBinaryError,
|
|
16
|
+
];
|
|
17
|
+
const PROTOTYPES = new Map(CLASSES.map((known) => [known.name, known.prototype]));
|
|
18
|
+
// A chain of causes deeper than this is cut, so a cycle cannot recurse for ever.
|
|
19
|
+
const MAX_CAUSES = 4;
|
|
20
|
+
function isFieldValue(value) {
|
|
21
|
+
return value === null || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';
|
|
22
|
+
}
|
|
23
|
+
function classNames(err) {
|
|
24
|
+
const names = [];
|
|
25
|
+
let proto = Object.getPrototypeOf(err);
|
|
26
|
+
while (proto !== null && proto !== Object.prototype) {
|
|
27
|
+
names.push(proto.constructor.name);
|
|
28
|
+
proto = Object.getPrototypeOf(proto);
|
|
29
|
+
}
|
|
30
|
+
return names;
|
|
31
|
+
}
|
|
32
|
+
function ownFields(err) {
|
|
33
|
+
return Object.fromEntries(Object.entries(err).filter((field) => isFieldValue(field[1])));
|
|
34
|
+
}
|
|
35
|
+
/** Worker side. A thrown value that is not an Error carries its text and no class. */
|
|
36
|
+
export function encodeError(err, depth = 0) {
|
|
37
|
+
if (!(err instanceof Error))
|
|
38
|
+
return { classes: [], message: errorMessage(err), stack: undefined, fields: {}, cause: undefined };
|
|
39
|
+
const cause = err.cause === undefined || depth >= MAX_CAUSES ? undefined : encodeError(err.cause, depth + 1);
|
|
40
|
+
return { classes: classNames(err), message: err.message, stack: err.stack, fields: ownFields(err), cause };
|
|
41
|
+
}
|
|
42
|
+
/** Server side: an instance of the thrown class, or of its nearest ancestor in the table, with the worker's stack, cause and fields. */
|
|
43
|
+
export function decodeError(wire) {
|
|
44
|
+
const thrown = wire.classes[0];
|
|
45
|
+
const known = wire.classes.find((name) => PROTOTYPES.has(name)) ?? 'Error';
|
|
46
|
+
const unlisted = thrown !== undefined && thrown !== known;
|
|
47
|
+
if (unlisted)
|
|
48
|
+
log.once(`store-worker-error:${thrown}`, 'warn', `a store worker threw ${thrown}, which the error codec does not list; it arrives as ${known}`);
|
|
49
|
+
// A listed ancestor still maps to its status, so its text stays as thrown; under plain Error the class survives only in the message.
|
|
50
|
+
const message = unlisted && known === 'Error' ? `${thrown}: ${wire.message}` : wire.message;
|
|
51
|
+
const rebuilt = wire.cause === undefined ? new Error(message) : new Error(message, { cause: decodeError(wire.cause) });
|
|
52
|
+
// The constructor is not run again: its arguments did not cross, and the fields below are what it set.
|
|
53
|
+
Object.setPrototypeOf(rebuilt, PROTOTYPES.get(known) ?? Error.prototype);
|
|
54
|
+
Object.assign(rebuilt, wire.fields);
|
|
55
|
+
if (wire.stack !== undefined)
|
|
56
|
+
rebuilt.stack = wire.stack;
|
|
57
|
+
return rebuilt;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=error-codec.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Counted on the server thread, across every executor of the process. */
|
|
2
|
+
export declare const workerCounts: {
|
|
3
|
+
/** Calls refused because a thread's queue was full. */
|
|
4
|
+
queueRefusals: number;
|
|
5
|
+
/** Calls whose request deadline passed, waiting or running. */
|
|
6
|
+
jobsExpired: number;
|
|
7
|
+
/** Threads stopped at a deadline and replaced. */
|
|
8
|
+
workersReplaced: number;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=executor-counts.d.ts.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// What the store workers refused, timed out and replaced since the process started; /health reports them beside the audit failure count.
|
|
2
|
+
/** Counted on the server thread, across every executor of the process. */
|
|
3
|
+
export const workerCounts = {
|
|
4
|
+
/** Calls refused because a thread's queue was full. */
|
|
5
|
+
queueRefusals: 0,
|
|
6
|
+
/** Calls whose request deadline passed, waiting or running. */
|
|
7
|
+
jobsExpired: 0,
|
|
8
|
+
/** Threads stopped at a deadline and replaced. */
|
|
9
|
+
workersReplaced: 0,
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=executor-counts.js.map
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type OpMode } from './worker-ops.js';
|
|
2
|
+
export interface CallOptions {
|
|
3
|
+
readonly mode: OpMode;
|
|
4
|
+
readonly requestId: string | undefined;
|
|
5
|
+
/** Epoch milliseconds by which the call's request must be answered; absent means the call waits as long as it takes. */
|
|
6
|
+
readonly deadlineAt?: number | undefined;
|
|
7
|
+
}
|
|
8
|
+
export interface ExecutorOptions {
|
|
9
|
+
/** Lock wait of each thread's connection; defaults to the server's. */
|
|
10
|
+
readonly busyWaitMs?: number;
|
|
11
|
+
/** Calls that may wait for one thread; defaults to HIPPO_STORE_QUEUE_MAX, else 256. */
|
|
12
|
+
readonly queueMax?: number;
|
|
13
|
+
/** How long past its deadline a write may still report its own outcome; defaults to 2000 ms. */
|
|
14
|
+
readonly writeGraceMs?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface SqliteExecutor {
|
|
17
|
+
/** Runs `op` of the synchronous store on a worker thread. A throw there rejects here as an instance of its own class. */
|
|
18
|
+
call<T>(op: string, args: readonly unknown[], opts: CallOptions): Promise<T>;
|
|
19
|
+
/** Resolves once every thread has exited: Windows cannot delete a store folder while a thread holds its files. */
|
|
20
|
+
close(): Promise<void>;
|
|
21
|
+
/** Threads started and not yet exited. */
|
|
22
|
+
liveThreads(): number;
|
|
23
|
+
/** Stops the writer thread as a crash would: its running and queued calls reject, and the next write starts a fresh thread. */
|
|
24
|
+
terminateWriter(): void;
|
|
25
|
+
}
|
|
26
|
+
/** Threads for the hippo.db under `hippoRoot`: one writer and two readers. The first call starts the writer for the store's setup; a reader starts at its own first call. */
|
|
27
|
+
export declare function createSqliteExecutor(hippoRoot: string, opts?: ExecutorOptions): SqliteExecutor;
|
|
28
|
+
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
// The server thread's side of the store workers: SQLite's synchronous statements and lock waits run on their threads, so the event loop keeps answering.
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import { SHARE_ENV, Worker } from 'node:worker_threads';
|
|
4
|
+
import { addAuditWriteFailures } from '../audit.js';
|
|
5
|
+
import { getHippoDbPath, SERVER_DB_WAIT_MS, StoreBusyError } from '../../db/index.js';
|
|
6
|
+
import { autoCheckpointPages } from '../../db/wal-checkpointer.js';
|
|
7
|
+
import { envStoreQueueMax } from '../../util/env.js';
|
|
8
|
+
import { DeadlineExceededError } from '../../util/http-util.js';
|
|
9
|
+
import { errorMessage, log } from '../../util/log.js';
|
|
10
|
+
import { requestScopes } from '../../util/request-scope.js';
|
|
11
|
+
import { decodeError } from './error-codec.js';
|
|
12
|
+
import { workerCounts } from './executor-counts.js';
|
|
13
|
+
import { STORE_SETUP_OP } from './worker-ops.js';
|
|
14
|
+
// Resolved from the package root, so a server run from TypeScript source starts the same built file.
|
|
15
|
+
const WORKER_ENTRY = fileURLToPath(new URL('../../../dist/store/sqlite/worker-entry.js', import.meta.url));
|
|
16
|
+
const WORKER_GONE = 'the store worker stopped before it answered; a write it was running may or may not be saved';
|
|
17
|
+
const EXECUTOR_CLOSED = 'the store is closed';
|
|
18
|
+
const QUEUE_FULL = 'the store worker has a full queue, so the call was refused before it ran';
|
|
19
|
+
const EXPIRED_WAITING = "the call was still waiting for a store worker at its request's deadline, so it never ran";
|
|
20
|
+
const READ_LATE = "the store did not answer the read by the request's deadline";
|
|
21
|
+
const WRITE_NOT_SAVED = "the store did not finish the write by the request's deadline; the write was stopped and nothing was saved";
|
|
22
|
+
const WRITE_UNKNOWN = "the store did not confirm the write by the request's deadline; it may or may not be saved";
|
|
23
|
+
// Far above any burst a healthy thread clears, small enough that a stuck thread refuses new work in bounded memory.
|
|
24
|
+
const DEFAULT_QUEUE_MAX = 256;
|
|
25
|
+
// How long past its deadline a write may still report its own outcome before the caller is told it is unknown.
|
|
26
|
+
const DEFAULT_WRITE_GRACE_MS = 2000;
|
|
27
|
+
function laneOf(mode) {
|
|
28
|
+
return { mode, queue: [], running: undefined, worker: undefined, stopping: undefined, commitFlag: undefined };
|
|
29
|
+
}
|
|
30
|
+
/** Gives `pending`'s caller its one answer; a second call does nothing. */
|
|
31
|
+
function finish(pending, answer) {
|
|
32
|
+
if (pending.answered)
|
|
33
|
+
return;
|
|
34
|
+
pending.answered = true;
|
|
35
|
+
clearTimeout(pending.timer);
|
|
36
|
+
answer();
|
|
37
|
+
}
|
|
38
|
+
function mayHaveCommitted(lane, pending) {
|
|
39
|
+
return lane.commitFlag !== undefined && Atomics.load(lane.commitFlag, 0) === pending.job.id;
|
|
40
|
+
}
|
|
41
|
+
function load(lane) {
|
|
42
|
+
return lane.queue.length + (lane.running === undefined ? 0 : 1);
|
|
43
|
+
}
|
|
44
|
+
class WorkerPool {
|
|
45
|
+
#hippoRoot;
|
|
46
|
+
#busyWaitMs;
|
|
47
|
+
// One writer, so writes run in call order and never wait on each other's lock.
|
|
48
|
+
#writer = laneOf('write');
|
|
49
|
+
#readers = [laneOf('read'), laneOf('read')];
|
|
50
|
+
// Keyed by thread and not by lane: close() must also wait for a thread its lane already replaced.
|
|
51
|
+
#exits = new Map();
|
|
52
|
+
#queueMax;
|
|
53
|
+
#writeGraceMs;
|
|
54
|
+
#nextId = 1;
|
|
55
|
+
#closed = false;
|
|
56
|
+
// 'done' once the writer has run the store's open-time setup, which a reader's connection could not write.
|
|
57
|
+
#setup = 'none';
|
|
58
|
+
constructor(hippoRoot, opts) {
|
|
59
|
+
this.#hippoRoot = hippoRoot;
|
|
60
|
+
this.#busyWaitMs = opts.busyWaitMs ?? SERVER_DB_WAIT_MS;
|
|
61
|
+
this.#queueMax = opts.queueMax ?? envStoreQueueMax() ?? DEFAULT_QUEUE_MAX;
|
|
62
|
+
this.#writeGraceMs = opts.writeGraceMs ?? DEFAULT_WRITE_GRACE_MS;
|
|
63
|
+
}
|
|
64
|
+
call(op, args, { mode, requestId, deadlineAt }) {
|
|
65
|
+
return new Promise((resolve, reject) => {
|
|
66
|
+
if (this.#closed) {
|
|
67
|
+
reject(new StoreBusyError(EXECUTOR_CLOSED));
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const settle = (reply) => {
|
|
71
|
+
if (!reply.ok) {
|
|
72
|
+
reject(decodeError(reply.error));
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
// SAFETY: the worker ran `op` of the synchronous store, whose result is the T the caller's port method declares.
|
|
76
|
+
resolve(reply.value);
|
|
77
|
+
};
|
|
78
|
+
const lane = mode === 'write' ? this.#writer : this.#readers.reduce((least, next) => (load(next) < load(least) ? next : least));
|
|
79
|
+
const refusal = this.#refusal(lane, deadlineAt);
|
|
80
|
+
if (refusal !== undefined) {
|
|
81
|
+
reject(refusal);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const pending = { job: { id: this.#nextId++, op, args, requestId }, settle, fail: reject, deadlineAt, timer: undefined, answered: false };
|
|
85
|
+
this.#watchDeadline(lane, pending);
|
|
86
|
+
lane.queue.push(pending);
|
|
87
|
+
this.#ensureSetup();
|
|
88
|
+
this.#pump(lane);
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
// Ahead of the call that started it, and with no deadline: the writer's own lock wait bounds it.
|
|
92
|
+
#ensureSetup() {
|
|
93
|
+
if (this.#setup !== 'none')
|
|
94
|
+
return;
|
|
95
|
+
this.#setup = 'running';
|
|
96
|
+
const pending = {
|
|
97
|
+
job: { id: this.#nextId++, op: STORE_SETUP_OP, args: [], requestId: undefined },
|
|
98
|
+
settle: (reply) => this.#setupEnded(reply.ok ? undefined : decodeError(reply.error)),
|
|
99
|
+
fail: (err) => this.#setupEnded(err),
|
|
100
|
+
deadlineAt: undefined,
|
|
101
|
+
timer: undefined,
|
|
102
|
+
answered: false,
|
|
103
|
+
};
|
|
104
|
+
this.#writer.queue.unshift(pending);
|
|
105
|
+
this.#pump(this.#writer);
|
|
106
|
+
}
|
|
107
|
+
// A failed setup fails the reads that waited for it with its own error, as each read's own open would have, and the next call tries it again.
|
|
108
|
+
#setupEnded(failure) {
|
|
109
|
+
this.#setup = failure === undefined ? 'done' : 'none';
|
|
110
|
+
for (const lane of this.#readers) {
|
|
111
|
+
if (failure !== undefined)
|
|
112
|
+
for (const waiting of lane.queue.splice(0))
|
|
113
|
+
finish(waiting, () => waiting.fail(failure));
|
|
114
|
+
this.#pump(lane);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Nothing is queued and nothing ran, so both refusals are the retryable 503 of a busy store.
|
|
118
|
+
#refusal(lane, deadlineAt) {
|
|
119
|
+
if (lane.queue.length >= this.#queueMax) {
|
|
120
|
+
workerCounts.queueRefusals += 1;
|
|
121
|
+
return new StoreBusyError(QUEUE_FULL);
|
|
122
|
+
}
|
|
123
|
+
if (deadlineAt !== undefined && deadlineAt <= Date.now()) {
|
|
124
|
+
workerCounts.jobsExpired += 1;
|
|
125
|
+
return new StoreBusyError(EXPIRED_WAITING);
|
|
126
|
+
}
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
#watchDeadline(lane, pending) {
|
|
130
|
+
if (pending.deadlineAt === undefined)
|
|
131
|
+
return;
|
|
132
|
+
pending.timer = setTimeout(() => this.#expire(lane, pending), pending.deadlineAt - Date.now());
|
|
133
|
+
// The request that waits on the call keeps the process alive; this timer alone must not.
|
|
134
|
+
pending.timer.unref();
|
|
135
|
+
}
|
|
136
|
+
#expire(lane, pending) {
|
|
137
|
+
workerCounts.jobsExpired += 1;
|
|
138
|
+
const place = lane.queue.indexOf(pending);
|
|
139
|
+
if (place >= 0) {
|
|
140
|
+
lane.queue.splice(place, 1);
|
|
141
|
+
finish(pending, () => pending.fail(new StoreBusyError(EXPIRED_WAITING)));
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
if (lane.running !== pending || lane.worker === undefined)
|
|
145
|
+
return;
|
|
146
|
+
log.warn(`the store's ${lane.mode} worker ran '${pending.job.op}' past its request's deadline`, { requestId: pending.job.requestId });
|
|
147
|
+
if (lane.mode === 'read')
|
|
148
|
+
this.#stopReader(lane, lane.worker, pending);
|
|
149
|
+
else
|
|
150
|
+
this.#stopWriter(lane, lane.worker, pending);
|
|
151
|
+
}
|
|
152
|
+
// A read changes nothing, so its caller is answered at once; the thread is replaced when it has exited.
|
|
153
|
+
#stopReader(lane, worker, pending) {
|
|
154
|
+
finish(pending, () => pending.fail(new DeadlineExceededError(READ_LATE)));
|
|
155
|
+
lane.stopping = worker;
|
|
156
|
+
void worker.terminate();
|
|
157
|
+
}
|
|
158
|
+
// Before its commit flag a stopped write is a known rollback; after it the thread is left to finish, since stopping it could not undo the write.
|
|
159
|
+
#stopWriter(lane, worker, pending) {
|
|
160
|
+
if (!mayHaveCommitted(lane, pending)) {
|
|
161
|
+
lane.stopping = worker;
|
|
162
|
+
this.terminateWriter();
|
|
163
|
+
}
|
|
164
|
+
// A statement in flight runs to its end even after the stop, so the caller waits for the thread's own word only this long.
|
|
165
|
+
pending.timer = setTimeout(() => finish(pending, () => pending.fail(new DeadlineExceededError(WRITE_UNKNOWN))), this.#writeGraceMs);
|
|
166
|
+
pending.timer.unref();
|
|
167
|
+
}
|
|
168
|
+
// The thread has exited, so the write lock is free and what the stopped job did is final.
|
|
169
|
+
#replaceStopped(lane) {
|
|
170
|
+
const stopped = lane.running;
|
|
171
|
+
lane.stopping = undefined;
|
|
172
|
+
lane.running = undefined;
|
|
173
|
+
workerCounts.workersReplaced += 1;
|
|
174
|
+
if (stopped !== undefined) {
|
|
175
|
+
// Read only now: the thread could still set its flag between the deadline and its exit.
|
|
176
|
+
const message = mayHaveCommitted(lane, stopped) ? WRITE_UNKNOWN : WRITE_NOT_SAVED;
|
|
177
|
+
finish(stopped, () => stopped.fail(new DeadlineExceededError(message)));
|
|
178
|
+
}
|
|
179
|
+
if (!this.#closed)
|
|
180
|
+
this.#pump(lane);
|
|
181
|
+
}
|
|
182
|
+
async close() {
|
|
183
|
+
this.#closed = true;
|
|
184
|
+
for (const lane of [this.#writer, ...this.#readers]) {
|
|
185
|
+
for (const pending of lane.queue.splice(0))
|
|
186
|
+
finish(pending, () => pending.fail(new StoreBusyError(EXECUTOR_CLOSED)));
|
|
187
|
+
// An idle thread is unreferenced, and the process must not end before the thread has closed its connection.
|
|
188
|
+
lane.worker?.ref();
|
|
189
|
+
// Read after the reply of a job still running; the thread then closes its connection and ends.
|
|
190
|
+
lane.worker?.postMessage('stop');
|
|
191
|
+
}
|
|
192
|
+
await Promise.all(this.#exits.values());
|
|
193
|
+
}
|
|
194
|
+
liveThreads() {
|
|
195
|
+
return this.#exits.size;
|
|
196
|
+
}
|
|
197
|
+
terminateWriter() {
|
|
198
|
+
void this.#writer.worker?.terminate();
|
|
199
|
+
}
|
|
200
|
+
#pump(lane) {
|
|
201
|
+
if (lane.running !== undefined)
|
|
202
|
+
return;
|
|
203
|
+
// Setup comes first: a reader sent a job before it would open a store whose setup it cannot write.
|
|
204
|
+
if (lane.mode === 'read' && this.#setup !== 'done')
|
|
205
|
+
return;
|
|
206
|
+
const next = lane.queue.shift();
|
|
207
|
+
if (next === undefined)
|
|
208
|
+
return;
|
|
209
|
+
// Started by the first call and never at boot, so a server that only answers /health opens no thread.
|
|
210
|
+
// Outside that call's request scope, or the thread's listeners would log every later event under its request id.
|
|
211
|
+
lane.worker ??= requestScopes.exit(() => this.#start(lane));
|
|
212
|
+
lane.running = next;
|
|
213
|
+
// An idle thread never keeps the process alive; one with a call in flight does.
|
|
214
|
+
lane.worker.ref();
|
|
215
|
+
try {
|
|
216
|
+
lane.worker.postMessage({ ...next.job, walPages: autoCheckpointPages(getHippoDbPath(this.#hippoRoot)) });
|
|
217
|
+
}
|
|
218
|
+
catch (err) {
|
|
219
|
+
// Arguments that cannot be copied to the thread fail this call alone.
|
|
220
|
+
this.#idle(lane, lane.worker);
|
|
221
|
+
finish(next, () => next.fail(err instanceof Error ? err : new Error(errorMessage(err))));
|
|
222
|
+
this.#pump(lane);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
#idle(lane, worker) {
|
|
226
|
+
lane.running = undefined;
|
|
227
|
+
worker.unref();
|
|
228
|
+
}
|
|
229
|
+
#start(lane) {
|
|
230
|
+
// A fresh flag per thread: a job id left by the thread before it could match no later job, but a shared buffer would outlive its writer.
|
|
231
|
+
const shared = lane.mode === 'write' ? new SharedArrayBuffer(4) : undefined;
|
|
232
|
+
lane.commitFlag = shared && new Int32Array(shared);
|
|
233
|
+
const init = { hippoRoot: this.#hippoRoot, mode: lane.mode, busyWaitMs: this.#busyWaitMs, ...(shared && { commitFlag: shared }) };
|
|
234
|
+
// An explicit execArgv keeps the parent's loaders out of the thread and silences its repeat of the node:sqlite warning.
|
|
235
|
+
const worker = new Worker(WORKER_ENTRY, { env: SHARE_ENV, execArgv: ['--no-warnings'], workerData: init });
|
|
236
|
+
worker.unref();
|
|
237
|
+
worker.on('message', (reply) => this.#settle(lane, worker, reply));
|
|
238
|
+
worker.on('error', (err) => this.#retire(lane, worker, err));
|
|
239
|
+
const exited = new Promise((resolve) => {
|
|
240
|
+
worker.once('exit', () => {
|
|
241
|
+
this.#exits.delete(worker);
|
|
242
|
+
this.#retire(lane, worker);
|
|
243
|
+
resolve();
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
this.#exits.set(worker, exited);
|
|
247
|
+
return worker;
|
|
248
|
+
}
|
|
249
|
+
#settle(lane, worker, reply) {
|
|
250
|
+
const done = lane.running;
|
|
251
|
+
// A reply for a call that was already rejected with its thread has no caller left.
|
|
252
|
+
if (lane.worker !== worker || done === undefined || done.job.id !== reply.id)
|
|
253
|
+
return;
|
|
254
|
+
addAuditWriteFailures(reply.auditFailures);
|
|
255
|
+
finish(done, () => done.settle(reply));
|
|
256
|
+
// A thread being stopped answered first; its lane stays taken until it has exited.
|
|
257
|
+
if (lane.stopping === worker)
|
|
258
|
+
return;
|
|
259
|
+
this.#idle(lane, worker);
|
|
260
|
+
this.#pump(lane);
|
|
261
|
+
}
|
|
262
|
+
// The lane keeps a stopped thread until it has exited, so a new thread never starts while the old one may still hold the write lock.
|
|
263
|
+
#retire(lane, worker, cause) {
|
|
264
|
+
if (lane.worker !== worker)
|
|
265
|
+
return;
|
|
266
|
+
lane.worker = undefined;
|
|
267
|
+
if (lane.stopping === worker) {
|
|
268
|
+
// Stopped on purpose: the calls still waiting run on the replacement.
|
|
269
|
+
this.#replaceStopped(lane);
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
const lost = lane.running === undefined ? lane.queue.splice(0) : [lane.running, ...lane.queue.splice(0)];
|
|
273
|
+
lane.running = undefined;
|
|
274
|
+
if (lost.length > 0 || cause !== undefined) {
|
|
275
|
+
log.warn(`the store's ${lane.mode} worker stopped with ${lost.length} call(s) unanswered${cause === undefined ? '' : `: ${cause.message}`}`);
|
|
276
|
+
}
|
|
277
|
+
// The server answers this class as its retryable 503.
|
|
278
|
+
for (const pending of lost)
|
|
279
|
+
finish(pending, () => pending.fail(new StoreBusyError(WORKER_GONE, { cause })));
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
/** Threads for the hippo.db under `hippoRoot`: one writer and two readers. The first call starts the writer for the store's setup; a reader starts at its own first call. */
|
|
283
|
+
export function createSqliteExecutor(hippoRoot, opts = {}) {
|
|
284
|
+
return new WorkerPool(hippoRoot, opts);
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=executor.js.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { GraphReads, Sync } from '../port.js';
|
|
2
|
+
export declare function sqliteGraphReads(hippoRoot: string): Sync<GraphReads>;
|
|
3
|
+
/** The group as a served store answers it: the call runs at once and resolves through a Promise, so a throw rejects as another store's would. */
|
|
4
|
+
export declare function servedGraphReads(sync: Sync<GraphReads>): GraphReads;
|
|
5
|
+
//# sourceMappingURL=graph-reads-group.d.ts.map
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// hippo.db's half of the GraphReads store group: one read snapshot around the walk the CLI graph commands run.
|
|
2
|
+
import { canReadScope } from '../recall-scope.js';
|
|
3
|
+
import { withGraphReadSnapshot } from '../graph-reads.js';
|
|
4
|
+
import { graphViewRows } from '../graph-view-rows.js';
|
|
5
|
+
export function sqliteGraphReads(hippoRoot) {
|
|
6
|
+
return {
|
|
7
|
+
graphRows: (tenantId, { entity, limit, reader }) => withGraphReadSnapshot(hippoRoot, (db) => graphViewRows(hippoRoot, db, tenantId, {
|
|
8
|
+
entity,
|
|
9
|
+
limit,
|
|
10
|
+
canRead: reader && ((scope) => scope === null || canReadScope(reader, scope)),
|
|
11
|
+
})),
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/** The group as a served store answers it: the call runs at once and resolves through a Promise, so a throw rejects as another store's would. */
|
|
15
|
+
export function servedGraphReads(sync) {
|
|
16
|
+
return { graphRows: async (tenantId, query) => sync.graphRows(tenantId, query) };
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=graph-reads-group.js.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type ScopeGrantChange } from '../key-writes.js';
|
|
2
|
+
import type { EntryTarget, OutcomeWrite, RecallWrites } from '../port.js';
|
|
3
|
+
/** A recall's writes when hippo.db keeps it as its last one: `strengthen.ids` are the ids it returned. */
|
|
4
|
+
type LastRecallWrites = RecallWrites & Required<Pick<RecallWrites, 'strengthen'>>;
|
|
5
|
+
/** The port's writes with a part that needs hippo.db's own handle or its meta table, which no other store has. */
|
|
6
|
+
export interface SqliteLocal {
|
|
7
|
+
/** entryWrites.applyOutcome, then a link from the recall trace to the ids applied, on the same handle after the commit. */
|
|
8
|
+
applyOutcome(outcome: OutcomeWrite, traceId: number): string[];
|
|
9
|
+
/** applyOutcome on the ids of the last recall, which hippo.db's meta table holds with that recall's trace; answers the ids applied. */
|
|
10
|
+
applyOutcomeToLastRecall(target: EntryTarget, good: boolean): string[];
|
|
11
|
+
/** finishRecall, then the ids this root lacks strengthened under `globalRoot`, then the ids and their trace saved as the last recall.
|
|
12
|
+
* A store of another kind keeps no last recall, so its stand-in is its own finishRecall, hence the Promise. */
|
|
13
|
+
finishLastRecall(writes: LastRecallWrites, globalRoot: string | undefined): void | Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
export declare function sqliteLocal(hippoRoot: string): SqliteLocal;
|
|
16
|
+
/** What a served store answers for each write that needs hippo.db's own handle: a refusal. */
|
|
17
|
+
export declare const REFUSED_ON_A_STORE: Pick<SqliteLocal, 'applyOutcome'>;
|
|
18
|
+
/** Off the port: only the local CLI changes grants, through synchronous published functions a store's Promise cannot answer. */
|
|
19
|
+
export declare function changeScopeGrant(hippoRoot: string, change: ScopeGrantChange): void;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=local.d.ts.map
|