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
|
@@ -11,13 +11,15 @@
|
|
|
11
11
|
* UserPromptSubmit. Fail-open by design: any error yields a clean exit
|
|
12
12
|
* with no output, so the hook can never block Claude Code shutdown.
|
|
13
13
|
*/
|
|
14
|
-
import { pathToFileURL } from "node:url";
|
|
15
14
|
import { clearSurfaced } from "../core/hook/memo.js";
|
|
15
|
+
import { DEFAULT_TEAM_ID } from "../core/tenancy/default-team.js";
|
|
16
16
|
import { clearCited } from "../core/hook/cite-memo.js";
|
|
17
|
-
import { readStdin, hookModeFromEnv, appendHookEvent } from "./hook-helpers.js";
|
|
17
|
+
import { readStdin, hookModeFromEnv, appendHookEvent, isMainModule } from "./hook-helpers.js";
|
|
18
18
|
export function runSessionEnd(conversationId) {
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
// Client-side hook composition root: no per-tenant CLI/hook concept exists
|
|
20
|
+
// today, so DEFAULT_TEAM_ID is this surface's real identity, not a placeholder.
|
|
21
|
+
const surfacedCleared = clearSurfaced(DEFAULT_TEAM_ID, conversationId);
|
|
22
|
+
const citedCleared = clearCited(DEFAULT_TEAM_ID, conversationId);
|
|
21
23
|
return { conversationId, cleared: surfacedCleared || citedCleared };
|
|
22
24
|
}
|
|
23
25
|
function logSessionEnd(result) {
|
|
@@ -40,7 +42,7 @@ async function main() {
|
|
|
40
42
|
// Fail open — never block Claude Code shutdown.
|
|
41
43
|
}
|
|
42
44
|
}
|
|
43
|
-
if (
|
|
45
|
+
if (isMainModule(import.meta.url, process.argv[1])) {
|
|
44
46
|
void main();
|
|
45
47
|
}
|
|
46
48
|
//# sourceMappingURL=session-end-hook.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-end-hook.js","sourceRoot":"","sources":["../../src/hook/session-end-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"session-end-hook.js","sourceRoot":"","sources":["../../src/hook/session-end-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAO9F,MAAM,UAAU,aAAa,CAAC,cAAsB;IAClD,2EAA2E;IAC3E,gFAAgF;IAChF,MAAM,eAAe,GAAG,aAAa,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;IACvE,MAAM,YAAY,GAAG,UAAU,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;IACjE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,eAAe,IAAI,YAAY,EAAE,CAAC;AACtE,CAAC;AAED,SAAS,aAAa,CAAC,MAAwB;IAC7C,eAAe,CAAC;QACd,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC5B,IAAI,EAAE,aAAa;QACnB,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,IAAI,EAAE,eAAe,EAAE;KACxB,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA6B,CAAC;QAC5D,MAAM,cAAc,GAClB,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1E,aAAa,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,gDAAgD;IAClD,CAAC;AACH,CAAC;AAED,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnD,KAAK,IAAI,EAAE,CAAC;AACd,CAAC"}
|
|
@@ -12,16 +12,29 @@
|
|
|
12
12
|
* memo writes, same NLM_HOOK_MODE semantics.
|
|
13
13
|
*/
|
|
14
14
|
import { type RecallHitInput } from "../core/hook/select.js";
|
|
15
|
+
import { type RecallOutcome } from "./recall-over-http.js";
|
|
15
16
|
export type HookMode = "shadow" | "live";
|
|
17
|
+
export interface SessionStartRecall {
|
|
18
|
+
readonly hits: ReadonlyArray<RecallHitInput>;
|
|
19
|
+
readonly outcome: RecallOutcome;
|
|
20
|
+
}
|
|
16
21
|
export interface SessionStartInput {
|
|
17
22
|
readonly conversationId: string;
|
|
18
23
|
readonly query: string;
|
|
19
24
|
}
|
|
20
25
|
export interface RunSessionStartDeps {
|
|
21
26
|
readonly mode: HookMode;
|
|
22
|
-
readonly recall: (query: string, conversationId?: string) => Promise<
|
|
27
|
+
readonly recall: (query: string, conversationId?: string) => Promise<SessionStartRecall>;
|
|
23
28
|
}
|
|
24
29
|
/** Orchestration. Returns the text to emit on stdout ("" for nothing). */
|
|
25
30
|
export declare function runHook(input: SessionStartInput, deps: RunSessionStartDeps): Promise<string>;
|
|
26
31
|
/** Join the failure-mode block (if any) above the session-recall block. */
|
|
27
32
|
export declare function composeSessionStartOutput(failureModeBlock: string, recallBlock: string): string;
|
|
33
|
+
/**
|
|
34
|
+
* Branch name plus recent commit subjects. A bare directory name is often a
|
|
35
|
+
* single word ("nlm-memory"), which the recall query extractor rejects as too
|
|
36
|
+
* short, so SessionStart surfaced nothing for most repos.
|
|
37
|
+
*/
|
|
38
|
+
export declare function readGitContext(workingDirectory: string): string;
|
|
39
|
+
/** Derive a best-effort query from SessionStart payload fields. */
|
|
40
|
+
export declare function buildQuery(workingDirectory: string, projectName: string, gitContext: string): string;
|
|
@@ -11,49 +11,59 @@
|
|
|
11
11
|
* Mirrors prompt-recall-hook.ts shape exactly: same pointer-block format, same
|
|
12
12
|
* memo writes, same NLM_HOOK_MODE semantics.
|
|
13
13
|
*/
|
|
14
|
-
import {
|
|
14
|
+
import { execFileSync } from "node:child_process";
|
|
15
15
|
import { appendHookLog } from "../core/hook/hook-log.js";
|
|
16
16
|
import { loadSurfaced, recordSurfaced } from "../core/hook/memo.js";
|
|
17
|
+
import { DEFAULT_TEAM_ID } from "../core/tenancy/default-team.js";
|
|
17
18
|
import { formatPointerBlock } from "../core/hook/pointer-block.js";
|
|
18
19
|
import { selectHits } from "../core/hook/select.js";
|
|
19
20
|
import { autoloadEnv } from "../llm/env-autoload.js";
|
|
20
21
|
import { hookAuthHeaders } from "./hook-auth.js";
|
|
21
22
|
import { parseScoreFloor, parseRelativeFloor } from "./score-floor.js";
|
|
22
23
|
import { recallOverHttp } from "./recall-over-http.js";
|
|
23
|
-
import { readStdin, hookModeFromEnv, fetchWithTimeout } from "./hook-helpers.js";
|
|
24
|
+
import { readStdin, hookModeFromEnv, fetchWithTimeout, isMainModule } from "./hook-helpers.js";
|
|
25
|
+
import { DEFAULT_NLM_PORT } from "../shared/net.js";
|
|
24
26
|
// This hook recalls in hybrid mode, whose matchScore is normalized to 0..1
|
|
25
27
|
// (mergeHybrid in recall-service.ts), so the default absolute floor is 0.
|
|
26
28
|
// NLM_RECALL_SCORE_FLOOR is shared with the keyword-mode prompt hook; the
|
|
27
29
|
// calibrated keyword floor (2.0, raw BM25) would deny-all here on the 0..1
|
|
28
30
|
// scale, so it is opt-in only. parseScoreFloor guards a bad env value.
|
|
29
|
-
|
|
31
|
+
// Lazy, not module-scope: autoloadEnv() runs inside main(), after imports are
|
|
32
|
+
// evaluated, so an eager read silently ignores ~/.nlm/.env. See recallTimeoutMs
|
|
33
|
+
// in recall-over-http.ts.
|
|
34
|
+
const scoreThreshold = () => parseScoreFloor(process.env["NLM_RECALL_SCORE_FLOOR"]);
|
|
30
35
|
// The relative floor IS scale-invariant (ratio to the fire median), so it
|
|
31
36
|
// applies cleanly to this hybrid path too — parity with the per-message hook.
|
|
32
|
-
const
|
|
37
|
+
const relativeFloor = () => parseRelativeFloor(process.env["NLM_RECALL_REL_FLOOR"], 0.9);
|
|
33
38
|
const PER_FIRE_CAP = 3;
|
|
34
39
|
const PER_CONVERSATION_CAP = 10;
|
|
35
40
|
const RECALL_TIMEOUT_MS = 2000;
|
|
36
41
|
/** Orchestration. Returns the text to emit on stdout ("" for nothing). */
|
|
37
42
|
export async function runHook(input, deps) {
|
|
38
43
|
let hits = [];
|
|
44
|
+
let recallOutcome = "unreachable";
|
|
39
45
|
try {
|
|
40
|
-
|
|
46
|
+
const fetched = await deps.recall(input.query, input.conversationId);
|
|
47
|
+
hits = fetched.hits;
|
|
48
|
+
recallOutcome = fetched.outcome;
|
|
41
49
|
}
|
|
42
50
|
catch {
|
|
43
51
|
hits = [];
|
|
44
52
|
}
|
|
45
|
-
|
|
53
|
+
// Client-side hook composition root: no per-tenant CLI/hook concept exists
|
|
54
|
+
// today, so DEFAULT_TEAM_ID is this surface's real identity, not a placeholder.
|
|
55
|
+
const surfaced = loadSurfaced(DEFAULT_TEAM_ID, input.conversationId);
|
|
46
56
|
const selected = selectHits({
|
|
47
57
|
hits,
|
|
48
58
|
surfaced,
|
|
49
|
-
scoreThreshold:
|
|
50
|
-
relativeFloor:
|
|
59
|
+
scoreThreshold: scoreThreshold(),
|
|
60
|
+
relativeFloor: relativeFloor(),
|
|
51
61
|
perFireCap: PER_FIRE_CAP,
|
|
52
62
|
perConversationCap: PER_CONVERSATION_CAP,
|
|
53
63
|
});
|
|
54
64
|
const block = formatPointerBlock(selected);
|
|
55
65
|
const estTokens = Math.ceil(block.length / 4);
|
|
56
|
-
appendHookLog({
|
|
66
|
+
appendHookLog(DEFAULT_TEAM_ID, {
|
|
57
67
|
ts: new Date().toISOString(),
|
|
58
68
|
conversationId: input.conversationId,
|
|
59
69
|
promptPreview: input.query,
|
|
@@ -62,9 +72,10 @@ export async function runHook(input, deps) {
|
|
|
62
72
|
wouldInject: selected.map((h) => h.id),
|
|
63
73
|
estTokens,
|
|
64
74
|
mode: deps.mode,
|
|
75
|
+
recallOutcome,
|
|
65
76
|
});
|
|
66
77
|
if (deps.mode === "live" && selected.length > 0) {
|
|
67
|
-
recordSurfaced(input.conversationId, selected.map((h) => h.id));
|
|
78
|
+
recordSurfaced(DEFAULT_TEAM_ID, input.conversationId, selected.map((h) => h.id));
|
|
68
79
|
return block;
|
|
69
80
|
}
|
|
70
81
|
return "";
|
|
@@ -76,7 +87,7 @@ export function composeSessionStartOutput(failureModeBlock, recallBlock) {
|
|
|
76
87
|
async function fetchFailureModeBlock(repo) {
|
|
77
88
|
if (!repo)
|
|
78
89
|
return "";
|
|
79
|
-
const portValue = process.env["NLM_PORT"] ??
|
|
90
|
+
const portValue = process.env["NLM_PORT"] ?? DEFAULT_NLM_PORT;
|
|
80
91
|
const url = `http://127.0.0.1:${portValue}/api/signals/failure-modes?repo=${encodeURIComponent(repo)}`;
|
|
81
92
|
try {
|
|
82
93
|
const res = await fetchWithTimeout(url, {
|
|
@@ -91,10 +102,37 @@ async function fetchFailureModeBlock(repo) {
|
|
|
91
102
|
return "";
|
|
92
103
|
}
|
|
93
104
|
}
|
|
105
|
+
const GIT_TIMEOUT_MS = 300;
|
|
106
|
+
const RECENT_COMMITS = 3;
|
|
107
|
+
function git(cwd, args) {
|
|
108
|
+
try {
|
|
109
|
+
return execFileSync("git", ["-C", cwd, ...args], {
|
|
110
|
+
encoding: "utf8",
|
|
111
|
+
timeout: GIT_TIMEOUT_MS,
|
|
112
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
113
|
+
}).trim();
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return "";
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Branch name plus recent commit subjects. A bare directory name is often a
|
|
121
|
+
* single word ("nlm-memory"), which the recall query extractor rejects as too
|
|
122
|
+
* short, so SessionStart surfaced nothing for most repos.
|
|
123
|
+
*/
|
|
124
|
+
export function readGitContext(workingDirectory) {
|
|
125
|
+
if (!workingDirectory)
|
|
126
|
+
return "";
|
|
127
|
+
const branch = git(workingDirectory, ["rev-parse", "--abbrev-ref", "HEAD"]);
|
|
128
|
+
const subjects = git(workingDirectory, ["log", `-${RECENT_COMMITS}`, "--format=%s"]);
|
|
129
|
+
const branchWords = branch === "HEAD" ? "" : branch.replace(/[/_-]+/g, " ");
|
|
130
|
+
return [branchWords, subjects.replace(/\n/g, " ")].filter(Boolean).join(" ");
|
|
131
|
+
}
|
|
94
132
|
/** Derive a best-effort query from SessionStart payload fields. */
|
|
95
|
-
function buildQuery(workingDirectory, projectName) {
|
|
133
|
+
export function buildQuery(workingDirectory, projectName, gitContext) {
|
|
96
134
|
const dirTail = workingDirectory.split("/").filter(Boolean).at(-1) ?? "";
|
|
97
|
-
const parts = [dirTail, projectName].filter(Boolean);
|
|
135
|
+
const parts = [dirTail, projectName, gitContext].filter(Boolean);
|
|
98
136
|
return parts.join(" ").trim() || "session start";
|
|
99
137
|
}
|
|
100
138
|
async function main() {
|
|
@@ -109,12 +147,15 @@ async function main() {
|
|
|
109
147
|
? payload.working_directory
|
|
110
148
|
: "";
|
|
111
149
|
const projectName = typeof payload.project_name === "string" ? payload.project_name : "";
|
|
112
|
-
const query = buildQuery(workingDirectory, projectName);
|
|
150
|
+
const query = buildQuery(workingDirectory, projectName, readGitContext(workingDirectory));
|
|
113
151
|
const mode = hookModeFromEnv();
|
|
114
152
|
const [out, failureModes] = await Promise.all([
|
|
115
153
|
runHook({ conversationId, query }, {
|
|
116
154
|
mode,
|
|
117
|
-
recall: async (q, cid) =>
|
|
155
|
+
recall: async (q, cid) => {
|
|
156
|
+
const r = await recallOverHttp(q, "claude-code", cid === "unknown" ? undefined : cid, "hybrid", "session-start-hook");
|
|
157
|
+
return { hits: r.hits, outcome: r.outcome };
|
|
158
|
+
},
|
|
118
159
|
}),
|
|
119
160
|
mode === "live" ? fetchFailureModeBlock(workingDirectory) : Promise.resolve(""),
|
|
120
161
|
]);
|
|
@@ -126,7 +167,7 @@ async function main() {
|
|
|
126
167
|
// Fail open — never block or fail a session start.
|
|
127
168
|
}
|
|
128
169
|
}
|
|
129
|
-
if (
|
|
170
|
+
if (isMainModule(import.meta.url, process.argv[1])) {
|
|
130
171
|
void main();
|
|
131
172
|
}
|
|
132
173
|
//# sourceMappingURL=session-start-hook.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-start-hook.js","sourceRoot":"","sources":["../../src/hook/session-start-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"session-start-hook.js","sourceRoot":"","sources":["../../src/hook/session-start-hook.ts"],"names":[],"mappings":"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"}
|
package/dist/hook/stop-hook.js
CHANGED
|
@@ -11,16 +11,17 @@
|
|
|
11
11
|
* Fail-open by design: any error yields a clean exit with no output. The
|
|
12
12
|
* Stop hook can never block Claude Code's response.
|
|
13
13
|
*/
|
|
14
|
-
import { pathToFileURL } from "node:url";
|
|
15
14
|
import { detectCitations, } from "../core/hook/citation-detect.js";
|
|
16
15
|
import { detectMisses } from "../core/hook/miss-detect.js";
|
|
17
16
|
import { loadSurfaced } from "../core/hook/memo.js";
|
|
18
17
|
import { loadCited, recordCited } from "../core/hook/cite-memo.js";
|
|
19
18
|
import { appendMisses } from "../core/recall/miss-log.js";
|
|
19
|
+
import { DEFAULT_TEAM_ID } from "../core/tenancy/default-team.js";
|
|
20
20
|
import { readAllAssistantTurns, } from "../core/hook/transcript.js";
|
|
21
21
|
import { autoloadEnv } from "../llm/env-autoload.js";
|
|
22
22
|
import { hookAuthHeaders } from "./hook-auth.js";
|
|
23
|
-
import { readStdin, fetchWithTimeout, hookModeFromEnv, appendHookEvent } from "./hook-helpers.js";
|
|
23
|
+
import { readStdin, fetchWithTimeout, hookModeFromEnv, appendHookEvent, isMainModule } from "./hook-helpers.js";
|
|
24
|
+
import { DEFAULT_NLM_PORT } from "../shared/net.js";
|
|
24
25
|
const RESPONSE_PREVIEW_CHARS = 200;
|
|
25
26
|
const POST_TIMEOUT_MS = 1500;
|
|
26
27
|
export async function runStopHook(input, deps) {
|
|
@@ -35,7 +36,9 @@ export async function runStopHook(input, deps) {
|
|
|
35
36
|
skipped: true,
|
|
36
37
|
};
|
|
37
38
|
}
|
|
38
|
-
|
|
39
|
+
// Client-side hook composition root: no per-tenant CLI/hook concept exists
|
|
40
|
+
// today, so DEFAULT_TEAM_ID is this surface's real identity, not a placeholder.
|
|
41
|
+
const surfaced = loadSurfaced(DEFAULT_TEAM_ID, input.conversationId);
|
|
39
42
|
if (surfaced.size === 0) {
|
|
40
43
|
return {
|
|
41
44
|
conversationId: input.conversationId,
|
|
@@ -69,7 +72,7 @@ export async function runStopHook(input, deps) {
|
|
|
69
72
|
toolUses: allToolUses,
|
|
70
73
|
surfacedIds: surfaced,
|
|
71
74
|
});
|
|
72
|
-
const alreadyCited = loadCited(input.conversationId);
|
|
75
|
+
const alreadyCited = loadCited(DEFAULT_TEAM_ID, input.conversationId);
|
|
73
76
|
const fresh = detected.filter((c) => !alreadyCited.has(c.id));
|
|
74
77
|
// Spec E: passive miss detection. Any session the agent explicitly
|
|
75
78
|
// fetched via get_session / cite_session that was NOT in the surfaced
|
|
@@ -78,7 +81,7 @@ export async function runStopHook(input, deps) {
|
|
|
78
81
|
// the Stop hook return.
|
|
79
82
|
const misses = detectMisses({ toolUses: allToolUses, surfacedIds: surfaced });
|
|
80
83
|
if (misses.length > 0) {
|
|
81
|
-
void appendMisses(misses.map((m) => ({
|
|
84
|
+
void appendMisses(DEFAULT_TEAM_ID, misses.map((m) => ({
|
|
82
85
|
conversationId: input.conversationId,
|
|
83
86
|
missedId: m.id,
|
|
84
87
|
kind: m.kind,
|
|
@@ -92,7 +95,7 @@ export async function runStopHook(input, deps) {
|
|
|
92
95
|
const preview = lastText.slice(0, RESPONSE_PREVIEW_CHARS);
|
|
93
96
|
await Promise.allSettled(fresh.map((c) => deps.postCitation(input.conversationId, c.id, c.kind, preview)));
|
|
94
97
|
if (fresh.length > 0) {
|
|
95
|
-
recordCited(input.conversationId, fresh.map((c) => c.id));
|
|
98
|
+
recordCited(DEFAULT_TEAM_ID, input.conversationId, fresh.map((c) => c.id));
|
|
96
99
|
}
|
|
97
100
|
return {
|
|
98
101
|
conversationId: input.conversationId,
|
|
@@ -115,7 +118,7 @@ function logStopResult(result) {
|
|
|
115
118
|
});
|
|
116
119
|
}
|
|
117
120
|
async function postCitationOverHttp(conversationId, citedId, kind, responsePreview) {
|
|
118
|
-
const port = process.env["NLM_PORT"] ??
|
|
121
|
+
const port = process.env["NLM_PORT"] ?? DEFAULT_NLM_PORT;
|
|
119
122
|
const url = `http://127.0.0.1:${port}/api/recall/cite-event`;
|
|
120
123
|
await fetchWithTimeout(url, {
|
|
121
124
|
method: "POST",
|
|
@@ -143,7 +146,7 @@ async function main() {
|
|
|
143
146
|
// Fail open — never block Claude Code's response.
|
|
144
147
|
}
|
|
145
148
|
}
|
|
146
|
-
if (
|
|
149
|
+
if (isMainModule(import.meta.url, process.argv[1])) {
|
|
147
150
|
void main();
|
|
148
151
|
}
|
|
149
152
|
//# sourceMappingURL=stop-hook.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stop-hook.js","sourceRoot":"","sources":["../../src/hook/stop-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"stop-hook.js","sourceRoot":"","sources":["../../src/hook/stop-hook.ts"],"names":[],"mappings":"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"}
|
package/dist/http/app.d.ts
CHANGED
|
@@ -19,8 +19,10 @@
|
|
|
19
19
|
*/
|
|
20
20
|
import { Hono } from "hono";
|
|
21
21
|
import type { RecallService } from "../core/recall/recall-service.js";
|
|
22
|
+
import { type UpdateCheckDeps } from "../core/update-check/check.js";
|
|
22
23
|
import type { FactRecallService } from "../core/recall-facts/fact-recall-service.js";
|
|
23
24
|
import type { FactStore } from "../ports/fact-store.js";
|
|
25
|
+
import type { LearnerStore } from "../ports/learner-store.js";
|
|
24
26
|
import { ClassifierBox } from "../llm/classifier-box.js";
|
|
25
27
|
import { SourceRegistry, PgSourceRegistry } from "../core/sources/source-registry.js";
|
|
26
28
|
import { ProviderRegistry, PgProviderRegistry } from "../core/providers/provider-registry.js";
|
|
@@ -32,6 +34,9 @@ import type { McpDeps } from "../mcp/server.js";
|
|
|
32
34
|
import type { SignalStore } from "../ports/signal-store.js";
|
|
33
35
|
import type { CodeExemplarStore } from "../ports/code-exemplar-store.js";
|
|
34
36
|
import type { CodeEmbedder } from "../ports/code-embedder.js";
|
|
37
|
+
import { type SessionScopeReader } from "../core/signals/stamp-scope.js";
|
|
38
|
+
import type { TeamTokenStorePort } from "../core/tenancy/team-token-store.js";
|
|
39
|
+
import type { JobSupervisor } from "../core/jobs/job-supervisor.js";
|
|
35
40
|
export interface HttpDeps {
|
|
36
41
|
readonly recall: RecallService;
|
|
37
42
|
readonly store: SessionStore;
|
|
@@ -54,6 +59,11 @@ export interface HttpDeps {
|
|
|
54
59
|
readonly sources?: SourceRegistry | PgSourceRegistry;
|
|
55
60
|
/** Providers registry — exposes /api/providers CRUD for the desktop UI. */
|
|
56
61
|
readonly providers?: ProviderRegistry | PgProviderRegistry;
|
|
62
|
+
/** Wire to enable GET /api/learner/by-session/:id. When omitted, the route 404s. */
|
|
63
|
+
readonly learnerRecall?: {
|
|
64
|
+
readonly learners: LearnerStore;
|
|
65
|
+
readonly sessions: Pick<SessionStore, "getWorkstreamIds">;
|
|
66
|
+
};
|
|
57
67
|
/** Wire to enable POST /api/ingest. When omitted, push ingest is disabled. */
|
|
58
68
|
readonly ingest?: IngestDeps;
|
|
59
69
|
/** Static embedder info — embeddings are always Ollama in this build (DeepSeek has no /embed). */
|
|
@@ -65,18 +75,39 @@ export interface HttpDeps {
|
|
|
65
75
|
/** Directory containing the built UI (dist/ui). When set, /ui/* serves the SPA. */
|
|
66
76
|
readonly uiDist?: string;
|
|
67
77
|
/**
|
|
68
|
-
* When provided, POST /mcp is mounted and token-gated
|
|
69
|
-
* Omitting this keeps the route absent — no
|
|
78
|
+
* When provided, POST /mcp is mounted and token-gated via team_tokens
|
|
79
|
+
* lookup (program spec §3 M3). Omitting this keeps the route absent — no
|
|
80
|
+
* auth surface, no risk.
|
|
70
81
|
*/
|
|
71
82
|
readonly mcpDeps?: McpDeps;
|
|
83
|
+
/**
|
|
84
|
+
* Bearer-token -> team resolution (M3). Wired whenever the daemon's
|
|
85
|
+
* Storage exposes it (always, in practice — both SqliteStorage and
|
|
86
|
+
* PgStorage construct one). Optional here only so unit tests that build a
|
|
87
|
+
* bare-bones HttpDeps without a real Storage still compile; when absent,
|
|
88
|
+
* the general gate falls back to pre-M3 local-mode behavior (DEFAULT_TEAM_ID
|
|
89
|
+
* on loopback) and /mcp refuses to mount.
|
|
90
|
+
*/
|
|
91
|
+
readonly teamTokens?: TeamTokenStorePort;
|
|
72
92
|
/** Signal store - wire to enable POST /api/signal + GET /api/signals/*. */
|
|
73
93
|
readonly signalStore?: SignalStore;
|
|
74
94
|
/** Per-install scope stamped on every ingested signal. */
|
|
75
95
|
readonly installScope?: string;
|
|
96
|
+
/** Used to inherit scope from a session when the signal carries a session_id. */
|
|
97
|
+
readonly sessionScopeReader?: SessionScopeReader;
|
|
76
98
|
/** Code exemplar store — wire to enable POST /api/exemplar + GET /api/recall-code. */
|
|
77
99
|
readonly exemplarStore?: CodeExemplarStore;
|
|
78
100
|
/** Optional code embedder for semantic recall-code queries. */
|
|
79
101
|
readonly codeEmbedder?: CodeEmbedder;
|
|
102
|
+
/** Test-only override for /api/health's update-check cache read (defaults to ~/.nlm/update-check.json via NLM_UPDATE_CHECK_CACHE). */
|
|
103
|
+
readonly updateCheckDeps?: Pick<UpdateCheckDeps, "cachePath" | "now">;
|
|
104
|
+
/**
|
|
105
|
+
* Wire to enable POST/DELETE /api/jobs/reprocess + the `job` block on
|
|
106
|
+
* GET /api/health. Narrowed to the three methods the routes need so unit
|
|
107
|
+
* tests can pass a plain fake instead of a real JobSupervisor (which
|
|
108
|
+
* would otherwise require real spawnChild/clock ports).
|
|
109
|
+
*/
|
|
110
|
+
readonly jobSupervisor?: Pick<JobSupervisor, "start" | "stop" | "snapshot">;
|
|
80
111
|
}
|
|
81
112
|
export declare function isLoopbackHost(host: string | undefined, port: number): boolean;
|
|
82
113
|
export declare function isLoopbackOrigin(origin: string | undefined, port: number): boolean;
|
|
@@ -84,4 +115,17 @@ export declare function parseAllowedOrigins(raw: string): {
|
|
|
84
115
|
origins: Set<string>;
|
|
85
116
|
hosts: Set<string>;
|
|
86
117
|
};
|
|
87
|
-
|
|
118
|
+
/**
|
|
119
|
+
* Hono context Variables (program spec §3 M3): `installLocalOnlyMiddleware`
|
|
120
|
+
* resolves the request's tenant exactly once (host/origin checks, then
|
|
121
|
+
* hosted/local/cookie/token auth) and stashes it via `c.set("tenantId", …)`;
|
|
122
|
+
* every downstream route handler reads it back via `c.get("tenantId")`
|
|
123
|
+
* instead of the composition-time `DEFAULT_TEAM_ID` constant M2 used as a
|
|
124
|
+
* placeholder.
|
|
125
|
+
*/
|
|
126
|
+
export interface AppEnv {
|
|
127
|
+
readonly Variables: {
|
|
128
|
+
tenantId: string;
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
export declare function createApp(deps: HttpDeps): Hono<AppEnv>;
|