nlm-memory 0.21.0 → 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 +67 -12
- package/assets/replay-eval-dark.svg +26 -0
- package/assets/replay-eval-light.svg +26 -0
- package/dist/cli/digest.js +34 -7
- package/dist/cli/digest.js.map +1 -1
- package/dist/cli/nlm.d.ts +14 -0
- package/dist/cli/nlm.js +450 -65
- package/dist/cli/nlm.js.map +1 -1
- package/dist/cli/reprocess-job-adapters.d.ts +35 -0
- package/dist/cli/reprocess-job-adapters.js +80 -0
- package/dist/cli/reprocess-job-adapters.js.map +1 -0
- package/dist/cli/scope-coverage.js +4 -1
- package/dist/cli/scope-coverage.js.map +1 -1
- package/dist/cli/supersede.js +8 -7
- package/dist/cli/supersede.js.map +1 -1
- package/dist/core/actions/actions-log.d.ts +65 -8
- package/dist/core/actions/actions-log.js +134 -17
- package/dist/core/actions/actions-log.js.map +1 -1
- package/dist/core/actions/overlay.d.ts +11 -2
- package/dist/core/actions/overlay.js +18 -6
- package/dist/core/actions/overlay.js.map +1 -1
- package/dist/core/adapters/from-source.js +11 -3
- package/dist/core/adapters/from-source.js.map +1 -1
- package/dist/core/adapters/fs-wiki-writer.d.ts +44 -0
- package/dist/core/adapters/fs-wiki-writer.js +132 -0
- package/dist/core/adapters/fs-wiki-writer.js.map +1 -0
- package/dist/core/adapters/hermes-agent.d.ts +15 -2
- package/dist/core/adapters/hermes-agent.js +57 -11
- package/dist/core/adapters/hermes-agent.js.map +1 -1
- package/dist/core/adapters/memory-wiki-writer.d.ts +8 -0
- package/dist/core/adapters/memory-wiki-writer.js +16 -0
- package/dist/core/adapters/memory-wiki-writer.js.map +1 -0
- package/dist/core/adapters/muse.d.ts +51 -0
- package/dist/core/adapters/muse.js +271 -0
- package/dist/core/adapters/muse.js.map +1 -0
- package/dist/core/adapters/opencode.d.ts +11 -4
- package/dist/core/adapters/opencode.js +41 -7
- package/dist/core/adapters/opencode.js.map +1 -1
- package/dist/core/alerts/alert-state.d.ts +17 -0
- package/dist/core/alerts/alert-state.js +45 -0
- package/dist/core/alerts/alert-state.js.map +1 -0
- package/dist/core/alerts/check-and-alert.d.ts +28 -0
- package/dist/core/alerts/check-and-alert.js +53 -0
- package/dist/core/alerts/check-and-alert.js.map +1 -0
- package/dist/core/alerts/drift-transition.d.ts +27 -0
- package/dist/core/alerts/drift-transition.js +56 -0
- package/dist/core/alerts/drift-transition.js.map +1 -0
- package/dist/core/alerts/embedder-transition.d.ts +23 -0
- package/dist/core/alerts/embedder-transition.js +40 -0
- package/dist/core/alerts/embedder-transition.js.map +1 -0
- package/dist/core/alerts/fire-alert.d.ts +24 -0
- package/dist/core/alerts/fire-alert.js +72 -0
- package/dist/core/alerts/fire-alert.js.map +1 -0
- package/dist/core/alerts/job-alert.d.ts +12 -0
- package/dist/core/alerts/job-alert.js +37 -0
- package/dist/core/alerts/job-alert.js.map +1 -0
- package/dist/core/alerts/types.d.ts +104 -0
- package/dist/core/alerts/types.js +11 -0
- package/dist/core/alerts/types.js.map +1 -0
- package/dist/core/alerts/wiki-alert.d.ts +15 -0
- package/dist/core/alerts/wiki-alert.js +31 -0
- package/dist/core/alerts/wiki-alert.js.map +1 -0
- package/dist/core/classifier/prompt.d.ts +13 -0
- package/dist/core/classifier/prompt.js +52 -2
- package/dist/core/classifier/prompt.js.map +1 -1
- package/dist/core/dataset/build-dataset.d.ts +16 -1
- package/dist/core/dataset/build-dataset.js +45 -13
- package/dist/core/dataset/build-dataset.js.map +1 -1
- package/dist/core/digest/compose.d.ts +8 -0
- package/dist/core/digest/compose.js +54 -0
- package/dist/core/digest/compose.js.map +1 -1
- package/dist/core/digest/hook-injection.d.ts +1 -1
- package/dist/core/digest/hook-injection.js +9 -1
- package/dist/core/digest/hook-injection.js.map +1 -1
- package/dist/core/digest/hook-version-parity.d.ts +31 -0
- package/dist/core/digest/hook-version-parity.js +56 -0
- package/dist/core/digest/hook-version-parity.js.map +1 -0
- package/dist/core/embedding/pg-embed-backfill.js +1 -1
- package/dist/core/embedding/pg-embed-backfill.js.map +1 -1
- package/dist/core/exemplars/capture-from-session.d.ts +1 -1
- package/dist/core/exemplars/capture-from-session.js +3 -3
- package/dist/core/exemplars/capture-from-session.js.map +1 -1
- package/dist/core/exemplars/embed-backfill.d.ts +9 -0
- package/dist/core/exemplars/embed-backfill.js +9 -1
- package/dist/core/exemplars/embed-backfill.js.map +1 -1
- package/dist/core/exemplars/recall-code.d.ts +1 -1
- package/dist/core/exemplars/recall-code.js +2 -2
- package/dist/core/exemplars/recall-code.js.map +1 -1
- package/dist/core/facts/backfill-facts.d.ts +1 -1
- package/dist/core/facts/backfill-facts.js +4 -4
- package/dist/core/facts/backfill-facts.js.map +1 -1
- package/dist/core/facts/embed-backfill.d.ts +54 -0
- package/dist/core/facts/embed-backfill.js +109 -0
- package/dist/core/facts/embed-backfill.js.map +1 -0
- package/dist/core/facts/reconcile-facts.d.ts +42 -0
- package/dist/core/facts/reconcile-facts.js +133 -0
- package/dist/core/facts/reconcile-facts.js.map +1 -0
- package/dist/core/health/embed-failure-state.d.ts +4 -0
- package/dist/core/health/embed-failure-state.js +12 -0
- package/dist/core/health/embed-failure-state.js.map +1 -0
- package/dist/core/health/warmup-retry.d.ts +27 -0
- package/dist/core/health/warmup-retry.js +53 -0
- package/dist/core/health/warmup-retry.js.map +1 -0
- package/dist/core/health/warmup-state.d.ts +15 -0
- package/dist/core/health/warmup-state.js +15 -1
- package/dist/core/health/warmup-state.js.map +1 -1
- package/dist/core/hook/cite-memo.d.ts +11 -7
- package/dist/core/hook/cite-memo.js +25 -17
- package/dist/core/hook/cite-memo.js.map +1 -1
- package/dist/core/hook/hook-log.d.ts +13 -2
- package/dist/core/hook/hook-log.js +16 -8
- package/dist/core/hook/hook-log.js.map +1 -1
- package/dist/core/hook/memo.d.ts +10 -6
- package/dist/core/hook/memo.js +25 -17
- package/dist/core/hook/memo.js.map +1 -1
- package/dist/core/hook/pointer-block.d.ts +8 -1
- package/dist/core/hook/pointer-block.js +17 -4
- package/dist/core/hook/pointer-block.js.map +1 -1
- package/dist/core/hook/resolve-conversation-by-query.d.ts +6 -5
- package/dist/core/hook/resolve-conversation-by-query.js +24 -12
- package/dist/core/hook/resolve-conversation-by-query.js.map +1 -1
- package/dist/core/ingest/ingest-session.d.ts +1 -1
- package/dist/core/ingest/ingest-session.js +3 -3
- package/dist/core/ingest/ingest-session.js.map +1 -1
- package/dist/core/ingest/reclassify-oversized.d.ts +1 -1
- package/dist/core/ingest/reclassify-oversized.js +2 -2
- package/dist/core/ingest/reclassify-oversized.js.map +1 -1
- package/dist/core/ingest/reprocess.d.ts +1 -1
- package/dist/core/ingest/reprocess.js +2 -2
- package/dist/core/ingest/reprocess.js.map +1 -1
- package/dist/core/jobs/job-supervisor.d.ts +168 -0
- package/dist/core/jobs/job-supervisor.js +335 -0
- package/dist/core/jobs/job-supervisor.js.map +1 -0
- package/dist/core/learner/model.d.ts +63 -0
- package/dist/core/learner/model.js +30 -0
- package/dist/core/learner/model.js.map +1 -0
- package/dist/core/learner/service.d.ts +42 -0
- package/dist/core/learner/service.js +74 -0
- package/dist/core/learner/service.js.map +1 -0
- package/dist/core/learner/summary.d.ts +28 -0
- package/dist/core/learner/summary.js +70 -0
- package/dist/core/learner/summary.js.map +1 -0
- package/dist/core/learner/validate.d.ts +18 -0
- package/dist/core/learner/validate.js +95 -0
- package/dist/core/learner/validate.js.map +1 -0
- package/dist/core/metrics/re-derivation.d.ts +31 -2
- package/dist/core/metrics/re-derivation.js +36 -4
- package/dist/core/metrics/re-derivation.js.map +1 -1
- package/dist/core/outcome/coverage.d.ts +1 -1
- package/dist/core/outcome/coverage.js +2 -2
- package/dist/core/outcome/coverage.js.map +1 -1
- package/dist/core/outcome/rollup.d.ts +1 -1
- package/dist/core/outcome/rollup.js +4 -4
- package/dist/core/outcome/rollup.js.map +1 -1
- package/dist/core/providers/provider-registry.d.ts +40 -23
- package/dist/core/providers/provider-registry.js +99 -81
- package/dist/core/providers/provider-registry.js.map +1 -1
- package/dist/core/recall/citation-log.d.ts +10 -5
- package/dist/core/recall/citation-log.js +21 -10
- package/dist/core/recall/citation-log.js.map +1 -1
- package/dist/core/recall/hook-recall-log.d.ts +5 -2
- package/dist/core/recall/hook-recall-log.js +12 -6
- package/dist/core/recall/hook-recall-log.js.map +1 -1
- package/dist/core/recall/miss-log.d.ts +7 -4
- package/dist/core/recall/miss-log.js +18 -11
- package/dist/core/recall/miss-log.js.map +1 -1
- package/dist/core/recall/query-log.d.ts +8 -5
- package/dist/core/recall/query-log.js +16 -9
- package/dist/core/recall/query-log.js.map +1 -1
- package/dist/core/recall/recall-service.d.ts +10 -1
- package/dist/core/recall/recall-service.js +31 -12
- package/dist/core/recall/recall-service.js.map +1 -1
- package/dist/core/recall/recent-log.d.ts +6 -1
- package/dist/core/recall/recent-log.js +13 -5
- package/dist/core/recall/recent-log.js.map +1 -1
- package/dist/core/recall/related-concepts.d.ts +29 -0
- package/dist/core/recall/related-concepts.js +67 -0
- package/dist/core/recall/related-concepts.js.map +1 -0
- package/dist/core/recall/related-exemplars.d.ts +1 -1
- package/dist/core/recall/related-exemplars.js +2 -2
- package/dist/core/recall/related-exemplars.js.map +1 -1
- package/dist/core/recall/related-facts.d.ts +1 -1
- package/dist/core/recall/related-facts.js +3 -3
- package/dist/core/recall/related-facts.js.map +1 -1
- package/dist/core/recall-facts/fact-query-log.d.ts +8 -4
- package/dist/core/recall-facts/fact-query-log.js +16 -8
- package/dist/core/recall-facts/fact-query-log.js.map +1 -1
- package/dist/core/recall-facts/fact-recall-service.d.ts +2 -2
- package/dist/core/recall-facts/fact-recall-service.js +12 -12
- package/dist/core/recall-facts/fact-recall-service.js.map +1 -1
- package/dist/core/scheduler/scan-once.js +15 -14
- package/dist/core/scheduler/scan-once.js.map +1 -1
- package/dist/core/scheduler/scheduler.d.ts +3 -0
- package/dist/core/scheduler/scheduler.js +15 -11
- package/dist/core/scheduler/scheduler.js.map +1 -1
- package/dist/core/signals/failure-mode-recall.d.ts +1 -1
- package/dist/core/signals/failure-mode-recall.js +2 -2
- package/dist/core/signals/failure-mode-recall.js.map +1 -1
- package/dist/core/signals/stamp-scope.d.ts +2 -2
- package/dist/core/signals/stamp-scope.js +2 -2
- package/dist/core/signals/stamp-scope.js.map +1 -1
- package/dist/core/sources/source-registry.d.ts +49 -28
- package/dist/core/sources/source-registry.js +113 -70
- package/dist/core/sources/source-registry.js.map +1 -1
- package/dist/core/storage/pg-code-exemplar-store.d.ts +19 -10
- package/dist/core/storage/pg-code-exemplar-store.js +58 -27
- package/dist/core/storage/pg-code-exemplar-store.js.map +1 -1
- package/dist/core/storage/pg-entity-store.d.ts +6 -1
- package/dist/core/storage/pg-entity-store.js +33 -18
- package/dist/core/storage/pg-entity-store.js.map +1 -1
- package/dist/core/storage/pg-fact-ingest.d.ts +1 -1
- package/dist/core/storage/pg-fact-ingest.js +10 -7
- package/dist/core/storage/pg-fact-ingest.js.map +1 -1
- package/dist/core/storage/pg-fact-store.d.ts +29 -17
- package/dist/core/storage/pg-fact-store.js +99 -46
- package/dist/core/storage/pg-fact-store.js.map +1 -1
- package/dist/core/storage/pg-learner-store.d.ts +27 -0
- package/dist/core/storage/pg-learner-store.js +174 -0
- package/dist/core/storage/pg-learner-store.js.map +1 -0
- package/dist/core/storage/pg-session-store.d.ts +24 -20
- package/dist/core/storage/pg-session-store.js +162 -90
- package/dist/core/storage/pg-session-store.js.map +1 -1
- package/dist/core/storage/pg-signal-store.d.ts +10 -5
- package/dist/core/storage/pg-signal-store.js +24 -12
- package/dist/core/storage/pg-signal-store.js.map +1 -1
- package/dist/core/storage/pg-storage.d.ts +4 -0
- package/dist/core/storage/pg-storage.js +6 -0
- package/dist/core/storage/pg-storage.js.map +1 -1
- package/dist/core/storage/pg-workstream-store.d.ts +16 -11
- package/dist/core/storage/pg-workstream-store.js +46 -29
- package/dist/core/storage/pg-workstream-store.js.map +1 -1
- package/dist/core/storage/sqlite-code-exemplar-store.d.ts +24 -10
- package/dist/core/storage/sqlite-code-exemplar-store.js +84 -40
- package/dist/core/storage/sqlite-code-exemplar-store.js.map +1 -1
- package/dist/core/storage/sqlite-entity-store.d.ts +8 -1
- package/dist/core/storage/sqlite-entity-store.js +46 -27
- package/dist/core/storage/sqlite-entity-store.js.map +1 -1
- package/dist/core/storage/sqlite-fact-store.d.ts +45 -19
- package/dist/core/storage/sqlite-fact-store.js +172 -64
- package/dist/core/storage/sqlite-fact-store.js.map +1 -1
- package/dist/core/storage/sqlite-learner-store.d.ts +33 -0
- package/dist/core/storage/sqlite-learner-store.js +178 -0
- package/dist/core/storage/sqlite-learner-store.js.map +1 -0
- package/dist/core/storage/sqlite-outcome-store.d.ts +37 -22
- package/dist/core/storage/sqlite-outcome-store.js +90 -37
- package/dist/core/storage/sqlite-outcome-store.js.map +1 -1
- package/dist/core/storage/sqlite-session-store.d.ts +29 -20
- package/dist/core/storage/sqlite-session-store.js +207 -121
- package/dist/core/storage/sqlite-session-store.js.map +1 -1
- package/dist/core/storage/sqlite-signal-store.d.ts +12 -5
- package/dist/core/storage/sqlite-signal-store.js +27 -15
- package/dist/core/storage/sqlite-signal-store.js.map +1 -1
- package/dist/core/storage/sqlite-storage.d.ts +4 -0
- package/dist/core/storage/sqlite-storage.js +10 -2
- package/dist/core/storage/sqlite-storage.js.map +1 -1
- package/dist/core/storage/sqlite-workstream-store.d.ts +16 -11
- package/dist/core/storage/sqlite-workstream-store.js +52 -31
- package/dist/core/storage/sqlite-workstream-store.js.map +1 -1
- package/dist/core/storage/supersedence-log.d.ts +10 -7
- package/dist/core/storage/supersedence-log.js +19 -14
- package/dist/core/storage/supersedence-log.js.map +1 -1
- package/dist/core/tenancy/default-team.d.ts +6 -0
- package/dist/core/tenancy/default-team.js +7 -0
- package/dist/core/tenancy/default-team.js.map +1 -0
- package/dist/core/tenancy/hosted-mode.d.ts +9 -0
- package/dist/core/tenancy/hosted-mode.js +12 -0
- package/dist/core/tenancy/hosted-mode.js.map +1 -0
- package/dist/core/tenancy/team-auth.d.ts +16 -0
- package/dist/core/tenancy/team-auth.js +22 -0
- package/dist/core/tenancy/team-auth.js.map +1 -0
- package/dist/core/tenancy/team-token-store.d.ts +45 -0
- package/dist/core/tenancy/team-token-store.js +52 -0
- package/dist/core/tenancy/team-token-store.js.map +1 -0
- package/dist/core/tenancy/tenant-clause.d.ts +37 -0
- package/dist/core/tenancy/tenant-clause.js +11 -0
- package/dist/core/tenancy/tenant-clause.js.map +1 -0
- package/dist/core/tenancy/tenant-state-path.d.ts +28 -0
- package/dist/core/tenancy/tenant-state-path.js +49 -0
- package/dist/core/tenancy/tenant-state-path.js.map +1 -0
- package/dist/core/wiki/project.d.ts +17 -0
- package/dist/core/wiki/project.js +37 -0
- package/dist/core/wiki/project.js.map +1 -0
- package/dist/core/wiki/reconcile.d.ts +15 -0
- package/dist/core/wiki/reconcile.js +14 -0
- package/dist/core/wiki/reconcile.js.map +1 -0
- package/dist/core/wiki/render.d.ts +5 -0
- package/dist/core/wiki/render.js +84 -0
- package/dist/core/wiki/render.js.map +1 -0
- package/dist/core/wiki/rollup.d.ts +28 -0
- package/dist/core/wiki/rollup.js +91 -0
- package/dist/core/wiki/rollup.js.map +1 -0
- package/dist/core/wiki/select.d.ts +8 -0
- package/dist/core/wiki/select.js +7 -0
- package/dist/core/wiki/select.js.map +1 -0
- package/dist/core/wiki/slug.d.ts +36 -0
- package/dist/core/wiki/slug.js +71 -0
- package/dist/core/wiki/slug.js.map +1 -0
- package/dist/core/wiki/types.d.ts +37 -0
- package/dist/core/wiki/types.js +2 -0
- package/dist/core/wiki/types.js.map +1 -0
- package/dist/core/work-digest/build-work-digest.d.ts +1 -1
- package/dist/core/work-digest/build-work-digest.js +3 -3
- package/dist/core/work-digest/build-work-digest.js.map +1 -1
- package/dist/core/workstream/bind.d.ts +1 -1
- package/dist/core/workstream/bind.js +10 -10
- package/dist/core/workstream/bind.js.map +1 -1
- package/dist/core/workstream/rollup.d.ts +1 -1
- package/dist/core/workstream/rollup.js +6 -6
- package/dist/core/workstream/rollup.js.map +1 -1
- package/dist/hook/hook-helpers.d.ts +14 -0
- package/dist/hook/hook-helpers.js +29 -2
- package/dist/hook/hook-helpers.js.map +1 -1
- package/dist/hook/pre-compact-hook.js +6 -4
- package/dist/hook/pre-compact-hook.js.map +1 -1
- package/dist/hook/prompt-recall-hook.d.ts +5 -2
- package/dist/hook/prompt-recall-hook.js +28 -17
- package/dist/hook/prompt-recall-hook.js.map +1 -1
- package/dist/hook/recall-over-http.d.ts +27 -3
- package/dist/hook/recall-over-http.js +44 -11
- package/dist/hook/recall-over-http.js.map +1 -1
- package/dist/hook/session-end-hook.js +7 -5
- package/dist/hook/session-end-hook.js.map +1 -1
- package/dist/hook/session-start-hook.d.ts +14 -1
- package/dist/hook/session-start-hook.js +55 -15
- package/dist/hook/session-start-hook.js.map +1 -1
- package/dist/hook/stop-hook.js +9 -7
- package/dist/hook/stop-hook.js.map +1 -1
- package/dist/http/app.d.ts +41 -3
- package/dist/http/app.js +355 -96
- package/dist/http/app.js.map +1 -1
- package/dist/install/claude-code.d.ts +17 -0
- package/dist/install/claude-code.js +44 -5
- package/dist/install/claude-code.js.map +1 -1
- package/dist/install/codex.d.ts +23 -2
- package/dist/install/codex.js +111 -14
- package/dist/install/codex.js.map +1 -1
- package/dist/install/cursor.d.ts +2 -2
- package/dist/install/cursor.js +7 -7
- package/dist/install/cursor.js.map +1 -1
- package/dist/install/hermes.d.ts +8 -0
- package/dist/install/hermes.js +28 -5
- package/dist/install/hermes.js.map +1 -1
- package/dist/install/local-source.d.ts +20 -0
- package/dist/install/local-source.js +28 -0
- package/dist/install/local-source.js.map +1 -0
- package/dist/install/mcp-block.d.ts +77 -0
- package/dist/install/mcp-block.js +99 -0
- package/dist/install/mcp-block.js.map +1 -0
- package/dist/install/pi.d.ts +26 -0
- package/dist/install/pi.js +43 -0
- package/dist/install/pi.js.map +1 -1
- package/dist/install/setup.js +6 -0
- package/dist/install/setup.js.map +1 -1
- package/dist/install/windsurf.d.ts +2 -2
- package/dist/install/windsurf.js +7 -7
- package/dist/install/windsurf.js.map +1 -1
- package/dist/llm/classifier-box.d.ts +5 -0
- package/dist/llm/classifier-box.js +5 -0
- package/dist/llm/classifier-box.js.map +1 -1
- package/dist/mcp/server.d.ts +73 -16
- package/dist/mcp/server.js +306 -83
- package/dist/mcp/server.js.map +1 -1
- package/dist/ports/clock.d.ts +12 -0
- package/dist/ports/clock.js +10 -0
- package/dist/ports/clock.js.map +1 -0
- package/dist/ports/code-exemplar-store.d.ts +13 -13
- package/dist/ports/entity-store.d.ts +5 -1
- package/dist/ports/fact-store.d.ts +0 -0
- package/dist/ports/fact-store.js +0 -0
- package/dist/ports/fact-store.js.map +1 -1
- package/dist/ports/learner-store.d.ts +80 -0
- package/dist/ports/learner-store.js +19 -0
- package/dist/ports/learner-store.js.map +1 -0
- package/dist/ports/outcome.d.ts +3 -3
- package/dist/ports/session-store.d.ts +20 -14
- package/dist/ports/session-store.js +5 -0
- package/dist/ports/session-store.js.map +1 -1
- package/dist/ports/signal-store.d.ts +12 -8
- package/dist/ports/spawn-child.d.ts +14 -0
- package/dist/ports/spawn-child.js +10 -0
- package/dist/ports/spawn-child.js.map +1 -0
- package/dist/ports/storage.d.ts +6 -0
- package/dist/ports/transcript-adapter.d.ts +11 -0
- package/dist/ports/wiki-writer.d.ts +19 -0
- package/dist/ports/wiki-writer.js +12 -0
- package/dist/ports/wiki-writer.js.map +1 -0
- package/dist/ports/workstream-store.d.ts +19 -12
- package/dist/shared/types.d.ts +22 -0
- package/dist/shared/types.js.map +1 -1
- package/dist/shared/version.d.ts +9 -0
- package/dist/shared/version.js +11 -0
- package/dist/shared/version.js.map +1 -0
- package/dist/ui/assets/index-D6F3xAis.js +11 -0
- package/dist/ui/index.html +1 -1
- package/migrations/033_actions_kind_check.sql +58 -0
- package/migrations/034_tenancy_teams_and_stamps.sql +40 -0
- package/migrations/035_tenancy_entity_rekey.sql +75 -0
- package/migrations/036_tenant_name_uniqueness.sql +59 -0
- package/migrations/037_sessions_covering_index.sql +25 -0
- package/migrations/038_sources_muse.sql +33 -0
- package/migrations/039_learner_evidence.sql +51 -0
- package/migrations/pg/033_actions_kind_check.sql +17 -0
- package/migrations/pg/034_tenancy.sql +77 -0
- package/migrations/pg/035_tenant_name_uniqueness.sql +15 -0
- package/migrations/pg/036_sources_muse.sql +12 -0
- package/migrations/pg/037_learner_evidence.sql +55 -0
- package/nlm/index.js +246 -55
- package/package.json +10 -5
- package/plugin/.codex-plugin/plugin.json +2 -2
- package/plugin/scripts/prompt-recall-hook.mjs +244 -55
- package/plugin/scripts/session-start-hook.mjs +273 -53
- package/plugin/scripts/stop-hook.mjs +195 -37
- package/dist/ui/assets/index-CSaBtgXD.js +0 -11
|
@@ -7,6 +7,15 @@
|
|
|
7
7
|
* Shared by buildDataset (UI projection) and SqliteSessionStore (recall
|
|
8
8
|
* path), so the same overlay drives both surfaces. Append-only; every
|
|
9
9
|
* mutation lives as a row in `actions`.
|
|
10
|
+
*
|
|
11
|
+
* Tenancy (program spec §4.6 hardening 1, M2 plan Wave B6): `actions` has no
|
|
12
|
+
* tenant_id column (see `@core/actions/actions-log.ts`'s module doc comment
|
|
13
|
+
* for the full mechanism/rationale). `loadActionOverlay`/`loadActionOverlayPg`
|
|
14
|
+
* reuse the same subject-resolvability predicate so an overlay entry keyed
|
|
15
|
+
* by an entity canonical or session-derived id that collides across tenants
|
|
16
|
+
* (the fixture's adversarial shared-entity case) never applies to the wrong
|
|
17
|
+
* tenant's projection — e.g. team B retiring their own "shared-entity" must
|
|
18
|
+
* never mark team A's distinct "shared-entity" row retired too.
|
|
10
19
|
*/
|
|
11
20
|
import type Database from "better-sqlite3";
|
|
12
21
|
import type { Pool } from "pg";
|
|
@@ -49,8 +58,8 @@ export declare const EMPTY_OVERLAY: ActionOverlay;
|
|
|
49
58
|
* loaders so the projection logic is shared and not duplicated per backend.
|
|
50
59
|
*/
|
|
51
60
|
export declare function reduceActionRows(rows: ReadonlyArray<ActionRow>): ActionOverlay;
|
|
52
|
-
export declare function loadActionOverlay(db: Database.Database): ActionOverlay;
|
|
53
|
-
export declare function loadActionOverlayPg(pool: Pool): Promise<ActionOverlay>;
|
|
61
|
+
export declare function loadActionOverlay(db: Database.Database, tenantId: string): ActionOverlay;
|
|
62
|
+
export declare function loadActionOverlayPg(pool: Pool, tenantId: string): Promise<ActionOverlay>;
|
|
54
63
|
/**
|
|
55
64
|
* Stable id for an open question: `${sessionId}::${hash12(text)}`. Both
|
|
56
65
|
* sides (overlay creators and consumers) compute it the same way so action
|
|
@@ -7,7 +7,17 @@
|
|
|
7
7
|
* Shared by buildDataset (UI projection) and SqliteSessionStore (recall
|
|
8
8
|
* path), so the same overlay drives both surfaces. Append-only; every
|
|
9
9
|
* mutation lives as a row in `actions`.
|
|
10
|
+
*
|
|
11
|
+
* Tenancy (program spec §4.6 hardening 1, M2 plan Wave B6): `actions` has no
|
|
12
|
+
* tenant_id column (see `@core/actions/actions-log.ts`'s module doc comment
|
|
13
|
+
* for the full mechanism/rationale). `loadActionOverlay`/`loadActionOverlayPg`
|
|
14
|
+
* reuse the same subject-resolvability predicate so an overlay entry keyed
|
|
15
|
+
* by an entity canonical or session-derived id that collides across tenants
|
|
16
|
+
* (the fixture's adversarial shared-entity case) never applies to the wrong
|
|
17
|
+
* tenant's projection — e.g. team B retiring their own "shared-entity" must
|
|
18
|
+
* never mark team A's distinct "shared-entity" row retired too.
|
|
10
19
|
*/
|
|
20
|
+
import { subjectTenantPredicate, subjectTenantPredicatePg } from "./actions-log.js";
|
|
11
21
|
export const EMPTY_OVERLAY = {
|
|
12
22
|
dismissedAlerts: new Set(),
|
|
13
23
|
snoozedAlerts: new Map(),
|
|
@@ -110,29 +120,31 @@ export function reduceActionRows(rows) {
|
|
|
110
120
|
}
|
|
111
121
|
return overlay;
|
|
112
122
|
}
|
|
113
|
-
export function loadActionOverlay(db) {
|
|
123
|
+
export function loadActionOverlay(db, tenantId) {
|
|
114
124
|
const hasActions = db
|
|
115
125
|
.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='actions'")
|
|
116
126
|
.get();
|
|
117
127
|
if (!hasActions)
|
|
118
128
|
return EMPTY_OVERLAY;
|
|
129
|
+
const pred = subjectTenantPredicate(tenantId);
|
|
119
130
|
// ORDER BY id keeps reducer deterministic: later writes overwrite earlier
|
|
120
131
|
// ones, so the latest non-reverted rename per subject wins.
|
|
121
132
|
const rows = db
|
|
122
133
|
.prepare(`
|
|
123
134
|
SELECT kind, subject_type, subject_id, payload
|
|
124
135
|
FROM actions
|
|
125
|
-
WHERE reverted_by IS NULL
|
|
136
|
+
WHERE reverted_by IS NULL AND ${pred.sql}
|
|
126
137
|
ORDER BY id
|
|
127
138
|
`)
|
|
128
|
-
.all();
|
|
139
|
+
.all(...pred.params);
|
|
129
140
|
return reduceActionRows(rows);
|
|
130
141
|
}
|
|
131
|
-
export async function loadActionOverlayPg(pool) {
|
|
142
|
+
export async function loadActionOverlayPg(pool, tenantId) {
|
|
143
|
+
const pred = subjectTenantPredicatePg(tenantId, 1);
|
|
132
144
|
const result = await pool.query(`SELECT kind, subject_type, subject_id, payload
|
|
133
145
|
FROM actions
|
|
134
|
-
WHERE reverted_by IS NULL
|
|
135
|
-
ORDER BY id
|
|
146
|
+
WHERE reverted_by IS NULL AND ${pred.sql}
|
|
147
|
+
ORDER BY id`, pred.params);
|
|
136
148
|
return reduceActionRows(result.rows);
|
|
137
149
|
}
|
|
138
150
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overlay.js","sourceRoot":"","sources":["../../../src/core/actions/overlay.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"overlay.js","sourceRoot":"","sources":["../../../src/core/actions/overlay.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@ import { CursorAdapter } from "./cursor.js";
|
|
|
13
13
|
import { HermesAdapter } from "./hermes.js";
|
|
14
14
|
import { HermesAgentAdapter } from "./hermes-agent.js";
|
|
15
15
|
import { JsonlGenericAdapter } from "./jsonl-generic.js";
|
|
16
|
+
import { MuseAdapter } from "./muse.js";
|
|
16
17
|
import { OpenCodeAdapter } from "./opencode.js";
|
|
17
18
|
import { PiAdapter } from "./pi.js";
|
|
18
19
|
import { WindsurfAdapter } from "./windsurf.js";
|
|
@@ -38,10 +39,17 @@ export function adapterFromSource(source) {
|
|
|
38
39
|
return source.pathOrUrl
|
|
39
40
|
? new HermesAdapter({ sessionsPath: source.pathOrUrl })
|
|
40
41
|
: new HermesAdapter();
|
|
41
|
-
case "hermes-agent":
|
|
42
|
+
case "hermes-agent": {
|
|
43
|
+
const exclude = source.parseConfig["excludeSources"];
|
|
44
|
+
return new HermesAgentAdapter({
|
|
45
|
+
...(source.pathOrUrl ? { dbPath: source.pathOrUrl } : {}),
|
|
46
|
+
...(Array.isArray(exclude) ? { excludeSources: exclude.filter((x) => typeof x === "string") } : {}),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
case "muse":
|
|
42
50
|
return source.pathOrUrl
|
|
43
|
-
? new
|
|
44
|
-
: new
|
|
51
|
+
? new MuseAdapter({ sessionsPath: source.pathOrUrl })
|
|
52
|
+
: new MuseAdapter();
|
|
45
53
|
case "opencode":
|
|
46
54
|
return source.pathOrUrl
|
|
47
55
|
? new OpenCodeAdapter({ dbPath: source.pathOrUrl })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"from-source.js","sourceRoot":"","sources":["../../../src/core/adapters/from-source.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAA2B,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,UAAU,iBAAiB,CAAC,MAAiB;IACjD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,OAAO;YACV,OAAO,MAAM,CAAC,SAAS;gBACrB,CAAC,CAAC,IAAI,YAAY,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;gBACrD,CAAC,CAAC,IAAI,YAAY,EAAE,CAAC;QACzB,KAAK,aAAa;YAChB,OAAO,MAAM,CAAC,SAAS;gBACrB,CAAC,CAAC,IAAI,iBAAiB,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;gBAC3D,CAAC,CAAC,IAAI,iBAAiB,EAAE,CAAC;QAC9B,KAAK,OAAO;YACV,OAAO,MAAM,CAAC,SAAS;gBACrB,CAAC,CAAC,IAAI,YAAY,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;gBACtD,CAAC,CAAC,IAAI,YAAY,EAAE,CAAC;QACzB,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC,SAAS;gBACrB,CAAC,CAAC,IAAI,aAAa,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;gBACjD,CAAC,CAAC,IAAI,aAAa,EAAE,CAAC;QAC1B,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC,SAAS;gBACrB,CAAC,CAAC,IAAI,aAAa,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;gBACvD,CAAC,CAAC,IAAI,aAAa,EAAE,CAAC;QAC1B,KAAK,cAAc;
|
|
1
|
+
{"version":3,"file":"from-source.js","sourceRoot":"","sources":["../../../src/core/adapters/from-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { WikiWriter } from "../../ports/wiki-writer.js";
|
|
2
|
+
export declare const SENTINEL_FILE = "AGENTS.md";
|
|
3
|
+
/**
|
|
4
|
+
* Adoption requires this marker inside the sentinel body, not just the
|
|
5
|
+
* sentinel's filename. AGENTS.md is now a widely used human/agent
|
|
6
|
+
* convention file on its own, so a directory holding someone else's
|
|
7
|
+
* AGENTS.md alongside their own notes must be refused, not silently
|
|
8
|
+
* adopted and later garbage-collected by reconcile.
|
|
9
|
+
*/
|
|
10
|
+
export declare const SENTINEL_MARKER = "<!-- nlm-generated-wiki -->";
|
|
11
|
+
export declare class WikiOwnershipError extends Error {
|
|
12
|
+
constructor(message: string);
|
|
13
|
+
}
|
|
14
|
+
export declare class FsWikiWriter implements WikiWriter {
|
|
15
|
+
private readonly root;
|
|
16
|
+
private ensured;
|
|
17
|
+
constructor(root: string);
|
|
18
|
+
private resolveWithin;
|
|
19
|
+
/**
|
|
20
|
+
* Runs the expensive adoption scan once per instance, then writes the
|
|
21
|
+
* sentinel so the root is provably owned before any content write. The
|
|
22
|
+
* scan itself is not repeated on later calls — that cost is paid once per
|
|
23
|
+
* writer, matching the daemon's one-writer-per-run lifecycle.
|
|
24
|
+
*/
|
|
25
|
+
private ensureOwned;
|
|
26
|
+
/**
|
|
27
|
+
* Adoption-time check only: a sentinel FILE named AGENTS.md is not enough
|
|
28
|
+
* evidence of ownership on its own, since that filename is now a common
|
|
29
|
+
* human/agent convention file a directory might carry for unrelated
|
|
30
|
+
* reasons. Its BODY must also carry SENTINEL_MARKER.
|
|
31
|
+
*/
|
|
32
|
+
private hasMarkedSentinel;
|
|
33
|
+
/**
|
|
34
|
+
* Cheap re-check for every destructive call after the one-time adoption
|
|
35
|
+
* scan. If a human deletes the sentinel mid-run, this is what stops the
|
|
36
|
+
* rest of that run's writes and removes rather than trusting the stale
|
|
37
|
+
* `ensured` latch.
|
|
38
|
+
*/
|
|
39
|
+
private verifySentinelPresent;
|
|
40
|
+
write(relPath: string, content: string): Promise<void>;
|
|
41
|
+
read(relPath: string): Promise<string | null>;
|
|
42
|
+
remove(relPath: string): Promise<void>;
|
|
43
|
+
list(): Promise<ReadonlyArray<string>>;
|
|
44
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filesystem WikiWriter.
|
|
3
|
+
*
|
|
4
|
+
* The ownership check is the load-bearing part. NLM regenerates this tree and
|
|
5
|
+
* deletes files that no longer qualify, so pointing it at a directory a human
|
|
6
|
+
* writes into would destroy their work. A root is writable only when it is
|
|
7
|
+
* absent, empty, or already carries this writer's sentinel. Adoption of a
|
|
8
|
+
* directory holding any other entry is refused, and that includes
|
|
9
|
+
* subdirectories: a nested folder is evidence of a human layout, not of a
|
|
10
|
+
* prior run, because this writer never creates one.
|
|
11
|
+
*/
|
|
12
|
+
import { mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync, existsSync } from "node:fs";
|
|
13
|
+
import { join, resolve, relative, isAbsolute } from "node:path";
|
|
14
|
+
export const SENTINEL_FILE = "AGENTS.md";
|
|
15
|
+
/**
|
|
16
|
+
* Adoption requires this marker inside the sentinel body, not just the
|
|
17
|
+
* sentinel's filename. AGENTS.md is now a widely used human/agent
|
|
18
|
+
* convention file on its own, so a directory holding someone else's
|
|
19
|
+
* AGENTS.md alongside their own notes must be refused, not silently
|
|
20
|
+
* adopted and later garbage-collected by reconcile.
|
|
21
|
+
*/
|
|
22
|
+
export const SENTINEL_MARKER = "<!-- nlm-generated-wiki -->";
|
|
23
|
+
export class WikiOwnershipError extends Error {
|
|
24
|
+
constructor(message) {
|
|
25
|
+
super(message);
|
|
26
|
+
this.name = "WikiOwnershipError";
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export class FsWikiWriter {
|
|
30
|
+
root;
|
|
31
|
+
ensured = false;
|
|
32
|
+
constructor(root) {
|
|
33
|
+
this.root = resolve(root);
|
|
34
|
+
}
|
|
35
|
+
resolveWithin(relPath) {
|
|
36
|
+
const full = resolve(this.root, relPath);
|
|
37
|
+
const rel = relative(this.root, full);
|
|
38
|
+
if (rel === "" || rel.startsWith("..") || isAbsolute(rel)) {
|
|
39
|
+
throw new WikiOwnershipError(`path escapes the wiki root: ${relPath}`);
|
|
40
|
+
}
|
|
41
|
+
return full;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Runs the expensive adoption scan once per instance, then writes the
|
|
45
|
+
* sentinel so the root is provably owned before any content write. The
|
|
46
|
+
* scan itself is not repeated on later calls — that cost is paid once per
|
|
47
|
+
* writer, matching the daemon's one-writer-per-run lifecycle.
|
|
48
|
+
*/
|
|
49
|
+
ensureOwned() {
|
|
50
|
+
if (this.ensured) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (!existsSync(this.root)) {
|
|
54
|
+
mkdirSync(this.root, { recursive: true });
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
const entries = readdirSync(this.root);
|
|
58
|
+
if (entries.length > 0 && !this.hasMarkedSentinel(entries)) {
|
|
59
|
+
throw new WikiOwnershipError(`refusing to write into ${this.root}: it holds ${entries.length} entr` +
|
|
60
|
+
`${entries.length === 1 ? "y" : "ies"} and no ${SENTINEL_FILE} carrying the ` +
|
|
61
|
+
`NLM marker, so it is not a directory NLM owns`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const sentinel = join(this.root, SENTINEL_FILE);
|
|
65
|
+
if (!existsSync(sentinel)) {
|
|
66
|
+
writeFileSync(sentinel, SENTINEL_BODY, "utf8");
|
|
67
|
+
}
|
|
68
|
+
this.ensured = true;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Adoption-time check only: a sentinel FILE named AGENTS.md is not enough
|
|
72
|
+
* evidence of ownership on its own, since that filename is now a common
|
|
73
|
+
* human/agent convention file a directory might carry for unrelated
|
|
74
|
+
* reasons. Its BODY must also carry SENTINEL_MARKER.
|
|
75
|
+
*/
|
|
76
|
+
hasMarkedSentinel(entries) {
|
|
77
|
+
if (!entries.includes(SENTINEL_FILE))
|
|
78
|
+
return false;
|
|
79
|
+
const body = readFileSync(join(this.root, SENTINEL_FILE), "utf8");
|
|
80
|
+
return body.includes(SENTINEL_MARKER);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Cheap re-check for every destructive call after the one-time adoption
|
|
84
|
+
* scan. If a human deletes the sentinel mid-run, this is what stops the
|
|
85
|
+
* rest of that run's writes and removes rather than trusting the stale
|
|
86
|
+
* `ensured` latch.
|
|
87
|
+
*/
|
|
88
|
+
verifySentinelPresent() {
|
|
89
|
+
if (!existsSync(join(this.root, SENTINEL_FILE))) {
|
|
90
|
+
throw new WikiOwnershipError(`refusing to modify ${this.root}: its ${SENTINEL_FILE} sentinel is gone, ` +
|
|
91
|
+
`so it may no longer be owned by NLM`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async write(relPath, content) {
|
|
95
|
+
this.ensureOwned();
|
|
96
|
+
this.verifySentinelPresent();
|
|
97
|
+
const full = this.resolveWithin(relPath);
|
|
98
|
+
writeFileSync(full, content, "utf8");
|
|
99
|
+
}
|
|
100
|
+
async read(relPath) {
|
|
101
|
+
const full = this.resolveWithin(relPath);
|
|
102
|
+
if (!existsSync(full))
|
|
103
|
+
return null;
|
|
104
|
+
return readFileSync(full, "utf8");
|
|
105
|
+
}
|
|
106
|
+
async remove(relPath) {
|
|
107
|
+
this.ensureOwned();
|
|
108
|
+
this.verifySentinelPresent();
|
|
109
|
+
rmSync(this.resolveWithin(relPath), { force: true });
|
|
110
|
+
}
|
|
111
|
+
async list() {
|
|
112
|
+
if (!existsSync(this.root))
|
|
113
|
+
return [];
|
|
114
|
+
return readdirSync(this.root, { withFileTypes: true })
|
|
115
|
+
.filter((entry) => entry.isFile() && entry.name.endsWith(".md") && entry.name !== SENTINEL_FILE)
|
|
116
|
+
.map((entry) => entry.name);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
const SENTINEL_BODY = `${SENTINEL_MARKER}
|
|
120
|
+
# Generated by NLM
|
|
121
|
+
|
|
122
|
+
Every file in this directory is projected from NLM's session corpus and is
|
|
123
|
+
rewritten on each projection run. Edits made here are overwritten without
|
|
124
|
+
warning.
|
|
125
|
+
|
|
126
|
+
To keep something, promote it. Promotion copies the content into a page you
|
|
127
|
+
own, outside this directory, which NLM never touches.
|
|
128
|
+
|
|
129
|
+
This file also marks the directory as NLM-owned. Deleting it makes NLM refuse
|
|
130
|
+
to write here until the directory is empty again.
|
|
131
|
+
`;
|
|
132
|
+
//# sourceMappingURL=fs-wiki-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-wiki-writer.js","sourceRoot":"","sources":["../../../src/core/adapters/fs-wiki-writer.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,9 +17,14 @@
|
|
|
17
17
|
* This adapter is distinct from HermesAdapter (src/core/adapters/hermes.ts),
|
|
18
18
|
* which reads Whtnxt Hermes WebUI session JSON files from ~/.hermes/sessions/.
|
|
19
19
|
*/
|
|
20
|
-
import type { DetectionResult, DiscoverOptions, SessionChunk, TranscriptAdapter } from "../../ports/transcript-adapter.js";
|
|
20
|
+
import type { DetectionResult, DiscoverOptions, SessionChunk, SourceStat, TranscriptAdapter } from "../../ports/transcript-adapter.js";
|
|
21
21
|
export interface HermesAgentAdapterOptions {
|
|
22
22
|
readonly dbPath?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Session `source` values to skip. Machine-driven runs (cron jobs, agent
|
|
25
|
+
* protocol loops) are mostly repetitive and flood recall. Default: cron.
|
|
26
|
+
*/
|
|
27
|
+
readonly excludeSources?: ReadonlyArray<string>;
|
|
23
28
|
}
|
|
24
29
|
export declare function defaultDbPath(): string;
|
|
25
30
|
export declare class HermesAgentAdapter implements TranscriptAdapter {
|
|
@@ -27,8 +32,16 @@ export declare class HermesAgentAdapter implements TranscriptAdapter {
|
|
|
27
32
|
readonly runtimeVersion = "hermes-agent/1.0";
|
|
28
33
|
readonly transcriptKind = "hermes-agent-sqlite";
|
|
29
34
|
private readonly dbPath;
|
|
35
|
+
private readonly excludeSources;
|
|
30
36
|
constructor(opts?: HermesAgentAdapterOptions);
|
|
31
37
|
detect(): DetectionResult;
|
|
32
38
|
discover(options?: DiscoverOptions): Promise<ReadonlyArray<string>>;
|
|
33
|
-
|
|
39
|
+
/**
|
|
40
|
+
* `<dbPath>::<sessionId>`, the key discover() emits and chunk.sourcePath
|
|
41
|
+
* carries, so scanOnce's adapter_state lookup matches what it recorded.
|
|
42
|
+
*/
|
|
43
|
+
private sourceKey;
|
|
44
|
+
private sessionIdOf;
|
|
45
|
+
stat(source: string): SourceStat | null;
|
|
46
|
+
parseSession(source: string): Promise<SessionChunk | null>;
|
|
34
47
|
}
|
|
@@ -23,6 +23,7 @@ import { join } from "node:path";
|
|
|
23
23
|
import Database from "better-sqlite3";
|
|
24
24
|
import { durationMinutes, normalizeTimestamp, safeSessionId } from "./common.js";
|
|
25
25
|
const TOOL_RESULT_PREVIEW_CHARS = 240;
|
|
26
|
+
const DEFAULT_EXCLUDED_SOURCES = ["cron"];
|
|
26
27
|
export function defaultDbPath() {
|
|
27
28
|
if (process.env["NLM_HERMES_AGENT_DB_PATH"])
|
|
28
29
|
return process.env["NLM_HERMES_AGENT_DB_PATH"];
|
|
@@ -100,8 +101,10 @@ export class HermesAgentAdapter {
|
|
|
100
101
|
runtimeVersion = "hermes-agent/1.0";
|
|
101
102
|
transcriptKind = "hermes-agent-sqlite";
|
|
102
103
|
dbPath;
|
|
104
|
+
excludeSources;
|
|
103
105
|
constructor(opts = {}) {
|
|
104
106
|
this.dbPath = opts.dbPath ?? defaultDbPath();
|
|
107
|
+
this.excludeSources = opts.excludeSources ?? DEFAULT_EXCLUDED_SOURCES;
|
|
105
108
|
}
|
|
106
109
|
detect() {
|
|
107
110
|
if (existsSync(this.dbPath)) {
|
|
@@ -120,19 +123,26 @@ export class HermesAgentAdapter {
|
|
|
120
123
|
let db;
|
|
121
124
|
try {
|
|
122
125
|
db = new Database(this.dbPath, { readonly: true });
|
|
123
|
-
|
|
126
|
+
// Older state.db schemas have no `source` column; nothing to filter there.
|
|
127
|
+
const hasSource = db
|
|
128
|
+
.prepare("SELECT name FROM pragma_table_info('sessions')")
|
|
129
|
+
.all()
|
|
130
|
+
.some((c) => c.name === "source");
|
|
131
|
+
const clauses = [];
|
|
132
|
+
const params = [];
|
|
124
133
|
if (options?.since) {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
.prepare(`SELECT id FROM sessions WHERE started_at >= ? ORDER BY started_at ASC`)
|
|
128
|
-
.all(sinceTs);
|
|
134
|
+
clauses.push("started_at >= ?");
|
|
135
|
+
params.push(options.since.getTime() / 1000);
|
|
129
136
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
.all();
|
|
137
|
+
if (hasSource && this.excludeSources.length > 0) {
|
|
138
|
+
clauses.push(`COALESCE(source, '') NOT IN (${this.excludeSources.map(() => "?").join(", ")})`);
|
|
139
|
+
params.push(...this.excludeSources);
|
|
134
140
|
}
|
|
135
|
-
|
|
141
|
+
const where = clauses.length > 0 ? `WHERE ${clauses.join(" AND ")}` : "";
|
|
142
|
+
const rows = db
|
|
143
|
+
.prepare(`SELECT id FROM sessions ${where} ORDER BY started_at ASC`)
|
|
144
|
+
.all(...params);
|
|
145
|
+
return rows.map((r) => this.sourceKey(r.id));
|
|
136
146
|
}
|
|
137
147
|
catch {
|
|
138
148
|
return [];
|
|
@@ -141,7 +151,43 @@ export class HermesAgentAdapter {
|
|
|
141
151
|
db?.close();
|
|
142
152
|
}
|
|
143
153
|
}
|
|
144
|
-
|
|
154
|
+
/**
|
|
155
|
+
* `<dbPath>::<sessionId>`, the key discover() emits and chunk.sourcePath
|
|
156
|
+
* carries, so scanOnce's adapter_state lookup matches what it recorded.
|
|
157
|
+
*/
|
|
158
|
+
sourceKey(sessionId) {
|
|
159
|
+
return `${this.dbPath}::${sessionId}`;
|
|
160
|
+
}
|
|
161
|
+
sessionIdOf(source) {
|
|
162
|
+
const sep = source.lastIndexOf("::");
|
|
163
|
+
return sep === -1 ? source : source.slice(sep + 2);
|
|
164
|
+
}
|
|
165
|
+
stat(source) {
|
|
166
|
+
if (!existsSync(this.dbPath))
|
|
167
|
+
return null;
|
|
168
|
+
let db;
|
|
169
|
+
try {
|
|
170
|
+
db = new Database(this.dbPath, { readonly: true });
|
|
171
|
+
const row = db
|
|
172
|
+
.prepare(`SELECT MAX(m.timestamp) AS last, COUNT(m.id) AS n, s.started_at AS started
|
|
173
|
+
FROM sessions s LEFT JOIN messages m ON m.session_id = s.id
|
|
174
|
+
WHERE s.id = ? GROUP BY s.id`)
|
|
175
|
+
.get(this.sessionIdOf(source));
|
|
176
|
+
if (!row)
|
|
177
|
+
return null;
|
|
178
|
+
// Timestamps are Unix seconds. The message count is the change marker:
|
|
179
|
+
// it only moves when the session gains messages.
|
|
180
|
+
return { mtimeMs: (row.last ?? row.started ?? 0) * 1000, size: row.n };
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
finally {
|
|
186
|
+
db?.close();
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
async parseSession(source) {
|
|
190
|
+
const sessionId = this.sessionIdOf(source);
|
|
145
191
|
if (!existsSync(this.dbPath))
|
|
146
192
|
return null;
|
|
147
193
|
let db;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hermes-agent.js","sourceRoot":"","sources":["../../../src/core/adapters/hermes-agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,QAAQ,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"hermes-agent.js","sourceRoot":"","sources":["../../../src/core/adapters/hermes-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { WikiWriter } from "../../ports/wiki-writer.js";
|
|
2
|
+
export declare class MemoryWikiWriter implements WikiWriter {
|
|
3
|
+
readonly files: Map<string, string>;
|
|
4
|
+
write(relPath: string, content: string): Promise<void>;
|
|
5
|
+
read(relPath: string): Promise<string | null>;
|
|
6
|
+
remove(relPath: string): Promise<void>;
|
|
7
|
+
list(): Promise<ReadonlyArray<string>>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export class MemoryWikiWriter {
|
|
2
|
+
files = new Map();
|
|
3
|
+
async write(relPath, content) {
|
|
4
|
+
this.files.set(relPath, content);
|
|
5
|
+
}
|
|
6
|
+
async read(relPath) {
|
|
7
|
+
return this.files.get(relPath) ?? null;
|
|
8
|
+
}
|
|
9
|
+
async remove(relPath) {
|
|
10
|
+
this.files.delete(relPath);
|
|
11
|
+
}
|
|
12
|
+
async list() {
|
|
13
|
+
return [...this.files.keys()];
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=memory-wiki-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-wiki-writer.js","sourceRoot":"","sources":["../../../src/core/adapters/memory-wiki-writer.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,gBAAgB;IAClB,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE3C,KAAK,CAAC,KAAK,CAAC,OAAe,EAAE,OAAe;QAC1C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAe;QACxB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAe;QAC1B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,IAAI;QACR,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAChC,CAAC;CACF"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Muse adapter.
|
|
3
|
+
*
|
|
4
|
+
* Reads ${XDG_DATA_HOME:-~/.local/share}/muse/sessions/YYYY/MM/DD/<session-id>/session.jsonl
|
|
5
|
+
* files. Each line is an event-sourced record (`record_type: "event"`,
|
|
6
|
+
* microsecond `recorded_at`); conversation turns come from a small set of
|
|
7
|
+
* payloads and everything else is recall noise:
|
|
8
|
+
*
|
|
9
|
+
* Conversation extraction:
|
|
10
|
+
* - `runtime.user_intent.accepted` (`surface: "main"`, `refill_blocks[].text`)
|
|
11
|
+
* -> [user] turn. The `run.started` event's `prompt` duplicates this text
|
|
12
|
+
* and is skipped. Non-main surfaces are steering, not conversation.
|
|
13
|
+
* - `runtime.session` / `assistant_message_committed.text` -> [assistant] turn.
|
|
14
|
+
*
|
|
15
|
+
* Tool surface: `assistant_tool_calls_committed.tool_calls[].name` ->
|
|
16
|
+
* `[tool_use: <name>]`; `tool_result_batch_committed.results[].text` ->
|
|
17
|
+
* `[tool_result: <240-char preview>]`.
|
|
18
|
+
*
|
|
19
|
+
* Dropped: hooks, reasoning, reminders, approvals, task lifecycle,
|
|
20
|
+
* resource samples, `model_user_messages` (a skill-body bundle), and the
|
|
21
|
+
* `session.*.observed` bookkeeping events.
|
|
22
|
+
*
|
|
23
|
+
* Session id is the parent directory name; project dir comes from the
|
|
24
|
+
* `runtime.session.metadata` record's `workspace_root`.
|
|
25
|
+
*
|
|
26
|
+
* Format reference: verified against a live 11k-line session on 2026-09-27.
|
|
27
|
+
*/
|
|
28
|
+
import type { DetectionResult, DiscoverOptions, SessionChunk, TranscriptAdapter } from "../../ports/transcript-adapter.js";
|
|
29
|
+
export interface MuseAdapterOptions {
|
|
30
|
+
readonly sessionsPath?: string;
|
|
31
|
+
readonly idleMinutes?: number;
|
|
32
|
+
}
|
|
33
|
+
export declare function defaultSessionsPath(): string;
|
|
34
|
+
/**
|
|
35
|
+
* Subagent runs live at `<parent>/subagent/<id>/session.jsonl`. They take the
|
|
36
|
+
* `<parent>/agent-<id>` shape claude-code uses, so deriveSubagentMeta links
|
|
37
|
+
* them to their parent instead of ingesting them as standalone sessions.
|
|
38
|
+
*/
|
|
39
|
+
export declare function museRuntimeSessionId(path: string): string;
|
|
40
|
+
export declare class MuseAdapter implements TranscriptAdapter {
|
|
41
|
+
readonly name = "muse";
|
|
42
|
+
readonly runtimeVersion = "muse/1.0";
|
|
43
|
+
readonly transcriptKind = "muse-jsonl";
|
|
44
|
+
private readonly sessionsPath;
|
|
45
|
+
readonly idleMinutes: number;
|
|
46
|
+
constructor(opts?: MuseAdapterOptions);
|
|
47
|
+
detect(): DetectionResult;
|
|
48
|
+
discover(options?: DiscoverOptions): Promise<ReadonlyArray<string>>;
|
|
49
|
+
parseSession(path: string): Promise<SessionChunk | null>;
|
|
50
|
+
private walk;
|
|
51
|
+
}
|