nlm-memory 0.20.1 → 0.21.12
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 +69 -12
- package/assets/replay-eval-dark.svg +26 -0
- package/assets/replay-eval-light.svg +26 -0
- package/dist/cli/digest.js +69 -4
- package/dist/cli/digest.js.map +1 -1
- package/dist/cli/nlm.d.ts +14 -0
- package/dist/cli/nlm.js +556 -71
- 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-backfill.d.ts +34 -0
- package/dist/cli/scope-backfill.js +237 -0
- package/dist/cli/scope-backfill.js.map +1 -0
- package/dist/cli/scope-coverage.d.ts +44 -0
- package/dist/cli/scope-coverage.js +208 -0
- package/dist/cli/scope-coverage.js.map +1 -0
- 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/claude-code.d.ts +14 -0
- package/dist/core/adapters/claude-code.js +30 -0
- package/dist/core/adapters/claude-code.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 +46 -13
- package/dist/core/dataset/build-dataset.js.map +1 -1
- package/dist/core/digest/compose.d.ts +11 -3
- package/dist/core/digest/compose.js +70 -17
- package/dist/core/digest/compose.js.map +1 -1
- package/dist/core/digest/hook-injection.d.ts +43 -0
- package/dist/core/digest/hook-injection.js +87 -0
- package/dist/core/digest/hook-injection.js.map +1 -0
- 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 +2 -1
- package/dist/core/exemplars/capture-from-session.js +4 -4
- 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/extract-exemplar.d.ts +2 -0
- package/dist/core/exemplars/extract-exemplar.js +7 -1
- package/dist/core/exemplars/extract-exemplar.js.map +1 -1
- package/dist/core/exemplars/ingest-exemplar.d.ts +1 -0
- package/dist/core/exemplars/ingest-exemplar.js +1 -0
- package/dist/core/exemplars/ingest-exemplar.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/claude-settings.d.ts +1 -1
- package/dist/core/hook/claude-settings.js +0 -1
- package/dist/core/hook/claude-settings.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/backfill-derivables.d.ts +92 -0
- package/dist/core/ingest/backfill-derivables.js +175 -0
- package/dist/core/ingest/backfill-derivables.js.map +1 -0
- package/dist/core/ingest/ingest-session.d.ts +1 -1
- package/dist/core/ingest/ingest-session.js +23 -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 +8 -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 +7 -2
- package/dist/core/ingest/reprocess.js.map +1 -1
- package/dist/core/ingest/transcript-derivables.d.ts +27 -0
- package/dist/core/ingest/transcript-derivables.js +138 -0
- package/dist/core/ingest/transcript-derivables.js.map +1 -0
- 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 +33 -0
- package/dist/core/outcome/coverage.js +46 -0
- package/dist/core/outcome/coverage.js.map +1 -0
- package/dist/core/outcome/rollup.d.ts +33 -0
- package/dist/core/outcome/rollup.js +113 -0
- package/dist/core/outcome/rollup.js.map +1 -0
- 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 +7 -4
- package/dist/core/recall/hook-recall-log.js +14 -8
- 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 +13 -12
- package/dist/core/recall-facts/fact-recall-service.js.map +1 -1
- package/dist/core/scheduler/scan-once.js +15 -12
- 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 +45 -10
- package/dist/core/scheduler/scheduler.js.map +1 -1
- package/dist/core/scope/alias-map.d.ts +10 -0
- package/dist/core/scope/alias-map.js +41 -0
- package/dist/core/scope/alias-map.js.map +1 -0
- package/dist/core/scope/derive-scope.d.ts +8 -0
- package/dist/core/scope/derive-scope.js +54 -0
- package/dist/core/scope/derive-scope.js.map +1 -0
- package/dist/core/scope/scope-clause.d.ts +16 -0
- package/dist/core/scope/scope-clause.js +21 -0
- package/dist/core/scope/scope-clause.js.map +1 -0
- package/dist/core/scope/stamp-flag.d.ts +1 -0
- package/dist/core/scope/stamp-flag.js +4 -0
- package/dist/core/scope/stamp-flag.js.map +1 -0
- package/dist/core/signals/code-signal.d.ts +1 -0
- package/dist/core/signals/code-signal.js +1 -0
- package/dist/core/signals/code-signal.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/ingest-signal.d.ts +1 -1
- package/dist/core/signals/ingest-signal.js +3 -1
- package/dist/core/signals/ingest-signal.js.map +1 -1
- package/dist/core/signals/stamp-scope.d.ts +18 -0
- package/dist/core/signals/stamp-scope.js +28 -0
- package/dist/core/signals/stamp-scope.js.map +1 -0
- 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 +62 -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 +25 -21
- package/dist/core/storage/pg-session-store.js +186 -114
- 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 +26 -13
- 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 +17 -11
- package/dist/core/storage/pg-workstream-store.js +47 -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 +86 -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 +175 -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 +104 -0
- package/dist/core/storage/sqlite-outcome-store.js +211 -0
- package/dist/core/storage/sqlite-outcome-store.js.map +1 -0
- package/dist/core/storage/sqlite-session-store.d.ts +50 -21
- package/dist/core/storage/sqlite-session-store.js +233 -149
- 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 +29 -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 +17 -11
- package/dist/core/storage/sqlite-workstream-store.js +53 -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 +21 -14
- package/dist/core/storage/supersedence-log.js.map +1 -1
- package/dist/core/telemetry/probe-filter.d.ts +35 -0
- package/dist/core/telemetry/probe-filter.js +56 -0
- package/dist/core/telemetry/probe-filter.js.map +1 -0
- 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/update-check/check.d.ts +6 -0
- package/dist/core/update-check/check.js +35 -0
- package/dist/core/update-check/check.js.map +1 -1
- 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 +3 -2
- package/dist/core/workstream/bind.js +29 -10
- package/dist/core/workstream/bind.js.map +1 -1
- package/dist/core/workstream/model.d.ts +1 -0
- package/dist/core/workstream/model.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 +8 -5
- package/dist/hook/pre-compact-hook.js.map +1 -1
- package/dist/hook/prompt-recall-hook.d.ts +7 -3
- package/dist/hook/prompt-recall-hook.js +35 -20
- package/dist/hook/prompt-recall-hook.js.map +1 -1
- package/dist/hook/recall-over-http.d.ts +28 -3
- package/dist/hook/recall-over-http.js +58 -12
- 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 +57 -16
- package/dist/hook/session-start-hook.js.map +1 -1
- package/dist/hook/stop-hook.js +11 -8
- package/dist/hook/stop-hook.js.map +1 -1
- package/dist/http/app.d.ts +47 -3
- package/dist/http/app.js +379 -132
- 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 +94 -15
- package/dist/mcp/server.js +402 -79
- 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 +85 -0
- package/dist/ports/outcome.js +11 -0
- package/dist/ports/outcome.js.map +1 -0
- package/dist/ports/session-store.d.ts +20 -20
- 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 +20 -12
- package/dist/shared/net.d.ts +3 -0
- package/dist/shared/net.js +4 -0
- package/dist/shared/net.js.map +1 -0
- package/dist/shared/types.d.ts +55 -0
- package/dist/shared/types.js +4 -1
- 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/029_project_scope.sql +21 -0
- package/migrations/032_session_derivables.sql +11 -0
- 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/030_project_scope.sql +23 -0
- package/migrations/pg/031_widen_session_edges_kind.sql +11 -0
- package/migrations/pg/032_session_derivables.sql +17 -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 +258 -59
- package/package.json +10 -5
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/plugin/scripts/prompt-recall-hook.mjs +256 -58
- package/plugin/scripts/session-start-hook.mjs +283 -55
- package/plugin/scripts/stop-hook.mjs +199 -38
- package/dist/hook/subagent-start-hook.d.ts +0 -28
- package/dist/hook/subagent-start-hook.js +0 -81
- package/dist/hook/subagent-start-hook.js.map +0 -1
- package/dist/ui/assets/index-CMpQkbQy.js +0 -11
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Muse adapter.
|
|
3
|
+
*
|
|
4
|
+
* Reads ${XDG_DATA_HOME:-~/.local/share}/muse/sessions/YYYY/MM/DD/<session-id>/session.jsonl
|
|
5
|
+
* files. Each line is an event-sourced record (`record_type: "event"`,
|
|
6
|
+
* microsecond `recorded_at`); conversation turns come from a small set of
|
|
7
|
+
* payloads and everything else is recall noise:
|
|
8
|
+
*
|
|
9
|
+
* Conversation extraction:
|
|
10
|
+
* - `runtime.user_intent.accepted` (`surface: "main"`, `refill_blocks[].text`)
|
|
11
|
+
* -> [user] turn. The `run.started` event's `prompt` duplicates this text
|
|
12
|
+
* and is skipped. Non-main surfaces are steering, not conversation.
|
|
13
|
+
* - `runtime.session` / `assistant_message_committed.text` -> [assistant] turn.
|
|
14
|
+
*
|
|
15
|
+
* Tool surface: `assistant_tool_calls_committed.tool_calls[].name` ->
|
|
16
|
+
* `[tool_use: <name>]`; `tool_result_batch_committed.results[].text` ->
|
|
17
|
+
* `[tool_result: <240-char preview>]`.
|
|
18
|
+
*
|
|
19
|
+
* Dropped: hooks, reasoning, reminders, approvals, task lifecycle,
|
|
20
|
+
* resource samples, `model_user_messages` (a skill-body bundle), and the
|
|
21
|
+
* `session.*.observed` bookkeeping events.
|
|
22
|
+
*
|
|
23
|
+
* Session id is the parent directory name; project dir comes from the
|
|
24
|
+
* `runtime.session.metadata` record's `workspace_root`.
|
|
25
|
+
*
|
|
26
|
+
* Format reference: verified against a live 11k-line session on 2026-09-27.
|
|
27
|
+
*/
|
|
28
|
+
import { promises as fs } from "node:fs";
|
|
29
|
+
import { existsSync, statSync } from "node:fs";
|
|
30
|
+
import { basename, dirname, join } from "node:path";
|
|
31
|
+
import { homedir } from "node:os";
|
|
32
|
+
import { durationMinutes, normalizeTimestamp, safeSessionId } from "./common.js";
|
|
33
|
+
const TOOL_RESULT_PREVIEW_CHARS = 240;
|
|
34
|
+
export function defaultSessionsPath() {
|
|
35
|
+
const dataHome = process.env["XDG_DATA_HOME"] || join(homedir(), ".local", "share");
|
|
36
|
+
return join(dataHome, "muse", "sessions");
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Subagent runs live at `<parent>/subagent/<id>/session.jsonl`. They take the
|
|
40
|
+
* `<parent>/agent-<id>` shape claude-code uses, so deriveSubagentMeta links
|
|
41
|
+
* them to their parent instead of ingesting them as standalone sessions.
|
|
42
|
+
*/
|
|
43
|
+
export function museRuntimeSessionId(path) {
|
|
44
|
+
const sessionDir = dirname(path);
|
|
45
|
+
const container = dirname(sessionDir);
|
|
46
|
+
if (basename(container) === "subagent") {
|
|
47
|
+
return `${basename(dirname(container))}/agent-${basename(sessionDir)}`;
|
|
48
|
+
}
|
|
49
|
+
return basename(sessionDir);
|
|
50
|
+
}
|
|
51
|
+
/** Muse `recorded_at` is microseconds; common.normalizeTimestamp wants ms. */
|
|
52
|
+
function museTimestamp(ts) {
|
|
53
|
+
if (typeof ts === "number" && Number.isFinite(ts) && ts > 0) {
|
|
54
|
+
return normalizeTimestamp(Math.trunc(ts / 1000));
|
|
55
|
+
}
|
|
56
|
+
return "";
|
|
57
|
+
}
|
|
58
|
+
export class MuseAdapter {
|
|
59
|
+
name = "muse";
|
|
60
|
+
runtimeVersion = "muse/1.0";
|
|
61
|
+
transcriptKind = "muse-jsonl";
|
|
62
|
+
sessionsPath;
|
|
63
|
+
idleMinutes;
|
|
64
|
+
constructor(opts = {}) {
|
|
65
|
+
this.sessionsPath = opts.sessionsPath ?? defaultSessionsPath();
|
|
66
|
+
this.idleMinutes = opts.idleMinutes ?? 15;
|
|
67
|
+
}
|
|
68
|
+
detect() {
|
|
69
|
+
const p = defaultSessionsPath();
|
|
70
|
+
if (existsSync(p) && statSync(p).isDirectory()) {
|
|
71
|
+
return { adapterName: this.name, enabled: true, path: p, hint: null };
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
adapterName: this.name,
|
|
75
|
+
enabled: false,
|
|
76
|
+
path: null,
|
|
77
|
+
hint: "Muse not detected — no sessions directory. Sessions live under ${XDG_DATA_HOME:-~/.local/share}/muse/sessions/.",
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
async discover(options = {}) {
|
|
81
|
+
if (!existsSync(this.sessionsPath))
|
|
82
|
+
return [];
|
|
83
|
+
const found = [];
|
|
84
|
+
const seen = new Set();
|
|
85
|
+
await this.walk(this.sessionsPath, seen, found, options.since);
|
|
86
|
+
found.sort((a, b) => a.mtime - b.mtime);
|
|
87
|
+
return found.map((f) => f.path);
|
|
88
|
+
}
|
|
89
|
+
async parseSession(path) {
|
|
90
|
+
const turns = [];
|
|
91
|
+
let startedAt = "";
|
|
92
|
+
let endedAt = "";
|
|
93
|
+
let projectDir = "";
|
|
94
|
+
let model = "";
|
|
95
|
+
let totalBytes = 0;
|
|
96
|
+
let raw;
|
|
97
|
+
try {
|
|
98
|
+
raw = await fs.readFile(path, "utf8");
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
for (const line of raw.split("\n")) {
|
|
104
|
+
totalBytes += Buffer.byteLength(line, "utf8") + 1;
|
|
105
|
+
const trimmed = line.trim();
|
|
106
|
+
if (!trimmed)
|
|
107
|
+
continue;
|
|
108
|
+
let row;
|
|
109
|
+
try {
|
|
110
|
+
row = JSON.parse(trimmed);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
const outerTs = museTimestamp(row["recorded_at"]);
|
|
116
|
+
const payload = row["payload"] ?? {};
|
|
117
|
+
const ptype = row["payload_type"];
|
|
118
|
+
if (ptype === "runtime.session.metadata") {
|
|
119
|
+
const rec = payload["record"];
|
|
120
|
+
if (rec) {
|
|
121
|
+
if (!projectDir && typeof rec["workspace_root"] === "string") {
|
|
122
|
+
projectDir = rec["workspace_root"];
|
|
123
|
+
}
|
|
124
|
+
if (!model && typeof rec["model"] === "string") {
|
|
125
|
+
model = rec["model"];
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
for (const turn of extractTurns(ptype, payload, outerTs)) {
|
|
131
|
+
if (turn.timestamp && !startedAt)
|
|
132
|
+
startedAt = turn.timestamp;
|
|
133
|
+
if (turn.timestamp)
|
|
134
|
+
endedAt = turn.timestamp;
|
|
135
|
+
turns.push(turn);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (turns.length === 0)
|
|
139
|
+
return null;
|
|
140
|
+
const transcript = turns.map((t) => `[${t.role}] ${t.text}`).join("\n\n");
|
|
141
|
+
const duration = durationMinutes(startedAt, endedAt);
|
|
142
|
+
const label = provisionalLabel(turns);
|
|
143
|
+
const runtimeSessionId = museRuntimeSessionId(path);
|
|
144
|
+
const chunk = {
|
|
145
|
+
id: safeSessionId("muse", runtimeSessionId),
|
|
146
|
+
runtime: this.runtimeVersion,
|
|
147
|
+
runtimeSessionId,
|
|
148
|
+
sourcePath: path,
|
|
149
|
+
startedAt,
|
|
150
|
+
endedAt,
|
|
151
|
+
durationMin: duration,
|
|
152
|
+
turnCount: turns.length,
|
|
153
|
+
byteRange: [0, totalBytes],
|
|
154
|
+
projectDir,
|
|
155
|
+
gitBranch: "",
|
|
156
|
+
text: transcript,
|
|
157
|
+
label,
|
|
158
|
+
};
|
|
159
|
+
return model ? { ...chunk, model } : chunk;
|
|
160
|
+
}
|
|
161
|
+
async walk(dir, seen, out, since) {
|
|
162
|
+
let entries;
|
|
163
|
+
try {
|
|
164
|
+
entries = await fs.readdir(dir, { withFileTypes: true });
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
for (const ent of entries) {
|
|
170
|
+
const full = join(dir, ent.name);
|
|
171
|
+
if (ent.isDirectory()) {
|
|
172
|
+
await this.walk(full, seen, out, since);
|
|
173
|
+
}
|
|
174
|
+
else if (ent.isFile() && ent.name === "session.jsonl") {
|
|
175
|
+
if (seen.has(full))
|
|
176
|
+
continue;
|
|
177
|
+
seen.add(full);
|
|
178
|
+
let st;
|
|
179
|
+
try {
|
|
180
|
+
st = await fs.stat(full);
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
if (st.size === 0)
|
|
186
|
+
continue;
|
|
187
|
+
if (since && st.mtime < since)
|
|
188
|
+
continue;
|
|
189
|
+
out.push({ mtime: st.mtimeMs, path: full });
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// ── event extraction ─────────────────────────────────────────────────────
|
|
195
|
+
function extractTurns(outerType, payload, outerTs) {
|
|
196
|
+
if (outerType === "runtime.user_intent.accepted") {
|
|
197
|
+
if (payload["surface"] !== "main")
|
|
198
|
+
return [];
|
|
199
|
+
const blocks = payload["refill_blocks"];
|
|
200
|
+
if (!Array.isArray(blocks))
|
|
201
|
+
return [];
|
|
202
|
+
const text = blocks
|
|
203
|
+
.filter((b) => typeof b === "object" &&
|
|
204
|
+
b !== null &&
|
|
205
|
+
b["kind"] === "text" &&
|
|
206
|
+
typeof b["text"] === "string")
|
|
207
|
+
.map((b) => b["text"])
|
|
208
|
+
.join("")
|
|
209
|
+
.trim();
|
|
210
|
+
if (!text)
|
|
211
|
+
return [];
|
|
212
|
+
return [{ role: "user", text, timestamp: outerTs }];
|
|
213
|
+
}
|
|
214
|
+
if (outerType === "runtime.session") {
|
|
215
|
+
const event = payload["event"];
|
|
216
|
+
if (typeof event !== "object" || event === null)
|
|
217
|
+
return [];
|
|
218
|
+
const ev = event;
|
|
219
|
+
if (ev["kind"] === "assistant_message_committed") {
|
|
220
|
+
const text = ev["text"];
|
|
221
|
+
if (typeof text !== "string" || !text.trim())
|
|
222
|
+
return [];
|
|
223
|
+
return [{ role: "assistant", text, timestamp: outerTs }];
|
|
224
|
+
}
|
|
225
|
+
if (ev["kind"] === "assistant_tool_calls_committed") {
|
|
226
|
+
const calls = ev["calls"] ?? ev["tool_calls"];
|
|
227
|
+
if (!Array.isArray(calls))
|
|
228
|
+
return [];
|
|
229
|
+
return calls.map((c) => {
|
|
230
|
+
const name = typeof c === "object" && c !== null && typeof c["name"] === "string"
|
|
231
|
+
? c["name"]
|
|
232
|
+
: "tool";
|
|
233
|
+
return { role: "assistant", text: `[tool_use: ${name}]`, timestamp: outerTs };
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
if (ev["kind"] === "tool_result_batch_committed") {
|
|
237
|
+
const results = ev["results"];
|
|
238
|
+
if (!Array.isArray(results))
|
|
239
|
+
return [];
|
|
240
|
+
const turns = [];
|
|
241
|
+
for (const res of results) {
|
|
242
|
+
if (typeof res !== "object" || res === null)
|
|
243
|
+
continue;
|
|
244
|
+
const text = res["text"];
|
|
245
|
+
if (typeof text !== "string" || !text.trim())
|
|
246
|
+
continue;
|
|
247
|
+
const preview = text.slice(0, TOOL_RESULT_PREVIEW_CHARS);
|
|
248
|
+
const ellipsis = text.length > TOOL_RESULT_PREVIEW_CHARS ? "…" : "";
|
|
249
|
+
turns.push({
|
|
250
|
+
role: "assistant",
|
|
251
|
+
text: `[tool_result: ${preview}${ellipsis}]`,
|
|
252
|
+
timestamp: outerTs,
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
return turns;
|
|
256
|
+
}
|
|
257
|
+
return [];
|
|
258
|
+
}
|
|
259
|
+
return [];
|
|
260
|
+
}
|
|
261
|
+
function provisionalLabel(turns) {
|
|
262
|
+
for (const t of turns) {
|
|
263
|
+
if (t.role !== "user")
|
|
264
|
+
continue;
|
|
265
|
+
const firstLine = t.text.split("\n", 1)[0]?.trim();
|
|
266
|
+
if (firstLine)
|
|
267
|
+
return firstLine.slice(0, 80);
|
|
268
|
+
}
|
|
269
|
+
return "Untitled session";
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=muse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"muse.js","sourceRoot":"","sources":["../../../src/core/adapters/muse.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* OpenCode adapter.
|
|
3
3
|
*
|
|
4
4
|
* Reads the OpenCode SQLite database at:
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* $XDG_DATA_HOME/opencode/opencode.db (default ~/.local/share/opencode/opencode.db)
|
|
6
|
+
* macOS falls back to ~/Library/Application Support/opencode/opencode.db
|
|
7
7
|
*
|
|
8
8
|
* Unlike the JSONL-based adapters, OpenCode stores all sessions and messages
|
|
9
9
|
* in a single SQLite file. `discover()` queries the sessions table and returns
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
* Format reference: verified against sst/opencode migration
|
|
20
20
|
* 20260127222353_familiar_lady_ursula and session.sql.ts, 2026-05-28.
|
|
21
21
|
*/
|
|
22
|
-
import type { DetectionResult, DiscoverOptions, SessionChunk, TranscriptAdapter } from "../../ports/transcript-adapter.js";
|
|
22
|
+
import type { DetectionResult, DiscoverOptions, SessionChunk, SourceStat, TranscriptAdapter } from "../../ports/transcript-adapter.js";
|
|
23
23
|
export interface OpenCodeAdapterOptions {
|
|
24
24
|
readonly dbPath?: string;
|
|
25
25
|
}
|
|
@@ -32,5 +32,12 @@ export declare class OpenCodeAdapter implements TranscriptAdapter {
|
|
|
32
32
|
constructor(opts?: OpenCodeAdapterOptions);
|
|
33
33
|
detect(): DetectionResult;
|
|
34
34
|
discover(options?: DiscoverOptions): Promise<ReadonlyArray<string>>;
|
|
35
|
-
|
|
35
|
+
/**
|
|
36
|
+
* `<dbPath>::<sessionId>`, the key discover() emits and chunk.sourcePath
|
|
37
|
+
* carries, so scanOnce's adapter_state lookup matches what it recorded.
|
|
38
|
+
*/
|
|
39
|
+
private sourceKey;
|
|
40
|
+
private sessionIdOf;
|
|
41
|
+
stat(source: string): SourceStat | null;
|
|
42
|
+
parseSession(source: string): Promise<SessionChunk | null>;
|
|
36
43
|
}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* OpenCode adapter.
|
|
3
3
|
*
|
|
4
4
|
* Reads the OpenCode SQLite database at:
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* $XDG_DATA_HOME/opencode/opencode.db (default ~/.local/share/opencode/opencode.db)
|
|
6
|
+
* macOS falls back to ~/Library/Application Support/opencode/opencode.db
|
|
7
7
|
*
|
|
8
8
|
* Unlike the JSONL-based adapters, OpenCode stores all sessions and messages
|
|
9
9
|
* in a single SQLite file. `discover()` queries the sessions table and returns
|
|
@@ -28,11 +28,13 @@ const TOOL_OUTPUT_PREVIEW_CHARS = 240;
|
|
|
28
28
|
export function defaultDbPath() {
|
|
29
29
|
if (process.env["OPENCODE_DB_PATH"])
|
|
30
30
|
return process.env["OPENCODE_DB_PATH"];
|
|
31
|
-
|
|
31
|
+
const xdg = process.env["XDG_DATA_HOME"] ?? join(homedir(), ".local", "share");
|
|
32
|
+
const xdgPath = join(xdg, "opencode", "opencode.db");
|
|
33
|
+
// OpenCode uses the XDG path on macOS too; Application Support is only a fallback.
|
|
34
|
+
if (process.platform === "darwin" && !existsSync(xdgPath)) {
|
|
32
35
|
return join(homedir(), "Library", "Application Support", "opencode", "opencode.db");
|
|
33
36
|
}
|
|
34
|
-
|
|
35
|
-
return join(xdg, "opencode", "opencode.db");
|
|
37
|
+
return xdgPath;
|
|
36
38
|
}
|
|
37
39
|
function readGitBranch(directory) {
|
|
38
40
|
try {
|
|
@@ -131,7 +133,7 @@ export class OpenCodeAdapter {
|
|
|
131
133
|
.prepare(`SELECT id FROM session WHERE time_archived IS NULL`)
|
|
132
134
|
.all();
|
|
133
135
|
}
|
|
134
|
-
return rows.map((r) => r.id);
|
|
136
|
+
return rows.map((r) => this.sourceKey(r.id));
|
|
135
137
|
}
|
|
136
138
|
catch {
|
|
137
139
|
return [];
|
|
@@ -140,7 +142,39 @@ export class OpenCodeAdapter {
|
|
|
140
142
|
db?.close();
|
|
141
143
|
}
|
|
142
144
|
}
|
|
143
|
-
|
|
145
|
+
/**
|
|
146
|
+
* `<dbPath>::<sessionId>`, the key discover() emits and chunk.sourcePath
|
|
147
|
+
* carries, so scanOnce's adapter_state lookup matches what it recorded.
|
|
148
|
+
*/
|
|
149
|
+
sourceKey(sessionId) {
|
|
150
|
+
return `${this.dbPath}::${sessionId}`;
|
|
151
|
+
}
|
|
152
|
+
sessionIdOf(source) {
|
|
153
|
+
const sep = source.lastIndexOf("::");
|
|
154
|
+
return sep === -1 ? source : source.slice(sep + 2);
|
|
155
|
+
}
|
|
156
|
+
stat(source) {
|
|
157
|
+
if (!existsSync(this.dbPath))
|
|
158
|
+
return null;
|
|
159
|
+
let db;
|
|
160
|
+
try {
|
|
161
|
+
db = new Database(this.dbPath, { readonly: true });
|
|
162
|
+
const row = db
|
|
163
|
+
.prepare("SELECT time_updated FROM session WHERE id = ?")
|
|
164
|
+
.get(this.sessionIdOf(source));
|
|
165
|
+
// time_updated moves whenever the session gains messages, so it doubles
|
|
166
|
+
// as the change marker scanOnce compares against adapter_state.
|
|
167
|
+
return row ? { mtimeMs: row.time_updated, size: row.time_updated } : null;
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
finally {
|
|
173
|
+
db?.close();
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
async parseSession(source) {
|
|
177
|
+
const sessionId = this.sessionIdOf(source);
|
|
144
178
|
if (!existsSync(this.dbPath))
|
|
145
179
|
return null;
|
|
146
180
|
let db;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../src/core/adapters/opencode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,QAAQ,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../src/core/adapters/opencode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persisted last-known alert state — one JSON file so restarts don't
|
|
3
|
+
* forget an in-progress drift/embedder episode and re-fire an alert
|
|
4
|
+
* that already went out. Lives beside update-check.json in ~/.nlm/,
|
|
5
|
+
* same cache-file shape/failure-mode convention as check.ts: unreadable
|
|
6
|
+
* or corrupt just means "start from a clean slate," never a throw.
|
|
7
|
+
*/
|
|
8
|
+
import { type DriftAlertState } from "./drift-transition.js";
|
|
9
|
+
import { type EmbedderAlertState } from "./embedder-transition.js";
|
|
10
|
+
export interface AlertState {
|
|
11
|
+
readonly drift: DriftAlertState;
|
|
12
|
+
readonly embedderCold: EmbedderAlertState;
|
|
13
|
+
}
|
|
14
|
+
export declare const DEFAULT_ALERT_STATE: AlertState;
|
|
15
|
+
export declare function defaultAlertStatePath(): string;
|
|
16
|
+
export declare function readAlertState(path: string): Promise<AlertState>;
|
|
17
|
+
export declare function writeAlertState(path: string, state: AlertState): Promise<void>;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persisted last-known alert state — one JSON file so restarts don't
|
|
3
|
+
* forget an in-progress drift/embedder episode and re-fire an alert
|
|
4
|
+
* that already went out. Lives beside update-check.json in ~/.nlm/,
|
|
5
|
+
* same cache-file shape/failure-mode convention as check.ts: unreadable
|
|
6
|
+
* or corrupt just means "start from a clean slate," never a throw.
|
|
7
|
+
*/
|
|
8
|
+
import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
9
|
+
import { dirname, join } from "node:path";
|
|
10
|
+
import { homedir } from "node:os";
|
|
11
|
+
import { DEFAULT_DRIFT_ALERT_STATE, } from "./drift-transition.js";
|
|
12
|
+
import { DEFAULT_EMBEDDER_ALERT_STATE, } from "./embedder-transition.js";
|
|
13
|
+
export const DEFAULT_ALERT_STATE = {
|
|
14
|
+
drift: DEFAULT_DRIFT_ALERT_STATE,
|
|
15
|
+
embedderCold: DEFAULT_EMBEDDER_ALERT_STATE,
|
|
16
|
+
};
|
|
17
|
+
export function defaultAlertStatePath() {
|
|
18
|
+
return join(homedir(), ".nlm", "alert-state.json");
|
|
19
|
+
}
|
|
20
|
+
export async function readAlertState(path) {
|
|
21
|
+
try {
|
|
22
|
+
const raw = await readFile(path, "utf8");
|
|
23
|
+
const parsed = JSON.parse(raw);
|
|
24
|
+
return {
|
|
25
|
+
drift: { ...DEFAULT_DRIFT_ALERT_STATE, ...parsed.drift },
|
|
26
|
+
embedderCold: { ...DEFAULT_EMBEDDER_ALERT_STATE, ...parsed.embedderCold },
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// First run, corrupt file, or unreadable — start from a clean slate;
|
|
31
|
+
// worst case is one extra false→true fire, never a crash.
|
|
32
|
+
return DEFAULT_ALERT_STATE;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export async function writeAlertState(path, state) {
|
|
36
|
+
try {
|
|
37
|
+
await mkdir(dirname(path), { recursive: true });
|
|
38
|
+
await writeFile(path, JSON.stringify(state, null, 2), "utf8");
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// Persist failure is non-fatal — the next check just re-evaluates
|
|
42
|
+
// from a clean slate instead of remembering this transition.
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=alert-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert-state.js","sourceRoot":"","sources":["../../../src/core/alerts/alert-state.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EACL,yBAAyB,GAE1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,4BAA4B,GAE7B,MAAM,0BAA0B,CAAC;AAOlC,MAAM,CAAC,MAAM,mBAAmB,GAAe;IAC7C,KAAK,EAAE,yBAAyB;IAChC,YAAY,EAAE,4BAA4B;CAC3C,CAAC;AAEF,MAAM,UAAU,qBAAqB;IACnC,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAwB,CAAC;QACtD,OAAO;YACL,KAAK,EAAE,EAAE,GAAG,yBAAyB,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE;YACxD,YAAY,EAAE,EAAE,GAAG,4BAA4B,EAAE,GAAG,MAAM,CAAC,YAAY,EAAE;SAC1E,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,qEAAqE;QACrE,0DAA0D;QAC1D,OAAO,mBAAmB,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,KAAiB;IACnE,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,kEAAkE;QAClE,6DAA6D;IAC/D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daemon-facing entry points: read persisted alert state, evaluate the
|
|
3
|
+
* relevant transition, fire the webhook if the transition says so, and
|
|
4
|
+
* persist the updated state. This is the only module the CLI wiring
|
|
5
|
+
* (src/cli/nlm.ts) needs to import — it doesn't touch transition logic
|
|
6
|
+
* or the webhook POST directly.
|
|
7
|
+
*/
|
|
8
|
+
import { type UpdateCheckDeps } from "../update-check/check.js";
|
|
9
|
+
export interface CheckDriftDeps {
|
|
10
|
+
readonly currentVersion: string;
|
|
11
|
+
readonly now?: () => Date;
|
|
12
|
+
readonly fetchImpl?: typeof fetch;
|
|
13
|
+
readonly statePath?: string;
|
|
14
|
+
readonly updateCheckDeps?: Partial<UpdateCheckDeps>;
|
|
15
|
+
}
|
|
16
|
+
/** Refresh path: calls the real (cache-respecting) update check, then
|
|
17
|
+
* evaluates + fires the version-drift transition. Safe to call on a
|
|
18
|
+
* tight interval — getUpdateStatus's own 24h TTL means this is a cache
|
|
19
|
+
* read except once a day. */
|
|
20
|
+
export declare function checkDriftAndAlert(deps: CheckDriftDeps): Promise<void>;
|
|
21
|
+
export interface CheckEmbedderDeps {
|
|
22
|
+
readonly now?: () => Date;
|
|
23
|
+
readonly fetchImpl?: typeof fetch;
|
|
24
|
+
readonly statePath?: string;
|
|
25
|
+
}
|
|
26
|
+
/** Polls the in-process warmup flag (see health/warmup-state.ts) and
|
|
27
|
+
* evaluates + fires the embedder-cold transition. */
|
|
28
|
+
export declare function checkEmbedderAndAlert(deps?: CheckEmbedderDeps): Promise<void>;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daemon-facing entry points: read persisted alert state, evaluate the
|
|
3
|
+
* relevant transition, fire the webhook if the transition says so, and
|
|
4
|
+
* persist the updated state. This is the only module the CLI wiring
|
|
5
|
+
* (src/cli/nlm.ts) needs to import — it doesn't touch transition logic
|
|
6
|
+
* or the webhook POST directly.
|
|
7
|
+
*/
|
|
8
|
+
import { getUpdateStatus } from "../update-check/check.js";
|
|
9
|
+
import { warmupSnapshot } from "../health/warmup-state.js";
|
|
10
|
+
import { readAlertState, writeAlertState, defaultAlertStatePath } from "./alert-state.js";
|
|
11
|
+
import { evaluateDriftTransition } from "./drift-transition.js";
|
|
12
|
+
import { evaluateEmbedderTransition } from "./embedder-transition.js";
|
|
13
|
+
import { fireAlert } from "./fire-alert.js";
|
|
14
|
+
/** Refresh path: calls the real (cache-respecting) update check, then
|
|
15
|
+
* evaluates + fires the version-drift transition. Safe to call on a
|
|
16
|
+
* tight interval — getUpdateStatus's own 24h TTL means this is a cache
|
|
17
|
+
* read except once a day. */
|
|
18
|
+
export async function checkDriftAndAlert(deps) {
|
|
19
|
+
const now = deps.now ?? (() => new Date());
|
|
20
|
+
const statePath = deps.statePath ?? defaultAlertStatePath();
|
|
21
|
+
const state = await readAlertState(statePath);
|
|
22
|
+
const status = await getUpdateStatus({
|
|
23
|
+
currentVersion: deps.currentVersion,
|
|
24
|
+
now,
|
|
25
|
+
...(deps.fetchImpl ? { fetchImpl: deps.fetchImpl } : {}),
|
|
26
|
+
...deps.updateCheckDeps,
|
|
27
|
+
});
|
|
28
|
+
const result = evaluateDriftTransition(state.drift, status, now());
|
|
29
|
+
if (result.fire && result.event) {
|
|
30
|
+
await fireAlert(result.event, {
|
|
31
|
+
now,
|
|
32
|
+
...(deps.fetchImpl ? { fetchImpl: deps.fetchImpl } : {}),
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
await writeAlertState(statePath, { ...state, drift: result.next });
|
|
36
|
+
}
|
|
37
|
+
/** Polls the in-process warmup flag (see health/warmup-state.ts) and
|
|
38
|
+
* evaluates + fires the embedder-cold transition. */
|
|
39
|
+
export async function checkEmbedderAndAlert(deps = {}) {
|
|
40
|
+
const now = deps.now ?? (() => new Date());
|
|
41
|
+
const statePath = deps.statePath ?? defaultAlertStatePath();
|
|
42
|
+
const state = await readAlertState(statePath);
|
|
43
|
+
const ready = warmupSnapshot().ready;
|
|
44
|
+
const result = evaluateEmbedderTransition(state.embedderCold, ready, now());
|
|
45
|
+
if (result.fire && result.event) {
|
|
46
|
+
await fireAlert(result.event, {
|
|
47
|
+
now,
|
|
48
|
+
...(deps.fetchImpl ? { fetchImpl: deps.fetchImpl } : {}),
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
await writeAlertState(statePath, { ...state, embedderCold: result.next });
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=check-and-alert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-and-alert.js","sourceRoot":"","sources":["../../../src/core/alerts/check-and-alert.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAwB,MAAM,0BAA0B,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC1F,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAU5C;;;8BAG8B;AAC9B,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAoB;IAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,qBAAqB,EAAE,CAAC;IAC5D,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;IAE9C,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;QACnC,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,GAAG;QACH,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,GAAG,IAAI,CAAC,eAAe;KACxB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,uBAAuB,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACnE,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,MAAM,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE;YAC5B,GAAG;YACH,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzD,CAAC,CAAC;IACL,CAAC;IACD,MAAM,eAAe,CAAC,SAAS,EAAE,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;AACrE,CAAC;AAQD;sDACsD;AACtD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAA0B,EAAE;IACtE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,qBAAqB,EAAE,CAAC;IAC5D,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;IAE9C,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC,KAAK,CAAC;IACrC,MAAM,MAAM,GAAG,0BAA0B,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5E,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,MAAM,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE;YAC5B,GAAG;YACH,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzD,CAAC,CAAC;IACL,CAAC;IACD,MAAM,eAAe,CAAC,SAAS,EAAE,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;AAC5E,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Version-drift alert transition logic — decides WHEN to fire, not
|
|
3
|
+
* whether to fire on every poll. Firing on every `behind: true` read
|
|
4
|
+
* would spam the webhook on every scheduled check; instead this tracks
|
|
5
|
+
* the false→true edge (fire once) and a daily re-fire while the daemon
|
|
6
|
+
* stays behind past a 48h grace window (so a long-ignored update still
|
|
7
|
+
* resurfaces, but not hourly).
|
|
8
|
+
*
|
|
9
|
+
* Pure and clock-injected — no fs/network here. Callers (see
|
|
10
|
+
* check-and-alert.ts) own reading/writing the persisted state and
|
|
11
|
+
* calling fireAlert with the returned event.
|
|
12
|
+
*/
|
|
13
|
+
import type { UpdateStatus } from "../update-check/check.js";
|
|
14
|
+
import type { DriftAlertEvent } from "./types.js";
|
|
15
|
+
export interface DriftAlertState {
|
|
16
|
+
/** ISO timestamp of when `behind` first became true, or null when not behind. */
|
|
17
|
+
readonly behindSince: string | null;
|
|
18
|
+
/** ISO timestamp of the last fired alert (initial or daily re-fire). */
|
|
19
|
+
readonly lastFiredAt: string | null;
|
|
20
|
+
}
|
|
21
|
+
export declare const DEFAULT_DRIFT_ALERT_STATE: DriftAlertState;
|
|
22
|
+
export interface DriftTransitionResult {
|
|
23
|
+
readonly fire: boolean;
|
|
24
|
+
readonly event: DriftAlertEvent | null;
|
|
25
|
+
readonly next: DriftAlertState;
|
|
26
|
+
}
|
|
27
|
+
export declare function evaluateDriftTransition(state: DriftAlertState, status: Pick<UpdateStatus, "current" | "latest" | "behind">, now: Date): DriftTransitionResult;
|