nlm-memory 0.21.0 → 0.21.13
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 +67 -12
- package/assets/replay-eval-dark.svg +26 -0
- package/assets/replay-eval-light.svg +26 -0
- package/dist/cli/digest.js +34 -7
- package/dist/cli/digest.js.map +1 -1
- package/dist/cli/nlm.d.ts +14 -0
- package/dist/cli/nlm.js +450 -65
- package/dist/cli/nlm.js.map +1 -1
- package/dist/cli/reprocess-job-adapters.d.ts +35 -0
- package/dist/cli/reprocess-job-adapters.js +80 -0
- package/dist/cli/reprocess-job-adapters.js.map +1 -0
- package/dist/cli/scope-coverage.js +4 -1
- package/dist/cli/scope-coverage.js.map +1 -1
- package/dist/cli/supersede.js +8 -7
- package/dist/cli/supersede.js.map +1 -1
- package/dist/core/actions/actions-log.d.ts +65 -8
- package/dist/core/actions/actions-log.js +134 -17
- package/dist/core/actions/actions-log.js.map +1 -1
- package/dist/core/actions/overlay.d.ts +11 -2
- package/dist/core/actions/overlay.js +18 -6
- package/dist/core/actions/overlay.js.map +1 -1
- package/dist/core/adapters/from-source.js +11 -3
- package/dist/core/adapters/from-source.js.map +1 -1
- package/dist/core/adapters/fs-wiki-writer.d.ts +44 -0
- package/dist/core/adapters/fs-wiki-writer.js +132 -0
- package/dist/core/adapters/fs-wiki-writer.js.map +1 -0
- package/dist/core/adapters/hermes-agent.d.ts +15 -2
- package/dist/core/adapters/hermes-agent.js +57 -11
- package/dist/core/adapters/hermes-agent.js.map +1 -1
- package/dist/core/adapters/memory-wiki-writer.d.ts +8 -0
- package/dist/core/adapters/memory-wiki-writer.js +16 -0
- package/dist/core/adapters/memory-wiki-writer.js.map +1 -0
- package/dist/core/adapters/muse.d.ts +51 -0
- package/dist/core/adapters/muse.js +271 -0
- package/dist/core/adapters/muse.js.map +1 -0
- package/dist/core/adapters/opencode.d.ts +11 -4
- package/dist/core/adapters/opencode.js +41 -7
- package/dist/core/adapters/opencode.js.map +1 -1
- package/dist/core/alerts/alert-state.d.ts +17 -0
- package/dist/core/alerts/alert-state.js +45 -0
- package/dist/core/alerts/alert-state.js.map +1 -0
- package/dist/core/alerts/check-and-alert.d.ts +28 -0
- package/dist/core/alerts/check-and-alert.js +53 -0
- package/dist/core/alerts/check-and-alert.js.map +1 -0
- package/dist/core/alerts/drift-transition.d.ts +27 -0
- package/dist/core/alerts/drift-transition.js +56 -0
- package/dist/core/alerts/drift-transition.js.map +1 -0
- package/dist/core/alerts/embedder-transition.d.ts +23 -0
- package/dist/core/alerts/embedder-transition.js +40 -0
- package/dist/core/alerts/embedder-transition.js.map +1 -0
- package/dist/core/alerts/fire-alert.d.ts +24 -0
- package/dist/core/alerts/fire-alert.js +72 -0
- package/dist/core/alerts/fire-alert.js.map +1 -0
- package/dist/core/alerts/job-alert.d.ts +12 -0
- package/dist/core/alerts/job-alert.js +37 -0
- package/dist/core/alerts/job-alert.js.map +1 -0
- package/dist/core/alerts/types.d.ts +104 -0
- package/dist/core/alerts/types.js +11 -0
- package/dist/core/alerts/types.js.map +1 -0
- package/dist/core/alerts/wiki-alert.d.ts +15 -0
- package/dist/core/alerts/wiki-alert.js +31 -0
- package/dist/core/alerts/wiki-alert.js.map +1 -0
- package/dist/core/classifier/prompt.d.ts +13 -0
- package/dist/core/classifier/prompt.js +52 -2
- package/dist/core/classifier/prompt.js.map +1 -1
- package/dist/core/dataset/build-dataset.d.ts +16 -1
- package/dist/core/dataset/build-dataset.js +105 -45
- package/dist/core/dataset/build-dataset.js.map +1 -1
- package/dist/core/digest/compose.d.ts +8 -0
- package/dist/core/digest/compose.js +54 -0
- package/dist/core/digest/compose.js.map +1 -1
- package/dist/core/digest/hook-injection.d.ts +1 -1
- package/dist/core/digest/hook-injection.js +9 -1
- package/dist/core/digest/hook-injection.js.map +1 -1
- package/dist/core/digest/hook-version-parity.d.ts +31 -0
- package/dist/core/digest/hook-version-parity.js +56 -0
- package/dist/core/digest/hook-version-parity.js.map +1 -0
- package/dist/core/embedding/pg-embed-backfill.js +1 -1
- package/dist/core/embedding/pg-embed-backfill.js.map +1 -1
- package/dist/core/exemplars/capture-from-session.d.ts +1 -1
- package/dist/core/exemplars/capture-from-session.js +3 -3
- package/dist/core/exemplars/capture-from-session.js.map +1 -1
- package/dist/core/exemplars/embed-backfill.d.ts +9 -0
- package/dist/core/exemplars/embed-backfill.js +9 -1
- package/dist/core/exemplars/embed-backfill.js.map +1 -1
- package/dist/core/exemplars/recall-code.d.ts +1 -1
- package/dist/core/exemplars/recall-code.js +2 -2
- package/dist/core/exemplars/recall-code.js.map +1 -1
- package/dist/core/facts/backfill-facts.d.ts +1 -1
- package/dist/core/facts/backfill-facts.js +4 -4
- package/dist/core/facts/backfill-facts.js.map +1 -1
- package/dist/core/facts/embed-backfill.d.ts +54 -0
- package/dist/core/facts/embed-backfill.js +109 -0
- package/dist/core/facts/embed-backfill.js.map +1 -0
- package/dist/core/facts/reconcile-facts.d.ts +42 -0
- package/dist/core/facts/reconcile-facts.js +133 -0
- package/dist/core/facts/reconcile-facts.js.map +1 -0
- package/dist/core/health/embed-failure-state.d.ts +4 -0
- package/dist/core/health/embed-failure-state.js +12 -0
- package/dist/core/health/embed-failure-state.js.map +1 -0
- package/dist/core/health/warmup-retry.d.ts +27 -0
- package/dist/core/health/warmup-retry.js +53 -0
- package/dist/core/health/warmup-retry.js.map +1 -0
- package/dist/core/health/warmup-state.d.ts +15 -0
- package/dist/core/health/warmup-state.js +15 -1
- package/dist/core/health/warmup-state.js.map +1 -1
- package/dist/core/hook/cite-memo.d.ts +11 -7
- package/dist/core/hook/cite-memo.js +25 -17
- package/dist/core/hook/cite-memo.js.map +1 -1
- package/dist/core/hook/hook-log.d.ts +13 -2
- package/dist/core/hook/hook-log.js +16 -8
- package/dist/core/hook/hook-log.js.map +1 -1
- package/dist/core/hook/memo.d.ts +10 -6
- package/dist/core/hook/memo.js +25 -17
- package/dist/core/hook/memo.js.map +1 -1
- package/dist/core/hook/pointer-block.d.ts +8 -1
- package/dist/core/hook/pointer-block.js +17 -4
- package/dist/core/hook/pointer-block.js.map +1 -1
- package/dist/core/hook/resolve-conversation-by-query.d.ts +6 -5
- package/dist/core/hook/resolve-conversation-by-query.js +24 -12
- package/dist/core/hook/resolve-conversation-by-query.js.map +1 -1
- package/dist/core/ingest/ingest-session.d.ts +1 -1
- package/dist/core/ingest/ingest-session.js +3 -3
- package/dist/core/ingest/ingest-session.js.map +1 -1
- package/dist/core/ingest/reclassify-oversized.d.ts +1 -1
- package/dist/core/ingest/reclassify-oversized.js +2 -2
- package/dist/core/ingest/reclassify-oversized.js.map +1 -1
- package/dist/core/ingest/reprocess.d.ts +1 -1
- package/dist/core/ingest/reprocess.js +2 -2
- package/dist/core/ingest/reprocess.js.map +1 -1
- package/dist/core/jobs/job-supervisor.d.ts +168 -0
- package/dist/core/jobs/job-supervisor.js +335 -0
- package/dist/core/jobs/job-supervisor.js.map +1 -0
- package/dist/core/learner/model.d.ts +63 -0
- package/dist/core/learner/model.js +30 -0
- package/dist/core/learner/model.js.map +1 -0
- package/dist/core/learner/service.d.ts +42 -0
- package/dist/core/learner/service.js +74 -0
- package/dist/core/learner/service.js.map +1 -0
- package/dist/core/learner/summary.d.ts +28 -0
- package/dist/core/learner/summary.js +70 -0
- package/dist/core/learner/summary.js.map +1 -0
- package/dist/core/learner/validate.d.ts +18 -0
- package/dist/core/learner/validate.js +95 -0
- package/dist/core/learner/validate.js.map +1 -0
- package/dist/core/metrics/re-derivation.d.ts +31 -2
- package/dist/core/metrics/re-derivation.js +36 -4
- package/dist/core/metrics/re-derivation.js.map +1 -1
- package/dist/core/outcome/coverage.d.ts +1 -1
- package/dist/core/outcome/coverage.js +2 -2
- package/dist/core/outcome/coverage.js.map +1 -1
- package/dist/core/outcome/rollup.d.ts +1 -1
- package/dist/core/outcome/rollup.js +4 -4
- package/dist/core/outcome/rollup.js.map +1 -1
- package/dist/core/providers/provider-registry.d.ts +40 -23
- package/dist/core/providers/provider-registry.js +99 -81
- package/dist/core/providers/provider-registry.js.map +1 -1
- package/dist/core/recall/citation-log.d.ts +10 -5
- package/dist/core/recall/citation-log.js +21 -10
- package/dist/core/recall/citation-log.js.map +1 -1
- package/dist/core/recall/hook-recall-log.d.ts +5 -2
- package/dist/core/recall/hook-recall-log.js +12 -6
- package/dist/core/recall/hook-recall-log.js.map +1 -1
- package/dist/core/recall/miss-log.d.ts +7 -4
- package/dist/core/recall/miss-log.js +18 -11
- package/dist/core/recall/miss-log.js.map +1 -1
- package/dist/core/recall/query-log.d.ts +8 -5
- package/dist/core/recall/query-log.js +16 -9
- package/dist/core/recall/query-log.js.map +1 -1
- package/dist/core/recall/recall-service.d.ts +10 -1
- package/dist/core/recall/recall-service.js +31 -12
- package/dist/core/recall/recall-service.js.map +1 -1
- package/dist/core/recall/recent-log.d.ts +6 -1
- package/dist/core/recall/recent-log.js +13 -5
- package/dist/core/recall/recent-log.js.map +1 -1
- package/dist/core/recall/related-concepts.d.ts +29 -0
- package/dist/core/recall/related-concepts.js +67 -0
- package/dist/core/recall/related-concepts.js.map +1 -0
- package/dist/core/recall/related-exemplars.d.ts +1 -1
- package/dist/core/recall/related-exemplars.js +2 -2
- package/dist/core/recall/related-exemplars.js.map +1 -1
- package/dist/core/recall/related-facts.d.ts +1 -1
- package/dist/core/recall/related-facts.js +3 -3
- package/dist/core/recall/related-facts.js.map +1 -1
- package/dist/core/recall-facts/fact-query-log.d.ts +8 -4
- package/dist/core/recall-facts/fact-query-log.js +16 -8
- package/dist/core/recall-facts/fact-query-log.js.map +1 -1
- package/dist/core/recall-facts/fact-recall-service.d.ts +2 -2
- package/dist/core/recall-facts/fact-recall-service.js +12 -12
- package/dist/core/recall-facts/fact-recall-service.js.map +1 -1
- package/dist/core/scheduler/scan-once.js +15 -14
- package/dist/core/scheduler/scan-once.js.map +1 -1
- package/dist/core/scheduler/scheduler.d.ts +3 -0
- package/dist/core/scheduler/scheduler.js +15 -11
- package/dist/core/scheduler/scheduler.js.map +1 -1
- package/dist/core/signals/failure-mode-recall.d.ts +1 -1
- package/dist/core/signals/failure-mode-recall.js +2 -2
- package/dist/core/signals/failure-mode-recall.js.map +1 -1
- package/dist/core/signals/stamp-scope.d.ts +2 -2
- package/dist/core/signals/stamp-scope.js +2 -2
- package/dist/core/signals/stamp-scope.js.map +1 -1
- package/dist/core/sources/source-registry.d.ts +49 -28
- package/dist/core/sources/source-registry.js +113 -70
- package/dist/core/sources/source-registry.js.map +1 -1
- package/dist/core/storage/pg-code-exemplar-store.d.ts +19 -10
- package/dist/core/storage/pg-code-exemplar-store.js +58 -27
- package/dist/core/storage/pg-code-exemplar-store.js.map +1 -1
- package/dist/core/storage/pg-entity-store.d.ts +6 -1
- package/dist/core/storage/pg-entity-store.js +33 -18
- package/dist/core/storage/pg-entity-store.js.map +1 -1
- package/dist/core/storage/pg-fact-ingest.d.ts +1 -1
- package/dist/core/storage/pg-fact-ingest.js +10 -7
- package/dist/core/storage/pg-fact-ingest.js.map +1 -1
- package/dist/core/storage/pg-fact-store.d.ts +29 -17
- package/dist/core/storage/pg-fact-store.js +99 -46
- package/dist/core/storage/pg-fact-store.js.map +1 -1
- package/dist/core/storage/pg-learner-store.d.ts +27 -0
- package/dist/core/storage/pg-learner-store.js +174 -0
- package/dist/core/storage/pg-learner-store.js.map +1 -0
- package/dist/core/storage/pg-session-store.d.ts +24 -20
- package/dist/core/storage/pg-session-store.js +162 -90
- package/dist/core/storage/pg-session-store.js.map +1 -1
- package/dist/core/storage/pg-signal-store.d.ts +10 -5
- package/dist/core/storage/pg-signal-store.js +24 -12
- package/dist/core/storage/pg-signal-store.js.map +1 -1
- package/dist/core/storage/pg-storage.d.ts +4 -0
- package/dist/core/storage/pg-storage.js +6 -0
- package/dist/core/storage/pg-storage.js.map +1 -1
- package/dist/core/storage/pg-workstream-store.d.ts +16 -11
- package/dist/core/storage/pg-workstream-store.js +46 -29
- package/dist/core/storage/pg-workstream-store.js.map +1 -1
- package/dist/core/storage/sqlite-code-exemplar-store.d.ts +24 -10
- package/dist/core/storage/sqlite-code-exemplar-store.js +84 -40
- package/dist/core/storage/sqlite-code-exemplar-store.js.map +1 -1
- package/dist/core/storage/sqlite-entity-store.d.ts +8 -1
- package/dist/core/storage/sqlite-entity-store.js +46 -27
- package/dist/core/storage/sqlite-entity-store.js.map +1 -1
- package/dist/core/storage/sqlite-fact-store.d.ts +45 -19
- package/dist/core/storage/sqlite-fact-store.js +172 -64
- package/dist/core/storage/sqlite-fact-store.js.map +1 -1
- package/dist/core/storage/sqlite-learner-store.d.ts +33 -0
- package/dist/core/storage/sqlite-learner-store.js +178 -0
- package/dist/core/storage/sqlite-learner-store.js.map +1 -0
- package/dist/core/storage/sqlite-outcome-store.d.ts +37 -22
- package/dist/core/storage/sqlite-outcome-store.js +90 -37
- package/dist/core/storage/sqlite-outcome-store.js.map +1 -1
- package/dist/core/storage/sqlite-session-store.d.ts +29 -20
- package/dist/core/storage/sqlite-session-store.js +207 -121
- package/dist/core/storage/sqlite-session-store.js.map +1 -1
- package/dist/core/storage/sqlite-signal-store.d.ts +12 -5
- package/dist/core/storage/sqlite-signal-store.js +27 -15
- package/dist/core/storage/sqlite-signal-store.js.map +1 -1
- package/dist/core/storage/sqlite-storage.d.ts +4 -0
- package/dist/core/storage/sqlite-storage.js +10 -2
- package/dist/core/storage/sqlite-storage.js.map +1 -1
- package/dist/core/storage/sqlite-workstream-store.d.ts +16 -11
- package/dist/core/storage/sqlite-workstream-store.js +52 -31
- package/dist/core/storage/sqlite-workstream-store.js.map +1 -1
- package/dist/core/storage/supersedence-log.d.ts +10 -7
- package/dist/core/storage/supersedence-log.js +19 -14
- package/dist/core/storage/supersedence-log.js.map +1 -1
- package/dist/core/tenancy/default-team.d.ts +6 -0
- package/dist/core/tenancy/default-team.js +7 -0
- package/dist/core/tenancy/default-team.js.map +1 -0
- package/dist/core/tenancy/hosted-mode.d.ts +9 -0
- package/dist/core/tenancy/hosted-mode.js +12 -0
- package/dist/core/tenancy/hosted-mode.js.map +1 -0
- package/dist/core/tenancy/team-auth.d.ts +16 -0
- package/dist/core/tenancy/team-auth.js +22 -0
- package/dist/core/tenancy/team-auth.js.map +1 -0
- package/dist/core/tenancy/team-token-store.d.ts +45 -0
- package/dist/core/tenancy/team-token-store.js +52 -0
- package/dist/core/tenancy/team-token-store.js.map +1 -0
- package/dist/core/tenancy/tenant-clause.d.ts +37 -0
- package/dist/core/tenancy/tenant-clause.js +11 -0
- package/dist/core/tenancy/tenant-clause.js.map +1 -0
- package/dist/core/tenancy/tenant-state-path.d.ts +28 -0
- package/dist/core/tenancy/tenant-state-path.js +49 -0
- package/dist/core/tenancy/tenant-state-path.js.map +1 -0
- package/dist/core/wiki/project.d.ts +17 -0
- package/dist/core/wiki/project.js +37 -0
- package/dist/core/wiki/project.js.map +1 -0
- package/dist/core/wiki/reconcile.d.ts +15 -0
- package/dist/core/wiki/reconcile.js +14 -0
- package/dist/core/wiki/reconcile.js.map +1 -0
- package/dist/core/wiki/render.d.ts +5 -0
- package/dist/core/wiki/render.js +84 -0
- package/dist/core/wiki/render.js.map +1 -0
- package/dist/core/wiki/rollup.d.ts +28 -0
- package/dist/core/wiki/rollup.js +91 -0
- package/dist/core/wiki/rollup.js.map +1 -0
- package/dist/core/wiki/select.d.ts +8 -0
- package/dist/core/wiki/select.js +7 -0
- package/dist/core/wiki/select.js.map +1 -0
- package/dist/core/wiki/slug.d.ts +36 -0
- package/dist/core/wiki/slug.js +71 -0
- package/dist/core/wiki/slug.js.map +1 -0
- package/dist/core/wiki/types.d.ts +37 -0
- package/dist/core/wiki/types.js +2 -0
- package/dist/core/wiki/types.js.map +1 -0
- package/dist/core/work-digest/build-work-digest.d.ts +1 -1
- package/dist/core/work-digest/build-work-digest.js +3 -3
- package/dist/core/work-digest/build-work-digest.js.map +1 -1
- package/dist/core/workstream/bind.d.ts +1 -1
- package/dist/core/workstream/bind.js +10 -10
- package/dist/core/workstream/bind.js.map +1 -1
- package/dist/core/workstream/rollup.d.ts +1 -1
- package/dist/core/workstream/rollup.js +6 -6
- package/dist/core/workstream/rollup.js.map +1 -1
- package/dist/hook/hook-helpers.d.ts +14 -0
- package/dist/hook/hook-helpers.js +29 -2
- package/dist/hook/hook-helpers.js.map +1 -1
- package/dist/hook/pre-compact-hook.js +6 -4
- package/dist/hook/pre-compact-hook.js.map +1 -1
- package/dist/hook/prompt-recall-hook.d.ts +5 -2
- package/dist/hook/prompt-recall-hook.js +28 -17
- package/dist/hook/prompt-recall-hook.js.map +1 -1
- package/dist/hook/recall-over-http.d.ts +27 -3
- package/dist/hook/recall-over-http.js +44 -11
- package/dist/hook/recall-over-http.js.map +1 -1
- package/dist/hook/session-end-hook.js +7 -5
- package/dist/hook/session-end-hook.js.map +1 -1
- package/dist/hook/session-start-hook.d.ts +14 -1
- package/dist/hook/session-start-hook.js +55 -15
- package/dist/hook/session-start-hook.js.map +1 -1
- package/dist/hook/stop-hook.js +9 -7
- package/dist/hook/stop-hook.js.map +1 -1
- package/dist/http/app.d.ts +41 -3
- package/dist/http/app.js +355 -96
- package/dist/http/app.js.map +1 -1
- package/dist/install/claude-code.d.ts +17 -0
- package/dist/install/claude-code.js +44 -5
- package/dist/install/claude-code.js.map +1 -1
- package/dist/install/codex.d.ts +23 -2
- package/dist/install/codex.js +111 -14
- package/dist/install/codex.js.map +1 -1
- package/dist/install/cursor.d.ts +2 -2
- package/dist/install/cursor.js +7 -7
- package/dist/install/cursor.js.map +1 -1
- package/dist/install/hermes.d.ts +8 -0
- package/dist/install/hermes.js +28 -5
- package/dist/install/hermes.js.map +1 -1
- package/dist/install/local-source.d.ts +20 -0
- package/dist/install/local-source.js +28 -0
- package/dist/install/local-source.js.map +1 -0
- package/dist/install/mcp-block.d.ts +77 -0
- package/dist/install/mcp-block.js +99 -0
- package/dist/install/mcp-block.js.map +1 -0
- package/dist/install/pi.d.ts +26 -0
- package/dist/install/pi.js +43 -0
- package/dist/install/pi.js.map +1 -1
- package/dist/install/setup.js +6 -0
- package/dist/install/setup.js.map +1 -1
- package/dist/install/windsurf.d.ts +2 -2
- package/dist/install/windsurf.js +7 -7
- package/dist/install/windsurf.js.map +1 -1
- package/dist/llm/classifier-box.d.ts +5 -0
- package/dist/llm/classifier-box.js +5 -0
- package/dist/llm/classifier-box.js.map +1 -1
- package/dist/mcp/server.d.ts +73 -16
- package/dist/mcp/server.js +306 -83
- package/dist/mcp/server.js.map +1 -1
- package/dist/ports/clock.d.ts +12 -0
- package/dist/ports/clock.js +10 -0
- package/dist/ports/clock.js.map +1 -0
- package/dist/ports/code-exemplar-store.d.ts +13 -13
- package/dist/ports/entity-store.d.ts +5 -1
- package/dist/ports/fact-store.d.ts +0 -0
- package/dist/ports/fact-store.js +0 -0
- package/dist/ports/fact-store.js.map +1 -1
- package/dist/ports/learner-store.d.ts +80 -0
- package/dist/ports/learner-store.js +19 -0
- package/dist/ports/learner-store.js.map +1 -0
- package/dist/ports/outcome.d.ts +3 -3
- package/dist/ports/session-store.d.ts +20 -14
- package/dist/ports/session-store.js +5 -0
- package/dist/ports/session-store.js.map +1 -1
- package/dist/ports/signal-store.d.ts +12 -8
- package/dist/ports/spawn-child.d.ts +14 -0
- package/dist/ports/spawn-child.js +10 -0
- package/dist/ports/spawn-child.js.map +1 -0
- package/dist/ports/storage.d.ts +6 -0
- package/dist/ports/transcript-adapter.d.ts +11 -0
- package/dist/ports/wiki-writer.d.ts +19 -0
- package/dist/ports/wiki-writer.js +12 -0
- package/dist/ports/wiki-writer.js.map +1 -0
- package/dist/ports/workstream-store.d.ts +19 -12
- package/dist/shared/types.d.ts +22 -0
- package/dist/shared/types.js.map +1 -1
- package/dist/shared/version.d.ts +9 -0
- package/dist/shared/version.js +11 -0
- package/dist/shared/version.js.map +1 -0
- package/dist/ui/assets/index-D6F3xAis.js +11 -0
- package/dist/ui/index.html +1 -1
- package/migrations/033_actions_kind_check.sql +58 -0
- package/migrations/034_tenancy_teams_and_stamps.sql +40 -0
- package/migrations/035_tenancy_entity_rekey.sql +75 -0
- package/migrations/036_tenant_name_uniqueness.sql +59 -0
- package/migrations/037_sessions_covering_index.sql +25 -0
- package/migrations/038_sources_muse.sql +33 -0
- package/migrations/039_learner_evidence.sql +51 -0
- package/migrations/pg/033_actions_kind_check.sql +17 -0
- package/migrations/pg/034_tenancy.sql +77 -0
- package/migrations/pg/035_tenant_name_uniqueness.sql +15 -0
- package/migrations/pg/036_sources_muse.sql +12 -0
- package/migrations/pg/037_learner_evidence.sql +55 -0
- package/nlm/index.js +246 -55
- package/package.json +10 -5
- package/plugin/.codex-plugin/plugin.json +2 -2
- package/plugin/scripts/prompt-recall-hook.mjs +244 -55
- package/plugin/scripts/session-start-hook.mjs +273 -53
- package/plugin/scripts/stop-hook.mjs +195 -37
- package/dist/ui/assets/index-CSaBtgXD.js +0 -11
|
@@ -44,13 +44,13 @@ export function captureExemplarsFromSession(ctx) {
|
|
|
44
44
|
}
|
|
45
45
|
return out;
|
|
46
46
|
}
|
|
47
|
-
export async function drainSessionExemplars(ctx, deps) {
|
|
47
|
+
export async function drainSessionExemplars(tenantId, ctx, deps) {
|
|
48
48
|
if (process.env["NLM_CODE_EXEMPLARS_ENABLED"] !== "1")
|
|
49
49
|
return 0;
|
|
50
50
|
let count = 0;
|
|
51
51
|
try {
|
|
52
52
|
for (const input of captureExemplarsFromSession(ctx)) {
|
|
53
|
-
const { id, skipped } = await deps.exemplarStore.insert(input);
|
|
53
|
+
const { id, skipped } = await deps.exemplarStore.insert(tenantId, input);
|
|
54
54
|
if (skipped)
|
|
55
55
|
continue;
|
|
56
56
|
count += 1;
|
|
@@ -59,7 +59,7 @@ export async function drainSessionExemplars(ctx, deps) {
|
|
|
59
59
|
const store = deps.exemplarStore;
|
|
60
60
|
void embedder
|
|
61
61
|
.embed(composeEmbedText(input.taskContext, input.code), "document")
|
|
62
|
-
.then((r) => store.upsertEmbedding(id, r.vector))
|
|
62
|
+
.then((r) => store.upsertEmbedding(tenantId, id, r.vector))
|
|
63
63
|
.catch(() => { });
|
|
64
64
|
}
|
|
65
65
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture-from-session.js","sourceRoot":"","sources":["../../../src/core/exemplars/capture-from-session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAIrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAc7B,MAAM,UAAU,kBAAkB,CAAC,OAAe,EAAE,SAAgC;IAClF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACvD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,GAA2B;IACrE,IAAI,CAAC,GAAG,CAAC,UAAU;QAAE,OAAO,EAAE,CAAC;IAC/B,MAAM,WAAW,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;IACnE,MAAM,GAAG,GAAwB,EAAE,CAAC;IACpC,KAAK,MAAM,GAAG,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,iBAAiB,CAAC;YACjC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;YAC9B,QAAQ,EAAE,GAAG,CAAC,UAAU;YACxB,GAAG;YACH,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,OAAO,EAAE,MAAM;YACf,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1C,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,EAAE,EAAE,GAAG,CAAC,SAAS;YACjB,WAAW;SACZ,CAAC,CAAC;QACH,IAAI,QAAQ;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,GAA2B,EAC3B,IAAuB;IAEvB,IAAI,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,KAAK,GAAG;QAAE,OAAO,CAAC,CAAC;IAChE,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,CAAC;QACH,KAAK,MAAM,KAAK,IAAI,2BAA2B,CAAC,GAAG,CAAC,EAAE,CAAC;YACrD,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"capture-from-session.js","sourceRoot":"","sources":["../../../src/core/exemplars/capture-from-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,10 +17,19 @@
|
|
|
17
17
|
* "list rows missing a vector" method and adding one to the port for a
|
|
18
18
|
* one-shot operational tool isn't worth it — same direct-SQLite call the
|
|
19
19
|
* session backfill makes).
|
|
20
|
+
*
|
|
21
|
+
* Tenancy: this is an operator-run local CLI maintenance tool (`nlm
|
|
22
|
+
* embed-backfill --exemplars`), not a corpus-returning surface in the
|
|
23
|
+
* disposition table — the discovery query stays whole-DB (it repairs
|
|
24
|
+
* dropped embeddings across every row missing one), while the write itself
|
|
25
|
+
* routes through the now-tenant-checked `upsertEmbedding` so a tenant
|
|
26
|
+
* mismatch (impossible in local single-tenant mode; relevant once M3 wires
|
|
27
|
+
* a hosted equivalent) is a no-op, not a cross-tenant write.
|
|
20
28
|
*/
|
|
21
29
|
import type { CodeEmbedder } from "../../ports/code-embedder.js";
|
|
22
30
|
import type { CodeExemplarStore } from "../../ports/code-exemplar-store.js";
|
|
23
31
|
export interface ExemplarBackfillOptions {
|
|
32
|
+
readonly tenantId: string;
|
|
24
33
|
readonly dbPath: string;
|
|
25
34
|
readonly embedder: CodeEmbedder;
|
|
26
35
|
readonly store: CodeExemplarStore;
|
|
@@ -17,6 +17,14 @@
|
|
|
17
17
|
* "list rows missing a vector" method and adding one to the port for a
|
|
18
18
|
* one-shot operational tool isn't worth it — same direct-SQLite call the
|
|
19
19
|
* session backfill makes).
|
|
20
|
+
*
|
|
21
|
+
* Tenancy: this is an operator-run local CLI maintenance tool (`nlm
|
|
22
|
+
* embed-backfill --exemplars`), not a corpus-returning surface in the
|
|
23
|
+
* disposition table — the discovery query stays whole-DB (it repairs
|
|
24
|
+
* dropped embeddings across every row missing one), while the write itself
|
|
25
|
+
* routes through the now-tenant-checked `upsertEmbedding` so a tenant
|
|
26
|
+
* mismatch (impossible in local single-tenant mode; relevant once M3 wires
|
|
27
|
+
* a hosted equivalent) is a no-op, not a cross-tenant write.
|
|
20
28
|
*/
|
|
21
29
|
import { existsSync } from "node:fs";
|
|
22
30
|
import Database from "better-sqlite3";
|
|
@@ -70,7 +78,7 @@ export async function backfillExemplarEmbeddings(opts) {
|
|
|
70
78
|
continue;
|
|
71
79
|
}
|
|
72
80
|
try {
|
|
73
|
-
await opts.store.upsertEmbedding(row.id, vector);
|
|
81
|
+
await opts.store.upsertEmbedding(opts.tenantId, row.id, vector);
|
|
74
82
|
}
|
|
75
83
|
catch (e) {
|
|
76
84
|
failed += 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embed-backfill.js","sourceRoot":"","sources":["../../../src/core/exemplars/embed-backfill.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"embed-backfill.js","sourceRoot":"","sources":["../../../src/core/exemplars/embed-backfill.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,4 +22,4 @@ export interface RecallCodeResult {
|
|
|
22
22
|
* Recall code exemplars. Returns positives (pass/fix) and negatives (fail/exhausted)
|
|
23
23
|
* as separate lists so the caller can surface them with distinct framing.
|
|
24
24
|
*/
|
|
25
|
-
export declare function recallCode(opts: RecallCodeOptions, store: CodeExemplarStore, codeEmbedder: CodeEmbedder | null, proseFallback: LLMClient | null): Promise<RecallCodeResult>;
|
|
25
|
+
export declare function recallCode(tenantId: string, opts: RecallCodeOptions, store: CodeExemplarStore, codeEmbedder: CodeEmbedder | null, proseFallback: LLMClient | null): Promise<RecallCodeResult>;
|
|
@@ -11,7 +11,7 @@ import { laneHealth } from "../health/embedding-lane-state.js";
|
|
|
11
11
|
* Recall code exemplars. Returns positives (pass/fix) and negatives (fail/exhausted)
|
|
12
12
|
* as separate lists so the caller can surface them with distinct framing.
|
|
13
13
|
*/
|
|
14
|
-
export async function recallCode(opts, store, codeEmbedder, proseFallback) {
|
|
14
|
+
export async function recallCode(tenantId, opts, store, codeEmbedder, proseFallback) {
|
|
15
15
|
if (laneHealth("code") === "stale") {
|
|
16
16
|
return { positives: [], negatives: [] };
|
|
17
17
|
}
|
|
@@ -45,7 +45,7 @@ export async function recallCode(opts, store, codeEmbedder, proseFallback) {
|
|
|
45
45
|
includeNegatives: opts.includeNegatives ?? true,
|
|
46
46
|
k: opts.k ?? 5,
|
|
47
47
|
};
|
|
48
|
-
const hits = await store.searchByVector(queryVector, filter);
|
|
48
|
+
const hits = await store.searchByVector(tenantId, queryVector, filter);
|
|
49
49
|
const positives = hits.filter((h) => h.outcome === "pass" || h.outcome === "fix");
|
|
50
50
|
const negatives = hits.filter((h) => h.outcome === "fail" || h.outcome === "exhausted");
|
|
51
51
|
return { positives, negatives };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recall-code.js","sourceRoot":"","sources":["../../../src/core/exemplars/recall-code.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAYlE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAuB,EACvB,KAAwB,EACxB,YAAiC,EACjC,aAA+B;IAE/B,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,OAAO,EAAE,CAAC;QACnC,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC1C,CAAC;IAED,IAAI,WAAW,GAAwB,IAAI,CAAC;IAE5C,IAAI,YAAY,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC7D,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,2CAA2C;QAC7C,CAAC;IACH,CAAC;IAED,IAAI,CAAC,WAAW,IAAI,aAAa,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC9D,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC1C,CAAC;IAED,MAAM,MAAM,GAA6B;QACvC,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QACnD,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QACnD,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;QACtD,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,IAAI;QAC/C,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC;KACf,CAAC;IAEF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"recall-code.js","sourceRoot":"","sources":["../../../src/core/exemplars/recall-code.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAYlE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,QAAgB,EAChB,IAAuB,EACvB,KAAwB,EACxB,YAAiC,EACjC,aAA+B;IAE/B,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,OAAO,EAAE,CAAC;QACnC,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC1C,CAAC;IAED,IAAI,WAAW,GAAwB,IAAI,CAAC;IAE5C,IAAI,YAAY,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC7D,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,2CAA2C;QAC7C,CAAC;IACH,CAAC;IAED,IAAI,CAAC,WAAW,IAAI,aAAa,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC9D,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC1C,CAAC;IAED,MAAM,MAAM,GAA6B;QACvC,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QACnD,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QACnD,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;QACtD,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,IAAI;QAC/C,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC;KACf,CAAC;IAEF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAEvE,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC;IAClF,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC,OAAO,KAAK,WAAW,CAAC,CAAC;IAExF,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AAClC,CAAC"}
|
|
@@ -57,4 +57,4 @@ export interface BackfillFactsReport {
|
|
|
57
57
|
readonly classifyFailures: number;
|
|
58
58
|
readonly storageFailures: number;
|
|
59
59
|
}
|
|
60
|
-
export declare function backfillFacts(opts: BackfillFactsOptions): Promise<BackfillFactsReport>;
|
|
60
|
+
export declare function backfillFacts(opts: BackfillFactsOptions, tenantId: string): Promise<BackfillFactsReport>;
|
|
@@ -40,7 +40,7 @@ function saveState(path, done) {
|
|
|
40
40
|
mkdirSync(dir, { recursive: true });
|
|
41
41
|
writeFileSync(path, JSON.stringify({ done: Array.from(done) }, null, 0));
|
|
42
42
|
}
|
|
43
|
-
export async function backfillFacts(opts) {
|
|
43
|
+
export async function backfillFacts(opts, tenantId) {
|
|
44
44
|
const startedAtCutoff = new Date().toISOString();
|
|
45
45
|
const statePath = opts.statePath ?? DEFAULT_STATE_PATH;
|
|
46
46
|
const done = opts.dryRun ? new Set() : loadState(statePath);
|
|
@@ -49,7 +49,7 @@ export async function backfillFacts(opts) {
|
|
|
49
49
|
// transcript text). When reprocess=false, exclude sessions that already
|
|
50
50
|
// have facts attributed to them. SQL lives in each adapter's
|
|
51
51
|
// listBackfillCandidates so backfill is backend-agnostic.
|
|
52
|
-
const rows = await opts.store.listBackfillCandidates({
|
|
52
|
+
const rows = await opts.store.listBackfillCandidates(tenantId, {
|
|
53
53
|
cutoff: startedAtCutoff,
|
|
54
54
|
...(opts.from ? { from: opts.from } : {}),
|
|
55
55
|
reprocess: opts.reprocess ?? false,
|
|
@@ -124,10 +124,10 @@ export async function backfillFacts(opts) {
|
|
|
124
124
|
// so the factStore cast is sound — TS just can't correlate the two union
|
|
125
125
|
// members at one call site.
|
|
126
126
|
if (opts.store instanceof PgSessionStore) {
|
|
127
|
-
await opts.store.insertFactsForSession(sid, opts.factStore, facts, opts.embedder ?? null);
|
|
127
|
+
await opts.store.insertFactsForSession(tenantId, sid, opts.factStore, facts, opts.embedder ?? null);
|
|
128
128
|
}
|
|
129
129
|
else {
|
|
130
|
-
await opts.store.insertFactsForSession(sid, opts.factStore, facts, opts.embedder ?? null);
|
|
130
|
+
await opts.store.insertFactsForSession(tenantId, sid, opts.factStore, facts, opts.embedder ?? null);
|
|
131
131
|
}
|
|
132
132
|
}
|
|
133
133
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backfill-facts.js","sourceRoot":"","sources":["../../../src/core/facts/backfill-facts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAG5D,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAGnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,sBAAsB,CAAC,CAAC;AAC3E,MAAM,UAAU,GAAG,EAAE,CAAC;AAuDtB,SAAS,SAAS,CAAC,IAAY;IAC7B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,GAAG,EAAE,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAwB,CAAC;QAC3E,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,GAAG,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,IAAiB;IAChD,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAA0B;
|
|
1
|
+
{"version":3,"file":"backfill-facts.js","sourceRoot":"","sources":["../../../src/core/facts/backfill-facts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* fact embed-backfill — (re)embed active facts that are missing a vector.
|
|
3
|
+
*
|
|
4
|
+
* The ingest path embeds facts best-effort: `SqliteSessionStore.embedFacts`
|
|
5
|
+
* traps per-fact embed errors so one bad call can't abort a batch, which
|
|
6
|
+
* leaves the fact row current but absent from `fact_embeddings`. Such a fact
|
|
7
|
+
* is still keyword-recallable via FTS5 and permanently invisible to semantic
|
|
8
|
+
* recall — and nothing repairs it, because the only existing fact re-embed
|
|
9
|
+
* runs inside `reembedCorpus` and is gated behind an embedder config change
|
|
10
|
+
* (a same-config rerun reembeds sessions only). This is that missing repair.
|
|
11
|
+
*
|
|
12
|
+
* Mirrors the exemplar embed-backfill (backfillExemplarEmbeddings): same
|
|
13
|
+
* discovery-by-absence, the store's existing tenant-checked upsertEmbedding,
|
|
14
|
+
* and a single retry on transient embedder failures. The retry matters here
|
|
15
|
+
* specifically — the measured production failure is sporadic (~1 in 26 calls,
|
|
16
|
+
* a steady 3-10% on every busy day since April), not a sustained outage, so
|
|
17
|
+
* most rows succeed on a second attempt.
|
|
18
|
+
*
|
|
19
|
+
* Embed text is `${subject} ${predicate} ${value}`.trim() with role
|
|
20
|
+
* "document", byte-identical to embedFacts. A different shape here would
|
|
21
|
+
* produce vectors that don't sit in the same space as live-path ones.
|
|
22
|
+
*
|
|
23
|
+
* Only recall-eligible facts are embedded (superseded_by IS NULL AND
|
|
24
|
+
* retired_at IS NULL). Embedding a dead fact would reintroduce exactly the
|
|
25
|
+
* ghost vectors scripts/repair-fact-embeddings.mjs deletes (#351), where they
|
|
26
|
+
* consume ANN k-nearest slots and reduce effective recall.
|
|
27
|
+
*
|
|
28
|
+
* Idempotent: discovery is by absence from the vec table, so a second run
|
|
29
|
+
* finds nothing.
|
|
30
|
+
*
|
|
31
|
+
* Layering: depends on the FactStore port for the upsert and on a read-only
|
|
32
|
+
* better-sqlite3 handle for discovery — the port has no "list rows missing a
|
|
33
|
+
* vector" method, and adding one for a one-shot operational tool isn't worth
|
|
34
|
+
* it. Same direct-SQLite call the session and exemplar backfills make.
|
|
35
|
+
*/
|
|
36
|
+
import type { FactStore } from "../../ports/fact-store.js";
|
|
37
|
+
import type { LLMClient } from "../../ports/llm-client.js";
|
|
38
|
+
export interface FactBackfillOptions {
|
|
39
|
+
readonly tenantId: string;
|
|
40
|
+
readonly dbPath: string;
|
|
41
|
+
readonly embedder: LLMClient;
|
|
42
|
+
readonly store: FactStore;
|
|
43
|
+
readonly limit?: number;
|
|
44
|
+
readonly onProgress?: (i: number, total: number, id: string, status: string) => void;
|
|
45
|
+
}
|
|
46
|
+
export interface FactBackfillReport {
|
|
47
|
+
readonly total: number;
|
|
48
|
+
readonly succeeded: number;
|
|
49
|
+
readonly failed: number;
|
|
50
|
+
readonly dbMissing: boolean;
|
|
51
|
+
}
|
|
52
|
+
/** Byte-identical to SqliteSessionStore.embedFacts — keep the two in sync. */
|
|
53
|
+
export declare function composeFactEmbedText(subject: string, predicate: string, value: string): string;
|
|
54
|
+
export declare function backfillFactEmbeddings(opts: FactBackfillOptions): Promise<FactBackfillReport>;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* fact embed-backfill — (re)embed active facts that are missing a vector.
|
|
3
|
+
*
|
|
4
|
+
* The ingest path embeds facts best-effort: `SqliteSessionStore.embedFacts`
|
|
5
|
+
* traps per-fact embed errors so one bad call can't abort a batch, which
|
|
6
|
+
* leaves the fact row current but absent from `fact_embeddings`. Such a fact
|
|
7
|
+
* is still keyword-recallable via FTS5 and permanently invisible to semantic
|
|
8
|
+
* recall — and nothing repairs it, because the only existing fact re-embed
|
|
9
|
+
* runs inside `reembedCorpus` and is gated behind an embedder config change
|
|
10
|
+
* (a same-config rerun reembeds sessions only). This is that missing repair.
|
|
11
|
+
*
|
|
12
|
+
* Mirrors the exemplar embed-backfill (backfillExemplarEmbeddings): same
|
|
13
|
+
* discovery-by-absence, the store's existing tenant-checked upsertEmbedding,
|
|
14
|
+
* and a single retry on transient embedder failures. The retry matters here
|
|
15
|
+
* specifically — the measured production failure is sporadic (~1 in 26 calls,
|
|
16
|
+
* a steady 3-10% on every busy day since April), not a sustained outage, so
|
|
17
|
+
* most rows succeed on a second attempt.
|
|
18
|
+
*
|
|
19
|
+
* Embed text is `${subject} ${predicate} ${value}`.trim() with role
|
|
20
|
+
* "document", byte-identical to embedFacts. A different shape here would
|
|
21
|
+
* produce vectors that don't sit in the same space as live-path ones.
|
|
22
|
+
*
|
|
23
|
+
* Only recall-eligible facts are embedded (superseded_by IS NULL AND
|
|
24
|
+
* retired_at IS NULL). Embedding a dead fact would reintroduce exactly the
|
|
25
|
+
* ghost vectors scripts/repair-fact-embeddings.mjs deletes (#351), where they
|
|
26
|
+
* consume ANN k-nearest slots and reduce effective recall.
|
|
27
|
+
*
|
|
28
|
+
* Idempotent: discovery is by absence from the vec table, so a second run
|
|
29
|
+
* finds nothing.
|
|
30
|
+
*
|
|
31
|
+
* Layering: depends on the FactStore port for the upsert and on a read-only
|
|
32
|
+
* better-sqlite3 handle for discovery — the port has no "list rows missing a
|
|
33
|
+
* vector" method, and adding one for a one-shot operational tool isn't worth
|
|
34
|
+
* it. Same direct-SQLite call the session and exemplar backfills make.
|
|
35
|
+
*/
|
|
36
|
+
import { existsSync } from "node:fs";
|
|
37
|
+
import Database from "better-sqlite3";
|
|
38
|
+
import * as sqliteVec from "sqlite-vec";
|
|
39
|
+
import { LLMUnreachableError } from "../../ports/llm-client.js";
|
|
40
|
+
/** Byte-identical to SqliteSessionStore.embedFacts — keep the two in sync. */
|
|
41
|
+
export function composeFactEmbedText(subject, predicate, value) {
|
|
42
|
+
return `${subject} ${predicate} ${value}`.trim();
|
|
43
|
+
}
|
|
44
|
+
export async function backfillFactEmbeddings(opts) {
|
|
45
|
+
if (!existsSync(opts.dbPath)) {
|
|
46
|
+
return { total: 0, succeeded: 0, failed: 0, dbMissing: true };
|
|
47
|
+
}
|
|
48
|
+
const db = new Database(opts.dbPath, { readonly: true });
|
|
49
|
+
sqliteVec.load(db);
|
|
50
|
+
let rows;
|
|
51
|
+
try {
|
|
52
|
+
const sql = "SELECT f.id, f.subject, f.predicate, f.value FROM facts f " +
|
|
53
|
+
"WHERE f.superseded_by IS NULL AND f.retired_at IS NULL " +
|
|
54
|
+
"AND f.id NOT IN (SELECT fact_id FROM fact_embeddings) " +
|
|
55
|
+
"ORDER BY f.created_at" +
|
|
56
|
+
(opts.limit ? ` LIMIT ${Math.trunc(opts.limit)}` : "");
|
|
57
|
+
rows = db.prepare(sql).all();
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
db.close();
|
|
61
|
+
}
|
|
62
|
+
const total = rows.length;
|
|
63
|
+
let succeeded = 0;
|
|
64
|
+
let failed = 0;
|
|
65
|
+
for (let i = 0; i < rows.length; i++) {
|
|
66
|
+
const row = rows[i];
|
|
67
|
+
const idx = i + 1;
|
|
68
|
+
const text = composeFactEmbedText(row.subject, row.predicate, row.value);
|
|
69
|
+
if (!text) {
|
|
70
|
+
failed += 1;
|
|
71
|
+
opts.onProgress?.(idx, total, row.id, "FAIL (empty embed text)");
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
let vector;
|
|
75
|
+
let lastErr;
|
|
76
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
77
|
+
try {
|
|
78
|
+
const out = await opts.embedder.embed(text, "document");
|
|
79
|
+
vector = out.vector;
|
|
80
|
+
lastErr = undefined;
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
catch (e) {
|
|
84
|
+
lastErr = e;
|
|
85
|
+
if (!(e instanceof LLMUnreachableError))
|
|
86
|
+
throw e;
|
|
87
|
+
if (attempt === 0)
|
|
88
|
+
await new Promise((r) => setTimeout(r, 200));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (vector === undefined) {
|
|
92
|
+
failed += 1;
|
|
93
|
+
opts.onProgress?.(idx, total, row.id, `FAIL (embedder): ${lastErr?.message ?? "unknown"}`);
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
await opts.store.upsertEmbedding(opts.tenantId, row.id, vector);
|
|
98
|
+
}
|
|
99
|
+
catch (e) {
|
|
100
|
+
failed += 1;
|
|
101
|
+
opts.onProgress?.(idx, total, row.id, `FAIL (db): ${e.message}`);
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
succeeded += 1;
|
|
105
|
+
opts.onProgress?.(idx, total, row.id, "OK");
|
|
106
|
+
}
|
|
107
|
+
return { total, succeeded, failed, dbMissing: false };
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=embed-backfill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embed-backfill.js","sourceRoot":"","sources":["../../../src/core/facts/embed-backfill.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reconcile live facts against operator-supplied authorities. Structured
|
|
3
|
+
* sources win: a live fact that contradicts an authority, or that names a
|
|
4
|
+
* deleted file, is retired (never replaced). Deterministic, no LLM calls.
|
|
5
|
+
*/
|
|
6
|
+
import type Database from "better-sqlite3";
|
|
7
|
+
export interface Authority {
|
|
8
|
+
readonly aliases: readonly string[];
|
|
9
|
+
readonly predicate: string;
|
|
10
|
+
readonly value: string;
|
|
11
|
+
readonly source: string;
|
|
12
|
+
}
|
|
13
|
+
export interface DeletedFile {
|
|
14
|
+
readonly name: string;
|
|
15
|
+
readonly deleted_at?: string;
|
|
16
|
+
readonly source?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface AuthoritiesFile {
|
|
19
|
+
readonly authorities: readonly Authority[];
|
|
20
|
+
readonly deleted_files: readonly DeletedFile[];
|
|
21
|
+
}
|
|
22
|
+
export type FindingType = "value_mismatch" | "dead_reference";
|
|
23
|
+
export interface Finding {
|
|
24
|
+
readonly type: FindingType;
|
|
25
|
+
readonly factId: string;
|
|
26
|
+
readonly subject: string;
|
|
27
|
+
readonly predicate: string;
|
|
28
|
+
readonly value: string;
|
|
29
|
+
readonly createdAt: string;
|
|
30
|
+
readonly tenantId: string;
|
|
31
|
+
readonly authorityValue: string | null;
|
|
32
|
+
readonly authoritySource: string;
|
|
33
|
+
}
|
|
34
|
+
export declare function loadAuthorities(path: string): AuthoritiesFile;
|
|
35
|
+
export declare function normalizeSubject(s: string): string;
|
|
36
|
+
export declare function findContradictions(db: Database.Database, file: AuthoritiesFile): Finding[];
|
|
37
|
+
export interface ApplyResult {
|
|
38
|
+
readonly retired: readonly Finding[];
|
|
39
|
+
readonly backupPath: string | null;
|
|
40
|
+
}
|
|
41
|
+
export declare function applyRetirements(db: Database.Database, dbFilePath: string, findings: readonly Finding[], limit: number, logPath?: string): Promise<ApplyResult>;
|
|
42
|
+
export declare function formatReport(findings: readonly Finding[], limit: number): string;
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reconcile live facts against operator-supplied authorities. Structured
|
|
3
|
+
* sources win: a live fact that contradicts an authority, or that names a
|
|
4
|
+
* deleted file, is retired (never replaced). Deterministic, no LLM calls.
|
|
5
|
+
*/
|
|
6
|
+
import { readFileSync } from "node:fs";
|
|
7
|
+
import { appendFactSupersedence } from "../storage/supersedence-log.js";
|
|
8
|
+
import { DEFAULT_TEAM_ID } from "../tenancy/default-team.js";
|
|
9
|
+
export function loadAuthorities(path) {
|
|
10
|
+
const raw = JSON.parse(readFileSync(path, "utf8"));
|
|
11
|
+
const authorities = raw.authorities ?? [];
|
|
12
|
+
const deleted = raw.deleted_files ?? [];
|
|
13
|
+
for (const a of authorities) {
|
|
14
|
+
if (!Array.isArray(a.aliases) || a.aliases.length === 0 || !a.predicate || a.value === undefined) {
|
|
15
|
+
throw new Error("each authority needs non-empty aliases, a predicate and a value");
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
for (const d of deleted) {
|
|
19
|
+
if (!d.name)
|
|
20
|
+
throw new Error("each deleted_files entry needs a name");
|
|
21
|
+
}
|
|
22
|
+
return { authorities, deleted_files: deleted };
|
|
23
|
+
}
|
|
24
|
+
export function normalizeSubject(s) {
|
|
25
|
+
return s.toLowerCase().replace(/[\s_-]+/g, " ").trim();
|
|
26
|
+
}
|
|
27
|
+
function ports(value) {
|
|
28
|
+
return (value.match(/\d+/g) ?? []).map(Number);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* `host:port` via the WHATWG URL parser only. One parser, so a value can't
|
|
32
|
+
* read one way to this check and another way to whatever consumes it.
|
|
33
|
+
*/
|
|
34
|
+
function hostPort(value) {
|
|
35
|
+
try {
|
|
36
|
+
const u = new URL(value.includes("://") ? value : `http://${value}`);
|
|
37
|
+
if (u.username || u.password)
|
|
38
|
+
return null;
|
|
39
|
+
return u.hostname && u.port ? `${u.hostname}:${u.port}`.toLowerCase() : null;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function contradicts(predicate, factValue, authorityValue) {
|
|
46
|
+
if (predicate === "port") {
|
|
47
|
+
const want = Number.parseInt(authorityValue, 10);
|
|
48
|
+
const have = ports(factValue);
|
|
49
|
+
return have.length > 0 && !have.includes(want);
|
|
50
|
+
}
|
|
51
|
+
if (predicate === "host" || predicate === "url" || predicate === "endpoint") {
|
|
52
|
+
// Prose values ("the Pro on :7803") aren't comparable; never retire on a guess.
|
|
53
|
+
const a = hostPort(authorityValue);
|
|
54
|
+
const f = hostPort(factValue.trim());
|
|
55
|
+
return a !== null && f !== null && a !== f;
|
|
56
|
+
}
|
|
57
|
+
return factValue.trim().toLowerCase() !== authorityValue.trim().toLowerCase();
|
|
58
|
+
}
|
|
59
|
+
export function findContradictions(db, file) {
|
|
60
|
+
const rows = db
|
|
61
|
+
.prepare(`SELECT id, subject, predicate, value, created_at, tenant_id FROM facts
|
|
62
|
+
WHERE superseded_by IS NULL AND retired_at IS NULL AND kind != 'decision'
|
|
63
|
+
ORDER BY created_at, id`)
|
|
64
|
+
.all();
|
|
65
|
+
const aliasMap = new Map();
|
|
66
|
+
for (const a of file.authorities) {
|
|
67
|
+
for (const alias of a.aliases) {
|
|
68
|
+
const key = normalizeSubject(alias);
|
|
69
|
+
aliasMap.set(key, [...(aliasMap.get(key) ?? []), a]);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const dead = file.deleted_files.map((d) => ({ d, key: normalizeSubject(d.name) }));
|
|
73
|
+
const findings = [];
|
|
74
|
+
for (const row of rows) {
|
|
75
|
+
const subject = normalizeSubject(row.subject);
|
|
76
|
+
const base = {
|
|
77
|
+
factId: row.id,
|
|
78
|
+
subject: row.subject,
|
|
79
|
+
predicate: row.predicate,
|
|
80
|
+
value: row.value,
|
|
81
|
+
createdAt: row.created_at,
|
|
82
|
+
tenantId: row.tenant_id ?? DEFAULT_TEAM_ID,
|
|
83
|
+
};
|
|
84
|
+
const predicate = row.predicate.trim().toLowerCase();
|
|
85
|
+
const bad = (aliasMap.get(subject) ?? []).find((a) => a.predicate.trim().toLowerCase() === predicate && contradicts(predicate, row.value, a.value));
|
|
86
|
+
if (bad) {
|
|
87
|
+
findings.push({ ...base, type: "value_mismatch", authorityValue: bad.value, authoritySource: bad.source });
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
const gone = dead.find(({ key }) => subject === key || subject.startsWith(key));
|
|
91
|
+
if (gone) {
|
|
92
|
+
findings.push({
|
|
93
|
+
...base,
|
|
94
|
+
type: "dead_reference",
|
|
95
|
+
authorityValue: null,
|
|
96
|
+
authoritySource: gone.d.source ?? `deleted file ${gone.d.name}`,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return findings;
|
|
101
|
+
}
|
|
102
|
+
export async function applyRetirements(db, dbFilePath, findings, limit, logPath) {
|
|
103
|
+
const batch = findings.slice(0, limit);
|
|
104
|
+
if (batch.length === 0)
|
|
105
|
+
return { retired: [], backupPath: null };
|
|
106
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
107
|
+
const backupPath = `${dbFilePath}.bak-reconcile-${stamp}`;
|
|
108
|
+
await db.backup(backupPath);
|
|
109
|
+
const retire = db.prepare("UPDATE facts SET retired_at = datetime('now') WHERE id = ? AND retired_at IS NULL AND superseded_by IS NULL");
|
|
110
|
+
db.transaction(() => {
|
|
111
|
+
for (const f of batch)
|
|
112
|
+
retire.run(f.factId);
|
|
113
|
+
})();
|
|
114
|
+
for (const f of batch) {
|
|
115
|
+
await appendFactSupersedence(f.tenantId, { factId: f.factId, reason: `${f.type}: contradicted by ${f.authoritySource}`, source: "reconcile" }, logPath);
|
|
116
|
+
}
|
|
117
|
+
return { retired: batch, backupPath };
|
|
118
|
+
}
|
|
119
|
+
export function formatReport(findings, limit) {
|
|
120
|
+
const lines = [];
|
|
121
|
+
for (const type of ["value_mismatch", "dead_reference"]) {
|
|
122
|
+
const group = findings.filter((f) => f.type === type);
|
|
123
|
+
lines.push(`${type} (${group.length})`);
|
|
124
|
+
for (const f of group) {
|
|
125
|
+
const auth = f.authorityValue === null ? "" : `authority=${f.authorityValue} `;
|
|
126
|
+
lines.push(` ${f.factId} subject=${f.subject} predicate=${f.predicate} value=${f.value} ` +
|
|
127
|
+
`${auth}source=${f.authoritySource} created=${f.createdAt}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
lines.push(`total: ${findings.length} (--apply would retire ${Math.min(findings.length, limit)})`);
|
|
131
|
+
return lines.join("\n");
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=reconcile-facts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcile-facts.js","sourceRoot":"","sources":["../../../src/core/facts/reconcile-facts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type EmbedFailureKind = "chunk" | "fact";
|
|
2
|
+
export declare function recordEmbedFailure(kind: EmbedFailureKind): void;
|
|
3
|
+
export declare function embedFailureSnapshot(): Readonly<Record<EmbedFailureKind, number>>;
|
|
4
|
+
export declare function resetEmbedFailureForTests(): void;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
const state = { chunk: 0, fact: 0 };
|
|
2
|
+
export function recordEmbedFailure(kind) {
|
|
3
|
+
state[kind] += 1;
|
|
4
|
+
}
|
|
5
|
+
export function embedFailureSnapshot() {
|
|
6
|
+
return Object.freeze({ ...state });
|
|
7
|
+
}
|
|
8
|
+
export function resetEmbedFailureForTests() {
|
|
9
|
+
state.chunk = 0;
|
|
10
|
+
state.fact = 0;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=embed-failure-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embed-failure-state.js","sourceRoot":"","sources":["../../../src/core/health/embed-failure-state.ts"],"names":[],"mappings":"AAEA,MAAM,KAAK,GAAqC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAEtE,MAAM,UAAU,kBAAkB,CAAC,IAAsB;IACvD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,yBAAyB;IACvC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;IAChB,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry loop for a warmup probe that must survive a backend being absent.
|
|
3
|
+
*
|
|
4
|
+
* The embedder warmup used to be a single fire-and-forget attempt with an empty
|
|
5
|
+
* catch. If the backend was not servable at that instant the stage latched cold
|
|
6
|
+
* for the daemon's entire uptime, even after the backend returned, and only a
|
|
7
|
+
* restart cleared it. Two costs, both real: a five-day silent outage while the
|
|
8
|
+
* embedder was reachable throughout, and a three-week hunt for a release
|
|
9
|
+
* "regression" that did not exist, because restarting inside the same outage
|
|
10
|
+
* window reproduces the failure every time and reads as determinism.
|
|
11
|
+
*
|
|
12
|
+
* Pure except for the injected `sleep`, so the backoff schedule is testable
|
|
13
|
+
* without timers. Never throws: a warmup probe must not be able to take down
|
|
14
|
+
* the process it is reporting on.
|
|
15
|
+
*/
|
|
16
|
+
export interface RetryUntilWarmDeps {
|
|
17
|
+
/** The probe. Resolving means the lane is live. */
|
|
18
|
+
readonly attempt: () => Promise<unknown>;
|
|
19
|
+
readonly onSuccess: () => void;
|
|
20
|
+
/** Called per failed attempt so health can name the cause instead of showing a bare false. */
|
|
21
|
+
readonly onFailure: (reason: string, attempt: number) => void;
|
|
22
|
+
readonly sleep: (ms: number) => Promise<void>;
|
|
23
|
+
readonly maxAttempts?: number;
|
|
24
|
+
readonly baseDelayMs?: number;
|
|
25
|
+
readonly maxDelayMs?: number;
|
|
26
|
+
}
|
|
27
|
+
export declare function retryUntilWarm(deps: RetryUntilWarmDeps): Promise<void>;
|