@remnic/core 9.3.728 → 9.3.730
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/dist/access-boundary.d.ts +6 -5
- package/dist/access-boundary.js +13 -13
- package/dist/access-cli.js +34 -33
- package/dist/access-cli.js.map +1 -1
- package/dist/access-http.d.ts +6 -5
- package/dist/access-http.js +19 -19
- package/dist/access-mcp.d.ts +6 -5
- package/dist/access-mcp.js +18 -18
- package/dist/access-operations-batch.js +16 -16
- package/dist/access-operations.d.ts +7 -6
- package/dist/access-operations.js +17 -17
- package/dist/access-schema.d.ts +4 -4
- package/dist/{access-service-Bgpjxo4f.d.ts → access-service-Byoe3HsT.d.ts} +18 -3
- package/dist/access-service.d.ts +6 -5
- package/dist/access-service.js +12 -12
- package/dist/access-surface-catalog.d.ts +6 -5
- package/dist/action-confidence.d.ts +1 -1
- package/dist/active-memory-bridge.d.ts +1 -1
- package/dist/active-recall.d.ts +1 -1
- package/dist/active-recall.js +2 -2
- package/dist/{auto-sync-F3KCSQFJ.js → auto-sync-G3V5AN4C.js} +2 -2
- package/dist/behavior-learner.d.ts +1 -1
- package/dist/behavior-signals.d.ts +1 -1
- package/dist/bootstrap.d.ts +5 -4
- package/dist/briefing.d.ts +1 -1
- package/dist/briefing.js +3 -3
- package/dist/buffer-surprise-report.d.ts +1 -1
- package/dist/buffer.d.ts +1 -1
- package/dist/calibration.d.ts +1 -1
- package/dist/capabilities.d.ts +55 -2
- package/dist/capabilities.js +5 -1
- package/dist/{catalog-bMczlO2G.d.ts → catalog-DM1nk7cM.d.ts} +1 -1
- package/dist/causal-behavior.d.ts +1 -1
- package/dist/causal-consolidation.d.ts +1 -1
- package/dist/causal-consolidation.js +4 -4
- package/dist/causal-trajectory-graph.d.ts +1 -1
- package/dist/{chunk-4NOI577P.js → chunk-24ZLC5QN.js} +2 -2
- package/dist/{chunk-DMQWV6SQ.js → chunk-5RZOFIDL.js} +2 -2
- package/dist/{chunk-UM5AWJNQ.js → chunk-646B5ERJ.js} +62 -37
- package/dist/chunk-646B5ERJ.js.map +1 -0
- package/dist/{chunk-H5BWGCRZ.js → chunk-6TUWSUUD.js} +51 -47
- package/dist/{chunk-H5BWGCRZ.js.map → chunk-6TUWSUUD.js.map} +1 -1
- package/dist/{chunk-36SEDFAU.js → chunk-C5WN74HH.js} +2 -2
- package/dist/{chunk-MLKWJOAJ.js → chunk-CGPHMNL4.js} +2 -2
- package/dist/{chunk-R6OVFAX6.js → chunk-DJECGBBM.js} +7 -2
- package/dist/{chunk-R6OVFAX6.js.map → chunk-DJECGBBM.js.map} +1 -1
- package/dist/{chunk-3RCBIOOJ.js → chunk-ESF7TRYJ.js} +18 -2
- package/dist/{chunk-3RCBIOOJ.js.map → chunk-ESF7TRYJ.js.map} +1 -1
- package/dist/{chunk-EY6MDMHK.js → chunk-F6OEXJQQ.js} +2 -2
- package/dist/{chunk-M4V2JVSZ.js → chunk-FFUCCKPN.js} +2 -2
- package/dist/{chunk-O6YH5F47.js → chunk-FYWUNVFZ.js} +8 -8
- package/dist/{chunk-37436GML.js → chunk-GEXI357K.js} +2 -2
- package/dist/{chunk-YGIQORJ3.js → chunk-GGL34GCW.js} +3 -3
- package/dist/{chunk-4H4F3BFL.js → chunk-GXTYEG7Q.js} +3 -3
- package/dist/{chunk-4H4F3BFL.js.map → chunk-GXTYEG7Q.js.map} +1 -1
- package/dist/{chunk-WAS3NV46.js → chunk-H3MB3F62.js} +2 -2
- package/dist/{chunk-UTHQPSRC.js → chunk-HHNSLPX7.js} +11 -8
- package/dist/chunk-HHNSLPX7.js.map +1 -0
- package/dist/{chunk-76NHR6ZL.js → chunk-HJWQJUKQ.js} +4 -4
- package/dist/{chunk-Y4YD5TYW.js → chunk-IIBFCZA7.js} +3 -3
- package/dist/{chunk-UVPL565C.js → chunk-IQOEW5YV.js} +2 -2
- package/dist/{chunk-V4GNSDFH.js → chunk-KQYGNGON.js} +2 -2
- package/dist/{chunk-CBWI22JN.js → chunk-KSJCXXOU.js} +2 -2
- package/dist/{chunk-M4AYVEWS.js → chunk-LUCARK4W.js} +12 -11
- package/dist/chunk-LUCARK4W.js.map +1 -0
- package/dist/{chunk-I5REUWLH.js → chunk-NIZQH6AU.js} +3 -3
- package/dist/{chunk-4ESAR77N.js → chunk-NOU77OHX.js} +2 -2
- package/dist/{chunk-BQCHEV7O.js → chunk-O4ZIBPIW.js} +3 -3
- package/dist/{chunk-HOHVIVDR.js → chunk-OBJUKYDO.js} +2 -2
- package/dist/{chunk-YKBHOBJK.js → chunk-OEHCMALU.js} +56 -4
- package/dist/chunk-OEHCMALU.js.map +1 -0
- package/dist/{chunk-YOLZS7NY.js → chunk-OTQE66IX.js} +2 -2
- package/dist/{chunk-QNEUZIAH.js → chunk-OUITHS6V.js} +381 -433
- package/dist/chunk-OUITHS6V.js.map +1 -0
- package/dist/{chunk-4T3BMHKD.js → chunk-OZECYVGI.js} +20 -7
- package/dist/chunk-OZECYVGI.js.map +1 -0
- package/dist/{chunk-C2PG7IEH.js → chunk-P3VJCTVE.js} +2 -2
- package/dist/{chunk-EH5ED3C6.js → chunk-PMAQRUN4.js} +4 -4
- package/dist/chunk-PMAQRUN4.js.map +1 -0
- package/dist/{chunk-7RLCCNHU.js → chunk-Q6BAA57B.js} +4 -3
- package/dist/chunk-Q6BAA57B.js.map +1 -0
- package/dist/{chunk-HGNOCPZX.js → chunk-QZHF4BWN.js} +6 -6
- package/dist/chunk-SYX73XD7.js +283 -0
- package/dist/chunk-SYX73XD7.js.map +1 -0
- package/dist/{chunk-ASKXIAHD.js → chunk-WDJCZQB4.js} +2 -2
- package/dist/{chunk-AQLOP5F4.js → chunk-WNGXQMRI.js} +95 -6
- package/dist/chunk-WNGXQMRI.js.map +1 -0
- package/dist/{chunk-JYLFZWUX.js → chunk-XYUFGHUW.js} +2 -2
- package/dist/{chunk-3TSTGI6F.js → chunk-ZQUAVZNG.js} +2 -2
- package/dist/{chunk-4NR2PDZ5.js → chunk-ZVHRSR2R.js} +14 -4
- package/dist/chunk-ZVHRSR2R.js.map +1 -0
- package/dist/{cli-BLME420h.d.ts → cli-Dt-tuiYH.d.ts} +3 -3
- package/dist/cli.d.ts +7 -6
- package/dist/cli.js +35 -35
- package/dist/compounding/engine.d.ts +12 -1
- package/dist/compounding/engine.js +3 -3
- package/dist/compounding/preference-consolidator.d.ts +1 -1
- package/dist/compression-optimizer.d.ts +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.js +2 -2
- package/dist/connectors/codex-materialize-runner.d.ts +1 -1
- package/dist/connectors/codex-materialize-runner.js +3 -3
- package/dist/connectors/codex-materialize.d.ts +1 -1
- package/dist/connectors/index.d.ts +1 -1
- package/dist/connectors/index.js +3 -3
- package/dist/consolidation-provenance-check.d.ts +1 -1
- package/dist/consolidation-undo.d.ts +1 -1
- package/dist/contradiction/index.d.ts +1 -1
- package/dist/contradiction/index.js +1 -1
- package/dist/conversation-index/backend.d.ts +1 -1
- package/dist/conversation-index/chunker.d.ts +1 -1
- package/dist/conversation-index/faiss-adapter.d.ts +1 -1
- package/dist/conversation-index/indexer.d.ts +1 -1
- package/dist/conversation-index/search.d.ts +1 -1
- package/dist/day-summary.d.ts +1 -1
- package/dist/delinearize.d.ts +1 -1
- package/dist/direct-answer-wiring.d.ts +1 -1
- package/dist/direct-answer.d.ts +1 -1
- package/dist/embedding-fallback.d.ts +1 -1
- package/dist/embedding-fallback.js +2 -2
- package/dist/enrichment/index.d.ts +1 -1
- package/dist/entity-retrieval.d.ts +1 -1
- package/dist/entity-retrieval.js +3 -3
- package/dist/entity-schema.d.ts +1 -1
- package/dist/explicit-capture.d.ts +6 -4
- package/dist/explicit-capture.js +1 -1
- package/dist/extraction-faithfulness.d.ts +1 -1
- package/dist/extraction-judge-telemetry.d.ts +1 -1
- package/dist/extraction-judge-training.d.ts +1 -1
- package/dist/extraction-judge.d.ts +1 -1
- package/dist/extraction.d.ts +1 -1
- package/dist/extraction.js +3 -3
- package/dist/fallback-llm.d.ts +1 -1
- package/dist/{first-start-migration-22LPFHD5.js → first-start-migration-OOR57AYR.js} +2 -2
- package/dist/graph-dashboard-diff.d.ts +1 -1
- package/dist/graph-dashboard-key.d.ts +1 -1
- package/dist/graph-dashboard-parser.d.ts +1 -1
- package/dist/graph-edge-reinforcement.d.ts +1 -1
- package/dist/graph-snapshot.d.ts +1 -1
- package/dist/graph.d.ts +1 -1
- package/dist/identity-continuity.d.ts +1 -1
- package/dist/importance.d.ts +1 -1
- package/dist/index.d.ts +296 -11
- package/dist/index.js +359 -47
- package/dist/index.js.map +1 -1
- package/dist/intent.d.ts +1 -1
- package/dist/lcm/engine.d.ts +1 -1
- package/dist/lcm/index.d.ts +1 -1
- package/dist/lcm/tools.d.ts +1 -1
- package/dist/lifecycle.d.ts +1 -1
- package/dist/live-connectors-runner.d.ts +1 -1
- package/dist/local-llm.d.ts +1 -1
- package/dist/local-model-endpoint.d.ts +1 -1
- package/dist/maintenance/memory-governance.d.ts +1 -1
- package/dist/maintenance/memory-governance.js +3 -3
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +3 -3
- package/dist/maintenance/rebuild-memory-projection.js +4 -4
- package/dist/mcp-memory-inspector-app.d.ts +6 -5
- package/dist/memory-action-policy.d.ts +1 -1
- package/dist/memory-cache.d.ts +1 -1
- package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
- package/dist/memory-projection-store.d.ts +1 -1
- package/dist/memory-provenance.d.ts +1 -1
- package/dist/memory-worth-outcomes.d.ts +1 -1
- package/dist/models-json.d.ts +1 -1
- package/dist/namespaces/migrate.d.ts +2 -2
- package/dist/namespaces/migrate.js +9 -9
- package/dist/namespaces/principal.d.ts +1 -1
- package/dist/namespaces/search.d.ts +1 -1
- package/dist/namespaces/search.js +5 -5
- package/dist/namespaces/storage.d.ts +2 -2
- package/dist/namespaces/storage.js +3 -3
- package/dist/native-knowledge.d.ts +1 -1
- package/dist/operator-toolkit.d.ts +1 -1
- package/dist/operator-toolkit.js +14 -14
- package/dist/orchestration/compression-guideline-coordinator.d.ts +105 -0
- package/dist/orchestration/compression-guideline-coordinator.js +12 -0
- package/dist/orchestration/maintenance.d.ts +2 -2
- package/dist/orchestration/maintenance.js +5 -5
- package/dist/{orchestrator-DqPAz8ot.d.ts → orchestrator-B4KjaOtY.d.ts} +128 -34
- package/dist/orchestrator.d.ts +5 -4
- package/dist/orchestrator.js +28 -26
- package/dist/patterns-cli.d.ts +1 -1
- package/dist/policy-runtime.d.ts +1 -1
- package/dist/provenance.d.ts +1 -1
- package/dist/provenance.js +1 -1
- package/dist/qmd-recall-cache.d.ts +1 -1
- package/dist/qmd.d.ts +1 -1
- package/dist/recall-disclosure-escalation.d.ts +1 -1
- package/dist/recall-explain-renderer.d.ts +1 -1
- package/dist/recall-planner-llm.d.ts +1 -1
- package/dist/recall-state.d.ts +1 -1
- package/dist/recall-tag-filter.d.ts +1 -1
- package/dist/recall-xray-cli.d.ts +1 -1
- package/dist/recall-xray-renderer.d.ts +1 -1
- package/dist/recall-xray.d.ts +1 -1
- package/dist/{resolution-MN36NW5P.js → resolution-33PIX3TT.js} +2 -2
- package/dist/resolution-33PIX3TT.js.map +1 -0
- package/dist/resolve-auth-token.d.ts +1 -1
- package/dist/resume-bundles.js +3 -3
- package/dist/retrieval-agents.d.ts +1 -1
- package/dist/retrieval-tiers.d.ts +1 -1
- package/dist/routing/engine.d.ts +1 -1
- package/dist/routing/store.d.ts +1 -1
- package/dist/schemas.d.ts +32 -32
- package/dist/search/embed-helper.d.ts +1 -1
- package/dist/search/embed-helper.js +2 -2
- package/dist/search/factory.d.ts +1 -1
- package/dist/search/factory.js +4 -4
- package/dist/search/index.d.ts +1 -1
- package/dist/search/index.js +8 -8
- package/dist/search/lancedb-backend.d.ts +1 -1
- package/dist/search/meilisearch-backend.d.ts +1 -1
- package/dist/search/noop-backend.d.ts +1 -1
- package/dist/search/orama-backend.d.ts +1 -1
- package/dist/search/port.d.ts +1 -1
- package/dist/search/remote-backend.d.ts +1 -1
- package/dist/{semantic-consolidation-Cl15ksZy.d.ts → semantic-consolidation-CstTvHPo.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +2 -2
- package/dist/semantic-consolidation.js +4 -4
- package/dist/semantic-rule-promotion.js +3 -3
- package/dist/semantic-rule-verifier.d.ts +1 -1
- package/dist/semantic-rule-verifier.js +3 -3
- package/dist/session-observer-bands.d.ts +1 -1
- package/dist/session-observer-state.d.ts +1 -1
- package/dist/shared-context/manager.d.ts +1 -1
- package/dist/signal.d.ts +1 -1
- package/dist/storage.d.ts +22 -3
- package/dist/storage.js +2 -2
- package/dist/summarizer.d.ts +1 -1
- package/dist/summary-snapshot.d.ts +1 -1
- package/dist/temporal-supersession.d.ts +1 -1
- package/dist/temporal-validity.d.ts +1 -1
- package/dist/threading.d.ts +1 -1
- package/dist/tier-migration.d.ts +1 -1
- package/dist/tier-routing.d.ts +1 -1
- package/dist/topics.d.ts +1 -1
- package/dist/transcript.d.ts +1 -1
- package/dist/transfer/types.d.ts +22 -22
- package/dist/trust-score-stage.d.ts +1 -1
- package/dist/trust-score.d.ts +1 -1
- package/dist/{types-ChQb9D6s.d.ts → types-VkxElCHR.d.ts} +8 -1
- package/dist/types.d.ts +1 -1
- package/dist/utility-runtime.d.ts +1 -1
- package/dist/verified-recall.js +3 -3
- package/package.json +12 -2
- package/src/access-service-coding-write.test.ts +2 -2
- package/src/access-service.ts +33 -14
- package/src/bitemporal-dedup-backfill.test.ts +10 -10
- package/src/bitemporal-frontmatter.test.ts +3 -3
- package/src/capabilities.test.ts +185 -0
- package/src/capabilities.ts +110 -0
- package/src/cli/creation-ledger-commands.ts +22 -21
- package/src/coding/architecture-surfaces.test.ts +25 -1
- package/src/coding/architecture-surfaces.ts +47 -19
- package/src/coding/decision-surfaces.ts +12 -3
- package/src/coding/review-context-structural.test.ts +303 -0
- package/src/coding/review-context.ts +79 -0
- package/src/coding/structural-context.test.ts +259 -0
- package/src/coding/structural-context.ts +315 -0
- package/src/coding/structural-subprocess-provider.test.ts +430 -0
- package/src/coding/structural-subprocess-provider.ts +355 -0
- package/src/compounding/engine.test.ts +90 -0
- package/src/compounding/engine.ts +25 -1
- package/src/contradiction/contradiction.test.ts +1 -1
- package/src/contradiction/resolution.ts +9 -1
- package/src/correction/correction-access-wiring.ts +21 -3
- package/src/correction/correction-contract.ts +7 -0
- package/src/correction/correction-planner.test.ts +231 -0
- package/src/correction/correction-planner.ts +73 -0
- package/src/correction/correction-service.ts +29 -0
- package/src/correction/correction-storage-integration.test.ts +2 -2
- package/src/dedup/semantic.test.ts +1 -1
- package/src/explicit-capture.ts +7 -4
- package/src/extraction-eventtime-wiring.test.ts +3 -3
- package/src/extraction-redaction-rules.test.ts +172 -0
- package/src/index.ts +29 -0
- package/src/maintenance/forget.test.ts +1 -1
- package/src/maintenance/memory-governance.test.ts +1 -1
- package/src/maintenance/pattern-reinforcement.test.ts +2 -2
- package/src/operator-toolkit.ts +4 -3
- package/src/orchestration/compression-guideline-coordinator.ts +449 -0
- package/src/orchestration/extraction-queue-coordinator.ts +175 -0
- package/src/orchestrator-extraction-queue.test.ts +26 -38
- package/src/orchestrator-flush.test.ts +10 -15
- package/src/orchestrator.ts +359 -542
- package/src/procedural/procedure-miner.test.ts +2 -2
- package/src/provenance-extraction.test.ts +382 -4
- package/src/provenance.ts +158 -22
- package/src/recall-handles-wiring.test.ts +1 -1
- package/src/search/factory.ts +4 -3
- package/src/semantic-rule-promotion.ts +1 -1
- package/src/source-attribution-roundtrip.test.ts +2 -2
- package/src/storage-contract/atomicity.test.ts +1 -1
- package/src/storage-contract/cache-coherence.test.ts +2 -2
- package/src/storage-contract/content-hash.test.ts +1 -1
- package/src/storage-contract/namespace-routing.test.ts +1 -1
- package/src/storage-contract/round-trip.test.ts +3 -3
- package/src/storage.ts +23 -2
- package/src/temporal-supersession.test.ts +12 -11
- package/src/temporal-validity.test.ts +11 -11
- package/src/wearables/cli.test.ts +30 -0
- package/src/wearables/cli.ts +3 -0
- package/src/wearables/memory-gen.test.ts +57 -1
- package/src/wearables/memory-gen.ts +31 -7
- package/src/wearables/pipeline.test.ts +40 -1
- package/src/wearables/pipeline.ts +4 -0
- package/src/wearables/service.test.ts +2 -2
- package/src/wearables/storage-io.test.ts +3 -3
- package/src/wearables/types.ts +7 -0
- package/dist/chunk-4NR2PDZ5.js.map +0 -1
- package/dist/chunk-4T3BMHKD.js.map +0 -1
- package/dist/chunk-7RLCCNHU.js.map +0 -1
- package/dist/chunk-AQLOP5F4.js.map +0 -1
- package/dist/chunk-EH5ED3C6.js.map +0 -1
- package/dist/chunk-M4AYVEWS.js.map +0 -1
- package/dist/chunk-QNEUZIAH.js.map +0 -1
- package/dist/chunk-UM5AWJNQ.js.map +0 -1
- package/dist/chunk-UTHQPSRC.js.map +0 -1
- package/dist/chunk-YKBHOBJK.js.map +0 -1
- /package/dist/{auto-sync-F3KCSQFJ.js.map → auto-sync-G3V5AN4C.js.map} +0 -0
- /package/dist/{chunk-4NOI577P.js.map → chunk-24ZLC5QN.js.map} +0 -0
- /package/dist/{chunk-DMQWV6SQ.js.map → chunk-5RZOFIDL.js.map} +0 -0
- /package/dist/{chunk-36SEDFAU.js.map → chunk-C5WN74HH.js.map} +0 -0
- /package/dist/{chunk-MLKWJOAJ.js.map → chunk-CGPHMNL4.js.map} +0 -0
- /package/dist/{chunk-EY6MDMHK.js.map → chunk-F6OEXJQQ.js.map} +0 -0
- /package/dist/{chunk-M4V2JVSZ.js.map → chunk-FFUCCKPN.js.map} +0 -0
- /package/dist/{chunk-O6YH5F47.js.map → chunk-FYWUNVFZ.js.map} +0 -0
- /package/dist/{chunk-37436GML.js.map → chunk-GEXI357K.js.map} +0 -0
- /package/dist/{chunk-YGIQORJ3.js.map → chunk-GGL34GCW.js.map} +0 -0
- /package/dist/{chunk-WAS3NV46.js.map → chunk-H3MB3F62.js.map} +0 -0
- /package/dist/{chunk-76NHR6ZL.js.map → chunk-HJWQJUKQ.js.map} +0 -0
- /package/dist/{chunk-Y4YD5TYW.js.map → chunk-IIBFCZA7.js.map} +0 -0
- /package/dist/{chunk-UVPL565C.js.map → chunk-IQOEW5YV.js.map} +0 -0
- /package/dist/{chunk-V4GNSDFH.js.map → chunk-KQYGNGON.js.map} +0 -0
- /package/dist/{chunk-CBWI22JN.js.map → chunk-KSJCXXOU.js.map} +0 -0
- /package/dist/{chunk-I5REUWLH.js.map → chunk-NIZQH6AU.js.map} +0 -0
- /package/dist/{chunk-4ESAR77N.js.map → chunk-NOU77OHX.js.map} +0 -0
- /package/dist/{chunk-BQCHEV7O.js.map → chunk-O4ZIBPIW.js.map} +0 -0
- /package/dist/{chunk-HOHVIVDR.js.map → chunk-OBJUKYDO.js.map} +0 -0
- /package/dist/{chunk-YOLZS7NY.js.map → chunk-OTQE66IX.js.map} +0 -0
- /package/dist/{chunk-C2PG7IEH.js.map → chunk-P3VJCTVE.js.map} +0 -0
- /package/dist/{chunk-HGNOCPZX.js.map → chunk-QZHF4BWN.js.map} +0 -0
- /package/dist/{chunk-ASKXIAHD.js.map → chunk-WDJCZQB4.js.map} +0 -0
- /package/dist/{chunk-JYLFZWUX.js.map → chunk-XYUFGHUW.js.map} +0 -0
- /package/dist/{chunk-3TSTGI6F.js.map → chunk-ZQUAVZNG.js.map} +0 -0
- /package/dist/{first-start-migration-22LPFHD5.js.map → first-start-migration-OOR57AYR.js.map} +0 -0
- /package/dist/{resolution-MN36NW5P.js.map → orchestration/compression-guideline-coordinator.js.map} +0 -0
|
@@ -11,19 +11,19 @@ import {
|
|
|
11
11
|
processChatMessage,
|
|
12
12
|
sessionBelongsToPrincipal,
|
|
13
13
|
subscribeChatTranscript
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-O4ZIBPIW.js";
|
|
15
15
|
import {
|
|
16
16
|
validateRequest
|
|
17
17
|
} from "./chunk-FVZ2ISIX.js";
|
|
18
18
|
import {
|
|
19
19
|
getOperation
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-NOU77OHX.js";
|
|
21
21
|
import {
|
|
22
22
|
EngramAccessInputError
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-646B5ERJ.js";
|
|
24
24
|
import {
|
|
25
25
|
CorrectionContractError
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-WNGXQMRI.js";
|
|
27
27
|
import {
|
|
28
28
|
isTrustZoneName
|
|
29
29
|
} from "./chunk-JGSKJHF7.js";
|
|
@@ -1669,7 +1669,7 @@ var EngramAccessHttpServer = class {
|
|
|
1669
1669
|
this.respondJson(res, 400, { error: "pairId and verb are required" });
|
|
1670
1670
|
return;
|
|
1671
1671
|
}
|
|
1672
|
-
const { isValidResolutionVerb, executeResolution } = await import("./resolution-
|
|
1672
|
+
const { isValidResolutionVerb, executeResolution } = await import("./resolution-33PIX3TT.js");
|
|
1673
1673
|
if (!isValidResolutionVerb(verb)) {
|
|
1674
1674
|
this.respondJson(res, 400, { error: `Invalid verb: ${verb}. Must be one of: keep-a, keep-b, merge, both-valid, needs-more-context` });
|
|
1675
1675
|
return;
|
|
@@ -2629,4 +2629,4 @@ function positiveIntQueryParam(value, label) {
|
|
|
2629
2629
|
export {
|
|
2630
2630
|
EngramAccessHttpServer
|
|
2631
2631
|
};
|
|
2632
|
-
//# sourceMappingURL=chunk-
|
|
2632
|
+
//# sourceMappingURL=chunk-QZHF4BWN.js.map
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
import {
|
|
2
|
+
computeCompressionGuidelineCandidate,
|
|
3
|
+
refineCompressionGuidelineCandidateSemantically,
|
|
4
|
+
renderCompressionGuidelinesMarkdown
|
|
5
|
+
} from "./chunk-OD4FM2U7.js";
|
|
6
|
+
import {
|
|
7
|
+
log
|
|
8
|
+
} from "./chunk-NU3CSQ4H.js";
|
|
9
|
+
|
|
10
|
+
// src/orchestration/compression-guideline-coordinator.ts
|
|
11
|
+
import { createHash } from "crypto";
|
|
12
|
+
var CompressionGuidelineCoordinator = class {
|
|
13
|
+
constructor(deps) {
|
|
14
|
+
this.deps = deps;
|
|
15
|
+
}
|
|
16
|
+
deps;
|
|
17
|
+
get storage() {
|
|
18
|
+
return this.deps.getStorage();
|
|
19
|
+
}
|
|
20
|
+
get config() {
|
|
21
|
+
return this.deps.config;
|
|
22
|
+
}
|
|
23
|
+
async optimizeCompressionGuidelines(options) {
|
|
24
|
+
const dryRun = options?.dryRun === true;
|
|
25
|
+
const eventLimit = typeof options?.eventLimit === "number" ? Math.max(0, Math.floor(options.eventLimit)) : 500;
|
|
26
|
+
const [activeState, draftState] = await Promise.all([
|
|
27
|
+
this.storage.readCompressionGuidelineOptimizerState(),
|
|
28
|
+
this.storage.readCompressionGuidelineDraftState().catch(() => null)
|
|
29
|
+
]);
|
|
30
|
+
const previousState = draftState && ((activeState?.guidelineVersion ?? 0) < draftState.guidelineVersion || (activeState?.guidelineVersion ?? 0) === draftState.guidelineVersion) ? draftState : activeState;
|
|
31
|
+
if (!this.config.compressionGuidelineLearningEnabled) {
|
|
32
|
+
return {
|
|
33
|
+
enabled: false,
|
|
34
|
+
dryRun,
|
|
35
|
+
eventCount: 0,
|
|
36
|
+
previousGuidelineVersion: previousState?.guidelineVersion ?? null,
|
|
37
|
+
nextGuidelineVersion: previousState?.guidelineVersion ?? 0,
|
|
38
|
+
changedRules: 0,
|
|
39
|
+
semanticRefinementApplied: false,
|
|
40
|
+
persisted: false,
|
|
41
|
+
draftContentHash: null
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
let events = await this.storage.readMemoryActionEvents(eventLimit);
|
|
45
|
+
if (eventLimit > 0) {
|
|
46
|
+
let effectiveEvents = events.filter((event) => event.dryRun !== true);
|
|
47
|
+
let fetchLimit = eventLimit;
|
|
48
|
+
while (effectiveEvents.length < eventLimit && events.length === fetchLimit) {
|
|
49
|
+
fetchLimit = Math.min(fetchLimit * 2, fetchLimit + 1e3);
|
|
50
|
+
if (fetchLimit <= events.length) break;
|
|
51
|
+
events = await this.storage.readMemoryActionEvents(fetchLimit);
|
|
52
|
+
effectiveEvents = events.filter((event) => event.dryRun !== true);
|
|
53
|
+
}
|
|
54
|
+
events = effectiveEvents.slice(-eventLimit);
|
|
55
|
+
}
|
|
56
|
+
const generatedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
57
|
+
const candidate = computeCompressionGuidelineCandidate(events, {
|
|
58
|
+
generatedAtIso: generatedAt,
|
|
59
|
+
previousState
|
|
60
|
+
});
|
|
61
|
+
if (candidate.eventCounts.total === 0) {
|
|
62
|
+
return {
|
|
63
|
+
enabled: true,
|
|
64
|
+
dryRun,
|
|
65
|
+
eventCount: 0,
|
|
66
|
+
previousGuidelineVersion: previousState?.guidelineVersion ?? null,
|
|
67
|
+
nextGuidelineVersion: previousState?.guidelineVersion ?? 0,
|
|
68
|
+
changedRules: 0,
|
|
69
|
+
semanticRefinementApplied: false,
|
|
70
|
+
persisted: false,
|
|
71
|
+
draftContentHash: null
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
const refinedCandidate = await refineCompressionGuidelineCandidateSemantically(candidate, {
|
|
75
|
+
enabled: this.config.compressionGuidelineSemanticRefinementEnabled,
|
|
76
|
+
timeoutMs: this.config.compressionGuidelineSemanticTimeoutMs,
|
|
77
|
+
runRefinement: async (baseline) => {
|
|
78
|
+
const prompt = [
|
|
79
|
+
"You refine compression policy suggestions conservatively.",
|
|
80
|
+
"Return JSON only in this shape:",
|
|
81
|
+
'{"updates":[{"action":"summarize_node","delta":0.02,"confidence":"medium","note":"..."}]}',
|
|
82
|
+
"Constraints:",
|
|
83
|
+
"- Keep updates sparse and conservative.",
|
|
84
|
+
"- delta must stay between -0.15 and 0.15.",
|
|
85
|
+
"- Only include actions present in the input.",
|
|
86
|
+
"Input candidate:",
|
|
87
|
+
JSON.stringify(baseline)
|
|
88
|
+
].join("\n");
|
|
89
|
+
const response = await this.deps.fastChatCompletion(
|
|
90
|
+
[
|
|
91
|
+
{
|
|
92
|
+
role: "system",
|
|
93
|
+
content: "Respond with strict JSON only. No markdown."
|
|
94
|
+
},
|
|
95
|
+
{ role: "user", content: prompt }
|
|
96
|
+
],
|
|
97
|
+
{
|
|
98
|
+
temperature: 0.1,
|
|
99
|
+
maxTokens: 400,
|
|
100
|
+
operation: "compression_guideline_semantic_refinement",
|
|
101
|
+
priority: "background"
|
|
102
|
+
}
|
|
103
|
+
);
|
|
104
|
+
return this.parseCompressionSemanticRefinement(
|
|
105
|
+
response?.content ?? ""
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
const content = renderCompressionGuidelinesMarkdown(refinedCandidate);
|
|
110
|
+
const contentHash = createHash("sha256").update(content).digest("hex");
|
|
111
|
+
const semanticRefinementApplied = JSON.stringify(refinedCandidate.ruleUpdates) !== JSON.stringify(candidate.ruleUpdates);
|
|
112
|
+
const changedRules = refinedCandidate.ruleUpdates.filter(
|
|
113
|
+
(rule) => rule.delta !== 0
|
|
114
|
+
).length;
|
|
115
|
+
if (!dryRun) {
|
|
116
|
+
await this.storage.writeCompressionGuidelineDraft(content);
|
|
117
|
+
await this.storage.writeCompressionGuidelineDraftState({
|
|
118
|
+
version: refinedCandidate.optimizerVersion,
|
|
119
|
+
updatedAt: refinedCandidate.generatedAt,
|
|
120
|
+
sourceWindow: refinedCandidate.sourceWindow,
|
|
121
|
+
eventCounts: refinedCandidate.eventCounts,
|
|
122
|
+
guidelineVersion: refinedCandidate.guidelineVersion,
|
|
123
|
+
contentHash,
|
|
124
|
+
activationState: "draft",
|
|
125
|
+
actionSummaries: refinedCandidate.actionSummaries,
|
|
126
|
+
ruleUpdates: refinedCandidate.ruleUpdates
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
enabled: true,
|
|
131
|
+
dryRun,
|
|
132
|
+
eventCount: candidate.eventCounts.total,
|
|
133
|
+
previousGuidelineVersion: previousState?.guidelineVersion ?? null,
|
|
134
|
+
nextGuidelineVersion: refinedCandidate.guidelineVersion,
|
|
135
|
+
changedRules,
|
|
136
|
+
semanticRefinementApplied,
|
|
137
|
+
persisted: !dryRun,
|
|
138
|
+
draftContentHash: dryRun ? null : contentHash
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
async activateCompressionGuidelineDraft(options) {
|
|
142
|
+
if (!this.config.compressionGuidelineLearningEnabled) {
|
|
143
|
+
return {
|
|
144
|
+
enabled: false,
|
|
145
|
+
activated: false,
|
|
146
|
+
guidelineVersion: null,
|
|
147
|
+
reason: "disabled"
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
const draftState = await this.storage.readCompressionGuidelineDraftState();
|
|
151
|
+
if (!draftState) {
|
|
152
|
+
return {
|
|
153
|
+
enabled: true,
|
|
154
|
+
activated: false,
|
|
155
|
+
guidelineVersion: null,
|
|
156
|
+
reason: "missing_draft"
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
const expectedContentHash = options?.expectedContentHash?.trim();
|
|
160
|
+
const expectedGuidelineVersion = options?.expectedGuidelineVersion;
|
|
161
|
+
if ((!expectedContentHash || expectedContentHash.length === 0) && typeof expectedGuidelineVersion !== "number") {
|
|
162
|
+
return {
|
|
163
|
+
enabled: true,
|
|
164
|
+
activated: false,
|
|
165
|
+
guidelineVersion: null,
|
|
166
|
+
reason: "expected_revision_required"
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
if (expectedContentHash && draftState.contentHash !== expectedContentHash) {
|
|
170
|
+
return {
|
|
171
|
+
enabled: true,
|
|
172
|
+
activated: false,
|
|
173
|
+
guidelineVersion: null,
|
|
174
|
+
reason: "content_hash_mismatch"
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
if (typeof expectedGuidelineVersion === "number" && draftState.guidelineVersion !== expectedGuidelineVersion) {
|
|
178
|
+
return {
|
|
179
|
+
enabled: true,
|
|
180
|
+
activated: false,
|
|
181
|
+
guidelineVersion: null,
|
|
182
|
+
reason: "guideline_version_mismatch"
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
const activated = await this.storage.activateCompressionGuidelineDraft({
|
|
186
|
+
...expectedContentHash ? { expectedContentHash } : {},
|
|
187
|
+
...typeof expectedGuidelineVersion === "number" ? { expectedGuidelineVersion } : {}
|
|
188
|
+
});
|
|
189
|
+
return {
|
|
190
|
+
enabled: true,
|
|
191
|
+
activated,
|
|
192
|
+
guidelineVersion: activated ? draftState.guidelineVersion : null,
|
|
193
|
+
...activated ? {} : { reason: "draft_changed" }
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
/** Consolidation-time hook: recompute the draft from recent events. */
|
|
197
|
+
async runCompressionGuidelineLearningPass() {
|
|
198
|
+
if (!this.config.compressionGuidelineLearningEnabled) return;
|
|
199
|
+
try {
|
|
200
|
+
const result = await this.optimizeCompressionGuidelines({
|
|
201
|
+
dryRun: false,
|
|
202
|
+
eventLimit: 500
|
|
203
|
+
});
|
|
204
|
+
log.info(
|
|
205
|
+
`compression guideline learning updated (${result.eventCount} events)`
|
|
206
|
+
);
|
|
207
|
+
} catch (err) {
|
|
208
|
+
log.warn(`compression guideline learning failed (ignored): ${err}`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/** Recall-time hook: surface active guidelines as a recall section. */
|
|
212
|
+
async buildCompressionGuidelineRecallSection() {
|
|
213
|
+
if (!this.config.contextCompressionActionsEnabled) return null;
|
|
214
|
+
if (!this.config.compressionGuidelineLearningEnabled) return null;
|
|
215
|
+
const state = await this.storage.readCompressionGuidelineOptimizerState().catch(() => null);
|
|
216
|
+
if (!state || state.guidelineVersion <= 0) return null;
|
|
217
|
+
const raw = await this.storage.readCompressionGuidelines().catch(() => null);
|
|
218
|
+
const summary = raw ? formatCompressionGuidelinesForRecall(raw, 5) : null;
|
|
219
|
+
if (!summary) return null;
|
|
220
|
+
return [
|
|
221
|
+
"## Active Compression Guidelines",
|
|
222
|
+
"",
|
|
223
|
+
`Guideline version: ${state.guidelineVersion}`,
|
|
224
|
+
`Updated: ${state.updatedAt}`,
|
|
225
|
+
"",
|
|
226
|
+
summary
|
|
227
|
+
].join("\n");
|
|
228
|
+
}
|
|
229
|
+
parseCompressionSemanticRefinement(raw) {
|
|
230
|
+
if (typeof raw !== "string" || raw.trim().length === 0) return null;
|
|
231
|
+
const trimmed = raw.trim();
|
|
232
|
+
const start = trimmed.indexOf("{");
|
|
233
|
+
const end = trimmed.lastIndexOf("}");
|
|
234
|
+
if (start === -1 || end === -1 || end <= start) return null;
|
|
235
|
+
try {
|
|
236
|
+
const parsed = JSON.parse(trimmed.slice(start, end + 1));
|
|
237
|
+
if (!Array.isArray(parsed?.updates)) return null;
|
|
238
|
+
const validActions = /* @__PURE__ */ new Set([
|
|
239
|
+
"store_episode",
|
|
240
|
+
"store_note",
|
|
241
|
+
"update_note",
|
|
242
|
+
"create_artifact",
|
|
243
|
+
"summarize_node",
|
|
244
|
+
"discard",
|
|
245
|
+
"link_graph"
|
|
246
|
+
]);
|
|
247
|
+
const updates = parsed.updates.filter(
|
|
248
|
+
(item) => item && typeof item.action === "string" && validActions.has(item.action)
|
|
249
|
+
).map((item) => {
|
|
250
|
+
const confidence = item.confidence === "low" || item.confidence === "medium" || item.confidence === "high" ? item.confidence : void 0;
|
|
251
|
+
return {
|
|
252
|
+
action: item.action,
|
|
253
|
+
delta: typeof item.delta === "number" && Number.isFinite(item.delta) ? item.delta : void 0,
|
|
254
|
+
confidence,
|
|
255
|
+
note: typeof item.note === "string" ? item.note : void 0
|
|
256
|
+
};
|
|
257
|
+
});
|
|
258
|
+
return { updates };
|
|
259
|
+
} catch {
|
|
260
|
+
return null;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
};
|
|
264
|
+
function formatCompressionGuidelinesForRecall(raw, maxLines = 5) {
|
|
265
|
+
if (typeof raw !== "string" || raw.trim().length === 0) return null;
|
|
266
|
+
const sectionMatch = raw.match(
|
|
267
|
+
// End the section at `\n## ` or end-of-string. Plain $ (not \s*$): the
|
|
268
|
+
// \s* branch overlapped the lazy body and backtracked polynomially
|
|
269
|
+
// (CodeQL js/polynomial-redos). Captured lines are trimmed/filtered below,
|
|
270
|
+
// so trailing whitespace handling is unchanged.
|
|
271
|
+
/## Suggested Guidelines\s*\n([\s\S]*?)(?:\n##\s+|$)/i
|
|
272
|
+
);
|
|
273
|
+
if (!sectionMatch) return null;
|
|
274
|
+
const lines = sectionMatch[1].split("\n").map((line) => line.trim()).filter((line) => line.startsWith("- ")).slice(0, Math.max(1, Math.floor(maxLines)));
|
|
275
|
+
if (lines.length === 0) return null;
|
|
276
|
+
return lines.join("\n");
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
export {
|
|
280
|
+
CompressionGuidelineCoordinator,
|
|
281
|
+
formatCompressionGuidelinesForRecall
|
|
282
|
+
};
|
|
283
|
+
//# sourceMappingURL=chunk-SYX73XD7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/orchestration/compression-guideline-coordinator.ts"],"sourcesContent":["/**\n * Compression-guideline learning coordinator — extracted from the\n * orchestrator (issue #1526, seam 4).\n *\n * Owns the compression-guideline learning lifecycle:\n * - candidate computation from recorded memory-action events\n * - optional LLM semantic refinement of the candidate\n * - draft persistence + activation (optimizer/draft state files)\n * - the recall section that surfaces active guidelines during recall\n * - the consolidation-time learning pass that recomputes the draft\n *\n * The orchestrator constructs one instance and delegates the public\n * entrypoints (`optimizeCompressionGuidelines`,\n * `activateCompressionGuidelineDraft`) plus the two internal hooks\n * (`runCompressionGuidelineLearningPass`, called from the consolidation\n * loop; `buildCompressionGuidelineRecallSection`, called from the recall\n * pipeline) to it. Storage is the orchestrator's stable `this.storage`;\n * the fast-tier LLM call arrives as a callback so gateway routing stays\n * owned by the orchestrator.\n *\n * Behavior-preserving move from orchestrator.ts. No logic changes — the\n * orchestrator keeps thin delegating methods so existing call sites and\n * tests that exercise the public API continue to work.\n */\n\nimport { createHash } from \"node:crypto\";\n\n// StorageManager type comes from the package barrel (type-only) so this\n// module does not add a direct storage.ts import (#1533 ratchet).\nimport type { StorageManager } from \"../index.js\";\nimport type { PluginConfig, MemoryActionType, MemoryActionEvent } from \"../types.js\";\nimport { log } from \"../logger.js\";\nimport {\n computeCompressionGuidelineCandidate,\n refineCompressionGuidelineCandidateSemantically,\n renderCompressionGuidelinesMarkdown,\n} from \"../compression-optimizer.js\";\n\n/** Dependencies injected by the orchestrator. All stable references or\n * live accessors. */\nexport interface CompressionGuidelineCoordinatorDeps {\n config: PluginConfig;\n /** Live accessor: the orchestrator's storage manager (stable post-ctor). */\n getStorage: () => StorageManager;\n /** Fast-tier LLM call used for optional semantic refinement. Routes\n * through the gateway chain when configured — owned by the\n * orchestrator, injected here so this module stays LLM-agnostic. */\n fastChatCompletion: (\n messages: Array<{ role: string; content: string }>,\n options: {\n temperature?: number;\n maxTokens?: number;\n timeoutMs?: number;\n operation?: string;\n priority?: \"background\" | \"recall-critical\";\n },\n ) => Promise<{ content: string } | null>;\n}\n\n/**\n * Coordinates compression-guideline learning. Holds no mutable state of\n * its own — all persistence flows through the injected storage manager.\n */\nexport class CompressionGuidelineCoordinator {\n constructor(private readonly deps: CompressionGuidelineCoordinatorDeps) {}\n\n private get storage(): StorageManager {\n return this.deps.getStorage();\n }\n\n private get config(): PluginConfig {\n return this.deps.config;\n }\n\n async optimizeCompressionGuidelines(options?: {\n dryRun?: boolean;\n eventLimit?: number;\n }): Promise<{\n enabled: boolean;\n dryRun: boolean;\n eventCount: number;\n previousGuidelineVersion: number | null;\n nextGuidelineVersion: number;\n changedRules: number;\n semanticRefinementApplied: boolean;\n persisted: boolean;\n draftContentHash: string | null;\n }> {\n const dryRun = options?.dryRun === true;\n const eventLimit =\n typeof options?.eventLimit === \"number\"\n ? Math.max(0, Math.floor(options.eventLimit))\n : 500;\n\n const [activeState, draftState] = await Promise.all([\n this.storage.readCompressionGuidelineOptimizerState(),\n this.storage.readCompressionGuidelineDraftState().catch(() => null),\n ]);\n const previousState =\n draftState &&\n ((activeState?.guidelineVersion ?? 0) < draftState.guidelineVersion ||\n (activeState?.guidelineVersion ?? 0) === draftState.guidelineVersion)\n ? draftState\n : activeState;\n\n if (!this.config.compressionGuidelineLearningEnabled) {\n return {\n enabled: false,\n dryRun,\n eventCount: 0,\n previousGuidelineVersion: previousState?.guidelineVersion ?? null,\n nextGuidelineVersion: previousState?.guidelineVersion ?? 0,\n changedRules: 0,\n semanticRefinementApplied: false,\n persisted: false,\n draftContentHash: null,\n };\n }\n\n let events = await this.storage.readMemoryActionEvents(eventLimit);\n if (eventLimit > 0) {\n let effectiveEvents = events.filter((event) => event.dryRun !== true);\n let fetchLimit = eventLimit;\n while (\n effectiveEvents.length < eventLimit &&\n events.length === fetchLimit\n ) {\n fetchLimit = Math.min(fetchLimit * 2, fetchLimit + 1000);\n if (fetchLimit <= events.length) break;\n events = await this.storage.readMemoryActionEvents(fetchLimit);\n effectiveEvents = events.filter((event) => event.dryRun !== true);\n }\n events = effectiveEvents.slice(-eventLimit);\n }\n const generatedAt = new Date().toISOString();\n const candidate = computeCompressionGuidelineCandidate(events, {\n generatedAtIso: generatedAt,\n previousState,\n });\n if (candidate.eventCounts.total === 0) {\n return {\n enabled: true,\n dryRun,\n eventCount: 0,\n previousGuidelineVersion: previousState?.guidelineVersion ?? null,\n nextGuidelineVersion: previousState?.guidelineVersion ?? 0,\n changedRules: 0,\n semanticRefinementApplied: false,\n persisted: false,\n draftContentHash: null,\n };\n }\n const refinedCandidate =\n await refineCompressionGuidelineCandidateSemantically(candidate, {\n enabled: this.config.compressionGuidelineSemanticRefinementEnabled,\n timeoutMs: this.config.compressionGuidelineSemanticTimeoutMs,\n runRefinement: async (baseline) => {\n const prompt = [\n \"You refine compression policy suggestions conservatively.\",\n \"Return JSON only in this shape:\",\n '{\"updates\":[{\"action\":\"summarize_node\",\"delta\":0.02,\"confidence\":\"medium\",\"note\":\"...\"}]}',\n \"Constraints:\",\n \"- Keep updates sparse and conservative.\",\n \"- delta must stay between -0.15 and 0.15.\",\n \"- Only include actions present in the input.\",\n \"Input candidate:\",\n JSON.stringify(baseline),\n ].join(\"\\n\");\n\n const response = await this.deps.fastChatCompletion(\n [\n {\n role: \"system\",\n content: \"Respond with strict JSON only. No markdown.\",\n },\n { role: \"user\", content: prompt },\n ],\n {\n temperature: 0.1,\n maxTokens: 400,\n operation: \"compression_guideline_semantic_refinement\",\n priority: \"background\",\n },\n );\n\n return this.parseCompressionSemanticRefinement(\n response?.content ?? \"\",\n );\n },\n });\n\n const content = renderCompressionGuidelinesMarkdown(refinedCandidate);\n const contentHash = createHash(\"sha256\").update(content).digest(\"hex\");\n const semanticRefinementApplied =\n JSON.stringify(refinedCandidate.ruleUpdates) !==\n JSON.stringify(candidate.ruleUpdates);\n const changedRules = refinedCandidate.ruleUpdates.filter(\n (rule) => rule.delta !== 0,\n ).length;\n\n if (!dryRun) {\n await this.storage.writeCompressionGuidelineDraft(content);\n await this.storage.writeCompressionGuidelineDraftState({\n version: refinedCandidate.optimizerVersion,\n updatedAt: refinedCandidate.generatedAt,\n sourceWindow: refinedCandidate.sourceWindow,\n eventCounts: refinedCandidate.eventCounts,\n guidelineVersion: refinedCandidate.guidelineVersion,\n contentHash,\n activationState: \"draft\",\n actionSummaries: refinedCandidate.actionSummaries,\n ruleUpdates: refinedCandidate.ruleUpdates,\n });\n }\n\n return {\n enabled: true,\n dryRun,\n eventCount: candidate.eventCounts.total,\n previousGuidelineVersion: previousState?.guidelineVersion ?? null,\n nextGuidelineVersion: refinedCandidate.guidelineVersion,\n changedRules,\n semanticRefinementApplied,\n persisted: !dryRun,\n draftContentHash: dryRun ? null : contentHash,\n };\n }\n\n async activateCompressionGuidelineDraft(options?: {\n expectedContentHash?: string;\n expectedGuidelineVersion?: number;\n }): Promise<{\n enabled: boolean;\n activated: boolean;\n guidelineVersion: number | null;\n reason?:\n | \"disabled\"\n | \"missing_draft\"\n | \"expected_revision_required\"\n | \"content_hash_mismatch\"\n | \"guideline_version_mismatch\"\n | \"draft_changed\";\n }> {\n if (!this.config.compressionGuidelineLearningEnabled) {\n return {\n enabled: false,\n activated: false,\n guidelineVersion: null,\n reason: \"disabled\",\n };\n }\n\n const draftState = await this.storage.readCompressionGuidelineDraftState();\n if (!draftState) {\n return {\n enabled: true,\n activated: false,\n guidelineVersion: null,\n reason: \"missing_draft\",\n };\n }\n\n const expectedContentHash = options?.expectedContentHash?.trim();\n const expectedGuidelineVersion = options?.expectedGuidelineVersion;\n\n if (\n (!expectedContentHash || expectedContentHash.length === 0) &&\n typeof expectedGuidelineVersion !== \"number\"\n ) {\n return {\n enabled: true,\n activated: false,\n guidelineVersion: null,\n reason: \"expected_revision_required\",\n };\n }\n\n if (expectedContentHash && draftState.contentHash !== expectedContentHash) {\n return {\n enabled: true,\n activated: false,\n guidelineVersion: null,\n reason: \"content_hash_mismatch\",\n };\n }\n\n if (\n typeof expectedGuidelineVersion === \"number\" &&\n draftState.guidelineVersion !== expectedGuidelineVersion\n ) {\n return {\n enabled: true,\n activated: false,\n guidelineVersion: null,\n reason: \"guideline_version_mismatch\",\n };\n }\n\n const activated = await this.storage.activateCompressionGuidelineDraft({\n ...(expectedContentHash ? { expectedContentHash } : {}),\n ...(typeof expectedGuidelineVersion === \"number\"\n ? { expectedGuidelineVersion }\n : {}),\n });\n return {\n enabled: true,\n activated,\n guidelineVersion: activated ? draftState.guidelineVersion : null,\n ...(activated ? {} : { reason: \"draft_changed\" as const }),\n };\n }\n\n /** Consolidation-time hook: recompute the draft from recent events. */\n async runCompressionGuidelineLearningPass(): Promise<void> {\n if (!this.config.compressionGuidelineLearningEnabled) return;\n try {\n const result = await this.optimizeCompressionGuidelines({\n dryRun: false,\n eventLimit: 500,\n });\n log.info(\n `compression guideline learning updated (${result.eventCount} events)`,\n );\n } catch (err) {\n log.warn(`compression guideline learning failed (ignored): ${err}`);\n }\n }\n\n /** Recall-time hook: surface active guidelines as a recall section. */\n async buildCompressionGuidelineRecallSection(): Promise<string | null> {\n if (!this.config.contextCompressionActionsEnabled) return null;\n if (!this.config.compressionGuidelineLearningEnabled) return null;\n\n const state = await this.storage\n .readCompressionGuidelineOptimizerState()\n .catch(() => null);\n if (!state || state.guidelineVersion <= 0) return null;\n\n const raw = await this.storage\n .readCompressionGuidelines()\n .catch(() => null);\n const summary = raw ? formatCompressionGuidelinesForRecall(raw, 5) : null;\n if (!summary) return null;\n\n return [\n \"## Active Compression Guidelines\",\n \"\",\n `Guideline version: ${state.guidelineVersion}`,\n `Updated: ${state.updatedAt}`,\n \"\",\n summary,\n ].join(\"\\n\");\n }\n\n private parseCompressionSemanticRefinement(raw: string): {\n updates: Array<{\n action: MemoryActionType;\n delta?: number;\n confidence?: \"low\" | \"medium\" | \"high\";\n note?: string;\n }>;\n } | null {\n if (typeof raw !== \"string\" || raw.trim().length === 0) return null;\n const trimmed = raw.trim();\n const start = trimmed.indexOf(\"{\");\n const end = trimmed.lastIndexOf(\"}\");\n if (start === -1 || end === -1 || end <= start) return null;\n\n try {\n const parsed = JSON.parse(trimmed.slice(start, end + 1)) as {\n updates?: Array<{\n action?: unknown;\n delta?: unknown;\n confidence?: unknown;\n note?: unknown;\n }>;\n };\n if (!Array.isArray(parsed?.updates)) return null;\n\n const validActions = new Set<MemoryActionType>([\n \"store_episode\",\n \"store_note\",\n \"update_note\",\n \"create_artifact\",\n \"summarize_node\",\n \"discard\",\n \"link_graph\",\n ]);\n\n const updates = parsed.updates\n .filter(\n (item) =>\n item &&\n typeof item.action === \"string\" &&\n validActions.has(item.action as MemoryActionType),\n )\n .map((item) => {\n const confidence: \"low\" | \"medium\" | \"high\" | undefined =\n item.confidence === \"low\" ||\n item.confidence === \"medium\" ||\n item.confidence === \"high\"\n ? item.confidence\n : undefined;\n return {\n action: item.action as MemoryActionType,\n delta:\n typeof item.delta === \"number\" && Number.isFinite(item.delta)\n ? item.delta\n : undefined,\n confidence,\n note: typeof item.note === \"string\" ? item.note : undefined,\n };\n });\n\n return { updates };\n } catch {\n return null;\n }\n }\n}\n\n/**\n * Format the active compression-guidelines section for recall. Extracted\n * from the orchestrator (was a module-level export there); re-exported by\n * the orchestrator barrel to preserve the public API. Pure — no state.\n */\nexport function formatCompressionGuidelinesForRecall(\n raw: string,\n maxLines: number = 5,\n): string | null {\n if (typeof raw !== \"string\" || raw.trim().length === 0) return null;\n const sectionMatch = raw.match(\n // End the section at `\\n## ` or end-of-string. Plain $ (not \\s*$): the\n // \\s* branch overlapped the lazy body and backtracked polynomially\n // (CodeQL js/polynomial-redos). Captured lines are trimmed/filtered below,\n // so trailing whitespace handling is unchanged.\n /## Suggested Guidelines\\s*\\n([\\s\\S]*?)(?:\\n##\\s+|$)/i,\n );\n if (!sectionMatch) return null;\n\n const lines = sectionMatch[1]\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.startsWith(\"- \"))\n .slice(0, Math.max(1, Math.floor(maxLines)));\n if (lines.length === 0) return null;\n\n return lines.join(\"\\n\");\n}\n"],"mappings":"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","names":[]}
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
} from "./chunk-ZBJMUXZH.js";
|
|
8
8
|
import {
|
|
9
9
|
StorageManager
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-Q6BAA57B.js";
|
|
11
11
|
import {
|
|
12
12
|
getCachedEpisodeMap,
|
|
13
13
|
setCachedEpisodeMap
|
|
@@ -107,4 +107,4 @@ export {
|
|
|
107
107
|
compareVerifiedEpisodeResults,
|
|
108
108
|
searchVerifiedEpisodes
|
|
109
109
|
};
|
|
110
|
-
//# sourceMappingURL=chunk-
|
|
110
|
+
//# sourceMappingURL=chunk-WDJCZQB4.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
enqueuePassiveCorrectionNotification
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-F6OEXJQQ.js";
|
|
4
4
|
import {
|
|
5
5
|
stripAttributesSuffix
|
|
6
6
|
} from "./chunk-SVOZFLIQ.js";
|
|
@@ -260,7 +260,7 @@ import { mkdir as mkdir2, writeFile as writeFile2 } from "fs/promises";
|
|
|
260
260
|
import { mkdir, readFile, rename, unlink, readdir, writeFile } from "fs/promises";
|
|
261
261
|
import path from "path";
|
|
262
262
|
var REDACTED_REQUEST_TEXT = "[redacted \u2014 never-store/redaction correction text withheld from the pending-plan file]";
|
|
263
|
-
var CorrectionPlanner = class {
|
|
263
|
+
var CorrectionPlanner = class _CorrectionPlanner {
|
|
264
264
|
constructor(deps) {
|
|
265
265
|
this.deps = deps;
|
|
266
266
|
}
|
|
@@ -510,6 +510,11 @@ var CorrectionPlanner = class {
|
|
|
510
510
|
const plan = parsePlan(raw);
|
|
511
511
|
if (!plan) return;
|
|
512
512
|
plan.status = status;
|
|
513
|
+
if (status === "applying") {
|
|
514
|
+
plan.applyingAt = this.deps.now().toISOString();
|
|
515
|
+
} else {
|
|
516
|
+
delete plan.applyingAt;
|
|
517
|
+
}
|
|
513
518
|
if (status !== "applying") {
|
|
514
519
|
plan.actions = plan.actions.map(
|
|
515
520
|
(a) => a.kind === "redaction_rule" ? { ...a, pattern: "[redacted \u2014 pattern applied]" } : a
|
|
@@ -534,6 +539,58 @@ var CorrectionPlanner = class {
|
|
|
534
539
|
}
|
|
535
540
|
});
|
|
536
541
|
}
|
|
542
|
+
/**
|
|
543
|
+
* Stale-applying TTL: a plan in `applying` state longer than this is
|
|
544
|
+
* assumed to be from a crashed process and is recovered on startup
|
|
545
|
+
* (#1713 Item 2). 10 minutes is generous for an apply that normally
|
|
546
|
+
* completes in seconds, yet short enough to avoid leaving stale state.
|
|
547
|
+
*/
|
|
548
|
+
static STALE_APPLYING_TTL_MS = 10 * 60 * 1e3;
|
|
549
|
+
/**
|
|
550
|
+
* Recover stale `applying` plans past the stale-applying TTL (#1713 Item 2).
|
|
551
|
+
*
|
|
552
|
+
* A plan stuck in `applying` means the process died mid-apply. Re-applying
|
|
553
|
+
* wholesale would duplicate succeeded actions (replacements, tombstones,
|
|
554
|
+
* audits), so recovery discards + scrubs the plan instead. The operator
|
|
555
|
+
* inspects the outcome and files a NEW plan for any actions that did not
|
|
556
|
+
* complete. Plans without `applyingAt` (predating this fix) are recovered
|
|
557
|
+
* when they are past their `expiresAt` timestamp.
|
|
558
|
+
*
|
|
559
|
+
* @returns the ids of recovered (discarded) plans.
|
|
560
|
+
*/
|
|
561
|
+
async recoverStaleApplyingPlans(namespace, opts) {
|
|
562
|
+
const ttl = opts?.ttlMs ?? _CorrectionPlanner.STALE_APPLYING_TTL_MS;
|
|
563
|
+
const now = (opts?.now ?? this.deps.now()).getTime();
|
|
564
|
+
const dir = await this.pendingDir(namespace);
|
|
565
|
+
let files;
|
|
566
|
+
try {
|
|
567
|
+
files = await readdir(dir);
|
|
568
|
+
} catch (err) {
|
|
569
|
+
const code = err?.code;
|
|
570
|
+
if (code === "ENOENT") return [];
|
|
571
|
+
throw err;
|
|
572
|
+
}
|
|
573
|
+
const recovered = [];
|
|
574
|
+
for (const f of files) {
|
|
575
|
+
if (!f.endsWith(".json")) continue;
|
|
576
|
+
const planId = f.replace(/\.json$/, "");
|
|
577
|
+
let plan;
|
|
578
|
+
try {
|
|
579
|
+
plan = await this.loadPlan(namespace, planId);
|
|
580
|
+
} catch {
|
|
581
|
+
continue;
|
|
582
|
+
}
|
|
583
|
+
if (!plan || plan.status !== "applying") continue;
|
|
584
|
+
const stale = plan.applyingAt ? now - new Date(plan.applyingAt).getTime() >= ttl : now >= new Date(plan.expiresAt).getTime();
|
|
585
|
+
if (!stale) continue;
|
|
586
|
+
try {
|
|
587
|
+
await this.markConsumed(namespace, planId, "discarded");
|
|
588
|
+
recovered.push(planId);
|
|
589
|
+
} catch {
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
return recovered;
|
|
593
|
+
}
|
|
537
594
|
};
|
|
538
595
|
function assertSafePlanId(planId) {
|
|
539
596
|
if (typeof planId !== "string" || planId.length === 0 || planId.includes("/") || planId.includes("\\") || planId.includes("\0") || planId === "." || planId === ".." || planId.startsWith(".") || planId.includes("..")) {
|
|
@@ -894,6 +951,28 @@ var CorrectionService = class {
|
|
|
894
951
|
await this.planner.markConsumed(namespace, planId, "discarded");
|
|
895
952
|
await this.planner.deletePlan(namespace, planId);
|
|
896
953
|
}
|
|
954
|
+
/**
|
|
955
|
+
* Recover stale `applying` plans across the given namespaces (#1713 Item 2).
|
|
956
|
+
*
|
|
957
|
+
* Startup maintenance: scans each namespace for plans stuck in `applying`
|
|
958
|
+
* past the stale-applying TTL (process died mid-apply) and discards+scrubs
|
|
959
|
+
* them. Unlike plan/apply/listPending, this is NOT a per-caller request —
|
|
960
|
+
* it operates on all supplied namespaces directly because it is an
|
|
961
|
+
* internal maintenance operation invoked by the orchestrator at init.
|
|
962
|
+
*
|
|
963
|
+
* @returns the total count of recovered plans across all namespaces.
|
|
964
|
+
*/
|
|
965
|
+
async recoverStaleApplyingPlans(namespaces) {
|
|
966
|
+
let recovered = 0;
|
|
967
|
+
for (const namespace of namespaces) {
|
|
968
|
+
try {
|
|
969
|
+
const ids = await this.planner.recoverStaleApplyingPlans(namespace);
|
|
970
|
+
recovered += ids.length;
|
|
971
|
+
} catch {
|
|
972
|
+
}
|
|
973
|
+
}
|
|
974
|
+
return recovered;
|
|
975
|
+
}
|
|
897
976
|
requireEnabled() {
|
|
898
977
|
if (!this.deps.isEnabled()) {
|
|
899
978
|
throw new CorrectionContractError(
|
|
@@ -1164,7 +1243,7 @@ async function getExecutorMemory(wiring, namespace, memoryId) {
|
|
|
1164
1243
|
}
|
|
1165
1244
|
async function writeReplacementMemory(wiring, namespace, draft) {
|
|
1166
1245
|
const storage = await wiring.orchestrator.getStorage(namespace);
|
|
1167
|
-
const id = await storage.writeMemory(
|
|
1246
|
+
const { id, tombstoneBlocked } = await storage.writeMemory(
|
|
1168
1247
|
draft.category ?? "fact",
|
|
1169
1248
|
draft.content,
|
|
1170
1249
|
{
|
|
@@ -1178,6 +1257,11 @@ async function writeReplacementMemory(wiring, namespace, draft) {
|
|
|
1178
1257
|
...draft.supersedes ? { supersedes: draft.supersedes } : {}
|
|
1179
1258
|
}
|
|
1180
1259
|
);
|
|
1260
|
+
if (tombstoneBlocked) {
|
|
1261
|
+
throw new CorrectionContractError(
|
|
1262
|
+
`correction replacement was tombstone-blocked (pending_review ${id}) \u2014 cannot supersede with a non-active replacement`
|
|
1263
|
+
);
|
|
1264
|
+
}
|
|
1181
1265
|
return id;
|
|
1182
1266
|
}
|
|
1183
1267
|
async function applyEditMemory(wiring, namespace, memoryId, patch) {
|
|
@@ -1219,7 +1303,7 @@ async function rescopeMemoryFn(wiring, namespace, memoryId, toNamespace) {
|
|
|
1219
1303
|
const destStorage = await wiring.orchestrator.getStorage(toNamespace);
|
|
1220
1304
|
const fm = memory.frontmatter;
|
|
1221
1305
|
const destContent = fm.structuredAttributes ? stripAttributesSuffix(memory.content) : memory.content;
|
|
1222
|
-
const destId = await destStorage.writeMemory(fm.category, destContent, {
|
|
1306
|
+
const { id: destId, tombstoneBlocked: destBlocked } = await destStorage.writeMemory(fm.category, destContent, {
|
|
1223
1307
|
source: `correction:rescope:${namespace}`,
|
|
1224
1308
|
...typeof fm.confidence === "number" ? { confidence: fm.confidence } : {},
|
|
1225
1309
|
...Array.isArray(fm.tags) ? { tags: fm.tags } : {},
|
|
@@ -1231,6 +1315,11 @@ async function rescopeMemoryFn(wiring, namespace, memoryId, toNamespace) {
|
|
|
1231
1315
|
...Array.isArray(fm.links) ? { links: fm.links } : {},
|
|
1232
1316
|
...fm.intentGoal ? { intentGoal: fm.intentGoal } : {}
|
|
1233
1317
|
});
|
|
1318
|
+
if (destBlocked) {
|
|
1319
|
+
throw new CorrectionContractError(
|
|
1320
|
+
`rescope of ${memoryId} into "${toNamespace}" was tombstone-blocked (pending_review ${destId}) \u2014 keeping source active`
|
|
1321
|
+
);
|
|
1322
|
+
}
|
|
1234
1323
|
try {
|
|
1235
1324
|
await sourceStorage.writeMemoryFrontmatter(memory, {
|
|
1236
1325
|
status: "archived",
|
|
@@ -1299,7 +1388,7 @@ async function registerRedactionRuleFn(wiring, namespace, pattern) {
|
|
|
1299
1388
|
}
|
|
1300
1389
|
async function appendAuditRecordFn(wiring, namespace, record) {
|
|
1301
1390
|
const storage = await wiring.orchestrator.getStorage(namespace);
|
|
1302
|
-
const id = await storage.writeMemory("correction", buildAuditBody(record), {
|
|
1391
|
+
const { id } = await storage.writeMemory("correction", buildAuditBody(record), {
|
|
1303
1392
|
source: "correction-contract",
|
|
1304
1393
|
confidence: 1,
|
|
1305
1394
|
tags: ["correction-audit", `plan:${record.planId}`, `classification:${record.classification}`]
|
|
@@ -1794,4 +1883,4 @@ export {
|
|
|
1794
1883
|
capturePassiveCorrections,
|
|
1795
1884
|
clusterByKey
|
|
1796
1885
|
};
|
|
1797
|
-
//# sourceMappingURL=chunk-
|
|
1886
|
+
//# sourceMappingURL=chunk-WNGXQMRI.js.map
|