@remnic/core 9.65.1 → 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.
Files changed (536) hide show
  1. package/dist/access-admin-ops-surface.d.ts +11 -11
  2. package/dist/access-admin-ops-surface.js +35 -34
  3. package/dist/access-authorization-probe.d.ts +12 -13
  4. package/dist/access-authorization-probe.js +36 -35
  5. package/dist/access-boundary.d.ts +12 -156
  6. package/dist/access-boundary.js +35 -34
  7. package/dist/access-cli.js +107 -104
  8. package/dist/access-cli.js.map +1 -1
  9. package/dist/access-coding-context-resolution.d.ts +1 -1
  10. package/dist/access-extraction-force-flush.d.ts +11 -11
  11. package/dist/access-extraction-force-flush.js +35 -34
  12. package/dist/access-health-types.d.ts +1 -1
  13. package/dist/access-http-lcm-compaction.d.ts +11 -11
  14. package/dist/access-http-lifecycle-flush.d.ts +12 -13
  15. package/dist/access-http-offline-stream.d.ts +11 -11
  16. package/dist/access-http-query.d.ts +2 -2
  17. package/dist/access-http-query.js +37 -36
  18. package/dist/access-http.d.ts +12 -12
  19. package/dist/access-http.js +54 -53
  20. package/dist/access-identity-continuity-surface.d.ts +9 -9
  21. package/dist/access-identity-continuity-surface.js +35 -34
  22. package/dist/access-lcm-surface.d.ts +11 -11
  23. package/dist/access-lcm-surface.js +35 -34
  24. package/dist/access-mcp-admin-tools.js +1 -1
  25. package/dist/access-mcp-output-schemas.js +1 -1
  26. package/dist/access-mcp.d.ts +11 -11
  27. package/dist/access-mcp.js +47 -44
  28. package/dist/access-memory-search-fanout.d.ts +2 -2
  29. package/dist/{access-namespace-preflight-BKUnKsBv.d.ts → access-namespace-preflight-Dhvcl-T0.d.ts} +1 -1
  30. package/dist/access-namespace-preflight.d.ts +3 -3
  31. package/dist/access-namespace-preflight.js +35 -34
  32. package/dist/access-observe-write-surface.d.ts +11 -11
  33. package/dist/access-observe-write-surface.js +35 -34
  34. package/dist/access-offline-manifest.d.ts +9 -9
  35. package/dist/access-offline-manifest.js +5 -5
  36. package/dist/access-operations-batch.js +38 -37
  37. package/dist/access-operations.d.ts +18 -19
  38. package/dist/access-operations.js +41 -40
  39. package/dist/access-recall-concurrency.d.ts +11 -11
  40. package/dist/access-recall-concurrency.js +35 -34
  41. package/dist/access-recall-response.d.ts +11 -11
  42. package/dist/access-recall-response.js +35 -34
  43. package/dist/access-recall-surface.d.ts +11 -11
  44. package/dist/access-recall-surface.js +35 -34
  45. package/dist/access-schema.d.ts +118 -118
  46. package/dist/access-schema.js +3 -3
  47. package/dist/{access-service-B1Lbb-nQ.d.ts → access-service-Bke1alZO.d.ts} +478 -74
  48. package/dist/access-service-helpers.d.ts +11 -11
  49. package/dist/access-service.d.ts +11 -11
  50. package/dist/access-service.js +35 -34
  51. package/dist/access-surface-catalog.d.ts +12 -13
  52. package/dist/access-surface-catalog.js +39 -36
  53. package/dist/access-surface-catalog.js.map +1 -1
  54. package/dist/access-wearables-meetings-surface.d.ts +3 -3
  55. package/dist/action-confidence.d.ts +1 -1
  56. package/dist/active-memory-bridge.d.ts +1 -1
  57. package/dist/active-recall.d.ts +1 -1
  58. package/dist/active-recall.js +6 -1
  59. package/dist/active-recall.js.map +1 -1
  60. package/dist/adapters/index.js +4 -4
  61. package/dist/adapters/registry.js +2 -2
  62. package/dist/ambient-provenance.d.ts +1 -1
  63. package/dist/artifact-search.d.ts +1 -1
  64. package/dist/{auto-sync-5L7EUZ27.js → auto-sync-H64ZCNIR.js} +13 -5
  65. package/dist/{auto-sync-5L7EUZ27.js.map → auto-sync-H64ZCNIR.js.map} +1 -1
  66. package/dist/behavior-learner.d.ts +1 -1
  67. package/dist/behavior-signals.d.ts +1 -1
  68. package/dist/bootstrap.d.ts +9 -9
  69. package/dist/briefing-window.d.ts +2 -2
  70. package/dist/briefing.d.ts +2 -2
  71. package/dist/briefing.js +16 -15
  72. package/dist/buffer-surprise-report.d.ts +1 -1
  73. package/dist/buffer-turn-helpers.d.ts +1 -1
  74. package/dist/buffer.d.ts +2 -2
  75. package/dist/buffer.js +4 -4
  76. package/dist/bulk-import/index.d.ts +3 -3
  77. package/dist/calibration.d.ts +1 -1
  78. package/dist/calibration.js +1 -1
  79. package/dist/capabilities.d.ts +1 -1
  80. package/dist/{capsule-crypto-7FJQINUR.js → capsule-crypto-YO5QJ6L3.js} +2 -2
  81. package/dist/{catalog-DjVhJoRM.d.ts → catalog-DV6qnbr7.d.ts} +1 -1
  82. package/dist/causal-behavior.d.ts +1 -1
  83. package/dist/causal-consolidation.d.ts +1 -1
  84. package/dist/causal-consolidation.js +17 -16
  85. package/dist/causal-consolidation.js.map +1 -1
  86. package/dist/causal-trajectory-graph.d.ts +1 -1
  87. package/dist/{chunk-LYIZXQYY.js → chunk-2E36UXVW.js} +2 -2
  88. package/dist/{chunk-7QFBLYFP.js → chunk-2XDWWPTN.js} +3 -3
  89. package/dist/{chunk-CFRBTATE.js → chunk-2YI72KM3.js} +3 -3
  90. package/dist/{chunk-3YTTAGPB.js → chunk-3DVBKTSO.js} +2 -2
  91. package/dist/{chunk-VPGRXEAB.js → chunk-3I7ASZN3.js} +2 -2
  92. package/dist/{chunk-EIR5VLIH.js → chunk-4K7IW3F7.js} +2 -2
  93. package/dist/chunk-4K7IW3F7.js.map +1 -0
  94. package/dist/{chunk-WTOE7CW4.js → chunk-4KYOLI6M.js} +13 -13
  95. package/dist/chunk-573TEZCD.js +88 -0
  96. package/dist/chunk-573TEZCD.js.map +1 -0
  97. package/dist/{chunk-ESCQ6LY7.js → chunk-5NM4OH4P.js} +3 -3
  98. package/dist/{chunk-Y23B2QXP.js → chunk-5YQ63T4B.js} +2 -2
  99. package/dist/{chunk-PMVPCZJZ.js → chunk-6433HV72.js} +2 -2
  100. package/dist/{chunk-4NZHHGVL.js → chunk-7BDZTALN.js} +4 -1
  101. package/dist/chunk-7BDZTALN.js.map +1 -0
  102. package/dist/{chunk-NS5ETDYD.js → chunk-7BEPVIH3.js} +3 -3
  103. package/dist/{chunk-JG22O53B.js → chunk-7CBKAQIG.js} +2 -1
  104. package/dist/chunk-7CBKAQIG.js.map +1 -0
  105. package/dist/{chunk-W6TSGWYS.js → chunk-7YQ4IYS2.js} +2 -2
  106. package/dist/chunk-AAXJNINV.js +55 -0
  107. package/dist/chunk-AAXJNINV.js.map +1 -0
  108. package/dist/{chunk-YQ3CBLL4.js → chunk-BWLRUMOG.js} +78 -8
  109. package/dist/chunk-BWLRUMOG.js.map +1 -0
  110. package/dist/{chunk-2NLLXCJG.js → chunk-BXLOS5AJ.js} +2 -2
  111. package/dist/{chunk-CEH2AFXG.js → chunk-C24UZSFW.js} +6 -6
  112. package/dist/{chunk-ZPN7W3OP.js → chunk-CDUUDBWJ.js} +3 -3
  113. package/dist/{chunk-5UYSCYR7.js → chunk-CT56C22C.js} +4 -4
  114. package/dist/{chunk-HJQZQUPC.js → chunk-DJZWNKFO.js} +5 -5
  115. package/dist/{chunk-X7Y7WX73.js → chunk-DQEMWVMT.js} +1 -1
  116. package/dist/{chunk-CCTVAVTT.js → chunk-DZUJ46DO.js} +2 -2
  117. package/dist/{chunk-N6TRHP72.js → chunk-EILZG5VC.js} +2 -2
  118. package/dist/{chunk-GXWDWOWP.js → chunk-GDFVPUJ5.js} +2 -2
  119. package/dist/{chunk-7PWWGYGO.js → chunk-GNCCUR6K.js} +2 -2
  120. package/dist/{chunk-KPBLJCCV.js → chunk-IID2CMUU.js} +2 -2
  121. package/dist/{chunk-DEFI2QBT.js → chunk-J275IYMG.js} +25 -22
  122. package/dist/chunk-J275IYMG.js.map +1 -0
  123. package/dist/{chunk-UYCIS6V5.js → chunk-JCWY73FK.js} +2 -2
  124. package/dist/{chunk-SYJ6EKKE.js → chunk-JYYBA7TF.js} +2 -2
  125. package/dist/{chunk-T42L3S6A.js → chunk-LBWQ65SX.js} +4 -4
  126. package/dist/{chunk-MSTNSVXI.js → chunk-LDBFXD4F.js} +2 -1
  127. package/dist/chunk-LDBFXD4F.js.map +1 -0
  128. package/dist/{chunk-LWVO2QZV.js → chunk-LGO6A7GJ.js} +50 -50
  129. package/dist/{chunk-CEQF6L5K.js → chunk-LUNJ3WFO.js} +9 -7
  130. package/dist/chunk-LUNJ3WFO.js.map +1 -0
  131. package/dist/{chunk-2572MRP2.js → chunk-LZH5FR2W.js} +2 -2
  132. package/dist/{chunk-256FBCVX.js → chunk-M4AHBM72.js} +7 -7
  133. package/dist/{chunk-YEQEGSJA.js → chunk-MN4KB2A4.js} +3 -3
  134. package/dist/{chunk-AGKIG3YA.js → chunk-NKKD4ZAU.js} +2 -2
  135. package/dist/{chunk-3TMYV3LP.js → chunk-NTWN6HB2.js} +5 -5
  136. package/dist/{chunk-63FHSH7E.js → chunk-OCZIYAE5.js} +4 -4
  137. package/dist/{chunk-I2HTKOOP.js → chunk-ODZG724P.js} +2 -2
  138. package/dist/{chunk-HQSBYI5X.js → chunk-OTHZWLUD.js} +2 -2
  139. package/dist/{chunk-4W6INNXO.js → chunk-PE255F4T.js} +2 -2
  140. package/dist/{chunk-6L27N6YI.js → chunk-QOS5LBZN.js} +2 -2
  141. package/dist/{chunk-G72IPMR7.js → chunk-R4OCGPSH.js} +2 -2
  142. package/dist/{chunk-MIBKEW7A.js → chunk-R7JAM2XF.js} +3 -3
  143. package/dist/{chunk-LCU5R6TQ.js → chunk-RAIUTAZZ.js} +22 -3
  144. package/dist/chunk-RAIUTAZZ.js.map +1 -0
  145. package/dist/chunk-RIAM7DND.js +167 -0
  146. package/dist/chunk-RIAM7DND.js.map +1 -0
  147. package/dist/{chunk-JBPKEARU.js → chunk-RKNJBZ55.js} +4 -4
  148. package/dist/{chunk-HUNSEO5U.js → chunk-S2DPMJXH.js} +2 -2
  149. package/dist/{chunk-3PXVYJMC.js → chunk-SB7D4BT7.js} +536 -114
  150. package/dist/chunk-SB7D4BT7.js.map +1 -0
  151. package/dist/{chunk-JFJ3MHGV.js → chunk-SBDCZ2AX.js} +1 -1
  152. package/dist/chunk-SBDCZ2AX.js.map +1 -0
  153. package/dist/{chunk-HQSPXTQO.js → chunk-SIHSCCUQ.js} +1 -1
  154. package/dist/{chunk-R3AAOKR2.js → chunk-SPUJNJJC.js} +2 -2
  155. package/dist/{chunk-IAY7YBXS.js → chunk-SQI57UCJ.js} +2 -2
  156. package/dist/{chunk-CTQRPANJ.js → chunk-SVSRPG6M.js} +2 -2
  157. package/dist/{chunk-56BSXSHC.js → chunk-TBOJ76ER.js} +14 -1
  158. package/dist/{chunk-56BSXSHC.js.map → chunk-TBOJ76ER.js.map} +1 -1
  159. package/dist/{chunk-Z54TXZ2F.js → chunk-TF77C7SV.js} +14 -7
  160. package/dist/chunk-TF77C7SV.js.map +1 -0
  161. package/dist/{chunk-S2VBSTTA.js → chunk-THG4GYIE.js} +2 -2
  162. package/dist/{chunk-IXRC7EQG.js → chunk-TR7DGXGI.js} +2 -2
  163. package/dist/{chunk-GEULB2VI.js → chunk-TZNQUNKL.js} +7 -1
  164. package/dist/chunk-TZNQUNKL.js.map +1 -0
  165. package/dist/{chunk-BC4QD3FM.js → chunk-UIN2BWDD.js} +2 -2
  166. package/dist/{chunk-JTSVMJHV.js → chunk-UXO5IMBK.js} +3 -3
  167. package/dist/{chunk-DBXZZIDU.js → chunk-V3MXUL3D.js} +138 -73
  168. package/dist/chunk-V3MXUL3D.js.map +1 -0
  169. package/dist/{chunk-KQAFEZQX.js → chunk-VDX2J7OX.js} +2 -2
  170. package/dist/{chunk-MUJ4QFUQ.js → chunk-W4BMEGQA.js} +4 -4
  171. package/dist/{chunk-5HK3CJAR.js → chunk-W675UJCZ.js} +2 -2
  172. package/dist/{chunk-MDVBCPOS.js → chunk-XCTXS7VY.js} +2 -2
  173. package/dist/{chunk-53ENM6F6.js → chunk-XRYZRW54.js} +2 -2
  174. package/dist/{chunk-VJ6ECBIP.js → chunk-Y7DK7HHJ.js} +2 -2
  175. package/dist/{chunk-3MADV4YC.js → chunk-YB42WZCY.js} +2 -2
  176. package/dist/{chunk-X5SDZMO7.js → chunk-YHCBJULX.js} +2 -2
  177. package/dist/{chunk-3RHFGGI5.js → chunk-YLDXWCZP.js} +20 -5
  178. package/dist/chunk-YLDXWCZP.js.map +1 -0
  179. package/dist/{chunk-6JJT5AKI.js → chunk-Z7PBQPJ4.js} +2 -2
  180. package/dist/{chunk-ALCJRQ72.js → chunk-ZO6AXLEH.js} +2 -2
  181. package/dist/{chunk-VZVP2W4O.js → chunk-ZQHI2BZB.js} +2 -2
  182. package/dist/{chunk-CUS6S7PN.js → chunk-ZWXJBFZU.js} +9 -9
  183. package/dist/chunk-ZWXJBFZU.js.map +1 -0
  184. package/dist/{cli-Pulnz-qm.d.ts → cli-cShQ13XG.d.ts} +5 -5
  185. package/dist/cli.d.ts +13 -13
  186. package/dist/cli.js +77 -75
  187. package/dist/coding/pre-action-gate.d.ts +1 -1
  188. package/dist/compounding/engine.d.ts +2 -2
  189. package/dist/compounding/engine.js +17 -16
  190. package/dist/compounding/preference-consolidator.d.ts +1 -1
  191. package/dist/compression-optimizer.d.ts +1 -1
  192. package/dist/config.d.ts +1 -1
  193. package/dist/config.js +6 -1
  194. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  195. package/dist/connectors/codex-materialize-runner.js +16 -15
  196. package/dist/connectors/codex-materialize.d.ts +1 -1
  197. package/dist/connectors/index.d.ts +1 -1
  198. package/dist/connectors/index.js +16 -15
  199. package/dist/consolidation-provenance-check.d.ts +2 -2
  200. package/dist/consolidation-undo.d.ts +2 -2
  201. package/dist/contradiction/index.d.ts +2 -2
  202. package/dist/contradiction/index.js +10 -2
  203. package/dist/converge-config.d.ts +1 -1
  204. package/dist/convergence-refresh.d.ts +2 -2
  205. package/dist/convergence-refresh.js +18 -17
  206. package/dist/conversation-index/backend.d.ts +1 -1
  207. package/dist/conversation-index/chunker.d.ts +1 -1
  208. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  209. package/dist/conversation-index/indexer.d.ts +1 -1
  210. package/dist/conversation-index/search.d.ts +1 -1
  211. package/dist/corpus-watermark.d.ts +1 -1
  212. package/dist/corpus-watermark.js +18 -17
  213. package/dist/cross-lingual-recall.d.ts +1 -1
  214. package/dist/day-summary.d.ts +1 -1
  215. package/dist/delinearize.d.ts +1 -1
  216. package/dist/dependency-propagation-config.d.ts +1 -1
  217. package/dist/{dependency-propagation-delivery-Co17gxYb.d.ts → dependency-propagation-delivery-CsGg-VwS.d.ts} +1 -1
  218. package/dist/direct-answer-wiring.d.ts +1 -1
  219. package/dist/direct-answer.d.ts +1 -1
  220. package/dist/embedding-fallback.d.ts +1 -1
  221. package/dist/enrichment/index.d.ts +1 -1
  222. package/dist/entity-origin-fields.d.ts +1 -1
  223. package/dist/entity-retrieval.d.ts +2 -2
  224. package/dist/entity-retrieval.js +16 -15
  225. package/dist/entity-schema.d.ts +1 -1
  226. package/dist/episodic-context.d.ts +1 -1
  227. package/dist/explicit-capture.d.ts +9 -9
  228. package/dist/explicit-capture.js +7 -6
  229. package/dist/external-wiki-access.d.ts +12 -13
  230. package/dist/external-wiki-access.js +36 -35
  231. package/dist/external-wiki-collection-registration.d.ts +1 -1
  232. package/dist/external-wiki-collection.d.ts +1 -1
  233. package/dist/external-wiki-mcp-tools.d.ts +11 -11
  234. package/dist/extraction-error-classification.d.ts +1 -1
  235. package/dist/extraction-faithfulness.d.ts +1 -1
  236. package/dist/extraction-judge-telemetry.d.ts +1 -1
  237. package/dist/extraction-judge-training.d.ts +1 -1
  238. package/dist/extraction-judge.d.ts +1 -1
  239. package/dist/extraction-judge.js +2 -2
  240. package/dist/extraction-liveness.d.ts +1 -1
  241. package/dist/extraction-normalization.d.ts +1 -1
  242. package/dist/extraction-normalization.js +2 -2
  243. package/dist/extraction-prompt.d.ts +2 -2
  244. package/dist/extraction-prompt.js +1 -1
  245. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  246. package/dist/extraction-source-grounding.d.ts +1 -1
  247. package/dist/extraction.d.ts +1 -1
  248. package/dist/extraction.js +22 -21
  249. package/dist/fallback-llm.d.ts +1 -1
  250. package/dist/graph-dashboard-diff.d.ts +1 -1
  251. package/dist/graph-dashboard-key.d.ts +1 -1
  252. package/dist/graph-dashboard-parser.d.ts +1 -1
  253. package/dist/graph-edge-reinforcement.d.ts +1 -1
  254. package/dist/graph-path-reconstruction.d.ts +1 -1
  255. package/dist/graph-path-scoring.d.ts +1 -1
  256. package/dist/graph-snapshot.d.ts +1 -1
  257. package/dist/graph.d.ts +1 -1
  258. package/dist/harmonic-retrieval.js +1 -1
  259. package/dist/importance.d.ts +1 -1
  260. package/dist/importers/index.d.ts +1 -1
  261. package/dist/in-flight-reads.d.ts +1 -1
  262. package/dist/index.d.ts +716 -699
  263. package/dist/index.js +173 -125
  264. package/dist/intent.d.ts +1 -1
  265. package/dist/lcm/engine.d.ts +1 -1
  266. package/dist/lcm/engine.js +3 -3
  267. package/dist/lcm/index.d.ts +1 -1
  268. package/dist/lcm/index.js +6 -6
  269. package/dist/lcm/tools.d.ts +1 -1
  270. package/dist/lifecycle.d.ts +1 -1
  271. package/dist/live-connectors-runner.d.ts +1 -1
  272. package/dist/local-llm.d.ts +1 -1
  273. package/dist/local-model-endpoint.d.ts +1 -1
  274. package/dist/maintenance/memory-governance.d.ts +1 -1
  275. package/dist/maintenance/memory-governance.js +16 -15
  276. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  277. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +16 -15
  278. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  279. package/dist/maintenance/rebuild-memory-projection.js +17 -16
  280. package/dist/{maintenance-DiSLtVN7.d.ts → maintenance-jhMpeGne.d.ts} +3 -3
  281. package/dist/mcp-memory-inspector-app.d.ts +11 -11
  282. package/dist/mcp-read-only-tools.js +1 -1
  283. package/dist/memory-action-policy.d.ts +1 -1
  284. package/dist/memory-cache.d.ts +1 -1
  285. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  286. package/dist/memory-projection-store.d.ts +1 -1
  287. package/dist/memory-provenance.d.ts +1 -1
  288. package/dist/memory-snapshot.d.ts +1 -1
  289. package/dist/memory-subject-cli.d.ts +177 -0
  290. package/dist/memory-subject-cli.js +16 -0
  291. package/dist/memory-subject.d.ts +128 -0
  292. package/dist/memory-subject.js +44 -0
  293. package/dist/memory-subject.js.map +1 -0
  294. package/dist/memory-worth-outcomes.d.ts +5 -4
  295. package/dist/memory-worth-outcomes.js +1 -1
  296. package/dist/models-json.d.ts +1 -1
  297. package/dist/namespaces/migrate.d.ts +3 -3
  298. package/dist/namespaces/migrate.js +17 -16
  299. package/dist/namespaces/principal.d.ts +1 -1
  300. package/dist/namespaces/search.d.ts +1 -1
  301. package/dist/namespaces/search.js +6 -6
  302. package/dist/namespaces/storage.d.ts +3 -3
  303. package/dist/namespaces/storage.js +16 -15
  304. package/dist/native-knowledge.d.ts +1 -1
  305. package/dist/offline-sync-impression-drain.d.ts +1 -1
  306. package/dist/operator-doctor-corpus.d.ts +1 -1
  307. package/dist/operator-doctor-corpus.js +19 -18
  308. package/dist/operator-doctor-replica.d.ts +1 -1
  309. package/dist/operator-toolkit.d.ts +3 -3
  310. package/dist/operator-toolkit.js +26 -24
  311. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  312. package/dist/orchestration/maintenance.d.ts +4 -4
  313. package/dist/orchestration/maintenance.js +22 -21
  314. package/dist/{orchestrator-DzCaxNS4.d.ts → orchestrator-DyGUC7re.d.ts} +8 -8
  315. package/dist/orchestrator.d.ts +9 -9
  316. package/dist/orchestrator.js +108 -105
  317. package/dist/patterns-cli.d.ts +1 -1
  318. package/dist/{pipeline-HJ8DKbFl.d.ts → pipeline-C25Oxtp1.d.ts} +1 -1
  319. package/dist/policy-runtime.d.ts +1 -1
  320. package/dist/proactive-contention.d.ts +1 -1
  321. package/dist/provenance.d.ts +1 -1
  322. package/dist/{public-http-DwXauTX3.d.ts → public-http-CMe7NQzj.d.ts} +1 -1
  323. package/dist/{qmd-BzxluoLt.d.ts → qmd-DkDVCbgF.d.ts} +1 -1
  324. package/dist/qmd-preflight.d.ts +2 -2
  325. package/dist/qmd-recall-cache.d.ts +1 -1
  326. package/dist/qmd.d.ts +2 -2
  327. package/dist/qmd.js +4 -4
  328. package/dist/recall-concurrency-config.d.ts +1 -1
  329. package/dist/recall-disclosure-escalation.d.ts +1 -1
  330. package/dist/recall-explain-renderer.d.ts +1 -1
  331. package/dist/recall-explain-renderer.js +3 -3
  332. package/dist/recall-memory-map.d.ts +1 -1
  333. package/dist/recall-planner-llm.d.ts +1 -1
  334. package/dist/recall-state.d.ts +1 -1
  335. package/dist/recall-tag-filter.d.ts +1 -1
  336. package/dist/recall-timings.d.ts +1 -1
  337. package/dist/recall-xray-cli.d.ts +1 -1
  338. package/dist/recall-xray-cli.js +4 -4
  339. package/dist/recall-xray-renderer.d.ts +1 -1
  340. package/dist/recall-xray-renderer.js +3 -3
  341. package/dist/recall-xray.d.ts +1 -1
  342. package/dist/recall-xray.js +2 -2
  343. package/dist/reconcile/cursor.d.ts +1 -1
  344. package/dist/reconcile/manifest.d.ts +1 -1
  345. package/dist/reconcile/manifest.js +3 -3
  346. package/dist/reconcile/plan.d.ts +1 -1
  347. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  348. package/dist/replay/normalizers/claude.d.ts +1 -1
  349. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  350. package/dist/replay/normalizers/shared.d.ts +1 -1
  351. package/dist/replay/runner.d.ts +1 -1
  352. package/dist/replay/types.d.ts +1 -1
  353. package/dist/replica-divergence.d.ts +1 -1
  354. package/dist/replica-peers-config.d.ts +1 -1
  355. package/dist/{resolution-DKMBPXHI.js → resolution-MFY72STR.js} +11 -3
  356. package/dist/resolution-MFY72STR.js.map +1 -0
  357. package/dist/resolve-auth-token.d.ts +1 -1
  358. package/dist/resume-bundles.js +7 -2
  359. package/dist/retrieval-agents.d.ts +2 -2
  360. package/dist/retrieval-tiers.d.ts +1 -1
  361. package/dist/routing/engine.d.ts +1 -1
  362. package/dist/routing/store.d.ts +1 -1
  363. package/dist/salvage-envelope.d.ts +1 -1
  364. package/dist/salvage-envelope.js +10 -2
  365. package/dist/schemas.d.ts +104 -90
  366. package/dist/schemas.js +1 -1
  367. package/dist/{scope-profiles-CEMZz0t5.d.ts → scope-profiles-B9xMoFO-.d.ts} +1 -1
  368. package/dist/search/embed-helper.d.ts +1 -1
  369. package/dist/search/factory.d.ts +1 -1
  370. package/dist/search/factory.js +5 -5
  371. package/dist/search/index.d.ts +1 -1
  372. package/dist/search/index.js +9 -9
  373. package/dist/search/lancedb-backend.d.ts +1 -1
  374. package/dist/search/meilisearch-backend.d.ts +1 -1
  375. package/dist/search/noop-backend.d.ts +1 -1
  376. package/dist/search/orama-backend.d.ts +1 -1
  377. package/dist/search/port.d.ts +1 -1
  378. package/dist/search/remote-backend.d.ts +1 -1
  379. package/dist/{semantic-consolidation-D9dYj6vu.d.ts → semantic-consolidation-C4uykW84.d.ts} +1 -1
  380. package/dist/semantic-consolidation.d.ts +2 -2
  381. package/dist/semantic-consolidation.js +17 -16
  382. package/dist/semantic-rule-promotion.js +16 -15
  383. package/dist/semantic-rule-verifier.d.ts +1 -1
  384. package/dist/semantic-rule-verifier.js +16 -15
  385. package/dist/{service-_qgST_0y.d.ts → service-DCZDZNcV.d.ts} +2 -2
  386. package/dist/session-observer-bands.d.ts +1 -1
  387. package/dist/session-observer-state.d.ts +1 -1
  388. package/dist/shared-context/manager.d.ts +11 -11
  389. package/dist/signal.d.ts +1 -1
  390. package/dist/source-agent-qualifier.d.ts +1 -1
  391. package/dist/source-agent-qualifier.js +18 -17
  392. package/dist/{storage-B9lbNTYE.d.ts → storage-CcKmEjL8.d.ts} +3 -2
  393. package/dist/storage.d.ts +2 -2
  394. package/dist/storage.js +18 -17
  395. package/dist/subject-config.d.ts +38 -0
  396. package/dist/subject-config.js +20 -0
  397. package/dist/subject-config.js.map +1 -0
  398. package/dist/summarizer.d.ts +1 -1
  399. package/dist/summary-snapshot.d.ts +1 -1
  400. package/dist/support-passport/index.d.ts +14 -14
  401. package/dist/support-passport/index.js +38 -37
  402. package/dist/temporal-supersession.d.ts +2 -2
  403. package/dist/temporal-timeline-recall.d.ts +1 -1
  404. package/dist/temporal-validity.d.ts +1 -1
  405. package/dist/threading.d.ts +1 -1
  406. package/dist/tier-migration.d.ts +2 -2
  407. package/dist/tier-routing.d.ts +1 -1
  408. package/dist/topics.d.ts +1 -1
  409. package/dist/transcript.d.ts +1 -1
  410. package/dist/transfer/backup.js +2 -2
  411. package/dist/transfer/capsule-export.js +2 -2
  412. package/dist/transfer/capsule-import.js +2 -2
  413. package/dist/transfer/types.d.ts +66 -66
  414. package/dist/trust-score-stage.d.ts +1 -1
  415. package/dist/trust-score.d.ts +1 -1
  416. package/dist/{types-BrEzuxPA.d.ts → types-Pi0lfaEt.d.ts} +38 -29
  417. package/dist/types.d.ts +1 -1
  418. package/dist/types.js +1 -1
  419. package/dist/utility-runtime.d.ts +1 -1
  420. package/dist/verified-recall.js +16 -15
  421. package/dist/who-knows-cli.d.ts +11 -11
  422. package/dist/who-knows-cli.js +17 -16
  423. package/dist/who-knows.d.ts +11 -11
  424. package/dist/who-knows.js +16 -15
  425. package/dist/write-envelope.d.ts +5 -2
  426. package/dist/write-envelope.js +10 -1
  427. package/package.json +2 -2
  428. package/scripts/build-with-heap.mjs +1 -1
  429. package/src/access-boundary.ts +2 -0
  430. package/src/access-mcp-admin-tools.ts +14 -0
  431. package/src/access-mcp-output-schemas.ts +6 -0
  432. package/src/access-mcp.ts +6 -6
  433. package/src/access-operations-batch.ts +8 -0
  434. package/src/access-service.ts +85 -0
  435. package/src/access-surface-catalog.ts +2 -0
  436. package/src/config.ts +10 -17
  437. package/src/extraction-prompt.ts +1 -0
  438. package/src/extraction.ts +4 -1
  439. package/src/index.ts +5 -6
  440. package/src/mcp-read-only-tools.ts +1 -0
  441. package/src/memory-subject-cli.ts +135 -0
  442. package/src/memory-subject.test.ts +48 -0
  443. package/src/memory-subject.ts +314 -0
  444. package/src/memory-worth-outcomes.test.ts +6 -2
  445. package/src/memory-worth-outcomes.ts +11 -7
  446. package/src/operator-toolkit.ts +1 -1
  447. package/src/orchestration/extraction-persist.ts +48 -48
  448. package/src/orchestration/recall-internal.ts +6 -5
  449. package/src/procedural/library-maintenance.test.ts +582 -0
  450. package/src/procedural/library-maintenance.ts +546 -0
  451. package/src/procedural/maintenance-config.ts +78 -0
  452. package/src/procedural/procedure-recall.ts +29 -1
  453. package/src/procedural/procedure-stats.ts +20 -0
  454. package/src/schemas.ts +7 -0
  455. package/src/spaces/index.ts +38 -2
  456. package/src/storage.ts +6 -2
  457. package/src/subject-config.ts +80 -0
  458. package/src/types.ts +26 -29
  459. package/src/write-envelope.test.ts +14 -0
  460. package/src/write-envelope.ts +24 -3
  461. package/dist/chunk-3PXVYJMC.js.map +0 -1
  462. package/dist/chunk-3RHFGGI5.js.map +0 -1
  463. package/dist/chunk-4NZHHGVL.js.map +0 -1
  464. package/dist/chunk-CEQF6L5K.js.map +0 -1
  465. package/dist/chunk-CUS6S7PN.js.map +0 -1
  466. package/dist/chunk-DBXZZIDU.js.map +0 -1
  467. package/dist/chunk-DEFI2QBT.js.map +0 -1
  468. package/dist/chunk-EIR5VLIH.js.map +0 -1
  469. package/dist/chunk-GEULB2VI.js.map +0 -1
  470. package/dist/chunk-JFJ3MHGV.js.map +0 -1
  471. package/dist/chunk-JG22O53B.js.map +0 -1
  472. package/dist/chunk-LCU5R6TQ.js.map +0 -1
  473. package/dist/chunk-MSTNSVXI.js.map +0 -1
  474. package/dist/chunk-YQ3CBLL4.js.map +0 -1
  475. package/dist/chunk-Z54TXZ2F.js.map +0 -1
  476. /package/dist/{capsule-crypto-7FJQINUR.js.map → capsule-crypto-YO5QJ6L3.js.map} +0 -0
  477. /package/dist/{chunk-LYIZXQYY.js.map → chunk-2E36UXVW.js.map} +0 -0
  478. /package/dist/{chunk-7QFBLYFP.js.map → chunk-2XDWWPTN.js.map} +0 -0
  479. /package/dist/{chunk-CFRBTATE.js.map → chunk-2YI72KM3.js.map} +0 -0
  480. /package/dist/{chunk-3YTTAGPB.js.map → chunk-3DVBKTSO.js.map} +0 -0
  481. /package/dist/{chunk-VPGRXEAB.js.map → chunk-3I7ASZN3.js.map} +0 -0
  482. /package/dist/{chunk-WTOE7CW4.js.map → chunk-4KYOLI6M.js.map} +0 -0
  483. /package/dist/{chunk-ESCQ6LY7.js.map → chunk-5NM4OH4P.js.map} +0 -0
  484. /package/dist/{chunk-Y23B2QXP.js.map → chunk-5YQ63T4B.js.map} +0 -0
  485. /package/dist/{chunk-PMVPCZJZ.js.map → chunk-6433HV72.js.map} +0 -0
  486. /package/dist/{chunk-NS5ETDYD.js.map → chunk-7BEPVIH3.js.map} +0 -0
  487. /package/dist/{chunk-W6TSGWYS.js.map → chunk-7YQ4IYS2.js.map} +0 -0
  488. /package/dist/{chunk-2NLLXCJG.js.map → chunk-BXLOS5AJ.js.map} +0 -0
  489. /package/dist/{chunk-CEH2AFXG.js.map → chunk-C24UZSFW.js.map} +0 -0
  490. /package/dist/{chunk-ZPN7W3OP.js.map → chunk-CDUUDBWJ.js.map} +0 -0
  491. /package/dist/{chunk-5UYSCYR7.js.map → chunk-CT56C22C.js.map} +0 -0
  492. /package/dist/{chunk-HJQZQUPC.js.map → chunk-DJZWNKFO.js.map} +0 -0
  493. /package/dist/{chunk-X7Y7WX73.js.map → chunk-DQEMWVMT.js.map} +0 -0
  494. /package/dist/{chunk-CCTVAVTT.js.map → chunk-DZUJ46DO.js.map} +0 -0
  495. /package/dist/{chunk-N6TRHP72.js.map → chunk-EILZG5VC.js.map} +0 -0
  496. /package/dist/{chunk-GXWDWOWP.js.map → chunk-GDFVPUJ5.js.map} +0 -0
  497. /package/dist/{chunk-7PWWGYGO.js.map → chunk-GNCCUR6K.js.map} +0 -0
  498. /package/dist/{chunk-KPBLJCCV.js.map → chunk-IID2CMUU.js.map} +0 -0
  499. /package/dist/{chunk-UYCIS6V5.js.map → chunk-JCWY73FK.js.map} +0 -0
  500. /package/dist/{chunk-SYJ6EKKE.js.map → chunk-JYYBA7TF.js.map} +0 -0
  501. /package/dist/{chunk-T42L3S6A.js.map → chunk-LBWQ65SX.js.map} +0 -0
  502. /package/dist/{chunk-LWVO2QZV.js.map → chunk-LGO6A7GJ.js.map} +0 -0
  503. /package/dist/{chunk-2572MRP2.js.map → chunk-LZH5FR2W.js.map} +0 -0
  504. /package/dist/{chunk-256FBCVX.js.map → chunk-M4AHBM72.js.map} +0 -0
  505. /package/dist/{chunk-YEQEGSJA.js.map → chunk-MN4KB2A4.js.map} +0 -0
  506. /package/dist/{chunk-AGKIG3YA.js.map → chunk-NKKD4ZAU.js.map} +0 -0
  507. /package/dist/{chunk-3TMYV3LP.js.map → chunk-NTWN6HB2.js.map} +0 -0
  508. /package/dist/{chunk-63FHSH7E.js.map → chunk-OCZIYAE5.js.map} +0 -0
  509. /package/dist/{chunk-I2HTKOOP.js.map → chunk-ODZG724P.js.map} +0 -0
  510. /package/dist/{chunk-HQSBYI5X.js.map → chunk-OTHZWLUD.js.map} +0 -0
  511. /package/dist/{chunk-4W6INNXO.js.map → chunk-PE255F4T.js.map} +0 -0
  512. /package/dist/{chunk-6L27N6YI.js.map → chunk-QOS5LBZN.js.map} +0 -0
  513. /package/dist/{chunk-G72IPMR7.js.map → chunk-R4OCGPSH.js.map} +0 -0
  514. /package/dist/{chunk-MIBKEW7A.js.map → chunk-R7JAM2XF.js.map} +0 -0
  515. /package/dist/{chunk-JBPKEARU.js.map → chunk-RKNJBZ55.js.map} +0 -0
  516. /package/dist/{chunk-HUNSEO5U.js.map → chunk-S2DPMJXH.js.map} +0 -0
  517. /package/dist/{chunk-HQSPXTQO.js.map → chunk-SIHSCCUQ.js.map} +0 -0
  518. /package/dist/{chunk-R3AAOKR2.js.map → chunk-SPUJNJJC.js.map} +0 -0
  519. /package/dist/{chunk-IAY7YBXS.js.map → chunk-SQI57UCJ.js.map} +0 -0
  520. /package/dist/{chunk-CTQRPANJ.js.map → chunk-SVSRPG6M.js.map} +0 -0
  521. /package/dist/{chunk-S2VBSTTA.js.map → chunk-THG4GYIE.js.map} +0 -0
  522. /package/dist/{chunk-IXRC7EQG.js.map → chunk-TR7DGXGI.js.map} +0 -0
  523. /package/dist/{chunk-BC4QD3FM.js.map → chunk-UIN2BWDD.js.map} +0 -0
  524. /package/dist/{chunk-JTSVMJHV.js.map → chunk-UXO5IMBK.js.map} +0 -0
  525. /package/dist/{chunk-KQAFEZQX.js.map → chunk-VDX2J7OX.js.map} +0 -0
  526. /package/dist/{chunk-MUJ4QFUQ.js.map → chunk-W4BMEGQA.js.map} +0 -0
  527. /package/dist/{chunk-5HK3CJAR.js.map → chunk-W675UJCZ.js.map} +0 -0
  528. /package/dist/{chunk-MDVBCPOS.js.map → chunk-XCTXS7VY.js.map} +0 -0
  529. /package/dist/{chunk-53ENM6F6.js.map → chunk-XRYZRW54.js.map} +0 -0
  530. /package/dist/{chunk-VJ6ECBIP.js.map → chunk-Y7DK7HHJ.js.map} +0 -0
  531. /package/dist/{chunk-3MADV4YC.js.map → chunk-YB42WZCY.js.map} +0 -0
  532. /package/dist/{chunk-X5SDZMO7.js.map → chunk-YHCBJULX.js.map} +0 -0
  533. /package/dist/{chunk-6JJT5AKI.js.map → chunk-Z7PBQPJ4.js.map} +0 -0
  534. /package/dist/{chunk-ALCJRQ72.js.map → chunk-ZO6AXLEH.js.map} +0 -0
  535. /package/dist/{chunk-VZVP2W4O.js.map → chunk-ZQHI2BZB.js.map} +0 -0
  536. /package/dist/{resolution-DKMBPXHI.js.map → memory-subject-cli.js.map} +0 -0
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-V7IZKJI3.js";
4
4
  import {
5
5
  AdapterRegistry
6
- } from "./chunk-JBPKEARU.js";
6
+ } from "./chunk-RKNJBZ55.js";
7
7
  import {
8
8
  WriteRateLimiter
9
9
  } from "./chunk-TB6CBZ5V.js";
@@ -12,16 +12,16 @@ import {
12
12
  } from "./chunk-3HSRWJTC.js";
13
13
  import {
14
14
  handleSupportPassportOwnerHttp
15
- } from "./chunk-HUNSEO5U.js";
15
+ } from "./chunk-S2DPMJXH.js";
16
16
  import {
17
17
  buildSupportPassportPublicRequestHandler
18
- } from "./chunk-6JJT5AKI.js";
18
+ } from "./chunk-Z7PBQPJ4.js";
19
19
  import {
20
20
  nonEmptyQueryParam,
21
21
  optionalNamespaceKindQueryParam,
22
22
  optionalQueryString,
23
23
  positiveIntQueryParam
24
- } from "./chunk-Y23B2QXP.js";
24
+ } from "./chunk-5YQ63T4B.js";
25
25
  import {
26
26
  EngramMcpServer,
27
27
  MCP_SUPPORTED_PROTOCOL_VERSIONS,
@@ -31,14 +31,14 @@ import {
31
31
  processChatMessage,
32
32
  sessionBelongsToPrincipal,
33
33
  subscribeChatTranscript
34
- } from "./chunk-Z54TXZ2F.js";
34
+ } from "./chunk-TF77C7SV.js";
35
35
  import {
36
36
  RelayMissionStoreError
37
- } from "./chunk-63FHSH7E.js";
37
+ } from "./chunk-OCZIYAE5.js";
38
38
  import {
39
39
  executeResolution,
40
40
  isValidResolutionVerb
41
- } from "./chunk-MDVBCPOS.js";
41
+ } from "./chunk-XCTXS7VY.js";
42
42
  import {
43
43
  isDefaultReviewNamespace,
44
44
  listPairs,
@@ -46,7 +46,7 @@ import {
46
46
  } from "./chunk-35NN3ZFA.js";
47
47
  import {
48
48
  validateRequest
49
- } from "./chunk-5HK3CJAR.js";
49
+ } from "./chunk-W675UJCZ.js";
50
50
  import {
51
51
  maybeHandleLifecycleFlush
52
52
  } from "./chunk-TIDEL77O.js";
@@ -61,15 +61,15 @@ import {
61
61
  authorizationProbeNamespaces,
62
62
  authorizationProbeRequiresPrincipalNamespace,
63
63
  probeOperationAuthorization
64
- } from "./chunk-BC4QD3FM.js";
64
+ } from "./chunk-UIN2BWDD.js";
65
65
  import {
66
66
  CorrectionContractError,
67
67
  getOperation,
68
68
  resolveQueryNamespaceWritablePreflight
69
- } from "./chunk-3PXVYJMC.js";
69
+ } from "./chunk-SB7D4BT7.js";
70
70
  import {
71
71
  handleWhoKnowsHttpQuery
72
- } from "./chunk-R3AAOKR2.js";
72
+ } from "./chunk-SPUJNJJC.js";
73
73
  import {
74
74
  isTrustZoneName
75
75
  } from "./chunk-5QZR2RA3.js";
@@ -78,7 +78,7 @@ import {
78
78
  } from "./chunk-DEUNUKTD.js";
79
79
  import {
80
80
  isRecallDisclosure
81
- } from "./chunk-JFJ3MHGV.js";
81
+ } from "./chunk-SBDCZ2AX.js";
82
82
  import {
83
83
  OFFLINE_SYNC_APPLY_MAX_BODY_BYTES,
84
84
  OFFLINE_SYNC_FILE_CONTENT_MAX_CHUNK_BYTES,
@@ -3388,4 +3388,4 @@ export {
3388
3388
  resolveDefaultAdminConsolePublicDir,
3389
3389
  EngramAccessHttpServer
3390
3390
  };
3391
- //# sourceMappingURL=chunk-WTOE7CW4.js.map
3391
+ //# sourceMappingURL=chunk-4KYOLI6M.js.map
@@ -0,0 +1,88 @@
1
+ // src/memory-subject-cli.ts
2
+ function parsePromotionCandidatesCliOptions(args) {
3
+ let limit = 20;
4
+ if (args.limit !== void 0) {
5
+ const parsed = Number(args.limit);
6
+ if (!Number.isInteger(parsed) || parsed < 1 || parsed > 100) {
7
+ throw new Error(
8
+ `promotion-candidates: --limit expects an integer in [1, 100] (got ${JSON.stringify(args.limit)})`
9
+ );
10
+ }
11
+ limit = parsed;
12
+ }
13
+ return {
14
+ ...args.namespace !== void 0 && args.namespace !== "" ? { namespace: args.namespace } : {},
15
+ ...args.targetNamespace !== void 0 && args.targetNamespace !== "" ? { targetNamespace: args.targetNamespace } : {},
16
+ limit,
17
+ json: args.json === true
18
+ };
19
+ }
20
+ function renderPromotionCandidates(result, json) {
21
+ if (json) return JSON.stringify(result, null, 2);
22
+ const lines = [
23
+ `Namespace: ${result.namespace} Target layer: ${result.targetNamespace} (minAccessCount ${result.minAccessCount})`
24
+ ];
25
+ if (result.candidates.length === 0) {
26
+ lines.push("No promotion candidates.");
27
+ return lines.join("\n");
28
+ }
29
+ for (const c of result.candidates) {
30
+ lines.push(
31
+ `- ${c.id} [${c.category}] signal=${c.reuseSignal} access=${c.accessCount} reinforced=${c.reinforcementCount} mw=${c.mwSuccess}/${c.mwFail}`
32
+ );
33
+ lines.push(` ${c.content.replace(/\s+/g, " ").slice(0, 100)}`);
34
+ }
35
+ lines.push("Promote explicitly with the existing promotion commands; nothing is auto-promoted.");
36
+ return lines.join("\n");
37
+ }
38
+ async function runPromotionCandidatesCommand(rest, io) {
39
+ const flag = (name) => {
40
+ const hit = rest.find((a) => a.startsWith(`--${name}=`));
41
+ return hit === void 0 ? void 0 : hit.slice(name.length + 3);
42
+ };
43
+ const options = parsePromotionCandidatesCliOptions({
44
+ namespace: flag("namespace"),
45
+ targetNamespace: flag("target-namespace"),
46
+ limit: flag("limit"),
47
+ json: rest.includes("--json")
48
+ });
49
+ const result = await io.promotionCandidates({
50
+ ...options.namespace !== void 0 ? { namespace: options.namespace } : {},
51
+ ...options.targetNamespace !== void 0 ? { targetNamespace: options.targetNamespace } : {},
52
+ limit: options.limit
53
+ });
54
+ io.stdout(renderPromotionCandidates(result, options.json));
55
+ }
56
+ function parseSubjectsBackfillCliOptions(args) {
57
+ return {
58
+ mode: args.apply === true ? "apply" : "shadow",
59
+ ...args.namespace !== void 0 && args.namespace !== "" ? { namespace: args.namespace } : {}
60
+ };
61
+ }
62
+ async function runSubjectsBackfillCommand(rest, io) {
63
+ const namespaceFlag = rest.find((a) => a.startsWith("--namespace="))?.slice("--namespace=".length);
64
+ const options = parseSubjectsBackfillCliOptions({
65
+ apply: rest.includes("--apply"),
66
+ namespace: namespaceFlag
67
+ });
68
+ const report = await io.backfill(options);
69
+ const lines = [
70
+ `Mode: ${report.mode} Scanned: ${report.scanned} Already stamped: ${report.alreadyStamped} To stamp: ${report.stamped}`
71
+ ];
72
+ for (const stamp of report.stamps) {
73
+ lines.push(`- ${stamp.id} [${stamp.category}] \u2192 subject: ${stamp.subject}`);
74
+ }
75
+ if (report.mode === "shadow") {
76
+ lines.push("Shadow run \u2014 nothing written. Re-run with --apply to stamp.");
77
+ }
78
+ io.stdout(lines.join("\n"));
79
+ }
80
+
81
+ export {
82
+ parsePromotionCandidatesCliOptions,
83
+ renderPromotionCandidates,
84
+ runPromotionCandidatesCommand,
85
+ parseSubjectsBackfillCliOptions,
86
+ runSubjectsBackfillCommand
87
+ };
88
+ //# sourceMappingURL=chunk-573TEZCD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/memory-subject-cli.ts"],"sourcesContent":["/**\n * CLI surface for memory-subject operations (issue #2372).\n *\n * `remnic promotion-candidates` — read-only surfacing of agent-subject,\n * reuse-signaled promotion candidates. `remnic subjects backfill` — the\n * deterministic shadow/apply stamp for unstamped memories. Runners take an\n * io seam (service/storage callbacks + stdout) so tests drive them without\n * booting an orchestrator; the remnic-cli entry supplies the real ones.\n */\n\nimport type {\n PromotionCandidatesResult,\n SubjectBackfillReport,\n} from \"./memory-subject.js\";\n\nexport interface PromotionCandidatesCliOptions {\n namespace?: string;\n targetNamespace?: string;\n limit: number;\n json: boolean;\n}\n\nexport function parsePromotionCandidatesCliOptions(args: {\n namespace?: string;\n targetNamespace?: string;\n limit?: string;\n json?: boolean;\n}): PromotionCandidatesCliOptions {\n let limit = 20;\n if (args.limit !== undefined) {\n const parsed = Number(args.limit);\n if (!Number.isInteger(parsed) || parsed < 1 || parsed > 100) {\n throw new Error(\n `promotion-candidates: --limit expects an integer in [1, 100] (got ${JSON.stringify(args.limit)})`,\n );\n }\n limit = parsed;\n }\n return {\n ...(args.namespace !== undefined && args.namespace !== \"\" ? { namespace: args.namespace } : {}),\n ...(args.targetNamespace !== undefined && args.targetNamespace !== \"\"\n ? { targetNamespace: args.targetNamespace }\n : {}),\n limit,\n json: args.json === true,\n };\n}\n\nexport function renderPromotionCandidates(result: PromotionCandidatesResult, json: boolean): string {\n if (json) return JSON.stringify(result, null, 2);\n const lines = [\n `Namespace: ${result.namespace} Target layer: ${result.targetNamespace} (minAccessCount ${result.minAccessCount})`,\n ];\n if (result.candidates.length === 0) {\n lines.push(\"No promotion candidates.\");\n return lines.join(\"\\n\");\n }\n for (const c of result.candidates) {\n lines.push(\n `- ${c.id} [${c.category}] signal=${c.reuseSignal} access=${c.accessCount} reinforced=${c.reinforcementCount} mw=${c.mwSuccess}/${c.mwFail}`,\n );\n lines.push(` ${c.content.replace(/\\s+/g, \" \").slice(0, 100)}`);\n }\n lines.push(\"Promote explicitly with the existing promotion commands; nothing is auto-promoted.\");\n return lines.join(\"\\n\");\n}\n\nexport async function runPromotionCandidatesCommand(\n rest: string[],\n io: {\n promotionCandidates: (request: {\n namespace?: string;\n targetNamespace?: string;\n limit?: number;\n }) => Promise<PromotionCandidatesResult>;\n stdout: (line: string) => void;\n },\n): Promise<void> {\n const flag = (name: string): string | undefined => {\n const hit = rest.find((a) => a.startsWith(`--${name}=`));\n return hit === undefined ? undefined : hit.slice(name.length + 3);\n };\n const options = parsePromotionCandidatesCliOptions({\n namespace: flag(\"namespace\"),\n targetNamespace: flag(\"target-namespace\"),\n limit: flag(\"limit\"),\n json: rest.includes(\"--json\"),\n });\n const result = await io.promotionCandidates({\n ...(options.namespace !== undefined ? { namespace: options.namespace } : {}),\n ...(options.targetNamespace !== undefined ? { targetNamespace: options.targetNamespace } : {}),\n limit: options.limit,\n });\n io.stdout(renderPromotionCandidates(result, options.json));\n}\n\nexport interface SubjectsBackfillCliOptions {\n mode: \"shadow\" | \"apply\";\n namespace?: string;\n}\n\nexport function parseSubjectsBackfillCliOptions(args: {\n apply?: boolean;\n namespace?: string;\n}): SubjectsBackfillCliOptions {\n return {\n mode: args.apply === true ? \"apply\" : \"shadow\",\n ...(args.namespace !== undefined && args.namespace !== \"\" ? { namespace: args.namespace } : {}),\n };\n}\n\nexport async function runSubjectsBackfillCommand(\n rest: string[],\n io: {\n backfill: (options: { mode: \"shadow\" | \"apply\"; namespace?: string }) => Promise<SubjectBackfillReport>;\n stdout: (line: string) => void;\n },\n): Promise<void> {\n const namespaceFlag = rest.find((a) => a.startsWith(\"--namespace=\"))?.slice(\"--namespace=\".length);\n const options = parseSubjectsBackfillCliOptions({\n apply: rest.includes(\"--apply\"),\n namespace: namespaceFlag,\n });\n const report = await io.backfill(options);\n const lines = [\n `Mode: ${report.mode} Scanned: ${report.scanned} Already stamped: ${report.alreadyStamped} To stamp: ${report.stamped}`,\n ];\n for (const stamp of report.stamps) {\n lines.push(`- ${stamp.id} [${stamp.category}] → subject: ${stamp.subject}`);\n }\n if (report.mode === \"shadow\") {\n lines.push(\"Shadow run — nothing written. Re-run with --apply to stamp.\");\n }\n io.stdout(lines.join(\"\\n\"));\n}\n"],"mappings":"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","names":[]}
@@ -7,10 +7,10 @@ import {
7
7
  import {
8
8
  listMemoryGovernanceRuns,
9
9
  readMemoryGovernanceRunArtifact
10
- } from "./chunk-SYJ6EKKE.js";
10
+ } from "./chunk-JYYBA7TF.js";
11
11
  import {
12
12
  StorageManager
13
- } from "./chunk-DEFI2QBT.js";
13
+ } from "./chunk-J275IYMG.js";
14
14
  import {
15
15
  normalizeProjectionPreview,
16
16
  normalizeProjectionTags
@@ -1005,4 +1005,4 @@ export {
1005
1005
  verifyMemoryProjection,
1006
1006
  repairMemoryProjection
1007
1007
  };
1008
- //# sourceMappingURL=chunk-ESCQ6LY7.js.map
1008
+ //# sourceMappingURL=chunk-5NM4OH4P.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  isNamespaceKind
3
- } from "./chunk-IAY7YBXS.js";
3
+ } from "./chunk-SQI57UCJ.js";
4
4
  import {
5
5
  EngramAccessInputError
6
6
  } from "./chunk-2Z24E5W2.js";
@@ -40,4 +40,4 @@ export {
40
40
  positiveIntQueryParam,
41
41
  optionalNamespaceKindQueryParam
42
42
  };
43
- //# sourceMappingURL=chunk-Y23B2QXP.js.map
43
+ //# sourceMappingURL=chunk-5YQ63T4B.js.map
@@ -19,7 +19,7 @@ import {
19
19
  import {
20
20
  decryptCapsuleFileInMemory,
21
21
  isEncryptedCapsuleFile
22
- } from "./chunk-X7Y7WX73.js";
22
+ } from "./chunk-DQEMWVMT.js";
23
23
  import {
24
24
  assertIsDirectoryNotSymlink,
25
25
  assertRealpathInsideRoot,
@@ -294,4 +294,4 @@ function mintForkId(capsuleId, originalId, now) {
294
294
  export {
295
295
  importCapsule
296
296
  };
297
- //# sourceMappingURL=chunk-PMVPCZJZ.js.map
297
+ //# sourceMappingURL=chunk-6433HV72.js.map
@@ -69,6 +69,9 @@ var ExtractedFactSchema = z.object({
69
69
  scope: z.enum(["project", "global"]).optional().nullable().describe(
70
70
  '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.'
71
71
  ),
72
+ subject: z.enum(["user", "agent"]).optional().nullable().describe(
73
+ '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.'
74
+ ),
72
75
  quote: z.string().optional().nullable().describe(
73
76
  "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)."
74
77
  ),
@@ -301,4 +304,4 @@ export {
301
304
  BehaviorLoopAdjustmentSchema,
302
305
  BehaviorLoopPolicyStateSchema
303
306
  };
304
- //# sourceMappingURL=chunk-4NZHHGVL.js.map
307
+ //# sourceMappingURL=chunk-7BDZTALN.js.map
@@ -0,0 +1 @@
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 subject: z\n .enum([\"user\", \"agent\"])\n .optional()\n .nullable()\n .describe(\n '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.',\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":[]}
@@ -2,11 +2,11 @@ import {
2
2
  buildExplicitCaptureDedupKey,
3
3
  isTombstoneBlockedCaptureWriteLockBusy,
4
4
  normalizeExplicitCaptureContent
5
- } from "./chunk-MUJ4QFUQ.js";
5
+ } from "./chunk-W4BMEGQA.js";
6
6
  import {
7
7
  TAG_LIMITS,
8
8
  composeMemoryEnvelope
9
- } from "./chunk-LCU5R6TQ.js";
9
+ } from "./chunk-RAIUTAZZ.js";
10
10
  import {
11
11
  isSupportPassportPrivateMemory
12
12
  } from "./chunk-XDL5CYZN.js";
@@ -787,4 +787,4 @@ export {
787
787
  shouldProcessInlineExplicitCapture,
788
788
  InlineExplicitCaptureProcessor
789
789
  };
790
- //# sourceMappingURL=chunk-NS5ETDYD.js.map
790
+ //# sourceMappingURL=chunk-7BEPVIH3.js.map
@@ -19,6 +19,7 @@ var EXTRACTION_RESPONSE_SHAPE = `{
19
19
  "promptedByQuestion": "<optional source-grounded question>",
20
20
  "quote": "<optional exact contiguous source span>",
21
21
  "scope": "<optional project-or-global>",
22
+ "subject": "<optional user-or-agent>",
22
23
  "structuredAttributes": {"<key>": "<value>"},
23
24
  "procedureSteps": [{"order": 1, "intent": "<step>"}, {"order": 2, "intent": "<step>"}],
24
25
  "reasoningTrace": {
@@ -194,4 +195,4 @@ export {
194
195
  buildConsolidationSystemPrompt,
195
196
  buildProfileConsolidationSystemPrompt
196
197
  };
197
- //# sourceMappingURL=chunk-JG22O53B.js.map
198
+ //# sourceMappingURL=chunk-7CBKAQIG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/extraction-prompt.ts"],"sourcesContent":["/**\n * Extraction prompt construction (issue #1995 sibling extraction).\n *\n * The system prompt, its JSON response shape, and the placeholder table\n * derived from that shape are prompt DATA, not engine behavior. They live here\n * so `extraction.ts` holds the pipeline and one module owns the text every\n * extraction path — local LLM, direct client, gateway fallback — sends.\n */\n\nimport { AMBIENT_CAPTURE_PROMPT_SECTION, AMBIENT_SPECULATIVE_TIER_CLAUSE } from \"./ambient-provenance.js\";\nimport { resolveMemoryLifecycleCapabilities, resolveRecallAuxiliaryCapabilities } from \"./capabilities.js\";\nimport type { PluginConfig } from \"./types.js\";\n\nexport const EXTRACTION_RESPONSE_SHAPE = `{\n \"facts\": [{\n \"category\": \"<category>\",\n \"content\": \"<source-grounded statement>\",\n \"confidence\": 0.0,\n \"tags\": [\"<tag>\"],\n \"entityRef\": \"<optional normalized-name>\",\n \"cueAnchors\": [{\"type\": \"<anchor-type>\", \"value\": \"<entity-or-topic plus key aspect>\"}],\n \"promptedByQuestion\": \"<optional source-grounded question>\",\n \"quote\": \"<optional exact contiguous source span>\",\n \"scope\": \"<optional project-or-global>\",\n \"subject\": \"<optional user-or-agent>\",\n \"structuredAttributes\": {\"<key>\": \"<value>\"},\n \"procedureSteps\": [{\"order\": 1, \"intent\": \"<step>\"}, {\"order\": 2, \"intent\": \"<step>\"}],\n \"reasoningTrace\": {\n \"steps\": [{\"order\": 1, \"description\": \"<step>\"}, {\"order\": 2, \"description\": \"<step>\"}],\n \"finalAnswer\": \"<answer>\",\n \"observedOutcome\": \"<optional outcome>\"\n },\n \"eventTime\": \"<optional source temporal expression>\"\n }],\n \"entities\": [{\n \"name\": \"<normalized-name>\",\n \"type\": \"<entity-type>\",\n \"facts\": [\"<source-grounded statement>\"],\n \"promptedByQuestion\": \"<optional source-grounded question>\",\n \"structuredSections\": [{\"key\": \"<section-key>\", \"title\": \"<section-title>\", \"facts\": [\"<source-grounded statement>\"]}]\n }],\n \"profileUpdates\": [\"<source-grounded profile update>\"],\n \"questions\": [{\"question\": \"<source-grounded unresolved question>\", \"context\": \"<source-grounded context>\", \"priority\": 0.0}],\n \"identityReflection\": \"<conversation-grounded agent reflection>\",\n \"episodeTitle\": \"<six-to-eight word conversation segment title>\",\n \"relationships\": [{\"source\": \"<normalized-name>\", \"target\": \"<normalized-name>\", \"label\": \"<source-grounded relationship>\"}]\n}`;\nexport const EXTRACTION_RESPONSE_PLACEHOLDERS: Record<string, true> = {};\nfor (const placeholder of EXTRACTION_RESPONSE_SHAPE.match(/<[^<>\\r\\n]+>/g) ?? []) {\n EXTRACTION_RESPONSE_PLACEHOLDERS[placeholder] = true;\n}\nexport const CUE_ANCHOR_PROMPT_INSTRUCTION = `- For each fact, emit at most 3 \"cueAnchors\".\n- Each cue anchor value must be a source-grounded search hook of at most 120 characters, in the form \"<main entity or topic> <key aspect>\".\n- Set each cue anchor type to entity, file, tool, outcome, constraint, or date.\n- Omit cue anchors when the conversation does not support a useful search hook.\n- Example: \"Alice booked Bistro Max for Mike's surprise party\" can use {\"type\":\"entity\",\"value\":\"Mike surprise party\"} and {\"type\":\"entity\",\"value\":\"Alice restaurant booking\"}.`;\n\n/**\n * Output-language policy (issue #2190). Every prompt that produces memory\n * content embeds this verbatim so non-English conversations are not silently\n * translated to English — translated memories fail later lexical recall.\n */\nexport const OUTPUT_LANGUAGE_POLICY = `Output language: write facts, profile updates, entity names and aliases, tags, questions, and any rewritten or merged memory content in the source language of the conversation or input memories. Never translate into English or another language unless the user explicitly asked for a translation.`;\n\n/**\n * Bi-temporal event-time extraction instruction (#1578 PR2). Emitted on\n * every extraction entry path when `temporal.biTemporal` is on so the LLM\n * emits an optional per-fact `eventTime` expression. The expression is\n * resolved against the source turn timestamp at write time — never\n * wall-clock — so replay/import of old transcripts anchors correctly.\n * Returns an empty string when the gate is off (byte-identical prompt).\n */\nexport function eventTimePromptInstruction(config: PluginConfig): string {\n if (!config.temporalBiTemporal) return \"\";\n return `\nWhen a fact states when it became or stopped being true, copy that explicit temporal expression verbatim into \"eventTime\". Omit \"eventTime\" when no such expression appears; never infer dates.`;\n}\n\n/**\n * Build extraction instructions shared between local and cloud LLM.\n *\n * `ambientCapture` marks input from an always-on recorder, which may carry\n * speech the user never authored (issue #2294).\n */\nexport function buildExtractionInstructions(\n config: PluginConfig,\n existingEntities?: string[],\n ambientCapture = false\n): string {\n const lifecycleCaps = resolveMemoryLifecycleCapabilities(config);\n return `You are a memory extraction system. Analyze the following conversation and extract durable, reusable memories.\n\nMemory categories:\n- fact: Objective information about the world\n- preference: User likes, dislikes, or stylistic choices\n- correction: User correcting a mistake or misconception (highest priority)\n- entity: Information about a specific person, project, tool, or company\n- decision: A choice that was made with rationale\n- relationship: How two entities relate to each other (e.g., \"Alice is Bob's manager\", \"Acme Corp uses Shopify\")\n- principle: Durable rules, values, or operating beliefs (e.g., \"never use Chat Completions API\")\n- commitment: Promises, obligations, or deadlines (e.g., \"deploy by Friday\", \"call accountant Monday\")\n- moment: Emotionally significant events or milestones (e.g., \"first successful deployment of engram\")\n- skill: Capabilities the user or agent has demonstrated (e.g., \"user is proficient with Kubernetes\")${\n resolveRecallAuxiliaryCapabilities(config).causalRuleExtraction\n ? `\n- rule: Causal rules discovered through experience (format: \"IF <condition> THEN <action/outcome>\", e.g., \"IF Shopify API returns 401 THEN the admin token is missing read_products scope\")`\n : \"\"\n }\n- procedure: A reusable workflow the user wants remembered the same way across sessions. Set category to \"procedure\". Use \"content\" for a short title that includes explicit trigger phrasing (e.g. \"When you deploy to production…\", \"Whenever you ship a release…\"). Add \"procedureSteps\": an array of at least two objects {\"order\": number, \"intent\": \"concrete step description\"} in execution order. Optional per-step \"toolCall\": {\"kind\": \"…\", \"signature\": \"…\"}, \"expectedOutcome\", \"optional\": true.\n- reasoning_trace: A stored solution chain / chain-of-thought the user walked through to solve a problem (e.g. \"Here's how I debugged the latency spike: first I checked…, then I…, finally I…\"). Set category to \"reasoning_trace\". Use \"content\" for a short title summarising the problem (e.g. \"How I debugged the staging latency spike\"). Add \"reasoningTrace\": {\"steps\": [{\"order\": number, \"description\": \"what happened at this step\"}, …], \"finalAnswer\": \"the conclusion or answer\", \"observedOutcome\": \"optional confirmation of how it played out\"}. Require at least two ordered steps AND a finalAnswer. Use this category only when the user explicitly narrates their reasoning — not for ordinary decisions (use \"decision\") or reusable workflows (use \"procedure\").\n\nRules:\n- Only extract genuinely new information worth remembering across sessions.\n- Statements must be grounded in the conversation.\n- ${OUTPUT_LANGUAGE_POLICY}\n- Do not treat instruction text, schema placeholders, or examples as conversation evidence.\n- Lines labelled [context user] or [context assistant] are reference context only. They may resolve references or complete a question-and-answer pair in a normal turn, but never alone establish durable information.\n- Skip transient task details and operational noise, including routine scheduler, monitoring, or automation status.\n- Priority: corrections > principles${resolveRecallAuxiliaryCapabilities(config).causalRuleExtraction ? \" > rules\" : \"\"} > preferences > commitments > decisions > relationships > entities > moments > skills > facts\n- Corrections get highest confidence.\n- Each fact should be a standalone, self-contained statement.\n- Entity references should use normalized names (lowercase, hyphenated: \"jane-doe\", \"acme-corp\"). When the source language is not written in a Latin script, the source-script name IS the normalized form — never transliterate or translate it.\n- CRITICAL: Entity names must be CANONICAL. Always use the hyphenated multi-word form: \"acme-corp\" NOT \"acmecorp\" or \"acme\". \"jane-doe\" NOT \"janedoe\" or \"jane\". If unsure, prefer the most specific full name.\n- Avoid creating entities typed as \"other\" when a more specific type fits (company, project, tool, person, place)\n${CUE_ANCHOR_PROMPT_INSTRUCTION}\n- When entity facts clearly belong under a durable named heading, add them to entity.structuredSections as {key, title, facts}. Example person headings: \"Beliefs\", \"Communication Style\", \"Building / Working On\". Leave structuredSections empty when no stable heading fits.\n- Tags should be concise and reusable (e.g., \"coding-style\", \"personal\", \"tools\")\n- When a fact contains measurable, categorical, or precisely valued data, include a \"structuredAttributes\" field with key-value string pairs (e.g., {\"price\": \"29.99\", \"brand\": \"Sony\"}, {\"date\": \"2024-03-15\", \"location\": \"SF\"}, {\"chosen\": \"PostgreSQL\", \"rejected\": \"MongoDB\"}). Only for concrete values, not narrative content.\n- Set confidence using these tiers:\n * Explicit (0.95-1.0): Direct user statements — \"I prefer X\", \"my name is Y\"\n * Implied (0.70-0.94): Strong contextual inference — user consistently does X, clear from conversation flow\n * Inferred (0.40-0.69): Pattern recognition — reasonable guess from limited evidence\n * Speculative (0.00-0.39): Tentative hypothesis — weak signal, needs future confirmation. Speculative memories auto-expire after 30 days if not confirmed.${ambientCapture ? AMBIENT_SPECULATIVE_TIER_CLAUSE : \"\"}${\n config.provenance?.enabled\n ? `\n- Source quotes: For each fact, include a \"quote\" field containing the EXACT verbatim words from the conversation that support the fact. Copy a contiguous span from a single speaker turn (not a paraphrase, not a summary). Cap at ~300 characters. This grounds every memory in the literal utterance that created it.`\n : \"\"\n }\n- For commitments: include any deadline or timeframe mentioned${\n lifecycleCaps.extractionScopeClassification\n ? `\n\nScope classification:\nFor each fact, set \"scope\" to one of:\n- \"global\" — knowledge that applies across projects: core framework/library bugs, API behavior patterns, user preferences (editor, language, style), general coding patterns, infrastructure knowledge, technology facts not tied to one codebase\n- \"project\" — knowledge specific to one codebase: file paths, environment configs, deployment details, project-specific workarounds, team/stakeholder info tied to one project, repo-specific conventions. Tool, command, or CLI-flag instructions TIED TO ONE AGENT are also \"project\", because the same tool name means different things in different agent integrations (a \"search\" tool may search repository code in one agent and the web in another); when keeping such an agent-tied instruction, the fact text MUST name the originating agent as a leading \"In <agent>,\" clause (e.g. \"In Pi, use the search tool with a repository path.\"). A tool/command fact that holds in every agent and every repo is NOT agent-tied — leave it \"global\" and do not add a qualifier (e.g. \"\\`git status --short\\` emits compact output\"). Examples: \"In Pi, the search tool takes a repository path\" -> \"project\"; \"\\`git status --short\\` emits compact output\" -> \"global\".\nWhen in doubt, prefer \"project\" — it is safer to keep knowledge scoped narrowly.`\n : \"\"\n }\n${\n ambientCapture\n ? `${AMBIENT_CAPTURE_PROMPT_SECTION}\n`\n : \"\"\n}\nEntity creation rules (STRICT):\n- Only create entities for DURABLE things: real people, companies, products, tools, ongoing projects\n- NEVER create entities for transient items: individual PRs, branches, Jira tickets, meetings, agent task IDs, log files, database tables, cron job runs, sessions\n- When you learn something about a transient item (e.g., PR #58 fixed a bug), store it as a FACT with an entityRef to the parent project — do NOT create an entity for the PR itself\n- Prefer attaching facts to broad parent entities rather than creating sub-entities. E.g., \"acme-store uses Algolia for search\" is a fact on entity \"acme-store\", NOT a new entity \"acme-store-algolia-connector\"\n- The entity list should be SHORT — think \"things that would have their own Wikipedia page\" not \"things mentioned in passing\"\n\n${\n existingEntities && existingEntities.length > 0\n ? `\nKNOWN ENTITIES (use these exact names when referencing existing things):\n${existingEntities.join(\", \")}\n\nWhen you see something that matches a known entity, use THAT name exactly. Only create a NEW entity if nothing in this list represents it.\n`\n : \"\"\n}\n${eventTimePromptInstruction(config)}\nAlso extract relationships between entities mentioned in the conversation.\n- Format: {source: \"entity-name\", target: \"entity-name\", label: \"relationship description\"}\n- Max 5 relationships per extraction\n- Only include clear, durable relationships (e.g., \"works at\", \"created\", \"manages\", \"uses\")\n- Use normalized entity names (e.g., \"person-jane-doe\", \"company-acme-corp\")\n\n\nAlso emit \"episodeTitle\" as a six-to-eight word title for this conversation segment.\nQuestions are optional. Include only source-grounded unresolved questions that would be useful in future sessions; otherwise return an empty array.\n\nFinally, write a brief identity reflection about the agent who had this conversation, based only on the conversation. Do not write about the extraction process.`;\n}\n\nexport const CONSOLIDATION_RESPONSE_SCHEMA = `{\n \"items\": [\n {\n \"existingId\": \"id\",\n \"action\": \"ADD\",\n \"mergeWith\": \"optional-existing-id\",\n \"updatedContent\": \"optional replacement content\",\n \"reason\": \"brief reason for this action\"\n }\n ],\n \"profileUpdates\": [\"optional profile update\"],\n \"entityUpdates\": [{\"name\": \"person-jane-doe\", \"type\": \"person\", \"facts\": [\"Now leads the backend team\", \"Recently migrated the user service to TypeScript\"]}]\n}`;\n\nexport const PROFILE_CONSOLIDATION_RESPONSE_SCHEMA = `{\n \"consolidatedProfile\": \"# Behavioral Profile\\\\n\\\\n... (complete markdown)\",\n \"removedCount\": 42,\n \"summary\": \"brief summary of what was consolidated\"\n}`;\n\n/**\n * System prompt shared by every consolidation path (gateway, direct client,\n * local LLM). Owns the causal-rule clause and the output-language policy so\n * the three paths cannot drift (issue #2190).\n */\nexport function buildConsolidationSystemPrompt(config: PluginConfig): string {\n return `You are a memory consolidation system. Compare new memories against existing ones and decide what to do with each.\n\nActions:\n- ADD: Keep the new memory as-is (no duplicate exists)\n- MERGE: Combine with an existing memory (provide mergeWith ID and updated content)\n- UPDATE: Replace existing memory content (provide updated content)\n- INVALIDATE: Remove existing memory (it's been superseded or is wrong)\n- SKIP: This new memory is redundant (exact duplicate or subset of existing)\n\nAlso:\n- Suggest profile updates based on patterns across memories\n- Identify entity updates for entity tracking${resolveRecallAuxiliaryCapabilities(config).causalRuleExtraction ? `\n- When merging or updating memories, look for IF→THEN causal patterns. If a memory describes \"X failed/succeeded because Y\" or \"doing X led to Y\", rewrite its content to make the causal rule explicit in the form \"IF <condition> THEN <action/outcome>\".` : \"\"}\n- ${OUTPUT_LANGUAGE_POLICY}`;\n}\n\n/**\n * System prompt shared by every profile-consolidation path (gateway, direct\n * client, local LLM). Owns the output-language policy (issue #2190).\n */\nexport function buildProfileConsolidationSystemPrompt(targetLines: number): string {\n return `You are a profile consolidation system. You are given a behavioral profile (markdown) that has grown too large. Your job is to produce a CONSOLIDATED version that:\n\n1. PRESERVES all ## section headers and their structure\n2. MERGES duplicate or near-duplicate bullet points into single, clear statements\n3. REMOVES stale information that has been superseded by newer bullets\n4. REMOVES trivial or overly specific operational details that won't be useful across sessions\n5. KEEPS the most important, durable observations about the user's preferences, habits, identity, and working style\n6. Target roughly ${targetLines} lines — this is a soft target, prioritize quality over length\n7. Write in the same style as the existing profile — concise bullets, no fluff\n8. ${OUTPUT_LANGUAGE_POLICY}\n\nThe output should be the COMPLETE consolidated profile as valid markdown, starting with \"# Behavioral Profile\".`;\n}\n"],"mappings":";;;;;;;;;;AAaO,IAAM,4BAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkClC,IAAM,mCAAyD,CAAC;AACvE,WAAW,eAAe,0BAA0B,MAAM,eAAe,KAAK,CAAC,GAAG;AAChF,mCAAiC,WAAW,IAAI;AAClD;AACO,IAAM,gCAAgC;AAAA;AAAA;AAAA;AAAA;AAWtC,IAAM,yBAAyB;AAU/B,SAAS,2BAA2B,QAA8B;AACvE,MAAI,CAAC,OAAO,mBAAoB,QAAO;AACvC,SAAO;AAAA;AAET;AAQO,SAAS,4BACd,QACA,kBACA,iBAAiB,OACT;AACR,QAAM,gBAAgB,mCAAmC,MAAM;AAC/D,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uGAaL,mCAAmC,MAAM,EAAE,uBACvC;AAAA,+LAEA,EACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOE,sBAAsB;AAAA;AAAA;AAAA;AAAA,sCAIY,mCAAmC,MAAM,EAAE,uBAAuB,aAAa,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMrH,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mKAQ+H,iBAAiB,kCAAkC,EAAE,GAC/M,OAAO,YAAY,UACf;AAAA,6TAEA,EACN;AAAA,gEAEE,cAAc,gCACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yFAOA,EACN;AAAA,EAEA,iBACI,GAAG,8BAA8B;AAAA,IAEjC,EACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASE,oBAAoB,iBAAiB,SAAS,IAC1C;AAAA;AAAA,EAEJ,iBAAiB,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,IAIvB,EACN;AAAA,EACE,2BAA2B,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYpC;AAEO,IAAM,gCAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AActC,IAAM,wCAAwC;AAAA;AAAA;AAAA;AAAA;AAW9C,SAAS,+BAA+B,QAA8B;AAC3E,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+CAWsC,mCAAmC,MAAM,EAAE,uBAAuB;AAAA,oQAC8I,EAAE;AAAA,IAC7P,sBAAsB;AAC1B;AAMO,SAAS,sCAAsC,aAA6B;AACjF,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAOW,WAAW;AAAA;AAAA,KAE1B,sBAAsB;AAAA;AAAA;AAG3B;","names":[]}
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-SOBJ6NEY.js";
4
4
  import {
5
5
  summarizeDisclosureTokens
6
- } from "./chunk-VPGRXEAB.js";
6
+ } from "./chunk-3I7ASZN3.js";
7
7
  import {
8
8
  summarizeRetrievedMemoryProvenance
9
9
  } from "./chunk-I4WBNM3M.js";
@@ -606,4 +606,4 @@ export {
606
606
  renderRecallExplain,
607
607
  parseRecallExplainFormat
608
608
  };
609
- //# sourceMappingURL=chunk-W6TSGWYS.js.map
609
+ //# sourceMappingURL=chunk-7YQ4IYS2.js.map
@@ -0,0 +1,55 @@
1
+ import {
2
+ PROMOTION_CANDIDATES_DEFAULT_MIN_ACCESS,
3
+ isSubjectGuardMode
4
+ } from "./chunk-RIAM7DND.js";
5
+ import {
6
+ coerceBool,
7
+ coerceNumber
8
+ } from "./chunk-PQVCH2AE.js";
9
+
10
+ // src/subject-config.ts
11
+ function assertObjectBlock(value, key, shape) {
12
+ if (value === void 0) return;
13
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
14
+ throw new Error(
15
+ `${key} must be an object (got ${JSON.stringify(value)}). Use ${shape} (issue #2372).`
16
+ );
17
+ }
18
+ }
19
+ function parseSubjectRuntimeConfig(cfg) {
20
+ assertObjectBlock(cfg.subjectClassification, "subjectClassification", "subjectClassification: { enabled: true }");
21
+ const classification = cfg.subjectClassification ?? {};
22
+ const rawEnabled = classification.enabled;
23
+ const enabledCoerced = coerceBool(rawEnabled);
24
+ if (rawEnabled !== void 0 && enabledCoerced === void 0) {
25
+ throw new Error(
26
+ `subjectClassification.enabled must be a boolean or one of "true"/"false"/"1"/"0"/"yes"/"no"/"on"/"off" (got ${JSON.stringify(rawEnabled)}) \u2014 rejected, not defaulted (issue #2372).`
27
+ );
28
+ }
29
+ const rawGuard = cfg.subjectGuard;
30
+ if (rawGuard !== void 0 && !isSubjectGuardMode(rawGuard)) {
31
+ throw new Error(
32
+ `subjectGuard must be one of: off, warn, enforce (got ${JSON.stringify(rawGuard)}) \u2014 rejected, not defaulted (issue #2372; checklist \xA71/\xA739).`
33
+ );
34
+ }
35
+ assertObjectBlock(cfg.promotionCandidates, "promotionCandidates", "promotionCandidates: { minAccessCount: 3 }");
36
+ const candidates = cfg.promotionCandidates ?? {};
37
+ const minAccessRaw = coerceNumber(candidates.minAccessCount);
38
+ if (candidates.minAccessCount !== void 0 && (minAccessRaw === void 0 || !Number.isFinite(minAccessRaw) || minAccessRaw < 0)) {
39
+ throw new Error(
40
+ `promotionCandidates.minAccessCount must be a non-negative number (got ${JSON.stringify(candidates.minAccessCount)}) \u2014 rejected, not defaulted (issue #2372).`
41
+ );
42
+ }
43
+ return {
44
+ subjectClassification: { enabled: rawEnabled === void 0 ? false : enabledCoerced === true },
45
+ subjectGuard: isSubjectGuardMode(rawGuard) ? rawGuard : "warn",
46
+ promotionCandidates: {
47
+ minAccessCount: minAccessRaw !== void 0 ? Math.floor(minAccessRaw) : PROMOTION_CANDIDATES_DEFAULT_MIN_ACCESS
48
+ }
49
+ };
50
+ }
51
+
52
+ export {
53
+ parseSubjectRuntimeConfig
54
+ };
55
+ //# sourceMappingURL=chunk-AAXJNINV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/subject-config.ts"],"sourcesContent":["/**\n * Config parsing for the memory-subject runtime knobs (issue #2372).\n *\n * Extracted from config.ts (its structural-ratchet ceiling forbids growth);\n * `parseConfig` spreads `parseSubjectRuntimeConfig(cfg)` into the plugin\n * config literal.\n *\n * Validation posture (Review Prevention Checklist §1/§24/§39): invalid\n * values are REJECTED loudly, never silently reinterpreted — but an omitted\n * key takes the documented default. The deliberate asymmetry from the issue\n * stands: classification defaults OFF while the guard defaults \"warn\", so\n * enabling classification later immediately yields promotion warnings\n * without a second flag flip, and with classification off, unstamped\n * memories still only warn (never silently promote) at shared targets.\n */\n\nimport { coerceBool, coerceNumber } from \"./connectors/coerce.js\";\nimport {\n isSubjectGuardMode,\n PROMOTION_CANDIDATES_DEFAULT_MIN_ACCESS,\n} from \"./memory-subject.js\";\nimport type { SubjectGuardMode } from \"./types.js\";\n\nexport interface SubjectRuntimeConfig {\n subjectClassification: { enabled: boolean };\n subjectGuard: SubjectGuardMode;\n promotionCandidates: { minAccessCount: number };\n}\n\n/**\n * Reject a non-object block loudly (rule 51 / §1): a shorthand like\n * `subjectClassification: false` must never normalize silently to `{}`.\n * Returns void so callers read the block through a DIRECT `cfg.<key>`\n * member access — the config-contract parser walker derives nested key\n * paths from those accesses, and a helper return value hides them.\n */\nfunction assertObjectBlock(value: unknown, key: string, shape: string): void {\n if (value === undefined) return;\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new Error(\n `${key} must be an object (got ${JSON.stringify(value)}). Use ${shape} (issue #2372).`,\n );\n }\n}\n\nexport function parseSubjectRuntimeConfig(cfg: Record<string, unknown>): SubjectRuntimeConfig {\n assertObjectBlock(cfg.subjectClassification, \"subjectClassification\", \"subjectClassification: { enabled: true }\");\n const classification = (cfg.subjectClassification ?? {}) as Record<string, unknown>;\n const rawEnabled = classification.enabled;\n const enabledCoerced = coerceBool(rawEnabled);\n if (rawEnabled !== undefined && enabledCoerced === undefined) {\n throw new Error(\n `subjectClassification.enabled must be a boolean or one of \"true\"/\"false\"/\"1\"/\"0\"/` +\n `\"yes\"/\"no\"/\"on\"/\"off\" (got ${JSON.stringify(rawEnabled)}) — rejected, not defaulted (issue #2372).`,\n );\n }\n const rawGuard = cfg.subjectGuard;\n if (rawGuard !== undefined && !isSubjectGuardMode(rawGuard)) {\n throw new Error(\n `subjectGuard must be one of: off, warn, enforce (got ${JSON.stringify(rawGuard)}) — ` +\n `rejected, not defaulted (issue #2372; checklist §1/§39).`,\n );\n }\n assertObjectBlock(cfg.promotionCandidates, \"promotionCandidates\", \"promotionCandidates: { minAccessCount: 3 }\");\n const candidates = (cfg.promotionCandidates ?? {}) as Record<string, unknown>;\n const minAccessRaw = coerceNumber(candidates.minAccessCount);\n if (candidates.minAccessCount !== undefined && (minAccessRaw === undefined || !Number.isFinite(minAccessRaw) || minAccessRaw < 0)) {\n throw new Error(\n `promotionCandidates.minAccessCount must be a non-negative number (got ${JSON.stringify(candidates.minAccessCount)}) — rejected, not defaulted (issue #2372).`,\n );\n }\n return {\n subjectClassification: { enabled: rawEnabled === undefined ? false : enabledCoerced === true },\n subjectGuard: isSubjectGuardMode(rawGuard) ? rawGuard : \"warn\",\n promotionCandidates: {\n minAccessCount:\n minAccessRaw !== undefined ? Math.floor(minAccessRaw) : PROMOTION_CANDIDATES_DEFAULT_MIN_ACCESS,\n },\n };\n}\n"],"mappings":";;;;;;;;;;AAoCA,SAAS,kBAAkB,OAAgB,KAAa,OAAqB;AAC3E,MAAI,UAAU,OAAW;AACzB,MAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GAAG;AACvE,UAAM,IAAI;AAAA,MACR,GAAG,GAAG,2BAA2B,KAAK,UAAU,KAAK,CAAC,UAAU,KAAK;AAAA,IACvE;AAAA,EACF;AACF;AAEO,SAAS,0BAA0B,KAAoD;AAC5F,oBAAkB,IAAI,uBAAuB,yBAAyB,0CAA0C;AAChH,QAAM,iBAAkB,IAAI,yBAAyB,CAAC;AACtD,QAAM,aAAa,eAAe;AAClC,QAAM,iBAAiB,WAAW,UAAU;AAC5C,MAAI,eAAe,UAAa,mBAAmB,QAAW;AAC5D,UAAM,IAAI;AAAA,MACR,+GACgC,KAAK,UAAU,UAAU,CAAC;AAAA,IAC5D;AAAA,EACF;AACA,QAAM,WAAW,IAAI;AACrB,MAAI,aAAa,UAAa,CAAC,mBAAmB,QAAQ,GAAG;AAC3D,UAAM,IAAI;AAAA,MACR,wDAAwD,KAAK,UAAU,QAAQ,CAAC;AAAA,IAElF;AAAA,EACF;AACA,oBAAkB,IAAI,qBAAqB,uBAAuB,4CAA4C;AAC9G,QAAM,aAAc,IAAI,uBAAuB,CAAC;AAChD,QAAM,eAAe,aAAa,WAAW,cAAc;AAC3D,MAAI,WAAW,mBAAmB,WAAc,iBAAiB,UAAa,CAAC,OAAO,SAAS,YAAY,KAAK,eAAe,IAAI;AACjI,UAAM,IAAI;AAAA,MACR,yEAAyE,KAAK,UAAU,WAAW,cAAc,CAAC;AAAA,IACpH;AAAA,EACF;AACA,SAAO;AAAA,IACL,uBAAuB,EAAE,SAAS,eAAe,SAAY,QAAQ,mBAAmB,KAAK;AAAA,IAC7F,cAAc,mBAAmB,QAAQ,IAAI,WAAW;AAAA,IACxD,qBAAqB;AAAA,MACnB,gBACE,iBAAiB,SAAY,KAAK,MAAM,YAAY,IAAI;AAAA,IAC5D;AAAA,EACF;AACF;","names":[]}
@@ -11,6 +11,9 @@ import {
11
11
  import {
12
12
  parseLocationConfig
13
13
  } from "./chunk-7PHI6GUI.js";
14
+ import {
15
+ parseSubjectRuntimeConfig
16
+ } from "./chunk-AAXJNINV.js";
14
17
  import {
15
18
  cloneDefaultSessionObserverBands
16
19
  } from "./chunk-Z5LAYHGJ.js";
@@ -96,6 +99,74 @@ import {
96
99
  // src/config.ts
97
100
  import path from "path";
98
101
 
102
+ // src/procedural/maintenance-config.ts
103
+ function parseProceduralMaintenanceConfig(raw) {
104
+ if (raw !== void 0 && (raw === null || typeof raw !== "object" || Array.isArray(raw))) {
105
+ throw new Error(
106
+ `procedural.maintenance must be an object (got ${JSON.stringify(raw)}). Omit the key to keep maintenance disabled (issue #2370).`
107
+ );
108
+ }
109
+ const rawMaintenance = raw && typeof raw === "object" ? raw : {};
110
+ let enabled = false;
111
+ if (rawMaintenance.enabled !== void 0) {
112
+ const coerced = coerceBool(rawMaintenance.enabled);
113
+ if (coerced === void 0) {
114
+ throw new Error(
115
+ `procedural.maintenance.enabled must be a boolean or one of "true"/"false"/"1"/"0"/"yes"/"no"/"on"/"off" (got ${JSON.stringify(rawMaintenance.enabled)}).`
116
+ );
117
+ }
118
+ enabled = coerced;
119
+ }
120
+ const parseInteger = (key, fallback, min, max) => {
121
+ const value = rawMaintenance[key];
122
+ if (value === void 0) return fallback;
123
+ const coerced = coerceNumber(value);
124
+ if (coerced === void 0 || !Number.isFinite(coerced)) {
125
+ throw new Error(
126
+ `procedural.maintenance.${key} must be a finite number (got ${JSON.stringify(value)}).`
127
+ );
128
+ }
129
+ if (!Number.isInteger(coerced)) {
130
+ throw new Error(
131
+ `procedural.maintenance.${key} must be an integer (got ${JSON.stringify(value)}).`
132
+ );
133
+ }
134
+ if (coerced < min || coerced > max) {
135
+ throw new Error(
136
+ `procedural.maintenance.${key} must be between ${min} and ${max} (got ${JSON.stringify(value)}).`
137
+ );
138
+ }
139
+ return coerced;
140
+ };
141
+ let retireFailRatio = 2;
142
+ if (rawMaintenance.retireFailRatio !== void 0) {
143
+ const coerced = coerceNumber(rawMaintenance.retireFailRatio);
144
+ if (coerced === void 0 || !Number.isFinite(coerced) || coerced <= 0) {
145
+ throw new Error(
146
+ `procedural.maintenance.retireFailRatio must be a positive finite number (got ${JSON.stringify(rawMaintenance.retireFailRatio)}).`
147
+ );
148
+ }
149
+ retireFailRatio = coerced;
150
+ }
151
+ let mergeEnabled = true;
152
+ if (rawMaintenance.mergeEnabled !== void 0) {
153
+ const coerced = coerceBool(rawMaintenance.mergeEnabled);
154
+ if (coerced === void 0) {
155
+ throw new Error(
156
+ `procedural.maintenance.mergeEnabled must be a boolean or one of "true"/"false"/"1"/"0"/"yes"/"no"/"on"/"off" (got ${JSON.stringify(rawMaintenance.mergeEnabled)}).`
157
+ );
158
+ }
159
+ mergeEnabled = coerced;
160
+ }
161
+ return {
162
+ enabled,
163
+ retireIdleDays: parseInteger("retireIdleDays", 90, 0, 36500),
164
+ retireMinOutcomes: parseInteger("retireMinOutcomes", 5, 1, 1e5),
165
+ retireFailRatio,
166
+ mergeEnabled
167
+ };
168
+ }
169
+
99
170
  // src/wearables/config.ts
100
171
  var KNOWN_WEARABLE_SOURCE_IDS = ["limitless", "bee", "omi"];
101
172
  var MEMORY_MODES = ["off", "review", "auto", "smart"];
@@ -1688,6 +1759,7 @@ function parseConfig(raw, rawOperatorConfig, runtimeSet) {
1688
1759
  const lookbackDays = lookbackCoerced !== void 0 && Number.isFinite(lookbackCoerced) ? Math.min(3650, Math.max(1, Math.floor(lookbackCoerced))) : 14;
1689
1760
  const recallMaxCoerced = coerceNumber(rawProcedural.recallMaxProcedures);
1690
1761
  const recallMaxProcedures = recallMaxCoerced !== void 0 && Number.isFinite(recallMaxCoerced) ? Math.min(10, Math.max(1, Math.floor(recallMaxCoerced))) : 2;
1762
+ const maintenance = parseProceduralMaintenanceConfig(rawProcedural.maintenance);
1691
1763
  const rawEnabledValue = rawProcedural.enabled;
1692
1764
  let proceduralEnabled;
1693
1765
  if (rawEnabledValue === void 0) {
@@ -1702,6 +1774,7 @@ function parseConfig(raw, rawOperatorConfig, runtimeSet) {
1702
1774
  proceduralEnabled = enabledCoerced;
1703
1775
  }
1704
1776
  const procedural = {
1777
+ maintenance,
1705
1778
  enabled: proceduralEnabled,
1706
1779
  /** `0` skips all mining (`minOccurrences_zero`); otherwise clusters need at least this many members. */
1707
1780
  minOccurrences: Math.min(1e3, Math.max(0, proceduralMinRaw)),
@@ -2789,10 +2862,10 @@ function parseConfig(raw, rawOperatorConfig, runtimeSet) {
2789
2862
  }
2790
2863
  return "low";
2791
2864
  })(),
2792
- // Extraction scope classification. When enabled, the extraction prompt
2793
- // asks the LLM to classify each fact as "project" or "global". Global
2794
- // facts are promoted to the shared namespace. Default true (rule 30 gate).
2865
+ // Extraction scope classification (rule 30 gate): "global" facts promote
2866
+ // to the shared namespace. Default true.
2795
2867
  extractionScopeClassificationEnabled: coerceBool(cfg.extractionScopeClassificationEnabled) !== false,
2868
+ ...parseSubjectRuntimeConfig(cfg),
2796
2869
  // Extraction judge (issue #376). Opt-in LLM-as-judge fact-worthiness gate.
2797
2870
  extractionJudgeEnabled: cfg.extractionJudgeEnabled === true,
2798
2871
  extractionJudgeModel: typeof cfg.extractionJudgeModel === "string" ? cfg.extractionJudgeModel : "",
@@ -2802,10 +2875,7 @@ function parseConfig(raw, rawOperatorConfig, runtimeSet) {
2802
2875
  // text before the verdict is forcibly converted to reject.
2803
2876
  extractionJudgeMaxDeferrals: typeof cfg.extractionJudgeMaxDeferrals === "number" && Number.isFinite(cfg.extractionJudgeMaxDeferrals) && cfg.extractionJudgeMaxDeferrals >= 1 ? Math.floor(cfg.extractionJudgeMaxDeferrals) : 2,
2804
2877
  // Judge telemetry (issue #562 PR 3): opt-in structured emit to the
2805
- // observation ledger for defer-rate / latency metrics.
2806
- // Uses `coerceBool` so CLI-style string inputs (`"true"`, `"false"`,
2807
- // `"1"`, `"0"`) are accepted consistently with the rest of the
2808
- // codebase (CLAUDE.md gotcha 36).
2878
+ // observation ledger; `coerceBool` accepts CLI-style strings (gotcha 36).
2809
2879
  extractionJudgeTelemetryEnabled: coerceBool(cfg.extractionJudgeTelemetryEnabled) === true,
2810
2880
  // Judge training-pair collection (issue #562 PR 4): opt-in shim for a
2811
2881
  // future GRPO training pipeline. Rows land under ~/.remnic/judge-
@@ -3936,4 +4006,4 @@ export {
3936
4006
  VALID_MEMORY_CATEGORIES,
3937
4007
  parseConfig
3938
4008
  };
3939
- //# sourceMappingURL=chunk-YQ3CBLL4.js.map
4009
+ //# sourceMappingURL=chunk-BWLRUMOG.js.map