@remnic/core 9.65.0 → 9.65.2
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-admin-ops-surface.d.ts +11 -11
- package/dist/access-admin-ops-surface.js +45 -43
- package/dist/access-authorization-probe.d.ts +12 -13
- package/dist/access-authorization-probe.js +46 -44
- package/dist/access-boundary.d.ts +12 -156
- package/dist/access-boundary.js +45 -43
- package/dist/access-cli.js +120 -116
- package/dist/access-cli.js.map +1 -1
- package/dist/access-coding-context-resolution.d.ts +1 -1
- package/dist/access-extraction-force-flush.d.ts +11 -11
- package/dist/access-extraction-force-flush.js +45 -43
- package/dist/access-health-types.d.ts +1 -1
- package/dist/access-http-lcm-compaction.d.ts +11 -11
- package/dist/access-http-lifecycle-flush.d.ts +12 -13
- package/dist/access-http-offline-stream.d.ts +11 -11
- package/dist/access-http-query.d.ts +2 -2
- package/dist/access-http-query.js +47 -45
- package/dist/access-http.d.ts +12 -12
- package/dist/access-http.js +65 -63
- package/dist/access-identity-continuity-surface.d.ts +9 -9
- package/dist/access-identity-continuity-surface.js +45 -43
- package/dist/access-lcm-surface.d.ts +11 -11
- package/dist/access-lcm-surface.js +45 -43
- package/dist/access-mcp-admin-tools.js +1 -1
- package/dist/access-mcp-output-schemas.js +1 -1
- package/dist/access-mcp.d.ts +11 -11
- package/dist/access-mcp.js +58 -54
- package/dist/access-memory-search-fanout.d.ts +2 -2
- package/dist/{access-namespace-preflight-AqlR0w02.d.ts → access-namespace-preflight-Dhvcl-T0.d.ts} +1 -1
- package/dist/access-namespace-preflight.d.ts +3 -3
- package/dist/access-namespace-preflight.js +45 -43
- package/dist/access-observe-write-surface.d.ts +11 -11
- package/dist/access-observe-write-surface.js +45 -43
- package/dist/access-offline-manifest.d.ts +9 -9
- package/dist/access-offline-manifest.js +5 -5
- package/dist/access-operations-batch.js +49 -47
- package/dist/access-operations.d.ts +18 -19
- package/dist/access-operations.js +52 -50
- package/dist/access-recall-concurrency.d.ts +11 -11
- package/dist/access-recall-concurrency.js +45 -43
- package/dist/access-recall-response.d.ts +11 -11
- package/dist/access-recall-response.js +45 -43
- package/dist/access-recall-surface.d.ts +11 -11
- package/dist/access-recall-surface.js +45 -43
- package/dist/access-schema.d.ts +118 -118
- package/dist/access-schema.js +3 -3
- package/dist/{access-service-BHmtl9BA.d.ts → access-service-Bke1alZO.d.ts} +484 -80
- package/dist/access-service-helpers.d.ts +11 -11
- package/dist/access-service.d.ts +11 -11
- package/dist/access-service.js +45 -43
- package/dist/access-surface-catalog.d.ts +12 -13
- package/dist/access-surface-catalog.js +49 -45
- package/dist/access-surface-catalog.js.map +1 -1
- package/dist/access-wearables-meetings-surface.d.ts +3 -3
- 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 +6 -1
- package/dist/active-recall.js.map +1 -1
- package/dist/adapters/index.js +4 -4
- package/dist/adapters/registry.js +2 -2
- package/dist/ambient-provenance.d.ts +1 -1
- package/dist/artifact-search.d.ts +1 -1
- package/dist/{auto-sync-5L7EUZ27.js → auto-sync-H64ZCNIR.js} +13 -5
- package/dist/{auto-sync-5L7EUZ27.js.map → auto-sync-H64ZCNIR.js.map} +1 -1
- package/dist/behavior-learner.d.ts +1 -1
- package/dist/behavior-signals.d.ts +1 -1
- package/dist/bootstrap.d.ts +9 -9
- package/dist/briefing-window.d.ts +2 -2
- package/dist/briefing.d.ts +2 -2
- package/dist/briefing.js +19 -17
- package/dist/buffer-surprise-report.d.ts +1 -1
- package/dist/buffer-turn-helpers.d.ts +1 -1
- package/dist/buffer.d.ts +2 -2
- package/dist/buffer.js +4 -4
- package/dist/bulk-import/index.d.ts +3 -3
- package/dist/calibration.d.ts +1 -1
- package/dist/calibration.js +1 -1
- package/dist/capabilities.d.ts +1 -1
- package/dist/{capsule-crypto-7FJQINUR.js → capsule-crypto-YO5QJ6L3.js} +2 -2
- package/dist/{catalog-gBoyN-IW.d.ts → catalog-DV6qnbr7.d.ts} +1 -1
- package/dist/causal-behavior.d.ts +1 -1
- package/dist/causal-behavior.js +2 -2
- package/dist/causal-chain.js +2 -2
- package/dist/causal-consolidation.d.ts +1 -1
- package/dist/causal-consolidation.js +22 -20
- package/dist/causal-consolidation.js.map +1 -1
- package/dist/causal-retrieval.js +2 -2
- package/dist/causal-trajectory-graph.d.ts +1 -1
- package/dist/causal-trajectory-graph.js +2 -2
- package/dist/causal-trajectory.js +1 -1
- package/dist/{chunk-A6LBDIFS.js → chunk-2E36UXVW.js} +2 -2
- package/dist/{chunk-RRJUMSFX.js → chunk-2XDWWPTN.js} +3 -3
- package/dist/{chunk-QCNB4BRE.js → chunk-2YI72KM3.js} +3 -3
- package/dist/{chunk-3YTTAGPB.js → chunk-3DVBKTSO.js} +2 -2
- package/dist/{chunk-IFK3PVM7.js → chunk-3I7ASZN3.js} +2 -2
- package/dist/chunk-3WU7XOFN.js +102 -0
- package/dist/chunk-3WU7XOFN.js.map +1 -0
- package/dist/{chunk-EIR5VLIH.js → chunk-4K7IW3F7.js} +2 -2
- package/dist/chunk-4K7IW3F7.js.map +1 -0
- package/dist/{chunk-HBKFYXBA.js → chunk-4KYOLI6M.js} +15 -15
- package/dist/chunk-573TEZCD.js +88 -0
- package/dist/chunk-573TEZCD.js.map +1 -0
- package/dist/{chunk-RNKNL5GQ.js → chunk-5NM4OH4P.js} +3 -3
- package/dist/{chunk-CESQ4CMC.js → chunk-5YQ63T4B.js} +2 -2
- package/dist/{chunk-PMVPCZJZ.js → chunk-6433HV72.js} +2 -2
- package/dist/{chunk-4NZHHGVL.js → chunk-7BDZTALN.js} +4 -1
- package/dist/chunk-7BDZTALN.js.map +1 -0
- package/dist/{chunk-NS5ETDYD.js → chunk-7BEPVIH3.js} +3 -3
- package/dist/{chunk-JG22O53B.js → chunk-7CBKAQIG.js} +2 -1
- package/dist/chunk-7CBKAQIG.js.map +1 -0
- package/dist/{chunk-SHQFYZTD.js → chunk-7YQ4IYS2.js} +2 -2
- package/dist/chunk-AAXJNINV.js +55 -0
- package/dist/chunk-AAXJNINV.js.map +1 -0
- package/dist/{chunk-YMOPYG3K.js → chunk-BIJAWZYW.js} +6 -6
- package/dist/{chunk-YQ3CBLL4.js → chunk-BWLRUMOG.js} +78 -8
- package/dist/chunk-BWLRUMOG.js.map +1 -0
- package/dist/{chunk-2NLLXCJG.js → chunk-BXLOS5AJ.js} +2 -2
- package/dist/{chunk-VYEPACWY.js → chunk-C24UZSFW.js} +2 -2
- package/dist/{chunk-ZPN7W3OP.js → chunk-CDUUDBWJ.js} +3 -3
- package/dist/{chunk-K7JMKLKV.js → chunk-CT56C22C.js} +4 -4
- package/dist/{chunk-KWIGDKM2.js → chunk-D2YNNDML.js} +2 -2
- package/dist/{chunk-ZFBZ4QTS.js → chunk-DJZWNKFO.js} +10 -10
- package/dist/{chunk-X7Y7WX73.js → chunk-DQEMWVMT.js} +1 -1
- package/dist/{chunk-VNIETTMR.js → chunk-DZUJ46DO.js} +2 -2
- package/dist/{chunk-T6QMNVMO.js → chunk-EILZG5VC.js} +2 -2
- package/dist/{chunk-652S5A5D.js → chunk-EUYWQ7TS.js} +2 -2
- package/dist/{chunk-YIZRTHHF.js → chunk-GDFVPUJ5.js} +2 -2
- package/dist/{chunk-ML3U4KPR.js → chunk-GIC6BASP.js} +2 -2
- package/dist/{chunk-7PWWGYGO.js → chunk-GNCCUR6K.js} +2 -2
- package/dist/{chunk-Y5UT73VZ.js → chunk-IID2CMUU.js} +2 -2
- package/dist/{chunk-MB6GLPRY.js → chunk-IVKIODHO.js} +4 -4
- package/dist/{chunk-ZAI5R6DW.js → chunk-J275IYMG.js} +26 -17
- package/dist/chunk-J275IYMG.js.map +1 -0
- package/dist/{chunk-UYCIS6V5.js → chunk-JCWY73FK.js} +2 -2
- package/dist/{chunk-URS5GSM7.js → chunk-JXN77SGO.js} +1 -1
- package/dist/chunk-JXN77SGO.js.map +1 -0
- package/dist/{chunk-WHA6ISFX.js → chunk-JYYBA7TF.js} +2 -2
- package/dist/{chunk-T42L3S6A.js → chunk-LBWQ65SX.js} +4 -4
- package/dist/{chunk-MSTNSVXI.js → chunk-LDBFXD4F.js} +2 -1
- package/dist/chunk-LDBFXD4F.js.map +1 -0
- package/dist/{chunk-JXMXTV6C.js → chunk-LGO6A7GJ.js} +56 -56
- package/dist/{chunk-XBRGJJK7.js → chunk-LUNJ3WFO.js} +10 -8
- package/dist/chunk-LUNJ3WFO.js.map +1 -0
- package/dist/{chunk-H6B6GPVH.js → chunk-LZH5FR2W.js} +2 -2
- package/dist/{chunk-5HERQ5FX.js → chunk-M4AHBM72.js} +10 -10
- package/dist/{chunk-GOGHZVY3.js → chunk-MN4KB2A4.js} +3 -3
- package/dist/{chunk-OQIRBGUU.js → chunk-N37X5RU7.js} +2 -2
- package/dist/{chunk-E6EQTCOQ.js → chunk-NKKD4ZAU.js} +2 -2
- package/dist/{chunk-VANZKHTN.js → chunk-NNBZS3DY.js} +2 -2
- package/dist/{chunk-IWUN4RZL.js → chunk-NTWN6HB2.js} +5 -5
- package/dist/{chunk-2PSX5BJU.js → chunk-NZPFCP5A.js} +2 -2
- package/dist/{chunk-U56TGYVS.js → chunk-OCZIYAE5.js} +4 -4
- package/dist/{chunk-I2HTKOOP.js → chunk-ODZG724P.js} +2 -2
- package/dist/{chunk-LTBKKSCX.js → chunk-OLBZ2WGG.js} +2 -2
- package/dist/{chunk-GQ5OJVTM.js → chunk-OTHZWLUD.js} +2 -2
- package/dist/{chunk-PD66CVSD.js → chunk-OUKBMQ2O.js} +2 -2
- package/dist/{chunk-4E6IJCLC.js → chunk-PE255F4T.js} +2 -2
- package/dist/{chunk-GPFZFCRN.js → chunk-PP7R754B.js} +1 -1
- package/dist/{chunk-PHX3ET3C.js → chunk-QOS5LBZN.js} +2 -2
- package/dist/{chunk-G72IPMR7.js → chunk-R4OCGPSH.js} +2 -2
- package/dist/{chunk-VUP47UJI.js → chunk-R7JAM2XF.js} +3 -3
- package/dist/{chunk-LCU5R6TQ.js → chunk-RAIUTAZZ.js} +22 -3
- package/dist/chunk-RAIUTAZZ.js.map +1 -0
- package/dist/chunk-RIAM7DND.js +167 -0
- package/dist/chunk-RIAM7DND.js.map +1 -0
- package/dist/{chunk-JBPKEARU.js → chunk-RKNJBZ55.js} +4 -4
- package/dist/{chunk-P4CQCL27.js → chunk-S2DPMJXH.js} +2 -2
- package/dist/{chunk-YHSNAGN3.js → chunk-SB7D4BT7.js} +548 -126
- package/dist/chunk-SB7D4BT7.js.map +1 -0
- package/dist/{chunk-VRYEXPRX.js → chunk-SBDCZ2AX.js} +1 -1
- package/dist/chunk-SBDCZ2AX.js.map +1 -0
- package/dist/{chunk-OXL5QKTV.js → chunk-SIHSCCUQ.js} +1 -1
- package/dist/{chunk-KLPVXLQJ.js → chunk-SPUJNJJC.js} +2 -2
- package/dist/{chunk-CCP6LXQJ.js → chunk-SQI57UCJ.js} +2 -2
- package/dist/{chunk-UIYYS2YI.js → chunk-SVSRPG6M.js} +2 -2
- package/dist/{chunk-56BSXSHC.js → chunk-TBOJ76ER.js} +14 -1
- package/dist/{chunk-56BSXSHC.js.map → chunk-TBOJ76ER.js.map} +1 -1
- package/dist/{chunk-RQYV6M2T.js → chunk-TF77C7SV.js} +14 -7
- package/dist/chunk-TF77C7SV.js.map +1 -0
- package/dist/{chunk-RNORDDD6.js → chunk-THG4GYIE.js} +2 -2
- package/dist/{chunk-CUIAHZPZ.js → chunk-TR7DGXGI.js} +2 -2
- package/dist/{chunk-GEULB2VI.js → chunk-TZNQUNKL.js} +7 -1
- package/dist/chunk-TZNQUNKL.js.map +1 -0
- package/dist/{chunk-PDKBKBC2.js → chunk-UIN2BWDD.js} +2 -2
- package/dist/{chunk-4GD7YV4Y.js → chunk-UXO5IMBK.js} +3 -3
- package/dist/{chunk-UPIKAT5A.js → chunk-V3MXUL3D.js} +173 -77
- package/dist/chunk-V3MXUL3D.js.map +1 -0
- package/dist/{chunk-KQAFEZQX.js → chunk-VDX2J7OX.js} +2 -2
- package/dist/{chunk-MUJ4QFUQ.js → chunk-W4BMEGQA.js} +4 -4
- package/dist/{chunk-5HK3CJAR.js → chunk-W675UJCZ.js} +2 -2
- package/dist/{chunk-MDVBCPOS.js → chunk-XCTXS7VY.js} +2 -2
- package/dist/{chunk-NTERJOFA.js → chunk-XRYZRW54.js} +2 -2
- package/dist/{chunk-LA2MSK23.js → chunk-Y7DK7HHJ.js} +2 -2
- package/dist/{chunk-34BMUGRA.js → chunk-YB42WZCY.js} +2 -2
- package/dist/{chunk-LWVG6U7L.js → chunk-YHCBJULX.js} +2 -2
- package/dist/{chunk-HDD4RRIX.js → chunk-YLDXWCZP.js} +21 -6
- package/dist/chunk-YLDXWCZP.js.map +1 -0
- package/dist/{chunk-VYISFWVX.js → chunk-YQNNHLCG.js} +2 -2
- package/dist/{chunk-FFPBTNLC.js → chunk-Z7PBQPJ4.js} +2 -2
- package/dist/{chunk-MXJU4GCA.js → chunk-ZO6AXLEH.js} +2 -2
- package/dist/{chunk-JNSLW2O4.js → chunk-ZQHI2BZB.js} +2 -2
- package/dist/{chunk-A4VJKT2H.js → chunk-ZWXJBFZU.js} +11 -11
- package/dist/chunk-ZWXJBFZU.js.map +1 -0
- package/dist/{cli-BpwTNHTm.d.ts → cli-cShQ13XG.d.ts} +5 -5
- package/dist/cli.d.ts +13 -13
- package/dist/cli.js +89 -86
- package/dist/coding/pre-action-gate.d.ts +1 -1
- package/dist/coding/pre-action-gate.js +2 -2
- package/dist/compounding/engine.d.ts +2 -2
- package/dist/compounding/engine.js +20 -18
- 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 +6 -1
- package/dist/connectors/codex-materialize-runner.d.ts +1 -1
- package/dist/connectors/codex-materialize-runner.js +19 -17
- package/dist/connectors/codex-materialize.d.ts +1 -1
- package/dist/connectors/index.d.ts +1 -1
- package/dist/connectors/index.js +19 -17
- package/dist/consolidation-provenance-check.d.ts +2 -2
- package/dist/consolidation-undo.d.ts +2 -2
- package/dist/contradiction/index.d.ts +2 -2
- package/dist/contradiction/index.js +10 -2
- package/dist/converge-config.d.ts +1 -1
- package/dist/convergence-refresh.d.ts +2 -2
- package/dist/convergence-refresh.js +21 -19
- 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/corpus-watermark.d.ts +1 -1
- package/dist/corpus-watermark.js +21 -19
- package/dist/cross-lingual-recall.d.ts +70 -0
- package/dist/cross-lingual-recall.js +14 -0
- package/dist/day-summary.d.ts +1 -1
- package/dist/delinearize.d.ts +1 -1
- package/dist/dependency-propagation-config.d.ts +1 -1
- package/dist/{dependency-propagation-delivery-QYJ1-c2M.d.ts → dependency-propagation-delivery-CsGg-VwS.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/enrichment/index.d.ts +1 -1
- package/dist/entity-origin-fields.d.ts +1 -1
- package/dist/entity-retrieval.d.ts +2 -2
- package/dist/entity-retrieval.js +19 -17
- package/dist/entity-schema.d.ts +1 -1
- package/dist/episodic-context.d.ts +1 -1
- package/dist/explicit-capture.d.ts +9 -9
- package/dist/explicit-capture.js +7 -6
- package/dist/external-wiki-access.d.ts +12 -13
- package/dist/external-wiki-access.js +46 -44
- package/dist/external-wiki-collection-registration.d.ts +1 -1
- package/dist/external-wiki-collection.d.ts +1 -1
- package/dist/external-wiki-mcp-tools.d.ts +11 -11
- package/dist/extraction-error-classification.d.ts +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-judge.js +2 -2
- package/dist/extraction-liveness.d.ts +1 -1
- package/dist/extraction-normalization.d.ts +1 -1
- package/dist/extraction-normalization.js +2 -2
- package/dist/extraction-prompt.d.ts +2 -2
- package/dist/extraction-prompt.js +1 -1
- package/dist/extraction-source-grounding-rules.d.ts +1 -1
- package/dist/extraction-source-grounding.d.ts +1 -1
- package/dist/extraction.d.ts +1 -1
- package/dist/extraction.js +27 -25
- package/dist/fallback-llm.d.ts +1 -1
- 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-decay-A4SDFMMS.js → graph-edge-decay-FXGELBFA.js} +4 -4
- package/dist/graph-edge-reinforcement.d.ts +1 -1
- package/dist/graph-path-reconstruction.d.ts +1 -1
- package/dist/graph-path-scoring.d.ts +1 -1
- package/dist/graph-snapshot.d.ts +1 -1
- package/dist/graph-snapshot.js +3 -3
- package/dist/graph.d.ts +1 -1
- package/dist/graph.js +3 -3
- package/dist/harmonic-retrieval.js +1 -1
- package/dist/importance.d.ts +1 -1
- package/dist/importers/index.d.ts +1 -1
- package/dist/in-flight-reads.d.ts +1 -1
- package/dist/index.d.ts +718 -701
- package/dist/index.js +188 -139
- package/dist/intent.d.ts +1 -1
- package/dist/lcm/engine.d.ts +1 -1
- package/dist/lcm/engine.js +4 -4
- package/dist/lcm/index.d.ts +1 -1
- package/dist/lcm/index.js +10 -10
- 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-llm.js +2 -2
- package/dist/local-model-endpoint.d.ts +1 -1
- package/dist/maintenance/memory-governance.d.ts +1 -1
- package/dist/maintenance/memory-governance.js +19 -17
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +19 -17
- package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
- package/dist/maintenance/rebuild-memory-projection.js +20 -18
- package/dist/{maintenance-BjEr3WKG.d.ts → maintenance-jhMpeGne.d.ts} +3 -3
- package/dist/mcp-memory-inspector-app.d.ts +11 -11
- package/dist/mcp-read-only-tools.js +1 -1
- 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-snapshot.d.ts +1 -1
- package/dist/memory-subject-cli.d.ts +177 -0
- package/dist/memory-subject-cli.js +16 -0
- package/dist/memory-subject-cli.js.map +1 -0
- package/dist/memory-subject.d.ts +128 -0
- package/dist/memory-subject.js +44 -0
- package/dist/memory-subject.js.map +1 -0
- package/dist/memory-worth-outcomes.d.ts +5 -4
- package/dist/memory-worth-outcomes.js +1 -1
- package/dist/models-json.d.ts +1 -1
- package/dist/namespaces/migrate.d.ts +3 -3
- package/dist/namespaces/migrate.js +20 -18
- package/dist/namespaces/principal.d.ts +1 -1
- package/dist/namespaces/search.d.ts +1 -1
- package/dist/namespaces/search.js +9 -9
- package/dist/namespaces/storage.d.ts +3 -3
- package/dist/namespaces/storage.js +19 -17
- package/dist/native-knowledge.d.ts +1 -1
- package/dist/offline-sync-impression-drain.d.ts +1 -1
- package/dist/operator-doctor-corpus.d.ts +1 -1
- package/dist/operator-doctor-corpus.js +22 -20
- package/dist/operator-doctor-replica.d.ts +1 -1
- package/dist/operator-toolkit.d.ts +3 -3
- package/dist/operator-toolkit.js +31 -28
- package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
- package/dist/orchestration/maintenance.d.ts +4 -4
- package/dist/orchestration/maintenance.js +25 -23
- package/dist/{orchestrator-CC4USYcD.d.ts → orchestrator-DyGUC7re.d.ts} +8 -8
- package/dist/orchestrator.d.ts +9 -9
- package/dist/orchestrator.js +120 -116
- package/dist/patterns-cli.d.ts +1 -1
- package/dist/{pipeline-DWgAgvJN.d.ts → pipeline-C25Oxtp1.d.ts} +1 -1
- package/dist/policy-runtime.d.ts +1 -1
- package/dist/proactive-contention.d.ts +1 -1
- package/dist/provenance.d.ts +1 -1
- package/dist/{public-http-CkQC8VpD.d.ts → public-http-CMe7NQzj.d.ts} +1 -1
- package/dist/{qmd-BJGhj4ta.d.ts → qmd-DkDVCbgF.d.ts} +1 -1
- package/dist/qmd-preflight.d.ts +2 -2
- package/dist/qmd-recall-cache.d.ts +1 -1
- package/dist/qmd.d.ts +2 -2
- package/dist/qmd.js +2 -2
- package/dist/recall-concurrency-config.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-explain-renderer.js +3 -3
- package/dist/recall-memory-map.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-timings.d.ts +1 -1
- package/dist/recall-xray-cli.d.ts +1 -1
- package/dist/recall-xray-cli.js +4 -4
- package/dist/recall-xray-renderer.d.ts +1 -1
- package/dist/recall-xray-renderer.js +3 -3
- package/dist/recall-xray.d.ts +1 -1
- package/dist/recall-xray.js +2 -2
- package/dist/reconcile/cursor.d.ts +1 -1
- package/dist/reconcile/manifest.d.ts +1 -1
- package/dist/reconcile/manifest.js +3 -3
- package/dist/reconcile/plan.d.ts +1 -1
- package/dist/replay/normalizers/chatgpt.d.ts +1 -1
- package/dist/replay/normalizers/claude.d.ts +1 -1
- package/dist/replay/normalizers/openclaw.d.ts +1 -1
- package/dist/replay/normalizers/shared.d.ts +1 -1
- package/dist/replay/runner.d.ts +1 -1
- package/dist/replay/types.d.ts +1 -1
- package/dist/replica-divergence.d.ts +1 -1
- package/dist/replica-peers-config.d.ts +1 -1
- package/dist/{resolution-DKMBPXHI.js → resolution-MFY72STR.js} +11 -3
- package/dist/resolution-MFY72STR.js.map +1 -0
- package/dist/resolve-auth-token.d.ts +1 -1
- package/dist/resume-bundles.js +7 -2
- package/dist/retrieval-agents.d.ts +2 -2
- 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/salvage-envelope.d.ts +1 -1
- package/dist/salvage-envelope.js +10 -2
- package/dist/schemas.d.ts +122 -108
- package/dist/schemas.js +1 -1
- package/dist/{scope-profiles-C4PdBYKc.d.ts → scope-profiles-B9xMoFO-.d.ts} +1 -1
- package/dist/search/embed-helper.d.ts +1 -1
- package/dist/search/factory.d.ts +1 -1
- package/dist/search/factory.js +8 -8
- package/dist/search/index.d.ts +1 -1
- package/dist/search/index.js +14 -14
- package/dist/search/lancedb-backend.d.ts +1 -1
- package/dist/search/lancedb-backend.js +2 -2
- package/dist/search/meilisearch-backend.d.ts +1 -1
- package/dist/search/meilisearch-backend.js +2 -2
- package/dist/search/noop-backend.d.ts +1 -1
- package/dist/search/orama-backend.d.ts +1 -1
- package/dist/search/orama-backend.js +2 -2
- package/dist/search/port.d.ts +2 -2
- package/dist/search/port.js +1 -1
- package/dist/search/remote-backend.d.ts +1 -1
- package/dist/search/remote-backend.js +2 -2
- package/dist/{semantic-consolidation-5-HOmIhL.d.ts → semantic-consolidation-C4uykW84.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +2 -2
- package/dist/semantic-consolidation.js +20 -18
- package/dist/semantic-rule-promotion.js +19 -17
- package/dist/semantic-rule-verifier.d.ts +1 -1
- package/dist/semantic-rule-verifier.js +19 -17
- package/dist/{service-8pDy6w8u.d.ts → service-DCZDZNcV.d.ts} +2 -2
- 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 +11 -11
- package/dist/signal.d.ts +1 -1
- package/dist/source-agent-qualifier.d.ts +1 -1
- package/dist/source-agent-qualifier.js +21 -19
- package/dist/{storage-VpDzURiA.d.ts → storage-CcKmEjL8.d.ts} +3 -2
- package/dist/storage.d.ts +2 -2
- package/dist/storage.js +21 -19
- package/dist/subject-config.d.ts +38 -0
- package/dist/subject-config.js +20 -0
- package/dist/subject-config.js.map +1 -0
- package/dist/summarizer.d.ts +1 -1
- package/dist/summarizer.js +3 -3
- package/dist/summary-snapshot.d.ts +1 -1
- package/dist/support-passport/index.d.ts +14 -14
- package/dist/support-passport/index.js +48 -46
- package/dist/temporal-supersession.d.ts +2 -2
- package/dist/temporal-timeline-recall.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 +2 -2
- 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/backup.js +2 -2
- package/dist/transfer/capsule-export.js +2 -2
- package/dist/transfer/capsule-import.js +2 -2
- package/dist/transfer/types.d.ts +66 -66
- package/dist/trust-score-stage.d.ts +1 -1
- package/dist/trust-score.d.ts +1 -1
- package/dist/{types-D9gKdB79.d.ts → types-Pi0lfaEt.d.ts} +40 -29
- package/dist/types.d.ts +1 -1
- package/dist/types.js +1 -1
- package/dist/utility-runtime.d.ts +1 -1
- package/dist/verified-recall.js +19 -17
- package/dist/who-knows-cli.d.ts +11 -11
- package/dist/who-knows-cli.js +20 -18
- package/dist/who-knows.d.ts +11 -11
- package/dist/who-knows.js +19 -17
- package/dist/write-envelope.d.ts +5 -2
- package/dist/write-envelope.js +10 -1
- package/package.json +2 -2
- package/scripts/build-with-heap.mjs +1 -1
- package/src/access-boundary.ts +2 -0
- package/src/access-mcp-admin-tools.ts +14 -0
- package/src/access-mcp-output-schemas.ts +6 -0
- package/src/access-mcp.ts +6 -6
- package/src/access-operations-batch.ts +8 -0
- package/src/access-service.ts +85 -0
- package/src/access-surface-catalog.ts +2 -0
- package/src/config.ts +10 -17
- package/src/cross-lingual-recall.test.ts +47 -0
- package/src/cross-lingual-recall.ts +186 -0
- package/src/extraction-prompt.ts +1 -0
- package/src/extraction.ts +4 -1
- package/src/index.ts +5 -6
- package/src/mcp-read-only-tools.ts +1 -0
- package/src/memory-subject-cli.ts +135 -0
- package/src/memory-subject.test.ts +48 -0
- package/src/memory-subject.ts +314 -0
- package/src/memory-worth-outcomes.test.ts +6 -2
- package/src/memory-worth-outcomes.ts +11 -7
- package/src/operator-toolkit.ts +1 -1
- package/src/orchestration/extraction-persist.ts +48 -48
- package/src/orchestration/recall-internal-deps.ts +2 -0
- package/src/orchestration/recall-internal.ts +41 -38
- package/src/orchestration/recall-search-pipeline.ts +16 -0
- package/src/procedural/library-maintenance.test.ts +582 -0
- package/src/procedural/library-maintenance.ts +546 -0
- package/src/procedural/maintenance-config.ts +78 -0
- package/src/procedural/procedure-recall.ts +29 -1
- package/src/procedural/procedure-stats.ts +20 -0
- package/src/schemas.ts +7 -0
- package/src/search/port.ts +2 -1
- package/src/spaces/index.ts +38 -2
- package/src/storage.ts +11 -3
- package/src/subject-config.ts +80 -0
- package/src/types.ts +28 -29
- package/src/write-envelope.test.ts +14 -0
- package/src/write-envelope.ts +24 -3
- package/dist/chunk-4NZHHGVL.js.map +0 -1
- package/dist/chunk-A4VJKT2H.js.map +0 -1
- package/dist/chunk-EIR5VLIH.js.map +0 -1
- package/dist/chunk-GEULB2VI.js.map +0 -1
- package/dist/chunk-HDD4RRIX.js.map +0 -1
- package/dist/chunk-JG22O53B.js.map +0 -1
- package/dist/chunk-LCU5R6TQ.js.map +0 -1
- package/dist/chunk-MSTNSVXI.js.map +0 -1
- package/dist/chunk-RQYV6M2T.js.map +0 -1
- package/dist/chunk-UPIKAT5A.js.map +0 -1
- package/dist/chunk-URS5GSM7.js.map +0 -1
- package/dist/chunk-VRYEXPRX.js.map +0 -1
- package/dist/chunk-XBRGJJK7.js.map +0 -1
- package/dist/chunk-YHSNAGN3.js.map +0 -1
- package/dist/chunk-YQ3CBLL4.js.map +0 -1
- package/dist/chunk-ZAI5R6DW.js.map +0 -1
- /package/dist/{capsule-crypto-7FJQINUR.js.map → capsule-crypto-YO5QJ6L3.js.map} +0 -0
- /package/dist/{chunk-A6LBDIFS.js.map → chunk-2E36UXVW.js.map} +0 -0
- /package/dist/{chunk-RRJUMSFX.js.map → chunk-2XDWWPTN.js.map} +0 -0
- /package/dist/{chunk-QCNB4BRE.js.map → chunk-2YI72KM3.js.map} +0 -0
- /package/dist/{chunk-3YTTAGPB.js.map → chunk-3DVBKTSO.js.map} +0 -0
- /package/dist/{chunk-IFK3PVM7.js.map → chunk-3I7ASZN3.js.map} +0 -0
- /package/dist/{chunk-HBKFYXBA.js.map → chunk-4KYOLI6M.js.map} +0 -0
- /package/dist/{chunk-RNKNL5GQ.js.map → chunk-5NM4OH4P.js.map} +0 -0
- /package/dist/{chunk-CESQ4CMC.js.map → chunk-5YQ63T4B.js.map} +0 -0
- /package/dist/{chunk-PMVPCZJZ.js.map → chunk-6433HV72.js.map} +0 -0
- /package/dist/{chunk-NS5ETDYD.js.map → chunk-7BEPVIH3.js.map} +0 -0
- /package/dist/{chunk-SHQFYZTD.js.map → chunk-7YQ4IYS2.js.map} +0 -0
- /package/dist/{chunk-YMOPYG3K.js.map → chunk-BIJAWZYW.js.map} +0 -0
- /package/dist/{chunk-2NLLXCJG.js.map → chunk-BXLOS5AJ.js.map} +0 -0
- /package/dist/{chunk-VYEPACWY.js.map → chunk-C24UZSFW.js.map} +0 -0
- /package/dist/{chunk-ZPN7W3OP.js.map → chunk-CDUUDBWJ.js.map} +0 -0
- /package/dist/{chunk-K7JMKLKV.js.map → chunk-CT56C22C.js.map} +0 -0
- /package/dist/{chunk-KWIGDKM2.js.map → chunk-D2YNNDML.js.map} +0 -0
- /package/dist/{chunk-ZFBZ4QTS.js.map → chunk-DJZWNKFO.js.map} +0 -0
- /package/dist/{chunk-X7Y7WX73.js.map → chunk-DQEMWVMT.js.map} +0 -0
- /package/dist/{chunk-VNIETTMR.js.map → chunk-DZUJ46DO.js.map} +0 -0
- /package/dist/{chunk-T6QMNVMO.js.map → chunk-EILZG5VC.js.map} +0 -0
- /package/dist/{chunk-652S5A5D.js.map → chunk-EUYWQ7TS.js.map} +0 -0
- /package/dist/{chunk-YIZRTHHF.js.map → chunk-GDFVPUJ5.js.map} +0 -0
- /package/dist/{chunk-ML3U4KPR.js.map → chunk-GIC6BASP.js.map} +0 -0
- /package/dist/{chunk-7PWWGYGO.js.map → chunk-GNCCUR6K.js.map} +0 -0
- /package/dist/{chunk-Y5UT73VZ.js.map → chunk-IID2CMUU.js.map} +0 -0
- /package/dist/{chunk-MB6GLPRY.js.map → chunk-IVKIODHO.js.map} +0 -0
- /package/dist/{chunk-UYCIS6V5.js.map → chunk-JCWY73FK.js.map} +0 -0
- /package/dist/{chunk-WHA6ISFX.js.map → chunk-JYYBA7TF.js.map} +0 -0
- /package/dist/{chunk-T42L3S6A.js.map → chunk-LBWQ65SX.js.map} +0 -0
- /package/dist/{chunk-JXMXTV6C.js.map → chunk-LGO6A7GJ.js.map} +0 -0
- /package/dist/{chunk-H6B6GPVH.js.map → chunk-LZH5FR2W.js.map} +0 -0
- /package/dist/{chunk-5HERQ5FX.js.map → chunk-M4AHBM72.js.map} +0 -0
- /package/dist/{chunk-GOGHZVY3.js.map → chunk-MN4KB2A4.js.map} +0 -0
- /package/dist/{chunk-OQIRBGUU.js.map → chunk-N37X5RU7.js.map} +0 -0
- /package/dist/{chunk-E6EQTCOQ.js.map → chunk-NKKD4ZAU.js.map} +0 -0
- /package/dist/{chunk-VANZKHTN.js.map → chunk-NNBZS3DY.js.map} +0 -0
- /package/dist/{chunk-IWUN4RZL.js.map → chunk-NTWN6HB2.js.map} +0 -0
- /package/dist/{chunk-2PSX5BJU.js.map → chunk-NZPFCP5A.js.map} +0 -0
- /package/dist/{chunk-U56TGYVS.js.map → chunk-OCZIYAE5.js.map} +0 -0
- /package/dist/{chunk-I2HTKOOP.js.map → chunk-ODZG724P.js.map} +0 -0
- /package/dist/{chunk-LTBKKSCX.js.map → chunk-OLBZ2WGG.js.map} +0 -0
- /package/dist/{chunk-GQ5OJVTM.js.map → chunk-OTHZWLUD.js.map} +0 -0
- /package/dist/{chunk-PD66CVSD.js.map → chunk-OUKBMQ2O.js.map} +0 -0
- /package/dist/{chunk-4E6IJCLC.js.map → chunk-PE255F4T.js.map} +0 -0
- /package/dist/{chunk-GPFZFCRN.js.map → chunk-PP7R754B.js.map} +0 -0
- /package/dist/{chunk-PHX3ET3C.js.map → chunk-QOS5LBZN.js.map} +0 -0
- /package/dist/{chunk-G72IPMR7.js.map → chunk-R4OCGPSH.js.map} +0 -0
- /package/dist/{chunk-VUP47UJI.js.map → chunk-R7JAM2XF.js.map} +0 -0
- /package/dist/{chunk-JBPKEARU.js.map → chunk-RKNJBZ55.js.map} +0 -0
- /package/dist/{chunk-P4CQCL27.js.map → chunk-S2DPMJXH.js.map} +0 -0
- /package/dist/{chunk-OXL5QKTV.js.map → chunk-SIHSCCUQ.js.map} +0 -0
- /package/dist/{chunk-KLPVXLQJ.js.map → chunk-SPUJNJJC.js.map} +0 -0
- /package/dist/{chunk-CCP6LXQJ.js.map → chunk-SQI57UCJ.js.map} +0 -0
- /package/dist/{chunk-UIYYS2YI.js.map → chunk-SVSRPG6M.js.map} +0 -0
- /package/dist/{chunk-RNORDDD6.js.map → chunk-THG4GYIE.js.map} +0 -0
- /package/dist/{chunk-CUIAHZPZ.js.map → chunk-TR7DGXGI.js.map} +0 -0
- /package/dist/{chunk-PDKBKBC2.js.map → chunk-UIN2BWDD.js.map} +0 -0
- /package/dist/{chunk-4GD7YV4Y.js.map → chunk-UXO5IMBK.js.map} +0 -0
- /package/dist/{chunk-KQAFEZQX.js.map → chunk-VDX2J7OX.js.map} +0 -0
- /package/dist/{chunk-MUJ4QFUQ.js.map → chunk-W4BMEGQA.js.map} +0 -0
- /package/dist/{chunk-5HK3CJAR.js.map → chunk-W675UJCZ.js.map} +0 -0
- /package/dist/{chunk-MDVBCPOS.js.map → chunk-XCTXS7VY.js.map} +0 -0
- /package/dist/{chunk-NTERJOFA.js.map → chunk-XRYZRW54.js.map} +0 -0
- /package/dist/{chunk-LA2MSK23.js.map → chunk-Y7DK7HHJ.js.map} +0 -0
- /package/dist/{chunk-34BMUGRA.js.map → chunk-YB42WZCY.js.map} +0 -0
- /package/dist/{chunk-LWVG6U7L.js.map → chunk-YHCBJULX.js.map} +0 -0
- /package/dist/{chunk-VYISFWVX.js.map → chunk-YQNNHLCG.js.map} +0 -0
- /package/dist/{chunk-FFPBTNLC.js.map → chunk-Z7PBQPJ4.js.map} +0 -0
- /package/dist/{chunk-MXJU4GCA.js.map → chunk-ZO6AXLEH.js.map} +0 -0
- /package/dist/{chunk-JNSLW2O4.js.map → chunk-ZQHI2BZB.js.map} +0 -0
- /package/dist/{graph-edge-decay-A4SDFMMS.js.map → cross-lingual-recall.js.map} +0 -0
- /package/dist/{resolution-DKMBPXHI.js.map → graph-edge-decay-FXGELBFA.js.map} +0 -0
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import type { MemoryFile, MemoryStatus, PluginConfig } from "../types.js";
|
|
14
14
|
import type { StorageManager } from "../storage.js";
|
|
15
|
+
import { isActiveMemoryStatus } from "../memory-lifecycle-ledger-utils.js";
|
|
16
|
+
import { readProcedureMaintenanceMarker } from "./library-maintenance.js";
|
|
15
17
|
|
|
16
18
|
export interface ProcedureStatusCounts {
|
|
17
19
|
total: number;
|
|
@@ -50,6 +52,10 @@ export interface ProcedureStatsReport {
|
|
|
50
52
|
counts: ProcedureStatusCounts;
|
|
51
53
|
recent: ProcedureStatsRecent;
|
|
52
54
|
config: ProcedureStatsConfigSnapshot;
|
|
55
|
+
/** ISO timestamp of the last library-maintenance run marker, or null (issue #2370). */
|
|
56
|
+
lastMaintenanceAt: string | null;
|
|
57
|
+
/** Active procedures currently carrying a `needsRepair` flag (issue #2370). */
|
|
58
|
+
needsRepairFlags: number;
|
|
53
59
|
}
|
|
54
60
|
|
|
55
61
|
function snapshotConfig(config: PluginConfig): ProcedureStatsConfigSnapshot {
|
|
@@ -102,6 +108,7 @@ export async function computeProcedureStats(options: {
|
|
|
102
108
|
let lastWriteMs: number | null = null;
|
|
103
109
|
let writesLast7Days = 0;
|
|
104
110
|
let minerSourced = 0;
|
|
111
|
+
let needsRepairFlags = 0;
|
|
105
112
|
|
|
106
113
|
const known: MemoryStatus[] = [
|
|
107
114
|
"active",
|
|
@@ -159,8 +166,15 @@ export async function computeProcedureStats(options: {
|
|
|
159
166
|
if (m.frontmatter.source === "procedure-miner") {
|
|
160
167
|
minerSourced += 1;
|
|
161
168
|
}
|
|
169
|
+
if (
|
|
170
|
+
m.frontmatter.structuredAttributes?.needsRepair !== undefined &&
|
|
171
|
+
isActiveMemoryStatus(m.frontmatter.status)
|
|
172
|
+
) {
|
|
173
|
+
needsRepairFlags += 1;
|
|
174
|
+
}
|
|
162
175
|
}
|
|
163
176
|
|
|
177
|
+
const maintenanceMarker = await readProcedureMaintenanceMarker(storage.dir);
|
|
164
178
|
return {
|
|
165
179
|
schemaVersion: 1,
|
|
166
180
|
generatedAt: new Date(nowMs).toISOString(),
|
|
@@ -171,6 +185,8 @@ export async function computeProcedureStats(options: {
|
|
|
171
185
|
minerSourced,
|
|
172
186
|
},
|
|
173
187
|
config: snapshotConfig(config),
|
|
188
|
+
lastMaintenanceAt: maintenanceMarker?.lastRunAt ?? null,
|
|
189
|
+
needsRepairFlags,
|
|
174
190
|
};
|
|
175
191
|
}
|
|
176
192
|
|
|
@@ -210,5 +226,9 @@ export function formatProcedureStatsText(report: ProcedureStatsReport): string {
|
|
|
210
226
|
lines.push(` lastWriteAt: ${recent.lastWriteAt ?? "(none)"}`);
|
|
211
227
|
lines.push(` writesLast7Days: ${recent.writesLast7Days}`);
|
|
212
228
|
lines.push(` minerSourced: ${recent.minerSourced}`);
|
|
229
|
+
lines.push("");
|
|
230
|
+
lines.push(` maintenance:`);
|
|
231
|
+
lines.push(` lastMaintenanceAt: ${report.lastMaintenanceAt ?? "(never)"}`);
|
|
232
|
+
lines.push(` needsRepairFlags: ${report.needsRepairFlags}`);
|
|
213
233
|
return lines.join("\n") + "\n";
|
|
214
234
|
}
|
package/src/schemas.ts
CHANGED
|
@@ -103,6 +103,13 @@ export const ExtractedFactSchema = z.object({
|
|
|
103
103
|
.describe(
|
|
104
104
|
'Scope classification: "global" for cross-project knowledge (framework bugs, library behavior, API patterns, user preferences, general coding patterns); "project" for project-specific knowledge (file paths, env configs, deployment details, project workarounds) and for tool, command, or CLI-flag instructions tied to one agent, since the same tool name can mean different things across agents. When keeping such an agent-tied instruction, begin the fact with a leading "In <agent>," clause naming that agent. Defaults to "project" when a coding context is active.',
|
|
105
105
|
),
|
|
106
|
+
subject: z
|
|
107
|
+
.enum(["user", "agent"])
|
|
108
|
+
.optional()
|
|
109
|
+
.nullable()
|
|
110
|
+
.describe(
|
|
111
|
+
'Memory subject: "user" when the fact models the person (preferences, relationships, biography, moments, commitments about their life); "agent" when it is reusable operating knowledge (procedures, principles, tool-usage lessons, debugging strategies, environment facts with no personal content). Emit only for fact/decision-like facts; the category defaults cover preference, relationship, moment, commitment, procedure, principle, and skill.',
|
|
112
|
+
),
|
|
106
113
|
quote: z
|
|
107
114
|
.string()
|
|
108
115
|
.optional()
|
package/src/search/port.ts
CHANGED
package/src/spaces/index.ts
CHANGED
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
* through push/pull and promotion workflows.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
+
import { evaluateSubjectGuard } from "../memory-subject.js";
|
|
12
|
+
import type { SubjectGuardMode } from "../types.js";
|
|
11
13
|
import { spawnSync } from "node:child_process";
|
|
12
14
|
import crypto from "node:crypto";
|
|
13
15
|
import fs from "node:fs";
|
|
@@ -99,6 +101,8 @@ export interface SpacePromoteResult {
|
|
|
99
101
|
memoriesPromoted: number;
|
|
100
102
|
conflicts: ConflictEntry[];
|
|
101
103
|
durationMs: number;
|
|
104
|
+
/** Subject-guard warnings (issue #2372): user-subject memories promoted to a shared team space under "warn". */
|
|
105
|
+
subjectWarnings?: string[];
|
|
102
106
|
}
|
|
103
107
|
|
|
104
108
|
export interface ConflictEntry {
|
|
@@ -748,7 +752,10 @@ export function shareSpace(spaceId: string, members: string[], baseDir?: string)
|
|
|
748
752
|
export async function promoteSpace(
|
|
749
753
|
sourceSpaceId: string,
|
|
750
754
|
targetSpaceId: string,
|
|
751
|
-
options?: {
|
|
755
|
+
options?: {
|
|
756
|
+
memoryIds?: string[]; force?: boolean; forceOverwrite?: boolean; baseDir?: string;
|
|
757
|
+
subjectGuard?: SubjectGuardMode; allowUserSubject?: boolean;
|
|
758
|
+
}
|
|
752
759
|
): Promise<SpacePromoteResult> {
|
|
753
760
|
const startTime = Date.now();
|
|
754
761
|
const manifest = loadManifest(options?.baseDir);
|
|
@@ -766,6 +773,33 @@ export async function promoteSpace(
|
|
|
766
773
|
}
|
|
767
774
|
}
|
|
768
775
|
|
|
776
|
+
// Subject guard (issue #2372): the SAME gate as the scope-profile promotion
|
|
777
|
+
// path — a user-subject (or unstamped, fail-closed) memory promoted into a
|
|
778
|
+
// TEAM space warns/rejects with the override named; recorded in the audit trail.
|
|
779
|
+
const subjectWarnings: string[] = [];
|
|
780
|
+
const warnedMemoryIds: string[] = [];
|
|
781
|
+
if (target.kind === "team") {
|
|
782
|
+
const sourceFiles = fs.existsSync(source.memoryDir) ? walkMd(fs.realpathSync(source.memoryDir)) : [];
|
|
783
|
+
for (const file of sourceFiles) {
|
|
784
|
+
const fm = parseSimpleFrontmatter(fs.readFileSync(file, "utf8"));
|
|
785
|
+
if (!fm?.id) continue;
|
|
786
|
+
if (options?.memoryIds?.length && !options.memoryIds.includes(fm.id)) continue;
|
|
787
|
+
const decision = evaluateSubjectGuard({
|
|
788
|
+
subject: fm.subject === "user" || fm.subject === "agent" ? fm.subject : undefined,
|
|
789
|
+
sharedTarget: true,
|
|
790
|
+
mode: options?.subjectGuard ?? "warn",
|
|
791
|
+
allowUserSubject: options?.allowUserSubject,
|
|
792
|
+
});
|
|
793
|
+
if (decision.action === "reject") {
|
|
794
|
+
throw new Error(`space promote blocked by subject guard: memory ${fm.id} — ${decision.reason}`);
|
|
795
|
+
}
|
|
796
|
+
if (decision.action === "warn") {
|
|
797
|
+
subjectWarnings.push(`memory ${fm.id}: ${decision.reason}`);
|
|
798
|
+
warnedMemoryIds.push(fm.id);
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
|
|
769
803
|
const result = await copyMemories(source.memoryDir, target.memoryDir, {
|
|
770
804
|
filterIds: options?.memoryIds,
|
|
771
805
|
force: options?.forceOverwrite !== undefined ? options.forceOverwrite : (options?.force ?? false),
|
|
@@ -776,7 +810,8 @@ export async function promoteSpace(
|
|
|
776
810
|
action: "space.promote",
|
|
777
811
|
sourceSpaceId,
|
|
778
812
|
targetSpaceId,
|
|
779
|
-
details: `Promoted ${result.merged} memories from "${source.name}" to "${target.name}"`,
|
|
813
|
+
details: `Promoted ${result.merged} memories from "${source.name}" to "${target.name}"${subjectWarnings.length > 0 ? `; subject-guard warned ${subjectWarnings.length} user-subject memories (${warnedMemoryIds.join(", ")})` : ""}${options?.allowUserSubject === true ? "; user-subject override: --allow-user-subject" : ""}`,
|
|
814
|
+
...(warnedMemoryIds.length > 0 ? { memoryIds: warnedMemoryIds } : {}),
|
|
780
815
|
},
|
|
781
816
|
options?.baseDir
|
|
782
817
|
);
|
|
@@ -787,6 +822,7 @@ export async function promoteSpace(
|
|
|
787
822
|
memoriesPromoted: result.merged,
|
|
788
823
|
conflicts: result.conflicts,
|
|
789
824
|
durationMs: Date.now() - startTime,
|
|
825
|
+
...(subjectWarnings.length > 0 ? { subjectWarnings } : {}),
|
|
790
826
|
};
|
|
791
827
|
}
|
|
792
828
|
|
package/src/storage.ts
CHANGED
|
@@ -166,6 +166,7 @@ import type {
|
|
|
166
166
|
VerificationState,
|
|
167
167
|
PolicyClass,
|
|
168
168
|
MemoryStatus,
|
|
169
|
+
MemorySubject,
|
|
169
170
|
MemoryActionEvent,
|
|
170
171
|
MemoryLifecycleEvent,
|
|
171
172
|
MemoryLifecycleEventType,
|
|
@@ -244,6 +245,7 @@ import { normalizeProjectionPreview, normalizeProjectionTags } from "./memory-pr
|
|
|
244
245
|
import { isSupportPassportPrivateMemory } from "./support-passport/card-projection.js";
|
|
245
246
|
import { parseFlexibleIsoTimestamp } from "./utils/iso-timestamp.js";
|
|
246
247
|
import { parseOriginClass } from "./security/origin-authority.js";
|
|
248
|
+
import { detectLanguageHint } from "./cross-lingual-recall.js";
|
|
247
249
|
import {
|
|
248
250
|
composeMemoryEnvelope,
|
|
249
251
|
isSealedMemoryEnvelope,
|
|
@@ -322,8 +324,10 @@ function serializeFrontmatter(fm: MemoryFrontmatter): string {
|
|
|
322
324
|
`tags: [${fm.tags.map((t) => `"${t}"`).join(", ")}]`,
|
|
323
325
|
];
|
|
324
326
|
// OKF v0.1 interop (issue #1946): inert presentation metadata; `category` stays canonical.
|
|
327
|
+
if (fm.language) lines.push(`language: ${fm.language}`);
|
|
325
328
|
if (fm.type !== undefined) lines.push(`type: ${fm.type}`);
|
|
326
329
|
if (fm.origin) lines.push(`origin: ${/^[A-Za-z0-9:_.*-]+$/.test(fm.origin) ? fm.origin : JSON.stringify(fm.origin)}`);
|
|
330
|
+
if (fm.subject) lines.push(`subject: ${fm.subject}`);
|
|
327
331
|
if (fm.entityRef) lines.push(`entityRef: ${fm.entityRef}`);
|
|
328
332
|
if (fm.sourceConnector) {
|
|
329
333
|
// YAML-injection guard (review thread QMPsP): emit unquoted for
|
|
@@ -859,8 +863,9 @@ export function parseFrontmatter(raw: string): { frontmatter: MemoryFrontmatter;
|
|
|
859
863
|
frontmatter: {
|
|
860
864
|
id: fm.id ?? "",
|
|
861
865
|
category: (fm.category ?? "fact") as MemoryCategory,
|
|
862
|
-
type: parseFrontmatterStringValue(fm.type),
|
|
863
866
|
created: fm.created ?? new Date().toISOString(),
|
|
867
|
+
language: fm.language || undefined,
|
|
868
|
+
type: parseFrontmatterStringValue(fm.type),
|
|
864
869
|
updated: fm.updated ?? new Date().toISOString(),
|
|
865
870
|
source: fm.source ?? "unknown",
|
|
866
871
|
confidence: conf,
|
|
@@ -868,6 +873,7 @@ export function parseFrontmatter(raw: string): { frontmatter: MemoryFrontmatter;
|
|
|
868
873
|
tags,
|
|
869
874
|
entityRef: fm.entityRef || undefined,
|
|
870
875
|
origin: fm.origin !== undefined ? parseOriginClass(decodeYamlScalar(fm.origin)) : undefined,
|
|
876
|
+
subject: fm.subject === "user" || fm.subject === "agent" ? fm.subject : undefined,
|
|
871
877
|
sourceConnector: fm.sourceConnector ? decodeYamlScalar(fm.sourceConnector) || undefined : undefined,
|
|
872
878
|
toolScoped: fm.toolScoped === "true" ? true : undefined,
|
|
873
879
|
supersedes: fm.supersedes || undefined,
|
|
@@ -1736,6 +1742,7 @@ export interface WriteMemoryOptions {
|
|
|
1736
1742
|
origin?: string;
|
|
1737
1743
|
sourceConnector?: string;
|
|
1738
1744
|
toolScoped?: true;
|
|
1745
|
+
subject?: MemorySubject;
|
|
1739
1746
|
}
|
|
1740
1747
|
|
|
1741
1748
|
/**
|
|
@@ -1744,7 +1751,7 @@ export interface WriteMemoryOptions {
|
|
|
1744
1751
|
*/
|
|
1745
1752
|
export type SealedWriteExtras = Omit<
|
|
1746
1753
|
WriteMemoryOptions,
|
|
1747
|
-
"confidence" | "tags" | "entityRef" | "source" | "expiresAt" | "validAt" | "structuredAttributes" | "sourceConnector" | "origin"
|
|
1754
|
+
"confidence" | "tags" | "entityRef" | "source" | "expiresAt" | "validAt" | "structuredAttributes" | "sourceConnector" | "origin" | "subject"
|
|
1748
1755
|
>;
|
|
1749
1756
|
|
|
1750
1757
|
export class StorageManager extends TombstoneBlockedCaptureIndexHost {
|
|
@@ -3729,6 +3736,7 @@ export class StorageManager extends TombstoneBlockedCaptureIndexHost {
|
|
|
3729
3736
|
category,
|
|
3730
3737
|
created: now.toISOString(),
|
|
3731
3738
|
updated: now.toISOString(),
|
|
3739
|
+
language: detectLanguageHint(content),
|
|
3732
3740
|
source: options.source ?? "extraction",
|
|
3733
3741
|
confidence: conf,
|
|
3734
3742
|
confidenceTier: tier,
|
|
@@ -3787,7 +3795,7 @@ export class StorageManager extends TombstoneBlockedCaptureIndexHost {
|
|
|
3787
3795
|
fm.sourceConnector = options.sourceConnector;
|
|
3788
3796
|
}
|
|
3789
3797
|
if (options.origin !== undefined) fm.origin = parseOriginClass(options.origin);
|
|
3790
|
-
|
|
3798
|
+
if (options.subject !== undefined) fm.subject = options.subject;
|
|
3791
3799
|
// Assemble the persisted body (attribute-suffix enrichment + combined
|
|
3792
3800
|
// sanitize) via the SHARED helper — the sealed-envelope composer uses the
|
|
3793
3801
|
// same one, so the two write paths cannot diverge (issue #1989 PR2).
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config parsing for the memory-subject runtime knobs (issue #2372).
|
|
3
|
+
*
|
|
4
|
+
* Extracted from config.ts (its structural-ratchet ceiling forbids growth);
|
|
5
|
+
* `parseConfig` spreads `parseSubjectRuntimeConfig(cfg)` into the plugin
|
|
6
|
+
* config literal.
|
|
7
|
+
*
|
|
8
|
+
* Validation posture (Review Prevention Checklist §1/§24/§39): invalid
|
|
9
|
+
* values are REJECTED loudly, never silently reinterpreted — but an omitted
|
|
10
|
+
* key takes the documented default. The deliberate asymmetry from the issue
|
|
11
|
+
* stands: classification defaults OFF while the guard defaults "warn", so
|
|
12
|
+
* enabling classification later immediately yields promotion warnings
|
|
13
|
+
* without a second flag flip, and with classification off, unstamped
|
|
14
|
+
* memories still only warn (never silently promote) at shared targets.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { coerceBool, coerceNumber } from "./connectors/coerce.js";
|
|
18
|
+
import {
|
|
19
|
+
isSubjectGuardMode,
|
|
20
|
+
PROMOTION_CANDIDATES_DEFAULT_MIN_ACCESS,
|
|
21
|
+
} from "./memory-subject.js";
|
|
22
|
+
import type { SubjectGuardMode } from "./types.js";
|
|
23
|
+
|
|
24
|
+
export interface SubjectRuntimeConfig {
|
|
25
|
+
subjectClassification: { enabled: boolean };
|
|
26
|
+
subjectGuard: SubjectGuardMode;
|
|
27
|
+
promotionCandidates: { minAccessCount: number };
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Reject a non-object block loudly (rule 51 / §1): a shorthand like
|
|
32
|
+
* `subjectClassification: false` must never normalize silently to `{}`.
|
|
33
|
+
* Returns void so callers read the block through a DIRECT `cfg.<key>`
|
|
34
|
+
* member access — the config-contract parser walker derives nested key
|
|
35
|
+
* paths from those accesses, and a helper return value hides them.
|
|
36
|
+
*/
|
|
37
|
+
function assertObjectBlock(value: unknown, key: string, shape: string): void {
|
|
38
|
+
if (value === undefined) return;
|
|
39
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
40
|
+
throw new Error(
|
|
41
|
+
`${key} must be an object (got ${JSON.stringify(value)}). Use ${shape} (issue #2372).`,
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function parseSubjectRuntimeConfig(cfg: Record<string, unknown>): SubjectRuntimeConfig {
|
|
47
|
+
assertObjectBlock(cfg.subjectClassification, "subjectClassification", "subjectClassification: { enabled: true }");
|
|
48
|
+
const classification = (cfg.subjectClassification ?? {}) as Record<string, unknown>;
|
|
49
|
+
const rawEnabled = classification.enabled;
|
|
50
|
+
const enabledCoerced = coerceBool(rawEnabled);
|
|
51
|
+
if (rawEnabled !== undefined && enabledCoerced === undefined) {
|
|
52
|
+
throw new Error(
|
|
53
|
+
`subjectClassification.enabled must be a boolean or one of "true"/"false"/"1"/"0"/` +
|
|
54
|
+
`"yes"/"no"/"on"/"off" (got ${JSON.stringify(rawEnabled)}) — rejected, not defaulted (issue #2372).`,
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
const rawGuard = cfg.subjectGuard;
|
|
58
|
+
if (rawGuard !== undefined && !isSubjectGuardMode(rawGuard)) {
|
|
59
|
+
throw new Error(
|
|
60
|
+
`subjectGuard must be one of: off, warn, enforce (got ${JSON.stringify(rawGuard)}) — ` +
|
|
61
|
+
`rejected, not defaulted (issue #2372; checklist §1/§39).`,
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
assertObjectBlock(cfg.promotionCandidates, "promotionCandidates", "promotionCandidates: { minAccessCount: 3 }");
|
|
65
|
+
const candidates = (cfg.promotionCandidates ?? {}) as Record<string, unknown>;
|
|
66
|
+
const minAccessRaw = coerceNumber(candidates.minAccessCount);
|
|
67
|
+
if (candidates.minAccessCount !== undefined && (minAccessRaw === undefined || !Number.isFinite(minAccessRaw) || minAccessRaw < 0)) {
|
|
68
|
+
throw new Error(
|
|
69
|
+
`promotionCandidates.minAccessCount must be a non-negative number (got ${JSON.stringify(candidates.minAccessCount)}) — rejected, not defaulted (issue #2372).`,
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
subjectClassification: { enabled: rawEnabled === undefined ? false : enabledCoerced === true },
|
|
74
|
+
subjectGuard: isSubjectGuardMode(rawGuard) ? rawGuard : "warn",
|
|
75
|
+
promotionCandidates: {
|
|
76
|
+
minAccessCount:
|
|
77
|
+
minAccessRaw !== undefined ? Math.floor(minAccessRaw) : PROMOTION_CANDIDATES_DEFAULT_MIN_ACCESS,
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
package/src/types.ts
CHANGED
|
@@ -11,8 +11,11 @@ import type { ContradictionLocalizationConfig, ContradictionScanConfig } from ".
|
|
|
11
11
|
import type { GraphPathScoringConfig } from "./graph-path-scoring-config.js";
|
|
12
12
|
export type { ContradictionLocalizationConfig, ContradictionScanConfig } from "./contradiction-config.js";
|
|
13
13
|
export type { GraphPathScoringConfig } from "./graph-path-scoring-config.js";
|
|
14
|
+
import type { ProceduralMaintenanceConfig } from "./procedural/maintenance-config.js";
|
|
14
15
|
|
|
15
16
|
import type { AmbientCaptureProvenance, BufferTurnOwner, SecurityConfig, OriginMetadata } from "./security/types.js";
|
|
17
|
+
export type MemorySubject = "user" | "agent";
|
|
18
|
+
export type SubjectGuardMode = "off" | "warn" | "enforce";
|
|
16
19
|
export type ReasoningEffort = "none" | "low" | "medium" | "high";
|
|
17
20
|
export type TriggerMode = "smart" | "every_n" | "time_based";
|
|
18
21
|
export type ConvergeConflictPolicy = "newest-wins" | "manual";
|
|
@@ -383,7 +386,6 @@ export interface DreamsPhasesConfig {
|
|
|
383
386
|
deepSleep: DreamsDeepSleepConfig;
|
|
384
387
|
}
|
|
385
388
|
|
|
386
|
-
/** Procedural memory (issue #519): mining + recall gates. All sub-features default off. */
|
|
387
389
|
export interface ProceduralConfig {
|
|
388
390
|
enabled: boolean;
|
|
389
391
|
/** Minimum cluster size before emitting a candidate; `0` disables mining (`minOccurrences_zero`). */
|
|
@@ -396,8 +398,8 @@ export interface ProceduralConfig {
|
|
|
396
398
|
lookbackDays: number;
|
|
397
399
|
/** When true, installer may register the nightly procedural mining cron (default off). */
|
|
398
400
|
proceduralMiningCronAutoRegister: boolean;
|
|
399
|
-
/** Max procedure memories to inject on task-initiation recall (1–10). */
|
|
400
401
|
recallMaxProcedures: number;
|
|
402
|
+
maintenance: ProceduralMaintenanceConfig;
|
|
401
403
|
}
|
|
402
404
|
|
|
403
405
|
/**
|
|
@@ -1041,14 +1043,11 @@ export interface PluginConfig extends BoundedJsonlStateConfig, SecurityConfig {
|
|
|
1041
1043
|
recallMaxConcurrentPerPrincipal: number;
|
|
1042
1044
|
/** Coalesce identical concurrent recalls per principal; each caller gets its own clone. Default true. */
|
|
1043
1045
|
recallSingleFlightEnabled: boolean;
|
|
1044
|
-
// Memory Worth recall filter (issue #560 PR 4)
|
|
1045
1046
|
/**
|
|
1046
|
-
* When true, recall multiplies candidate scores by the Memory Worth
|
|
1047
|
-
*
|
|
1048
|
-
*
|
|
1049
|
-
*
|
|
1050
|
-
* are untouched (multiplier 1.0). Default false — flip to true in PR 5
|
|
1051
|
-
* once the benchmark shows precision tie-or-win.
|
|
1047
|
+
* When true, recall multiplies candidate scores by the Memory Worth factor
|
|
1048
|
+
* from `mw_success` / `mw_fail` (see `computeMemoryWorth`): failed memories
|
|
1049
|
+
* sink; neutral ones untouched (multiplier 1.0). Default false until the
|
|
1050
|
+
* benchmark shows precision tie-or-win.
|
|
1052
1051
|
*/
|
|
1053
1052
|
recallMemoryWorthFilterEnabled: boolean;
|
|
1054
1053
|
/**
|
|
@@ -1265,6 +1264,10 @@ export interface PluginConfig extends BoundedJsonlStateConfig, SecurityConfig {
|
|
|
1265
1264
|
codexCompat: CodexCompatConfig;
|
|
1266
1265
|
/** When true (default), LLM classifies facts as `"project"` or `"global"` scope for promotion across projects. */
|
|
1267
1266
|
extractionScopeClassificationEnabled: boolean;
|
|
1267
|
+
subjectClassification: { enabled: boolean };
|
|
1268
|
+
subjectGuard: SubjectGuardMode;
|
|
1269
|
+
/** Min accessCount reuse signal for promotion candidates (issue #2372). Default 3. */
|
|
1270
|
+
promotionCandidates: { minAccessCount: number };
|
|
1268
1271
|
// Extraction judge (issue #376)
|
|
1269
1272
|
/** Enable the LLM-as-judge fact-worthiness gate on extracted facts. Default false (opt-in). */
|
|
1270
1273
|
extractionJudgeEnabled: boolean;
|
|
@@ -2804,9 +2807,13 @@ export interface MemoryFrontmatter extends SourceConnectorProvenance, OriginMeta
|
|
|
2804
2807
|
/** True when write-time classification ties this memory to its source connector's tools or commands. */
|
|
2805
2808
|
toolScoped?: true;
|
|
2806
2809
|
id: string;
|
|
2810
|
+
/** Whom this memory models (issue #2372). The promotion guard treats absent as "user" (fail closed). */
|
|
2811
|
+
subject?: MemorySubject;
|
|
2807
2812
|
category: MemoryCategory;
|
|
2808
2813
|
/** OKF v0.1 interop metadata (issue #1946). Inert: presentation only, never overrides `category`. */
|
|
2809
2814
|
type?: string;
|
|
2815
|
+
/** Dominant-script hint (ISO 15924, e.g. `latn`/`jpan`) for cross-lingual recall (#2197). Absent on legacy files. */
|
|
2816
|
+
language?: string;
|
|
2810
2817
|
created: string;
|
|
2811
2818
|
updated: string;
|
|
2812
2819
|
source: string;
|
|
@@ -2822,12 +2829,8 @@ export interface MemoryFrontmatter extends SourceConnectorProvenance, OriginMeta
|
|
|
2822
2829
|
/** Memory status: active (default), pending_review, rejected, quarantined, superseded, archived, or forgotten */
|
|
2823
2830
|
status?: MemoryStatus;
|
|
2824
2831
|
/**
|
|
2825
|
-
* Tombstone block marker (issue #1579)
|
|
2826
|
-
*
|
|
2827
|
-
* `status: "pending_review"` and this field set to the tombstone id — making
|
|
2828
|
-
* the block VISIBLE (rule 34: never a silent drop) rather than silently
|
|
2829
|
-
* discarding the extraction. Approving the memory through the review queue
|
|
2830
|
-
* emits a revocation that re-allows the content.
|
|
2832
|
+
* Tombstone block marker (issue #1579): persisted `pending_review` with this
|
|
2833
|
+
* set to the tombstone id — a VISIBLE block (rule 34); approval revokes it.
|
|
2831
2834
|
*/
|
|
2832
2835
|
blockedBy?: string;
|
|
2833
2836
|
/** Which tombstone tier matched (`exact`/`normalized`/`keyed`/`semantic`). */
|
|
@@ -3232,29 +3235,25 @@ export interface ExtractedFact {
|
|
|
3232
3235
|
*/
|
|
3233
3236
|
provenance?: "verified" | "unverified" | "none";
|
|
3234
3237
|
/**
|
|
3235
|
-
* Transient LLM
|
|
3236
|
-
*
|
|
3237
|
-
*
|
|
3238
|
-
* checklist §13). Absent on facts that have already passed the validator.
|
|
3238
|
+
* Transient LLM quote (issue #1575 PR 2): consumed by the post-parse
|
|
3239
|
+
* validator to build `sources`, stripped before persistence, never in
|
|
3240
|
+
* content-hash dedup (rule 23 / checklist §13).
|
|
3239
3241
|
*/
|
|
3240
3242
|
quote?: string;
|
|
3241
3243
|
/**
|
|
3242
|
-
* Transient requireSpans signal (
|
|
3243
|
-
*
|
|
3244
|
-
* `
|
|
3245
|
-
* in any source turn. Read by the persist path to route the fact to
|
|
3246
|
-
* `pending_review` instead of `active`. Stripped before persistence —
|
|
3247
|
-
* it never reaches frontmatter (chatgpt-codex-connector thread 4xB).
|
|
3244
|
+
* Transient requireSpans signal (#1575 PR 2): quote unlocatable while
|
|
3245
|
+
* `provenance.requireSpans` is on. Persist path routes the fact to
|
|
3246
|
+
* `pending_review`. Stripped before persistence — never reaches frontmatter.
|
|
3248
3247
|
*/
|
|
3249
3248
|
requireSpansPending?: boolean;
|
|
3250
3249
|
promptedByQuestion?: string;
|
|
3251
3250
|
/**
|
|
3252
|
-
*
|
|
3253
|
-
*
|
|
3254
|
-
* classifies each fact. Default is `"project"` when a coding context is
|
|
3255
|
-
* active, `"global"` when no coding context is present.
|
|
3251
|
+
* Project- vs global-scoped; emitted when `extractionScopeClassificationEnabled`.
|
|
3252
|
+
* Defaults to "project" with a coding context active, else "global".
|
|
3256
3253
|
*/
|
|
3257
3254
|
scope?: MemoryScope;
|
|
3255
|
+
/** Extractor-assigned subject, present only when subjectClassification.enabled (issue #2372). */
|
|
3256
|
+
subject?: MemorySubject;
|
|
3258
3257
|
/** Structured key-value attributes extracted from the content (e.g., product attributes, dates, quantities). */
|
|
3259
3258
|
structuredAttributes?: Record<string, string>;
|
|
3260
3259
|
/** When category is `procedure`, ordered steps with intents (persisted under procedures/). */
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
WRITE_FINGERPRINT_FIELDS,
|
|
10
10
|
buildWriteIdempotencyPayload,
|
|
11
11
|
composeMemoryEnvelope,
|
|
12
|
+
sealedWriteToLegacyArgs,
|
|
12
13
|
isSealedMemoryEnvelope,
|
|
13
14
|
type FingerprintScope,
|
|
14
15
|
type MemoryWriteInput,
|
|
@@ -198,6 +199,7 @@ test("registry and exempt list disjointly cover every MemoryWriteInput field", (
|
|
|
198
199
|
sourceConnector: "bee",
|
|
199
200
|
sourceReason: "r",
|
|
200
201
|
origin: "user",
|
|
202
|
+
subject: "user",
|
|
201
203
|
};
|
|
202
204
|
for (const key of Object.keys(populated)) {
|
|
203
205
|
assert.ok(classified.has(key), `field ${key} is not classified`);
|
|
@@ -682,3 +684,15 @@ test("structural fallback rejects prototype-inherited accessors (round 13)", ()
|
|
|
682
684
|
"prototype-inherited getter lookalike must be rejected",
|
|
683
685
|
);
|
|
684
686
|
});
|
|
687
|
+
|
|
688
|
+
test("sealedWriteToLegacyArgs always copies sourceConnector from the envelope", () => {
|
|
689
|
+
const envelope = composeMemoryEnvelope(
|
|
690
|
+
minimalInput({ sourceConnector: "chatgpt" }),
|
|
691
|
+
CTX,
|
|
692
|
+
);
|
|
693
|
+
const mapped = sealedWriteToLegacyArgs(envelope, { sourceConnector: "smuggled" });
|
|
694
|
+
assert.equal(mapped.options.sourceConnector, "chatgpt");
|
|
695
|
+
const empty = composeMemoryEnvelope(minimalInput(), CTX);
|
|
696
|
+
const cleared = sealedWriteToLegacyArgs(empty, { sourceConnector: "smuggled" });
|
|
697
|
+
assert.equal(cleared.options.sourceConnector, undefined);
|
|
698
|
+
});
|
package/src/write-envelope.ts
CHANGED
|
@@ -24,7 +24,8 @@
|
|
|
24
24
|
* the write call sites onto this module (see #1989 for the slicing).
|
|
25
25
|
*/
|
|
26
26
|
|
|
27
|
-
import
|
|
27
|
+
import { isMemorySubject } from "./memory-subject.js";
|
|
28
|
+
import type { MemoryCategory, MemorySubject } from "./types.js";
|
|
28
29
|
import { normalizeTags } from "./recall-tag-filter.js";
|
|
29
30
|
import { parseFlexibleIsoTimestamp } from "./utils/iso-timestamp.js";
|
|
30
31
|
import { assemblePersistedBody } from "./structured-attributes.js";
|
|
@@ -61,6 +62,8 @@ export interface MemoryWriteInput {
|
|
|
61
62
|
sourceConnector?: string;
|
|
62
63
|
/** Origin class stamped at creation time (issue #1955). */
|
|
63
64
|
origin?: string;
|
|
65
|
+
/** Whom the memory models (issue #2372): "user" or "agent". */
|
|
66
|
+
subject?: MemorySubject;
|
|
64
67
|
/** Human-readable provenance note. */
|
|
65
68
|
sourceReason?: string;
|
|
66
69
|
}
|
|
@@ -184,6 +187,7 @@ export interface SealedMemoryEnvelope {
|
|
|
184
187
|
readonly validAt: string | undefined;
|
|
185
188
|
readonly sourceConnector: string | undefined;
|
|
186
189
|
readonly origin: string | undefined;
|
|
190
|
+
readonly subject: MemorySubject | undefined;
|
|
187
191
|
readonly sourceReason: string | undefined;
|
|
188
192
|
readonly source: string;
|
|
189
193
|
/** ISO timestamp the envelope was composed (from ctx.now). */
|
|
@@ -430,6 +434,18 @@ export function composeMemoryEnvelope(
|
|
|
430
434
|
}
|
|
431
435
|
}
|
|
432
436
|
|
|
437
|
+
let subject: MemorySubject | undefined;
|
|
438
|
+
if (input.subject !== undefined) {
|
|
439
|
+
if (!isMemorySubject(input.subject)) {
|
|
440
|
+
hygiene.flag(
|
|
441
|
+
"subject",
|
|
442
|
+
`must be "user" or "agent" (got ${JSON.stringify(input.subject)}) — dropped`,
|
|
443
|
+
);
|
|
444
|
+
} else {
|
|
445
|
+
subject = input.subject;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
|
|
433
449
|
// validAt stays FATAL in salvage too: legacy writeMemory throws on an
|
|
434
450
|
// invalid validAt (normalizeMemoryWriteTimestamp), so salvage-dropping it
|
|
435
451
|
// would CHANGE behavior rather than preserve it.
|
|
@@ -465,11 +481,12 @@ export function composeMemoryEnvelope(
|
|
|
465
481
|
structuredAttributes: attributes?.canonical,
|
|
466
482
|
rawStructuredAttributes: attributes?.raw,
|
|
467
483
|
entityRef: normalizeOptionalString("entityRef", input.entityRef, hygiene),
|
|
484
|
+
origin: normalizeOptionalString("origin", input.origin, hygiene),
|
|
485
|
+
subject,
|
|
468
486
|
confidence,
|
|
469
487
|
ttl: normalizeOptionalString("ttl", input.ttl, hygiene),
|
|
470
488
|
validAt,
|
|
471
489
|
sourceConnector: normalizeOptionalString("sourceConnector", input.sourceConnector, hygiene),
|
|
472
|
-
origin: normalizeOptionalString("origin", input.origin, hygiene),
|
|
473
490
|
sourceReason: normalizeOptionalString("sourceReason", input.sourceReason, hygiene),
|
|
474
491
|
source: ctx.source.trim(),
|
|
475
492
|
composedAt: now.toISOString(),
|
|
@@ -656,8 +673,9 @@ export function sealedWriteToLegacyArgs(
|
|
|
656
673
|
// extras — a conditional spread let extras.sourceConnector smuggle
|
|
657
674
|
// unvalidated connector provenance past the sealed envelope when the
|
|
658
675
|
// envelope had none.
|
|
659
|
-
sourceConnector: envelope.sourceConnector,
|
|
660
676
|
origin: envelope.origin,
|
|
677
|
+
sourceConnector: envelope.sourceConnector,
|
|
678
|
+
subject: envelope.subject,
|
|
661
679
|
},
|
|
662
680
|
};
|
|
663
681
|
}
|
|
@@ -695,6 +713,9 @@ export const FINGERPRINT_EXEMPT_FIELDS = [
|
|
|
695
713
|
// Free-text provenance note; carries no identity.
|
|
696
714
|
// Origin is provenance metadata, not write identity (#1955).
|
|
697
715
|
"origin",
|
|
716
|
+
// Subject is derived classification metadata (#2372): two writes identical
|
|
717
|
+
// except subject are the same memory for dedup purposes.
|
|
718
|
+
"subject",
|
|
698
719
|
"sourceReason",
|
|
699
720
|
] as const satisfies readonly (keyof MemoryWriteInput)[];
|
|
700
721
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/schemas.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport const MemoryActionTypeSchema = z.enum([\n \"store_episode\",\n \"store_note\",\n \"update_note\",\n \"create_artifact\",\n \"summarize_node\",\n \"discard\",\n \"link_graph\",\n]);\n\nexport const MemoryActionEligibilityContextSchema = z\n .object({\n confidence: z.number().min(0).max(1),\n lifecycleState: z.enum([\"active\", \"validated\", \"candidate\", \"stale\", \"archived\"]),\n importance: z.number().min(0).max(1),\n source: z.enum([\"extraction\", \"consolidation\", \"replay\", \"manual\", \"unknown\"]),\n })\n .strict();\n\nexport function parseMemoryActionType(value: unknown): z.infer<typeof MemoryActionTypeSchema> {\n const parsed = MemoryActionTypeSchema.safeParse(value);\n return parsed.success ? parsed.data : \"discard\";\n}\n\nexport function parseMemoryActionEligibilityContext(\n value: unknown,\n): z.infer<typeof MemoryActionEligibilityContextSchema> {\n const parsed = MemoryActionEligibilityContextSchema.safeParse(value);\n if (parsed.success) return parsed.data;\n return {\n confidence: 0,\n lifecycleState: \"candidate\",\n importance: 0,\n source: \"unknown\",\n };\n}\n\nexport const ProcedureStepExtractSchema = z.object({\n order: z.number(),\n intent: z.string(),\n toolCall: z\n .object({\n kind: z.string(),\n signature: z.string(),\n })\n .optional()\n .nullable(),\n expectedOutcome: z.string().optional().nullable(),\n optional: z.boolean().optional().nullable(),\n});\n\nexport const ExtractedFactSchema = z.object({\n category: z.enum([\n \"fact\",\n \"preference\",\n \"correction\",\n \"entity\",\n \"decision\",\n \"relationship\",\n \"principle\",\n \"commitment\",\n \"moment\",\n \"skill\",\n \"rule\",\n \"procedure\",\n \"reasoning_trace\",\n ]),\n content: z\n .string()\n .describe(\"The memory content — a clear, standalone statement\"),\n confidence: z\n .number()\n .min(0)\n .max(1)\n .describe(\"How confident are you this is correct (0-1)\"),\n tags: z.array(z.string()).describe(\"Relevant tags for categorization\"),\n entityRef: z\n .string()\n .optional()\n .nullable()\n .describe(\"If about an entity, its normalized name (e.g. person-jane-doe)\"),\n cueAnchors: z\n .array(\n z.object({\n type: z.enum([\"entity\", \"file\", \"tool\", \"outcome\", \"constraint\", \"date\"]),\n value: z.string(),\n }),\n )\n .optional()\n .nullable()\n .describe(\"Up to three short retrieval cues for this fact.\"),\n promptedByQuestion: z\n .string()\n .optional()\n .nullable()\n .describe(\"Optional proactive follow-up question that surfaced this fact.\"),\n scope: z\n .enum([\"project\", \"global\"])\n .optional()\n .nullable()\n .describe(\n 'Scope classification: \"global\" for cross-project knowledge (framework bugs, library behavior, API patterns, user preferences, general coding patterns); \"project\" for project-specific knowledge (file paths, env configs, deployment details, project workarounds) and for tool, command, or CLI-flag instructions tied to one agent, since the same tool name can mean different things across agents. When keeping such an agent-tied instruction, begin the fact with a leading \"In <agent>,\" clause naming that agent. Defaults to \"project\" when a coding context is active.',\n ),\n quote: z\n .string()\n .optional()\n .nullable()\n .describe(\n \"The EXACT verbatim words from the conversation that support this fact. Copy a contiguous span from a single speaker turn (not a paraphrase). Cap at ~300 characters. This is the grounding evidence for downstream faithfulness verification (issue #1575).\",\n ),\n structuredAttributes: z\n .record(z.string(), z.string())\n .optional()\n .nullable()\n .describe(\"Structured key-value attributes when the fact contains measurable or categorical data (e.g., {\\\"price\\\": \\\"29.99\\\", \\\"color\\\": \\\"blue\\\", \\\"date\\\": \\\"2024-03-15\\\"}).\"),\n procedureSteps: z\n .array(ProcedureStepExtractSchema)\n .optional()\n .nullable()\n .describe(\n 'For category \"procedure\" only: ordered steps (intent per step). At least two steps; include explicit trigger phrasing in content (e.g. \"When you deploy…\").',\n ),\n reasoningTrace: z\n .object({\n steps: z\n .array(\n z.object({\n order: z.number(),\n description: z.string(),\n }),\n )\n // Prompts and normalizer require >=2 ordered steps; enforce it at\n // the schema layer so gateway-path parsing rejects malformed traces\n // rather than persisting them (local/direct-client normalization\n // already enforces this, keeping the two paths symmetric).\n .min(2)\n .describe(\"Ordered reasoning steps the user walked through (require >=2).\"),\n // Accept snake_case aliases so a loose gateway model using\n // `final_answer` / `observed_outcome` does not fail schema parsing\n // and drop the entire extraction result. Local/direct-client\n // normalization already tolerates these keys; the gateway path must\n // too. Zod's `union` keeps the parse successful either way.\n finalAnswer: z\n .string()\n .optional()\n .nullable()\n .describe(\"The conclusion, decision, or answer the chain arrived at.\"),\n final_answer: z\n .string()\n .optional()\n .nullable()\n .describe(\"Alias for finalAnswer (snake_case). Gateway-tolerance shim.\"),\n observedOutcome: z\n .string()\n .optional()\n .nullable()\n .describe(\"Optional note about how the answer actually played out.\"),\n observed_outcome: z\n .string()\n .optional()\n .nullable()\n .describe(\"Alias for observedOutcome (snake_case). Gateway-tolerance shim.\"),\n })\n // Either finalAnswer OR final_answer must be present — enforce here so\n // the rest of the pipeline can assume a usable string downstream.\n .refine(\n (v) =>\n (typeof v.finalAnswer === \"string\" && v.finalAnswer.trim().length > 0) ||\n (typeof v.final_answer === \"string\" && v.final_answer.trim().length > 0),\n { message: \"reasoningTrace requires finalAnswer (or final_answer)\" },\n )\n .optional()\n .nullable()\n .describe(\n 'For category \"reasoning_trace\" only: a stored solution chain with ordered steps, a final answer, and an optional observed outcome. Require at least two steps.',\n ),\n eventTime: z\n .string()\n .optional()\n .nullable()\n .describe(\n 'Optional event-time expression for bi-temporal validity (#1578). An ISO date (\"2025-03-01\") or a relative expression verbatim (\"last March\", \"yesterday\", \"since 2024\", \"until 2025-06-01\"). Resolved against the source turn timestamp at write time — NOT wall-clock. Omit when the fact has no explicit temporal anchor.',\n ),\n event_time: z\n .string()\n .optional()\n .nullable()\n .describe(\"Alias for eventTime (snake_case). Gateway-tolerance shim (#1578).\"),\n}).superRefine((value, ctx) => {\n if (value.category === \"procedure\" && (!Array.isArray(value.procedureSteps) || value.procedureSteps.length < 2)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"procedureSteps\"],\n message: \"procedure facts require at least two procedureSteps\",\n });\n }\n\n if (value.category === \"reasoning_trace\" && value.reasoningTrace == null) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"reasoningTrace\"],\n message: \"reasoning_trace facts require reasoningTrace\",\n });\n }\n});\n\nexport const EntityMentionSchema = z.object({\n name: z\n .string()\n .describe(\"Normalized entity name (e.g. jane-doe, acme-corp, my-project)\"),\n type: z.enum([\"person\", \"project\", \"tool\", \"company\", \"place\", \"other\"]),\n facts: z\n .array(z.string())\n .describe(\"New facts learned about this entity in this conversation\"),\n promptedByQuestion: z\n .string()\n .optional()\n .nullable()\n .describe(\"Optional proactive follow-up question that surfaced this entity.\"),\n structuredSections: z\n .array(z.object({\n key: z.string(),\n title: z.string(),\n facts: z.array(z.string()),\n }))\n .optional()\n .nullable()\n .describe(\"Optional named sections for entity-specific facts. Use when facts clearly belong under a durable heading such as Beliefs or Building / Working On.\"),\n});\n\nexport const ExtractedQuestionSchema = z.object({\n question: z.string().describe(\"A genuine question the AI is curious about based on this conversation\"),\n context: z.string().describe(\"Why this question matters or what prompted it\"),\n priority: z.number().min(0).max(1).describe(\"How important/urgent this question is (0-1)\"),\n});\n\nexport const ProactiveQuestionsResultSchema = z.object({\n questions: z\n .array(ExtractedQuestionSchema)\n .describe(\"Additional follow-up questions discovered in a proactive second-pass extraction.\"),\n});\n\nexport const ExtractedRelationshipSchema = z.object({\n source: z.string().describe(\"Source entity name (normalized, e.g. person-jane-doe)\"),\n target: z.string().describe(\"Target entity name (normalized, e.g. company-acme-corp)\"),\n label: z.string().describe(\"Relationship label (e.g. 'works at', 'created', 'manages')\"),\n promptedByQuestion: z\n .string()\n .optional()\n .nullable()\n .describe(\"Optional proactive follow-up question that surfaced this relationship.\"),\n});\n\nexport const ProactiveExtractionResultSchema = z.object({\n facts: z\n .array(ExtractedFactSchema)\n .describe(\n \"Additional high-confidence memories recovered only after answering proactive follow-up questions from the same buffered conversation.\",\n ),\n profileUpdates: z\n .array(z.string())\n .describe(\n \"Additional profile updates directly supported by the buffered conversation. Omit anything speculative.\",\n ),\n entities: z\n .array(EntityMentionSchema)\n .describe(\n \"Additional entities or entity facts surfaced by the proactive follow-up pass.\",\n ),\n relationships: z\n .array(ExtractedRelationshipSchema)\n .optional()\n .nullable()\n .describe(\n \"Additional relationships surfaced by the proactive follow-up pass.\",\n ),\n});\n\n/**\n * Salvage array for model-produced extraction output (issue #2455).\n *\n * Mixed valid+invalid items parse to the valid subset so one malformed\n * element no longer discards the whole extraction. A non-empty array with\n * zero valid items still fails, so bounded retry stays effective and wholly\n * malformed output is never silently accepted as empty. Empty arrays stay\n * valid. Consolidation schemas intentionally stay strict — do not use this\n * for them.\n */\nfunction salvageArray<T extends z.ZodTypeAny>(itemSchema: T) {\n return z\n .array(z.unknown())\n .transform((items, ctx) => {\n const valid: z.infer<T>[] = [];\n for (const raw of items) {\n const parsed = itemSchema.safeParse(raw);\n if (parsed.success) {\n valid.push(parsed.data);\n }\n }\n if (items.length > 0 && valid.length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"array contains no items matching the schema\",\n });\n return z.NEVER;\n }\n return valid;\n });\n}\n\nexport const ExtractionResultSchema = z.object({\n facts: salvageArray(ExtractedFactSchema).describe(\n \"Extracted memories from the conversation. Include facts, preferences, corrections, and decisions. Only extract genuinely new, durable information — skip transient task state.\",\n ),\n profileUpdates: salvageArray(z.string()).describe(\n \"Updates to the user's behavioral profile. Each string is a standalone statement about the user's preferences, habits, or personality. Only include genuinely new insights.\",\n ),\n entities: salvageArray(EntityMentionSchema).describe(\n \"Entities mentioned in the conversation with new facts about them.\",\n ),\n questions: salvageArray(ExtractedQuestionSchema).describe(\n \"Zero to three source-grounded questions useful in future sessions. Return an empty array when the conversation supports none.\",\n ),\n identityReflection: z\n .string()\n .optional()\n .nullable()\n .describe(\n \"A brief reflection on what you learned about yourself as an agent in this interaction — patterns in your behavior, growth, things you did well or could improve.\",\n ),\n episodeTitle: z\n .string()\n .optional()\n .nullable()\n .describe(\"A six-to-eight word title for this conversation segment.\"),\n relationships: salvageArray(ExtractedRelationshipSchema)\n .optional()\n .nullable()\n .describe(\n \"Relationships between entities discovered in this conversation. Max 5 per extraction. Format: {source, target, label}.\",\n ),\n});\n\nexport const ConsolidationItemSchema = z.object({\n existingId: z\n .string()\n .describe(\"The ID of the existing memory being evaluated\"),\n action: z.enum([\"ADD\", \"MERGE\", \"UPDATE\", \"INVALIDATE\", \"SKIP\"]),\n mergeWith: z\n .string()\n .optional()\n .nullable()\n .describe(\"If MERGE, the ID of the memory to merge with\"),\n updatedContent: z\n .string()\n .optional()\n .nullable()\n .describe(\"If UPDATE or MERGE, the new content\"),\n reason: z.string().describe(\"Brief reason for this decision\"),\n});\n\nexport const ConsolidationResultSchema = z.object({\n items: z\n .array(ConsolidationItemSchema)\n .describe(\n \"Decisions for each existing memory: ADD (keep as-is), MERGE (combine with another), UPDATE (revise content), INVALIDATE (mark as outdated/wrong), SKIP (no action needed)\",\n ),\n profileUpdates: z\n .array(z.string())\n .describe(\"New profile statements to add or update\"),\n entityUpdates: z\n .array(EntityMentionSchema)\n .describe(\"Entity updates from consolidation analysis\"),\n});\n\nexport function buildProfileConsolidationResultSchema(targetLines: number) {\n return z.object({\n consolidatedProfile: z\n .string()\n .describe(\n `The full consolidated profile as markdown. Preserve all ## section headers. Merge duplicate or near-duplicate bullets into single clear statements. Remove stale or superseded information. Keep the most important and durable observations. Target roughly ${targetLines} lines.`,\n ),\n removedCount: z\n .number()\n .describe(\"Number of bullets removed or merged during consolidation\"),\n summary: z\n .string()\n .describe(\"Brief summary of what was consolidated\"),\n });\n}\n\nexport const ProfileConsolidationResultSchema = buildProfileConsolidationResultSchema(50);\n\nexport const IdentityConsolidationResultSchema = z.object({\n learnedPatterns: z\n .array(z.string())\n .describe(\n \"Consolidated behavioral patterns and lessons learned, each a concise standalone statement\",\n ),\n summary: z\n .string()\n .describe(\n \"A brief paragraph summarizing the agent's core identity insights\",\n ),\n});\n\nexport type IdentityConsolidationResultParsed = z.infer<\n typeof IdentityConsolidationResultSchema\n>;\n\n// Contradiction Verification (Phase 2B)\nexport const ContradictionVerificationSchema = z.object({\n isContradiction: z\n .boolean()\n .describe(\"Whether the two memories truly contradict each other\"),\n confidence: z\n .number()\n .min(0)\n .max(1)\n .describe(\"How confident are you in this assessment (0-1)\"),\n reasoning: z\n .string()\n .describe(\"Explanation of why these are or are not contradictory\"),\n whichIsNewer: z\n .enum([\"first\", \"second\", \"unclear\"])\n .describe(\"Which memory represents the more recent/current state\"),\n});\n\nexport type ContradictionVerificationResult = z.infer<\n typeof ContradictionVerificationSchema\n>;\n\n// Memory Linking (Phase 3A)\nexport const MemoryLinkSchema = z.object({\n targetId: z\n .string()\n .describe(\"The ID of the memory this links to\"),\n linkType: z\n .enum([\"follows\", \"references\", \"contradicts\", \"supports\", \"related\"])\n .describe(\"The type of relationship\"),\n strength: z\n .number()\n .min(0)\n .max(1)\n .describe(\"How strong is this relationship (0-1)\"),\n reason: z\n .string()\n .optional()\n .nullable()\n .describe(\"Why this link exists\"),\n});\n\nexport const SuggestedLinksSchema = z.object({\n links: z\n .array(MemoryLinkSchema)\n .describe(\"Suggested links between memories based on semantic analysis\"),\n});\n\nexport type MemoryLink = z.infer<typeof MemoryLinkSchema>;\nexport type SuggestedLinks = z.infer<typeof SuggestedLinksSchema>;\n\n// Memory Summarization (Phase 4A)\nexport const MemorySummarySchema = z.object({\n summaryText: z\n .string()\n .describe(\"A concise summary of the batch of memories\"),\n keyFacts: z\n .array(z.string())\n .describe(\"The most important facts extracted from these memories\"),\n keyEntities: z\n .array(z.string())\n .describe(\"Key entities mentioned across these memories\"),\n});\n\nexport type MemorySummaryResult = z.infer<typeof MemorySummarySchema>;\n\nexport const DaySummaryResultSchema = z.object({\n summary: z.string().min(1).describe(\"A concise end-of-day summary paragraph.\"),\n bullets: z.array(z.string()).default([]).describe(\"The most important moments from the day.\"),\n next_actions: z.array(z.string()).default([]).describe(\"Concrete next actions for tomorrow.\"),\n risks_or_open_loops: z.array(z.string()).default([]).describe(\"Open loops, blockers, or fragile assumptions still needing attention.\"),\n});\n\n// v8.15 behavior-loop auto-tuning state contracts\nexport const BehaviorLoopAdjustmentSchema = z.object({\n parameter: z.string().min(1),\n previousValue: z.number(),\n nextValue: z.number(),\n delta: z.number(),\n evidenceCount: z.number().int().min(0),\n confidence: z.number().min(0).max(1),\n reason: z.string(),\n appliedAt: z.string(),\n});\n\nexport const BehaviorLoopPolicyStateSchema = z.object({\n version: z.number().int().min(0),\n windowDays: z.number().int().min(0),\n minSignalCount: z.number().int().min(0),\n maxDeltaPerCycle: z.number().min(0).max(1),\n protectedParams: z.array(z.string()),\n adjustments: z.array(BehaviorLoopAdjustmentSchema),\n updatedAt: z.string(),\n});\n\nexport type BehaviorLoopAdjustmentParsed = z.infer<typeof BehaviorLoopAdjustmentSchema>;\nexport type BehaviorLoopPolicyStateParsed = z.infer<typeof BehaviorLoopPolicyStateSchema>;\n\nexport type MemoryActionTypeParsed = z.infer<typeof MemoryActionTypeSchema>;\nexport type MemoryActionEligibilityContextParsed = z.infer<typeof MemoryActionEligibilityContextSchema>;\nexport type ExtractedFactParsed = z.infer<typeof ExtractedFactSchema>;\nexport type EntityMentionParsed = z.infer<typeof EntityMentionSchema>;\nexport type ExtractedQuestionParsed = z.infer<typeof ExtractedQuestionSchema>;\nexport type ProactiveQuestionsResultParsed = z.infer<typeof ProactiveQuestionsResultSchema>;\nexport type ExtractionResultParsed = z.infer<typeof ExtractionResultSchema>;\nexport type ConsolidationItemParsed = z.infer<typeof ConsolidationItemSchema>;\nexport type ConsolidationResultParsed = z.infer<\n typeof ConsolidationResultSchema\n>;\n"],"mappings":"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","names":[]}
|