nlm-memory 0.20.0 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -10
- package/dist/cli/digest.js +60 -1
- package/dist/cli/digest.js.map +1 -1
- package/dist/cli/init.d.ts +12 -0
- package/dist/cli/init.js +49 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/nlm.d.ts +13 -1
- package/dist/cli/nlm.js +872 -61
- package/dist/cli/nlm.js.map +1 -1
- 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 +205 -0
- package/dist/cli/scope-coverage.js.map +1 -0
- package/dist/core/actions/overlay.d.ts +20 -6
- package/dist/core/actions/overlay.js +32 -18
- 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 +36 -0
- package/dist/core/adapters/claude-code.js.map +1 -1
- package/dist/core/classifier/prompt.js +3 -3
- package/dist/core/dataset/build-dataset.js +1 -0
- package/dist/core/dataset/build-dataset.js.map +1 -1
- package/dist/core/digest/compose.d.ts +13 -3
- package/dist/core/digest/compose.js +23 -18
- 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 +79 -0
- package/dist/core/digest/hook-injection.js.map +1 -0
- package/dist/core/embedding/embed-backfill.d.ts +13 -2
- package/dist/core/embedding/embed-backfill.js +181 -43
- package/dist/core/embedding/embed-backfill.js.map +1 -1
- package/dist/core/embedding/embedding-config.d.ts +17 -0
- package/dist/core/embedding/embedding-config.js +12 -0
- package/dist/core/embedding/embedding-config.js.map +1 -0
- package/dist/core/embedding/pg-embed-backfill.d.ts +31 -0
- package/dist/core/embedding/pg-embed-backfill.js +264 -0
- package/dist/core/embedding/pg-embed-backfill.js.map +1 -0
- package/dist/core/entities/dedup-suggest.d.ts +25 -0
- package/dist/core/entities/dedup-suggest.js +107 -0
- package/dist/core/entities/dedup-suggest.js.map +1 -0
- package/dist/core/eval/classifier-fixture-eval.d.ts +29 -0
- package/dist/core/eval/classifier-fixture-eval.js +217 -0
- package/dist/core/eval/classifier-fixture-eval.js.map +1 -0
- package/dist/core/eval/extraction-scoring.d.ts +63 -0
- package/dist/core/eval/extraction-scoring.js +79 -0
- package/dist/core/eval/extraction-scoring.js.map +1 -0
- package/dist/core/eval/run-eval.d.ts +40 -0
- package/dist/core/eval/run-eval.js +34 -0
- package/dist/core/eval/run-eval.js.map +1 -0
- package/dist/core/exemplars/capture-from-session.d.ts +2 -0
- package/dist/core/exemplars/capture-from-session.js +7 -3
- package/dist/core/exemplars/capture-from-session.js.map +1 -1
- package/dist/core/exemplars/diff-parse.d.ts +23 -0
- package/dist/core/exemplars/diff-parse.js +73 -0
- package/dist/core/exemplars/diff-parse.js.map +1 -0
- package/dist/core/exemplars/embed-backfill.d.ts +36 -0
- package/dist/core/exemplars/embed-backfill.js +85 -0
- package/dist/core/exemplars/embed-backfill.js.map +1 -0
- package/dist/core/exemplars/embed-text.d.ts +15 -0
- package/dist/core/exemplars/embed-text.js +18 -0
- package/dist/core/exemplars/embed-text.js.map +1 -0
- package/dist/core/exemplars/extract-exemplar.d.ts +2 -0
- package/dist/core/exemplars/extract-exemplar.js +9 -66
- 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.js +4 -0
- package/dist/core/exemplars/recall-code.js.map +1 -1
- package/dist/core/exemplars/warm-embedder.d.ts +14 -0
- package/dist/core/exemplars/warm-embedder.js +18 -0
- package/dist/core/exemplars/warm-embedder.js.map +1 -0
- package/dist/core/health/corpus-state.d.ts +8 -0
- package/dist/core/health/corpus-state.js +11 -0
- package/dist/core/health/corpus-state.js.map +1 -0
- package/dist/core/health/embed-inflight.d.ts +9 -0
- package/dist/core/health/embed-inflight.js +30 -0
- package/dist/core/health/embed-inflight.js.map +1 -0
- package/dist/core/health/embedding-lane-state.d.ts +6 -0
- package/dist/core/health/embedding-lane-state.js +18 -0
- package/dist/core/health/embedding-lane-state.js.map +1 -0
- package/dist/core/health/warmup-state.d.ts +12 -0
- package/dist/core/health/warmup-state.js +12 -0
- package/dist/core/health/warmup-state.js.map +1 -0
- 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/gate.d.ts +13 -6
- package/dist/core/hook/gate.js +47 -6
- package/dist/core/hook/gate.js.map +1 -1
- package/dist/core/hook/hook-log.d.ts +5 -0
- package/dist/core/hook/hook-log.js.map +1 -1
- package/dist/core/hook/memo.d.ts +12 -0
- package/dist/core/hook/memo.js +41 -1
- package/dist/core/hook/memo.js.map +1 -1
- package/dist/core/hook/pointer-block.d.ts +1 -0
- package/dist/core/hook/pointer-block.js +23 -2
- package/dist/core/hook/pointer-block.js.map +1 -1
- package/dist/core/hook/query-extract.d.ts +2 -1
- package/dist/core/hook/query-extract.js +10 -1
- package/dist/core/hook/query-extract.js.map +1 -1
- package/dist/core/hook/resolve-conversation-by-query.d.ts +28 -0
- package/dist/core/hook/resolve-conversation-by-query.js +98 -0
- package/dist/core/hook/resolve-conversation-by-query.js.map +1 -0
- package/dist/core/hook/select.d.ts +8 -0
- package/dist/core/hook/select.js +9 -2
- package/dist/core/hook/select.js.map +1 -1
- package/dist/core/hook/transcript.js +16 -2
- package/dist/core/hook/transcript.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 +5 -0
- package/dist/core/ingest/ingest-session.js +23 -0
- package/dist/core/ingest/ingest-session.js.map +1 -1
- package/dist/core/ingest/reclassify-oversized.d.ts +5 -0
- package/dist/core/ingest/reclassify-oversized.js +9 -0
- package/dist/core/ingest/reclassify-oversized.js.map +1 -1
- package/dist/core/ingest/reprocess.d.ts +96 -0
- package/dist/core/ingest/reprocess.js +280 -0
- package/dist/core/ingest/reprocess.js.map +1 -0
- 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/integrity/check-invariants.d.ts +6 -1
- package/dist/core/integrity/check-invariants.js +209 -3
- package/dist/core/integrity/check-invariants.js.map +1 -1
- package/dist/core/metrics/corpus-stats.d.ts +49 -0
- package/dist/core/metrics/corpus-stats.js +111 -0
- package/dist/core/metrics/corpus-stats.js.map +1 -0
- package/dist/core/metrics/re-derivation.d.ts +48 -0
- package/dist/core/metrics/re-derivation.js +87 -0
- package/dist/core/metrics/re-derivation.js.map +1 -0
- 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/recall/citation-log.d.ts +8 -0
- package/dist/core/recall/citation-log.js +17 -0
- package/dist/core/recall/citation-log.js.map +1 -1
- package/dist/core/recall/hook-recall-log.d.ts +2 -2
- package/dist/core/recall/hook-recall-log.js +2 -2
- package/dist/core/recall/query-intent.d.ts +7 -0
- package/dist/core/recall/query-intent.js +25 -0
- package/dist/core/recall/query-intent.js.map +1 -0
- package/dist/core/recall/query-log.d.ts +4 -0
- package/dist/core/recall/query-log.js +4 -0
- package/dist/core/recall/query-log.js.map +1 -1
- package/dist/core/recall/recall-service.d.ts +37 -1
- package/dist/core/recall/recall-service.js +106 -63
- package/dist/core/recall/recall-service.js.map +1 -1
- package/dist/core/recall/related-exemplars.d.ts +1 -0
- package/dist/core/recall/related-exemplars.js +4 -1
- package/dist/core/recall/related-exemplars.js.map +1 -1
- package/dist/core/recall/related-facts.js +2 -2
- package/dist/core/recall/related-facts.js.map +1 -1
- package/dist/core/recall/reranker.d.ts +2 -1
- package/dist/core/recall/reranker.js +3 -3
- package/dist/core/recall/reranker.js.map +1 -1
- package/dist/core/recall-facts/fact-query-log.d.ts +7 -0
- package/dist/core/recall-facts/fact-query-log.js +2 -0
- package/dist/core/recall-facts/fact-query-log.js.map +1 -1
- package/dist/core/recall-facts/fact-recall-service.d.ts +9 -1
- package/dist/core/recall-facts/fact-recall-service.js +22 -8
- package/dist/core/recall-facts/fact-recall-service.js.map +1 -1
- package/dist/core/scheduler/scan-once.d.ts +6 -6
- package/dist/core/scheduler/scan-once.js +15 -49
- package/dist/core/scheduler/scan-once.js.map +1 -1
- package/dist/core/scheduler/scheduler.d.ts +10 -0
- package/dist/core/scheduler/scheduler.js +109 -13
- 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 +50 -0
- package/dist/core/signals/code-signal.js +54 -0
- package/dist/core/signals/code-signal.js.map +1 -0
- 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/storage/db-restore.js +3 -1
- package/dist/core/storage/db-restore.js.map +1 -1
- package/dist/core/storage/fact-batch.d.ts +9 -0
- package/dist/core/storage/fact-batch.js +14 -0
- package/dist/core/storage/fact-batch.js.map +1 -0
- package/dist/core/storage/pg-code-exemplar-store.d.ts +1 -0
- package/dist/core/storage/pg-code-exemplar-store.js +13 -2
- package/dist/core/storage/pg-code-exemplar-store.js.map +1 -1
- package/dist/core/storage/pg-embedding-config.d.ts +29 -0
- package/dist/core/storage/pg-embedding-config.js +53 -0
- package/dist/core/storage/pg-embedding-config.js.map +1 -0
- package/dist/core/storage/pg-entity-store.d.ts +12 -0
- package/dist/core/storage/pg-entity-store.js +79 -0
- package/dist/core/storage/pg-entity-store.js.map +1 -0
- package/dist/core/storage/pg-fact-ingest.d.ts +15 -0
- package/dist/core/storage/pg-fact-ingest.js +34 -0
- package/dist/core/storage/pg-fact-ingest.js.map +1 -0
- package/dist/core/storage/pg-fact-store.d.ts +3 -0
- package/dist/core/storage/pg-fact-store.js +26 -30
- package/dist/core/storage/pg-fact-store.js.map +1 -1
- package/dist/core/storage/pg-migrate.d.ts +18 -0
- package/dist/core/storage/pg-migrate.js +73 -0
- package/dist/core/storage/pg-migrate.js.map +1 -0
- package/dist/core/storage/pg-session-store.d.ts +11 -2
- package/dist/core/storage/pg-session-store.js +224 -96
- package/dist/core/storage/pg-session-store.js.map +1 -1
- package/dist/core/storage/pg-signal-store.js +4 -3
- package/dist/core/storage/pg-signal-store.js.map +1 -1
- package/dist/core/storage/pg-storage.d.ts +9 -7
- package/dist/core/storage/pg-storage.js +20 -50
- package/dist/core/storage/pg-storage.js.map +1 -1
- package/dist/core/storage/pg-workstream-store.d.ts +25 -0
- package/dist/core/storage/pg-workstream-store.js +97 -0
- package/dist/core/storage/pg-workstream-store.js.map +1 -0
- package/dist/core/storage/sqlite-code-exemplar-store.d.ts +1 -0
- package/dist/core/storage/sqlite-code-exemplar-store.js +15 -2
- package/dist/core/storage/sqlite-code-exemplar-store.js.map +1 -1
- package/dist/core/storage/sqlite-embedding-config.d.ts +10 -0
- package/dist/core/storage/sqlite-embedding-config.js +27 -0
- package/dist/core/storage/sqlite-embedding-config.js.map +1 -0
- package/dist/core/storage/sqlite-entity-store.d.ts +13 -0
- package/dist/core/storage/sqlite-entity-store.js +96 -0
- package/dist/core/storage/sqlite-entity-store.js.map +1 -0
- package/dist/core/storage/sqlite-fact-store.d.ts +15 -7
- package/dist/core/storage/sqlite-fact-store.js +81 -27
- package/dist/core/storage/sqlite-fact-store.js.map +1 -1
- package/dist/core/storage/sqlite-outcome-store.d.ts +89 -0
- package/dist/core/storage/sqlite-outcome-store.js +158 -0
- package/dist/core/storage/sqlite-outcome-store.js.map +1 -0
- package/dist/core/storage/sqlite-session-store.d.ts +42 -7
- package/dist/core/storage/sqlite-session-store.js +208 -95
- package/dist/core/storage/sqlite-session-store.js.map +1 -1
- package/dist/core/storage/sqlite-signal-store.js +4 -2
- package/dist/core/storage/sqlite-signal-store.js.map +1 -1
- package/dist/core/storage/sqlite-storage.d.ts +8 -8
- package/dist/core/storage/sqlite-storage.js +21 -32
- package/dist/core/storage/sqlite-storage.js.map +1 -1
- package/dist/core/storage/sqlite-workstream-store.d.ts +25 -0
- package/dist/core/storage/sqlite-workstream-store.js +99 -0
- package/dist/core/storage/sqlite-workstream-store.js.map +1 -0
- package/dist/core/storage/supersedence-log.js +2 -0
- 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/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/work-digest/active-spans.d.ts +8 -0
- package/dist/core/work-digest/active-spans.js +29 -0
- package/dist/core/work-digest/active-spans.js.map +1 -0
- package/dist/core/work-digest/attribute.d.ts +15 -0
- package/dist/core/work-digest/attribute.js +76 -0
- package/dist/core/work-digest/attribute.js.map +1 -0
- package/dist/core/work-digest/build-work-digest.d.ts +12 -0
- package/dist/core/work-digest/build-work-digest.js +69 -0
- package/dist/core/work-digest/build-work-digest.js.map +1 -0
- package/dist/core/work-digest/compose-work-digest.d.ts +3 -0
- package/dist/core/work-digest/compose-work-digest.js +52 -0
- package/dist/core/work-digest/compose-work-digest.js.map +1 -0
- package/dist/core/work-digest/merge-active.d.ts +10 -0
- package/dist/core/work-digest/merge-active.js +22 -0
- package/dist/core/work-digest/merge-active.js.map +1 -0
- package/dist/core/work-digest/read-transcript-timestamps.d.ts +7 -0
- package/dist/core/work-digest/read-transcript-timestamps.js +40 -0
- package/dist/core/work-digest/read-transcript-timestamps.js.map +1 -0
- package/dist/core/work-digest/topics.d.ts +18 -0
- package/dist/core/work-digest/topics.js +26 -0
- package/dist/core/work-digest/topics.js.map +1 -0
- package/dist/core/work-digest/types.d.ts +45 -0
- package/dist/core/work-digest/types.js +2 -0
- package/dist/core/work-digest/types.js.map +1 -0
- package/dist/core/workstream/bind.d.ts +26 -0
- package/dist/core/workstream/bind.js +42 -0
- package/dist/core/workstream/bind.js.map +1 -0
- package/dist/core/workstream/compose-recall.d.ts +2 -0
- package/dist/core/workstream/compose-recall.js +39 -0
- package/dist/core/workstream/compose-recall.js.map +1 -0
- package/dist/core/workstream/merge-suggest.d.ts +19 -0
- package/dist/core/workstream/merge-suggest.js +61 -0
- package/dist/core/workstream/merge-suggest.js.map +1 -0
- package/dist/core/workstream/model.d.ts +21 -0
- package/dist/core/workstream/model.js +9 -0
- package/dist/core/workstream/model.js.map +1 -0
- package/dist/core/workstream/name-match.d.ts +8 -0
- package/dist/core/workstream/name-match.js +18 -0
- package/dist/core/workstream/name-match.js.map +1 -0
- package/dist/core/workstream/resolve.d.ts +10 -0
- package/dist/core/workstream/resolve.js +21 -0
- package/dist/core/workstream/resolve.js.map +1 -0
- package/dist/core/workstream/rollup.d.ts +12 -0
- package/dist/core/workstream/rollup.js +17 -0
- package/dist/core/workstream/rollup.js.map +1 -0
- package/dist/core/workstream/work-topics.d.ts +10 -0
- package/dist/core/workstream/work-topics.js +55 -0
- package/dist/core/workstream/work-topics.js.map +1 -0
- package/dist/hook/hook-helpers.d.ts +4 -0
- package/dist/hook/hook-helpers.js +36 -0
- package/dist/hook/hook-helpers.js.map +1 -0
- package/dist/hook/pre-compact-hook.d.ts +23 -0
- package/dist/hook/pre-compact-hook.js +67 -0
- package/dist/hook/pre-compact-hook.js.map +1 -0
- package/dist/hook/prompt-recall-hook.d.ts +38 -0
- package/dist/hook/prompt-recall-hook.js +124 -20
- package/dist/hook/prompt-recall-hook.js.map +1 -1
- package/dist/hook/recall-gate.d.ts +29 -0
- package/dist/hook/recall-gate.js +50 -0
- package/dist/hook/recall-gate.js.map +1 -0
- package/dist/hook/recall-over-http.d.ts +3 -2
- package/dist/hook/recall-over-http.js +26 -13
- package/dist/hook/recall-over-http.js.map +1 -1
- package/dist/hook/recent-context.d.ts +25 -0
- package/dist/hook/recent-context.js +104 -0
- package/dist/hook/recent-context.js.map +1 -0
- package/dist/hook/score-floor.d.ts +27 -0
- package/dist/hook/score-floor.js +42 -0
- package/dist/hook/score-floor.js.map +1 -0
- package/dist/hook/session-end-hook.js +8 -29
- package/dist/hook/session-end-hook.js.map +1 -1
- package/dist/hook/session-start-hook.js +26 -60
- package/dist/hook/session-start-hook.js.map +1 -1
- package/dist/hook/stop-hook.js +24 -60
- package/dist/hook/stop-hook.js.map +1 -1
- package/dist/http/app.d.ts +6 -0
- package/dist/http/app.js +52 -44
- package/dist/http/app.js.map +1 -1
- package/dist/install/setup.js +2 -0
- package/dist/install/setup.js.map +1 -1
- package/dist/llm/build-classifier.d.ts +22 -0
- package/dist/llm/build-classifier.js +42 -0
- package/dist/llm/build-classifier.js.map +1 -0
- package/dist/llm/build-embedder.d.ts +11 -0
- package/dist/llm/build-embedder.js +42 -0
- package/dist/llm/build-embedder.js.map +1 -0
- package/dist/llm/bundled-embedder-client.d.ts +37 -0
- package/dist/llm/bundled-embedder-client.js +90 -0
- package/dist/llm/bundled-embedder-client.js.map +1 -0
- package/dist/llm/classifier-box.d.ts +13 -5
- package/dist/llm/classifier-box.js +28 -6
- package/dist/llm/classifier-box.js.map +1 -1
- package/dist/llm/classifier-egress.d.ts +18 -0
- package/dist/llm/classifier-egress.js +59 -0
- package/dist/llm/classifier-egress.js.map +1 -0
- package/dist/llm/client-shared.d.ts +4 -0
- package/dist/llm/client-shared.js +39 -0
- package/dist/llm/client-shared.js.map +1 -0
- package/dist/llm/deepseek-client.d.ts +20 -0
- package/dist/llm/deepseek-client.js +59 -45
- package/dist/llm/deepseek-client.js.map +1 -1
- package/dist/llm/embedder-info.d.ts +15 -0
- package/dist/llm/embedder-info.js +27 -0
- package/dist/llm/embedder-info.js.map +1 -0
- package/dist/llm/model-quirks.d.ts +4 -0
- package/dist/llm/model-quirks.js +7 -0
- package/dist/llm/model-quirks.js.map +1 -0
- package/dist/llm/naming.d.ts +5 -0
- package/dist/llm/naming.js +20 -0
- package/dist/llm/naming.js.map +1 -0
- package/dist/llm/ollama-client.d.ts +7 -8
- package/dist/llm/ollama-client.js +59 -51
- package/dist/llm/ollama-client.js.map +1 -1
- package/dist/llm/ollama-code-embedder.d.ts +8 -3
- package/dist/llm/ollama-code-embedder.js +14 -24
- package/dist/llm/ollama-code-embedder.js.map +1 -1
- package/dist/llm/openai-code-embedder-client.d.ts +25 -0
- package/dist/llm/openai-code-embedder-client.js +52 -0
- package/dist/llm/openai-code-embedder-client.js.map +1 -0
- package/dist/llm/openai-embedder-client.d.ts +41 -0
- package/dist/llm/openai-embedder-client.js +83 -0
- package/dist/llm/openai-embedder-client.js.map +1 -0
- package/dist/mcp/server.d.ts +69 -2
- package/dist/mcp/server.js +404 -19
- package/dist/mcp/server.js.map +1 -1
- package/dist/ports/code-embedder.d.ts +6 -1
- package/dist/ports/code-exemplar-store.d.ts +5 -0
- package/dist/ports/entity-store.d.ts +35 -0
- package/dist/ports/entity-store.js +7 -0
- package/dist/ports/entity-store.js.map +1 -0
- package/dist/ports/fact-store.d.ts +0 -0
- package/dist/ports/fact-store.js.map +1 -1
- package/dist/ports/llm-client.d.ts +9 -1
- 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 +12 -6
- package/dist/ports/storage.d.ts +7 -30
- package/dist/ports/storage.js +3 -7
- package/dist/ports/storage.js.map +1 -1
- package/dist/ports/transcript-adapter.d.ts +2 -0
- package/dist/ports/workstream-store.d.ts +22 -0
- package/dist/ports/workstream-store.js +2 -0
- package/dist/ports/workstream-store.js.map +1 -0
- 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 +56 -2
- package/dist/shared/types.js +4 -1
- package/dist/shared/types.js.map +1 -1
- package/dist/ui/assets/{index-CMpQkbQy.js → index-CSaBtgXD.js} +1 -1
- package/dist/ui/index.html +1 -1
- package/fixtures/classifier-gold/README.md +94 -0
- package/fixtures/classifier-gold/reference.json +318 -0
- package/fixtures/classifier-gold/transcripts/01-bug-fix-null-pointer-api.txt +75 -0
- package/fixtures/classifier-gold/transcripts/02-bug-fix-race-condition-queue.txt +77 -0
- package/fixtures/classifier-gold/transcripts/03-bug-fix-jwt-clock-skew.txt +86 -0
- package/fixtures/classifier-gold/transcripts/04-feature-webhook-retry.txt +95 -0
- package/fixtures/classifier-gold/transcripts/05-feature-csv-export.txt +86 -0
- package/fixtures/classifier-gold/transcripts/06-feature-rate-limiting.txt +61 -0
- package/fixtures/classifier-gold/transcripts/07-refactor-db-abstraction.txt +72 -0
- package/fixtures/classifier-gold/transcripts/08-refactor-config-loading.txt +89 -0
- package/fixtures/classifier-gold/transcripts/09-ops-docker-staging.txt +94 -0
- package/fixtures/classifier-gold/transcripts/10-ops-nginx-ssl.txt +121 -0
- package/fixtures/classifier-gold/transcripts/11-ops-postgres-migration.txt +74 -0
- package/fixtures/classifier-gold/transcripts/12-ops-cron-debugging.txt +73 -0
- package/fixtures/classifier-gold/transcripts/13-research-vector-db-comparison.txt +59 -0
- package/fixtures/classifier-gold/transcripts/14-research-oauth-provider.txt +74 -0
- package/fixtures/classifier-gold/transcripts/15-writing-api-docs.txt +154 -0
- package/fixtures/classifier-gold/transcripts/16-meeting-sprint-planning.txt +69 -0
- package/fixtures/classifier-gold/transcripts/17-trivial-list-files.txt +14 -0
- package/fixtures/classifier-gold/transcripts/18-trivial-version-check.txt +21 -0
- package/fixtures/classifier-gold/transcripts/19-trivial-syntax-help.txt +29 -0
- package/fixtures/classifier-gold/transcripts/20-trivial-read-package-json.txt +41 -0
- package/migrations/000_initial_schema.sql +1 -1
- package/migrations/024_backfill_exemplar_repo_basename.sql +32 -0
- package/migrations/025_workstreams.sql +30 -0
- package/migrations/026_embedding_config.sql +12 -0
- package/migrations/027_drop_legacy_session_embeddings.sql +7 -0
- package/migrations/028_classifier_provenance.sql +5 -0
- package/migrations/029_project_scope.sql +21 -0
- package/migrations/032_session_derivables.sql +11 -0
- package/migrations/pg/001_initial.sql +34 -0
- package/migrations/pg/019_split_replaces.sql +16 -7
- package/migrations/pg/025_workstreams.sql +34 -0
- package/migrations/pg/026_embedding_config.sql +12 -0
- package/migrations/pg/028_classifier_provenance.sql +5 -0
- package/migrations/pg/029_entity_variants.sql +9 -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/nlm/index.js +405 -39
- package/package.json +12 -2
- package/plugin/.codex-plugin/plugin.json +2 -2
- package/plugin/scripts/prompt-recall-hook.mjs +413 -43
- package/plugin/scripts/session-start-hook.mjs +295 -61
- package/plugin/scripts/stop-hook.mjs +89 -66
- package/plugin-hermes-agent/__init__.py +2 -1
- package/templates/agent-contract/README.md +24 -0
- package/templates/agent-contract/claude-code.md +40 -0
- package/templates/agent-contract/generic.md +38 -0
- package/dist/core/embedding/embed-normalize.d.ts +0 -28
- package/dist/core/embedding/embed-normalize.js +0 -98
- package/dist/core/embedding/embed-normalize.js.map +0 -1
- package/dist/core/storage/pg-tx-context.d.ts +0 -52
- package/dist/core/storage/pg-tx-context.js +0 -149
- package/dist/core/storage/pg-tx-context.js.map +0 -1
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* reprocess: retroactive re-classification of prior sessions under a
|
|
3
|
+
* stronger configured lane.
|
|
4
|
+
*
|
|
5
|
+
* Selection: sessions with a non-empty body whose classifier_model is NULL,
|
|
6
|
+
* differs from the current lane model, or (when --min-confidence is given)
|
|
7
|
+
* whose stored confidence falls below the threshold even for the same model.
|
|
8
|
+
*
|
|
9
|
+
* Per session: classifyAdaptive on the stored body, then a full insertSession
|
|
10
|
+
* upsert (refreshes chunks + facts). A below-floor classification updates the
|
|
11
|
+
* session row (label, summary, markers, provenance) but preserves prior facts
|
|
12
|
+
* and their embeddings unchanged. It is counted in belowFloorOverwrites.
|
|
13
|
+
* Workstream binding (workstream_id) is NOT touched by the upsert.
|
|
14
|
+
*
|
|
15
|
+
* Resumable via a JSON state file (default ~/.nlm/reprocess.state). A lane
|
|
16
|
+
* change (different provider or model) invalidates the done-set.
|
|
17
|
+
*
|
|
18
|
+
* SQLite only. Pg variant deferred; file task against nlm#TODO in report.
|
|
19
|
+
*/
|
|
20
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
21
|
+
import { dirname, join } from "node:path";
|
|
22
|
+
import { homedir } from "node:os";
|
|
23
|
+
import { classifyAdaptive } from "../classifier/hierarchical-classify.js";
|
|
24
|
+
import { extractFacts } from "../facts/extract-facts.js";
|
|
25
|
+
const DEFAULT_STATE_PATH = join(homedir(), ".nlm", "reprocess.state");
|
|
26
|
+
const SAVE_EVERY = 25;
|
|
27
|
+
const CONFIDENCE_FLOOR = 0.4;
|
|
28
|
+
function confidenceBand(conf) {
|
|
29
|
+
if (conf === null)
|
|
30
|
+
return "null";
|
|
31
|
+
if (conf < 0.4)
|
|
32
|
+
return "<0.4";
|
|
33
|
+
if (conf < 0.6)
|
|
34
|
+
return "0.4-0.6";
|
|
35
|
+
if (conf < 0.8)
|
|
36
|
+
return "0.6-0.8";
|
|
37
|
+
return ">=0.8";
|
|
38
|
+
}
|
|
39
|
+
function loadState(path, lane) {
|
|
40
|
+
if (!existsSync(path))
|
|
41
|
+
return new Set();
|
|
42
|
+
try {
|
|
43
|
+
const raw = JSON.parse(readFileSync(path, "utf8"));
|
|
44
|
+
if (raw.lane?.provider === lane.provider && raw.lane?.model === lane.model) {
|
|
45
|
+
return new Set(raw.done ?? []);
|
|
46
|
+
}
|
|
47
|
+
return new Set();
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// Malformed state file: restart reprocessing from scratch.
|
|
51
|
+
return new Set();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function saveState(path, done, lane) {
|
|
55
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
56
|
+
writeFileSync(path, JSON.stringify({ done: [...done].sort(), lane }));
|
|
57
|
+
}
|
|
58
|
+
export function selectReprocessCandidates(db, model, minConfidence, opts) {
|
|
59
|
+
const params = [];
|
|
60
|
+
let classifierClause;
|
|
61
|
+
if (opts?.onlyNull) {
|
|
62
|
+
classifierClause = "classifier_model IS NULL";
|
|
63
|
+
}
|
|
64
|
+
else if (minConfidence !== undefined) {
|
|
65
|
+
classifierClause = "(classifier_model IS NULL OR classifier_model != ? OR classifier_confidence < ?)";
|
|
66
|
+
params.push(model, minConfidence);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
classifierClause = "(classifier_model IS NULL OR classifier_model != ?)";
|
|
70
|
+
params.push(model);
|
|
71
|
+
}
|
|
72
|
+
const excludeModels = opts?.excludeModels ?? [];
|
|
73
|
+
let excludeClause = "";
|
|
74
|
+
if (excludeModels.length > 0) {
|
|
75
|
+
const placeholders = excludeModels.map(() => "?").join(", ");
|
|
76
|
+
excludeClause = ` AND (classifier_model IS NULL OR classifier_model NOT IN (${placeholders}))`;
|
|
77
|
+
params.push(...excludeModels);
|
|
78
|
+
}
|
|
79
|
+
const sql = "SELECT id, runtime, runtime_session_id, started_at, ended_at, duration_min, " +
|
|
80
|
+
"label, summary, status, transcript_kind, transcript_path, " +
|
|
81
|
+
"transcript_offset, transcript_length, " +
|
|
82
|
+
"classifier_provider, classifier_model, classifier_confidence " +
|
|
83
|
+
"FROM sessions " +
|
|
84
|
+
"WHERE body IS NOT NULL AND length(body) > 0 " +
|
|
85
|
+
"AND " +
|
|
86
|
+
classifierClause +
|
|
87
|
+
excludeClause +
|
|
88
|
+
" " +
|
|
89
|
+
"ORDER BY started_at DESC";
|
|
90
|
+
return db.prepare(sql).all(...params);
|
|
91
|
+
}
|
|
92
|
+
export async function reprocess(deps, opts = {}) {
|
|
93
|
+
const { db, store, factStore, embedder, classifier, classifierDescriptor } = deps;
|
|
94
|
+
const log = deps.log ?? ((m) => console.error(m));
|
|
95
|
+
const statePath = opts.statePath ?? DEFAULT_STATE_PATH;
|
|
96
|
+
const lane = {
|
|
97
|
+
provider: classifierDescriptor.provider,
|
|
98
|
+
model: classifierDescriptor.model,
|
|
99
|
+
};
|
|
100
|
+
const allCandidates = selectReprocessCandidates(db, classifierDescriptor.model, opts.minConfidence, {
|
|
101
|
+
...(opts.onlyNull ? { onlyNull: true } : {}),
|
|
102
|
+
...(opts.excludeModels ? { excludeModels: opts.excludeModels } : {}),
|
|
103
|
+
});
|
|
104
|
+
if (opts.dryRun) {
|
|
105
|
+
const groupMap = new Map();
|
|
106
|
+
for (const row of allCandidates) {
|
|
107
|
+
const key = `${row.classifier_provider ?? ""}\u0000${row.classifier_model ?? ""}\u0000${confidenceBand(row.classifier_confidence)}`;
|
|
108
|
+
const existing = groupMap.get(key);
|
|
109
|
+
if (existing) {
|
|
110
|
+
groupMap.set(key, { ...existing, count: existing.count + 1 });
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
groupMap.set(key, {
|
|
114
|
+
classifierProvider: row.classifier_provider,
|
|
115
|
+
classifierModel: row.classifier_model,
|
|
116
|
+
confidenceBand: confidenceBand(row.classifier_confidence),
|
|
117
|
+
count: 1,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
const cohort = [...groupMap.values()].sort((a, b) => b.count - a.count);
|
|
122
|
+
let stateNote;
|
|
123
|
+
if (existsSync(statePath)) {
|
|
124
|
+
const n = loadState(statePath, lane).size;
|
|
125
|
+
stateNote = `state file present, ${n} sessions already done, real run will skip them`;
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
totalEligible: allCandidates.length,
|
|
129
|
+
processed: 0,
|
|
130
|
+
succeeded: 0,
|
|
131
|
+
failed: 0,
|
|
132
|
+
skippedAlreadyDone: 0,
|
|
133
|
+
limitSkipped: 0,
|
|
134
|
+
belowFloorOverwrites: 0,
|
|
135
|
+
meanConfidenceOld: null,
|
|
136
|
+
meanConfidenceNew: null,
|
|
137
|
+
cohort,
|
|
138
|
+
...(stateNote !== undefined ? { stateNote } : {}),
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
if (deps.embeddingConfig && deps.embedderDescriptor) {
|
|
142
|
+
const stored = deps.embeddingConfig.getLane("prose");
|
|
143
|
+
if (stored) {
|
|
144
|
+
let dim = null;
|
|
145
|
+
try {
|
|
146
|
+
const result = await deps.embedder.embed("nlm probe", "query");
|
|
147
|
+
dim = result.vector.length;
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
// probe failure: pre-tracking tolerance, proceed
|
|
151
|
+
}
|
|
152
|
+
if (dim !== null) {
|
|
153
|
+
const mismatch = stored.provider !== deps.embedderDescriptor.provider ||
|
|
154
|
+
stored.model !== deps.embedderDescriptor.model ||
|
|
155
|
+
stored.dim !== dim;
|
|
156
|
+
if (mismatch && !opts.forceEmbed) {
|
|
157
|
+
const msg = `reprocess: prose embedding lane mismatch: stored ${stored.provider}/${stored.model}@${stored.dim}` +
|
|
158
|
+
` vs runtime ${deps.embedderDescriptor.provider}/${deps.embedderDescriptor.model}@${dim}.` +
|
|
159
|
+
` Re-embedding under a mismatched lane writes mixed vectors. Run nlm embed-backfill first,` +
|
|
160
|
+
` or pass --force-embed to override.`;
|
|
161
|
+
log(msg);
|
|
162
|
+
throw new Error(msg);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
const bodyStmt = db.prepare("SELECT body FROM sessions WHERE id = ?");
|
|
168
|
+
const done = loadState(statePath, lane);
|
|
169
|
+
const skippedByState = allCandidates.filter((r) => done.has(r.id)).length;
|
|
170
|
+
const candidates = allCandidates.filter((r) => !done.has(r.id));
|
|
171
|
+
const work = opts.limit !== undefined ? candidates.slice(0, opts.limit) : candidates;
|
|
172
|
+
const total = work.length;
|
|
173
|
+
let processed = 0;
|
|
174
|
+
let succeeded = 0;
|
|
175
|
+
let failed = 0;
|
|
176
|
+
let belowFloorOverwrites = 0;
|
|
177
|
+
let sumConfidenceOld = 0;
|
|
178
|
+
let countOld = 0;
|
|
179
|
+
let sumConfidenceNew = 0;
|
|
180
|
+
let countNew = 0;
|
|
181
|
+
for (let i = 0; i < work.length; i++) {
|
|
182
|
+
const row = work[i];
|
|
183
|
+
const sid = row.id;
|
|
184
|
+
const idx = i + 1;
|
|
185
|
+
const bodyRow = bodyStmt.get(sid);
|
|
186
|
+
if (!bodyRow?.body) {
|
|
187
|
+
failed++;
|
|
188
|
+
processed++;
|
|
189
|
+
log(`[reprocess] empty body ${sid}: skipping`);
|
|
190
|
+
opts.onProgress?.(idx, total, sid, "empty_body");
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
const body = bodyRow.body;
|
|
194
|
+
let classification;
|
|
195
|
+
try {
|
|
196
|
+
classification = await classifyAdaptive(body, classifier, {
|
|
197
|
+
...(opts.classifyTimeoutMs ? { perCallTimeoutMs: opts.classifyTimeoutMs } : {}),
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
catch (e) {
|
|
201
|
+
failed++;
|
|
202
|
+
processed++;
|
|
203
|
+
log(`[reprocess] classify failed ${sid}: ${e instanceof Error ? e.message : String(e)}`);
|
|
204
|
+
opts.onProgress?.(idx, total, sid, "classify_failed");
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
if (row.classifier_confidence !== null) {
|
|
208
|
+
sumConfidenceOld += row.classifier_confidence;
|
|
209
|
+
countOld++;
|
|
210
|
+
}
|
|
211
|
+
sumConfidenceNew += classification.confidence;
|
|
212
|
+
countNew++;
|
|
213
|
+
const belowFloor = classification.confidence < CONFIDENCE_FLOOR;
|
|
214
|
+
if (belowFloor) {
|
|
215
|
+
belowFloorOverwrites++;
|
|
216
|
+
if (opts.verbose) {
|
|
217
|
+
log(`[reprocess] below-floor ${sid}: old=${row.classifier_confidence ?? "null"} new=${classification.confidence}`);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
else if (opts.verbose) {
|
|
221
|
+
log(`[reprocess] ${sid}: old=${row.classifier_confidence ?? "null"} new=${classification.confidence}`);
|
|
222
|
+
}
|
|
223
|
+
const record = {
|
|
224
|
+
id: sid,
|
|
225
|
+
runtime: row.runtime,
|
|
226
|
+
runtimeSessionId: row.runtime_session_id,
|
|
227
|
+
startedAt: row.started_at,
|
|
228
|
+
endedAt: row.ended_at,
|
|
229
|
+
durationMin: row.duration_min,
|
|
230
|
+
label: classification.label,
|
|
231
|
+
summary: classification.summary,
|
|
232
|
+
body,
|
|
233
|
+
status: row.status,
|
|
234
|
+
transcriptKind: row.transcript_kind,
|
|
235
|
+
transcriptPath: row.transcript_path,
|
|
236
|
+
transcriptOffset: row.transcript_offset,
|
|
237
|
+
transcriptLength: row.transcript_length,
|
|
238
|
+
entities: classification.entities,
|
|
239
|
+
decisions: classification.decisions,
|
|
240
|
+
openQuestions: classification.open,
|
|
241
|
+
// Reprocess rebuilds from the stored row, which carries no project
|
|
242
|
+
// directory evidence; the scope backfill command re-derives from the
|
|
243
|
+
// transcript, so a NULL here is recoverable.
|
|
244
|
+
scope: null,
|
|
245
|
+
classifier: { ...classifierDescriptor, confidence: classification.confidence },
|
|
246
|
+
};
|
|
247
|
+
try {
|
|
248
|
+
const factSinkArg = belowFloor
|
|
249
|
+
? null
|
|
250
|
+
: { factStore, facts: extractFacts(classification, sid, row.started_at) };
|
|
251
|
+
await store.insertSession(record, embedder, null, factSinkArg);
|
|
252
|
+
done.add(sid);
|
|
253
|
+
succeeded++;
|
|
254
|
+
processed++;
|
|
255
|
+
opts.onProgress?.(idx, total, sid, "ok");
|
|
256
|
+
if (succeeded % SAVE_EVERY === 0)
|
|
257
|
+
saveState(statePath, done, lane);
|
|
258
|
+
}
|
|
259
|
+
catch (e) {
|
|
260
|
+
failed++;
|
|
261
|
+
processed++;
|
|
262
|
+
log(`[reprocess] ingest failed ${sid}: ${e instanceof Error ? e.message : String(e)}`);
|
|
263
|
+
opts.onProgress?.(idx, total, sid, "ingest_failed");
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
saveState(statePath, done, lane);
|
|
267
|
+
const limitSkipped = opts.limit !== undefined ? candidates.length - work.length : 0;
|
|
268
|
+
return {
|
|
269
|
+
totalEligible: allCandidates.length,
|
|
270
|
+
processed,
|
|
271
|
+
succeeded,
|
|
272
|
+
failed,
|
|
273
|
+
skippedAlreadyDone: skippedByState,
|
|
274
|
+
limitSkipped,
|
|
275
|
+
belowFloorOverwrites,
|
|
276
|
+
meanConfidenceOld: countOld > 0 ? sumConfidenceOld / countOld : null,
|
|
277
|
+
meanConfidenceNew: countNew > 0 ? sumConfidenceNew / countNew : null,
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=reprocess.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reprocess.js","sourceRoot":"","sources":["../../../src/core/ingest/reprocess.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* transcript-derivables — post-classify scan of the raw transcript file for
|
|
3
|
+
* primary_model/total_tokens/skill (#352 phase 2, Task 5). Complements
|
|
4
|
+
* deriveSubagentMeta (Task 2), which derives persona/parent from the chunk's
|
|
5
|
+
* already-parsed runtimeSessionId + label; this scan needs the per-message
|
|
6
|
+
* `model` + `usage` + `tool_use` blocks the chunk parser summarizes away, so
|
|
7
|
+
* it re-reads the transcript file directly.
|
|
8
|
+
*
|
|
9
|
+
* v1 supports claude-code-jsonl only: assistant events carry `message.model`
|
|
10
|
+
* and `message.usage.{input,output}_tokens` (same fields
|
|
11
|
+
* claude-code.ts's parseSession already reads for `lastModel`); a Skill-tool
|
|
12
|
+
* invocation is a `content` block with `type: "tool_use"`, `name: "Skill"`,
|
|
13
|
+
* and `input.skill` holding the slug (e.g. "superpowers:brainstorming").
|
|
14
|
+
* Every other transcript kind returns all-null — no per-runtime scanner
|
|
15
|
+
* exists yet.
|
|
16
|
+
*
|
|
17
|
+
* Streamed line-by-line (readline over a ReadStream), never readFileSync:
|
|
18
|
+
* transcripts reach tens of MB and this runs on the ingest write path, not
|
|
19
|
+
* just backfill. A missing, unreadable, or rotated-away file resolves nulls
|
|
20
|
+
* rather than rejecting — never throws.
|
|
21
|
+
*/
|
|
22
|
+
export interface TranscriptDerivables {
|
|
23
|
+
readonly primaryModel: string | null;
|
|
24
|
+
readonly totalTokens: number | null;
|
|
25
|
+
readonly skill: string | null;
|
|
26
|
+
}
|
|
27
|
+
export declare function scanTranscriptDerivables(path: string, kind: string): Promise<TranscriptDerivables>;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* transcript-derivables — post-classify scan of the raw transcript file for
|
|
3
|
+
* primary_model/total_tokens/skill (#352 phase 2, Task 5). Complements
|
|
4
|
+
* deriveSubagentMeta (Task 2), which derives persona/parent from the chunk's
|
|
5
|
+
* already-parsed runtimeSessionId + label; this scan needs the per-message
|
|
6
|
+
* `model` + `usage` + `tool_use` blocks the chunk parser summarizes away, so
|
|
7
|
+
* it re-reads the transcript file directly.
|
|
8
|
+
*
|
|
9
|
+
* v1 supports claude-code-jsonl only: assistant events carry `message.model`
|
|
10
|
+
* and `message.usage.{input,output}_tokens` (same fields
|
|
11
|
+
* claude-code.ts's parseSession already reads for `lastModel`); a Skill-tool
|
|
12
|
+
* invocation is a `content` block with `type: "tool_use"`, `name: "Skill"`,
|
|
13
|
+
* and `input.skill` holding the slug (e.g. "superpowers:brainstorming").
|
|
14
|
+
* Every other transcript kind returns all-null — no per-runtime scanner
|
|
15
|
+
* exists yet.
|
|
16
|
+
*
|
|
17
|
+
* Streamed line-by-line (readline over a ReadStream), never readFileSync:
|
|
18
|
+
* transcripts reach tens of MB and this runs on the ingest write path, not
|
|
19
|
+
* just backfill. A missing, unreadable, or rotated-away file resolves nulls
|
|
20
|
+
* rather than rejecting — never throws.
|
|
21
|
+
*/
|
|
22
|
+
import { createReadStream } from "node:fs";
|
|
23
|
+
import { createInterface } from "node:readline";
|
|
24
|
+
const CLAUDE_CODE_JSONL_KIND = "claude-code-jsonl";
|
|
25
|
+
const NULL_DERIVABLES = {
|
|
26
|
+
primaryModel: null,
|
|
27
|
+
totalTokens: null,
|
|
28
|
+
skill: null,
|
|
29
|
+
};
|
|
30
|
+
export function scanTranscriptDerivables(path, kind) {
|
|
31
|
+
if (kind !== CLAUDE_CODE_JSONL_KIND)
|
|
32
|
+
return Promise.resolve(NULL_DERIVABLES);
|
|
33
|
+
return new Promise((resolve) => {
|
|
34
|
+
const modelCounts = new Map();
|
|
35
|
+
const modelLastSeenAt = new Map();
|
|
36
|
+
let lineNumber = 0;
|
|
37
|
+
let inputTokens = 0;
|
|
38
|
+
let outputTokens = 0;
|
|
39
|
+
let sawUsage = false;
|
|
40
|
+
let skill = null;
|
|
41
|
+
let settled = false;
|
|
42
|
+
const finish = (result) => {
|
|
43
|
+
if (settled)
|
|
44
|
+
return;
|
|
45
|
+
settled = true;
|
|
46
|
+
resolve(result);
|
|
47
|
+
};
|
|
48
|
+
let stream;
|
|
49
|
+
try {
|
|
50
|
+
stream = createReadStream(path, { encoding: "utf8" });
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Synchronous throw (e.g. malformed path) — most fs errors surface via
|
|
54
|
+
// the 'error' event below instead.
|
|
55
|
+
finish(NULL_DERIVABLES);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
// Missing/unreadable/rotated-away file — resolve nulls, never throw.
|
|
59
|
+
stream.on("error", () => finish(NULL_DERIVABLES));
|
|
60
|
+
const rl = createInterface({ input: stream, crlfDelay: Infinity });
|
|
61
|
+
rl.on("error", () => finish(NULL_DERIVABLES));
|
|
62
|
+
rl.on("line", (line) => {
|
|
63
|
+
const trimmed = line.trim();
|
|
64
|
+
if (!trimmed)
|
|
65
|
+
return;
|
|
66
|
+
lineNumber += 1;
|
|
67
|
+
let evt;
|
|
68
|
+
try {
|
|
69
|
+
evt = JSON.parse(trimmed);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (evt["type"] !== "assistant")
|
|
75
|
+
return;
|
|
76
|
+
const msg = evt["message"] ?? {};
|
|
77
|
+
const model = msg["model"];
|
|
78
|
+
if (typeof model === "string" && model) {
|
|
79
|
+
modelCounts.set(model, (modelCounts.get(model) ?? 0) + 1);
|
|
80
|
+
modelLastSeenAt.set(model, lineNumber);
|
|
81
|
+
}
|
|
82
|
+
const usage = msg["usage"];
|
|
83
|
+
if (usage && typeof usage === "object") {
|
|
84
|
+
const input = usage["input_tokens"];
|
|
85
|
+
const output = usage["output_tokens"];
|
|
86
|
+
if (typeof input === "number") {
|
|
87
|
+
inputTokens += input;
|
|
88
|
+
sawUsage = true;
|
|
89
|
+
}
|
|
90
|
+
if (typeof output === "number") {
|
|
91
|
+
outputTokens += output;
|
|
92
|
+
sawUsage = true;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (skill === null) {
|
|
96
|
+
const content = msg["content"];
|
|
97
|
+
if (Array.isArray(content)) {
|
|
98
|
+
for (const block of content) {
|
|
99
|
+
if (!block || typeof block !== "object")
|
|
100
|
+
continue;
|
|
101
|
+
const b = block;
|
|
102
|
+
if (b["type"] === "tool_use" && b["name"] === "Skill") {
|
|
103
|
+
const toolInput = b["input"];
|
|
104
|
+
const slug = toolInput?.["skill"];
|
|
105
|
+
if (typeof slug === "string" && slug)
|
|
106
|
+
skill = slug;
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
rl.on("close", () => {
|
|
114
|
+
finish({
|
|
115
|
+
primaryModel: majorityModel(modelCounts, modelLastSeenAt),
|
|
116
|
+
totalTokens: sawUsage ? inputTokens + outputTokens : null,
|
|
117
|
+
skill,
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
/** Majority wins by occurrence count; ties break to whichever model's last
|
|
123
|
+
* occurrence is chronologically latest in the transcript. */
|
|
124
|
+
function majorityModel(counts, lastSeenAt) {
|
|
125
|
+
let best = null;
|
|
126
|
+
let bestCount = -1;
|
|
127
|
+
let bestLastSeenAt = -1;
|
|
128
|
+
for (const [model, count] of counts) {
|
|
129
|
+
const lastSeen = lastSeenAt.get(model) ?? -1;
|
|
130
|
+
if (count > bestCount || (count === bestCount && lastSeen > bestLastSeenAt)) {
|
|
131
|
+
best = model;
|
|
132
|
+
bestCount = count;
|
|
133
|
+
bestLastSeenAt = lastSeen;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return best;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=transcript-derivables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript-derivables.js","sourceRoot":"","sources":["../../../src/core/ingest/transcript-derivables.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,8 +13,12 @@
|
|
|
13
13
|
* 'replaces' edges (BFS, depth-capped at 100)
|
|
14
14
|
* I4 every session_edges endpoint exists in sessions
|
|
15
15
|
* I5 at most one active fact per (subject, predicate); every superseded_by
|
|
16
|
-
* references an existing facts.id
|
|
16
|
+
* references an existing facts.id; superseded_by forms no cycle (I5c)
|
|
17
17
|
* I6 every non-null adapter_state.session_id references a sessions.id
|
|
18
|
+
* I7 every fact_embeddings row has a live (active, non-retired) parent fact
|
|
19
|
+
* I7b chunk-level ghost: every session_embedding_chunks row has a map entry
|
|
20
|
+
* (I7b-1); every session_chunk_map row references an existing session
|
|
21
|
+
* (I7b-2)
|
|
18
22
|
*/
|
|
19
23
|
import type Database from "better-sqlite3";
|
|
20
24
|
import type { Pool } from "pg";
|
|
@@ -36,6 +40,7 @@ export declare function runCheapChecksOnPg(pool: Pool): Promise<ReadonlyArray<Vi
|
|
|
36
40
|
export interface FixReport {
|
|
37
41
|
readonly deletedSelfLoops: number;
|
|
38
42
|
readonly restoredToClosed: number;
|
|
43
|
+
readonly deletedGhostEmbeddings: number;
|
|
39
44
|
}
|
|
40
45
|
export declare function applyFixOnSqlite(db: Database.Database): FixReport;
|
|
41
46
|
export declare function applyFixOnPg(pool: Pool): Promise<FixReport>;
|