@remnic/core 9.69.40 → 9.69.42

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 (688) hide show
  1. package/dist/access-admin-ops-surface.d.ts +14 -13
  2. package/dist/access-admin-ops-surface.js +79 -78
  3. package/dist/access-audit.js +2 -2
  4. package/dist/access-authorization-probe.d.ts +14 -13
  5. package/dist/access-authorization-probe.js +80 -79
  6. package/dist/access-boundary.d.ts +14 -13
  7. package/dist/access-boundary.js +79 -78
  8. package/dist/access-cli.js +170 -168
  9. package/dist/access-cli.js.map +1 -1
  10. package/dist/access-coding-context-resolution.d.ts +1 -1
  11. package/dist/access-extraction-force-flush.d.ts +14 -13
  12. package/dist/access-extraction-force-flush.js +79 -78
  13. package/dist/access-health-types.d.ts +1 -1
  14. package/dist/access-http-briefing.d.ts +14 -13
  15. package/dist/access-http-briefing.js +80 -79
  16. package/dist/access-http-lcm-compaction.d.ts +14 -13
  17. package/dist/access-http-lifecycle-flush.d.ts +14 -13
  18. package/dist/access-http-offline-stream.d.ts +14 -13
  19. package/dist/access-http-query.d.ts +2 -2
  20. package/dist/access-http-query.js +81 -80
  21. package/dist/access-http.d.ts +15 -14
  22. package/dist/access-http.js +100 -97
  23. package/dist/access-identity-continuity-surface.d.ts +11 -11
  24. package/dist/access-identity-continuity-surface.js +79 -78
  25. package/dist/access-lcm-surface.d.ts +14 -13
  26. package/dist/access-lcm-surface.js +79 -78
  27. package/dist/access-mcp-shared-context-tools.d.ts +157 -0
  28. package/dist/access-mcp-shared-context-tools.js +8 -0
  29. package/dist/access-mcp.d.ts +14 -13
  30. package/dist/access-mcp.js +91 -88
  31. package/dist/access-memory-search-fanout.d.ts +2 -2
  32. package/dist/{access-namespace-preflight-CKBumJ8W.d.ts → access-namespace-preflight-ShnAJ9uL.d.ts} +1 -1
  33. package/dist/access-namespace-preflight.d.ts +3 -3
  34. package/dist/access-namespace-preflight.js +79 -78
  35. package/dist/access-observe-transcript.d.ts +11 -11
  36. package/dist/access-observe-write-category.d.ts +17 -1
  37. package/dist/access-observe-write-category.js +21 -4
  38. package/dist/access-observe-write-surface.d.ts +14 -13
  39. package/dist/access-observe-write-surface.js +79 -78
  40. package/dist/access-offline-manifest.d.ts +11 -11
  41. package/dist/access-offline-manifest.js +14 -14
  42. package/dist/access-operations-batch.js +84 -82
  43. package/dist/access-operations.d.ts +14 -13
  44. package/dist/access-operations.js +89 -87
  45. package/dist/access-recall-concurrency.d.ts +14 -13
  46. package/dist/access-recall-concurrency.js +79 -78
  47. package/dist/access-recall-response.d.ts +14 -13
  48. package/dist/access-recall-response.js +79 -78
  49. package/dist/access-recall-surface.d.ts +14 -13
  50. package/dist/access-recall-surface.js +79 -78
  51. package/dist/access-schema.d.ts +117 -114
  52. package/dist/access-schema.js +3 -3
  53. package/dist/{access-service-DJ3qogNt.d.ts → access-service-DjG_e2cM.d.ts} +81 -75
  54. package/dist/access-service-helpers.d.ts +14 -13
  55. package/dist/access-service.d.ts +14 -13
  56. package/dist/access-service.js +79 -78
  57. package/dist/access-surface-catalog.d.ts +14 -13
  58. package/dist/access-surface-catalog.js +81 -80
  59. package/dist/access-surface-catalog.js.map +1 -1
  60. package/dist/access-wearables-meetings-surface.d.ts +4 -4
  61. package/dist/action-confidence.d.ts +1 -1
  62. package/dist/active-memory-bridge.d.ts +1 -1
  63. package/dist/active-memory-bridge.js +3 -3
  64. package/dist/active-recall.d.ts +1 -1
  65. package/dist/active-recall.js +10 -10
  66. package/dist/activity/digest.d.ts +1 -1
  67. package/dist/ambient-provenance.d.ts +1 -1
  68. package/dist/artifact-search.d.ts +1 -1
  69. package/dist/{auto-sync-D6BAPIJV.js → auto-sync-QZD4RD6H.js} +14 -10
  70. package/dist/{auto-sync-D6BAPIJV.js.map → auto-sync-QZD4RD6H.js.map} +1 -1
  71. package/dist/background-generation.d.ts +1 -1
  72. package/dist/behavior-learner.d.ts +1 -1
  73. package/dist/behavior-signals.d.ts +1 -1
  74. package/dist/bootstrap.d.ts +11 -11
  75. package/dist/briefing-window.d.ts +2 -2
  76. package/dist/briefing.d.ts +2 -2
  77. package/dist/briefing.js +22 -22
  78. package/dist/buffer-surprise-report.d.ts +1 -1
  79. package/dist/buffer-turn-helpers.d.ts +1 -1
  80. package/dist/buffer.d.ts +2 -2
  81. package/dist/buffer.js +9 -9
  82. package/dist/bulk-import/index.d.ts +3 -3
  83. package/dist/calibration.d.ts +1 -1
  84. package/dist/calibration.js +2 -2
  85. package/dist/capabilities.d.ts +1 -1
  86. package/dist/{capsule-crypto-7FJQINUR.js → capsule-crypto-YO5QJ6L3.js} +2 -2
  87. package/dist/{capsule-merge-IPG4IOFP.js → capsule-merge-3MNURAQ3.js} +2 -2
  88. package/dist/{catalog-BHXkBVhg.d.ts → catalog-BhuXaQHx.d.ts} +1 -1
  89. package/dist/causal-behavior.d.ts +1 -1
  90. package/dist/causal-consolidation.d.ts +1 -1
  91. package/dist/causal-consolidation.js +25 -25
  92. package/dist/causal-trajectory-graph.d.ts +1 -1
  93. package/dist/{chunk-M6RORUO5.js → chunk-2EYZ32LH.js} +24 -2
  94. package/dist/{chunk-M6RORUO5.js.map → chunk-2EYZ32LH.js.map} +1 -1
  95. package/dist/{chunk-JAJIMTFB.js → chunk-2PDMIPMP.js} +9 -9
  96. package/dist/{chunk-5LYSEZOF.js → chunk-2UINSKQC.js} +12 -11
  97. package/dist/chunk-2UINSKQC.js.map +1 -0
  98. package/dist/{chunk-6L2II3KS.js → chunk-3D75XIYO.js} +2 -2
  99. package/dist/{chunk-XCPNH2MG.js → chunk-3KJTSCSX.js} +5 -5
  100. package/dist/{chunk-YTZN2UZO.js → chunk-3RLWUW7G.js} +2 -2
  101. package/dist/{chunk-J272ODKJ.js → chunk-42DJ235G.js} +2 -2
  102. package/dist/{chunk-NVVZPBKI.js → chunk-46FVFU7S.js} +2 -2
  103. package/dist/{chunk-JUDT33RX.js → chunk-4AX5OYKC.js} +2 -2
  104. package/dist/{chunk-GSSDHAYH.js → chunk-4IGOLIWM.js} +2 -2
  105. package/dist/{chunk-23HFXQ5J.js → chunk-6EGIQEKC.js} +4 -4
  106. package/dist/{chunk-TVVEYCNW.js → chunk-7K5Q6COX.js} +4 -4
  107. package/dist/{chunk-GO5LOHCD.js → chunk-7L54ARML.js} +2 -2
  108. package/dist/{chunk-TEMKBSV6.js → chunk-7PSRCGWT.js} +3 -3
  109. package/dist/{chunk-ICNJ6J46.js → chunk-AAAFZW3U.js} +2 -2
  110. package/dist/{chunk-K4JKAXMO.js → chunk-AAX22E4K.js} +3 -3
  111. package/dist/{chunk-UZ6JYPJ6.js → chunk-ADARR5KF.js} +232 -171
  112. package/dist/chunk-ADARR5KF.js.map +1 -0
  113. package/dist/{chunk-KY236SP5.js → chunk-AHHFBJX7.js} +3 -3
  114. package/dist/{chunk-TZ44E732.js → chunk-AIVRD66I.js} +2 -2
  115. package/dist/{chunk-OEDW4ER7.js → chunk-AJBWVDRV.js} +2 -1
  116. package/dist/chunk-AJBWVDRV.js.map +1 -0
  117. package/dist/{chunk-YRIFXXMI.js → chunk-AOGICQMH.js} +6 -6
  118. package/dist/{chunk-KOTG3RXE.js → chunk-AUSRUOMQ.js} +2 -2
  119. package/dist/{chunk-C5R73BON.js → chunk-BIANISES.js} +2 -2
  120. package/dist/{chunk-IMBQFHRV.js → chunk-BPXJINHW.js} +8 -8
  121. package/dist/{chunk-2NLLXCJG.js → chunk-BXLOS5AJ.js} +2 -2
  122. package/dist/{chunk-2J3V5QEO.js → chunk-C3QXITIP.js} +4 -4
  123. package/dist/{chunk-2SNCQHJZ.js → chunk-CQ4BTPX6.js} +6 -6
  124. package/dist/{chunk-3QEVOQF5.js → chunk-CTETTVDN.js} +2 -2
  125. package/dist/{chunk-DFVSJFHK.js → chunk-DBB5JPSL.js} +2 -2
  126. package/dist/{chunk-W23JARAQ.js → chunk-DLPMOSNH.js} +2 -2
  127. package/dist/{chunk-BGRTZOJB.js → chunk-DMTSKY4W.js} +8 -8
  128. package/dist/{chunk-X7Y7WX73.js → chunk-DQEMWVMT.js} +1 -1
  129. package/dist/{chunk-QS5Q5RBV.js → chunk-E4FRR4MA.js} +8 -8
  130. package/dist/{chunk-NETQXOPY.js → chunk-EH3HNCAM.js} +12 -7
  131. package/dist/{chunk-NETQXOPY.js.map → chunk-EH3HNCAM.js.map} +1 -1
  132. package/dist/{chunk-RJQAP333.js → chunk-ETE3SGAH.js} +2 -2
  133. package/dist/{chunk-YNDLCWXS.js → chunk-EZ25VE3G.js} +4 -4
  134. package/dist/{chunk-RLU2Y5GV.js → chunk-F2FJTOV6.js} +4 -4
  135. package/dist/{chunk-V2ZA4YWE.js → chunk-F5H6YG5P.js} +2 -2
  136. package/dist/{chunk-K75A5XWU.js → chunk-F6PTJLEM.js} +4 -4
  137. package/dist/chunk-F6PTJLEM.js.map +1 -0
  138. package/dist/{chunk-4CMXI55L.js → chunk-FSUFKIFS.js} +2 -2
  139. package/dist/{chunk-ZAEPD4C2.js → chunk-G3NTZZWT.js} +2 -2
  140. package/dist/{chunk-ZMWSYUUL.js → chunk-GCBIXUPT.js} +2 -2
  141. package/dist/{chunk-WZYHPAG5.js → chunk-GIM2AGFL.js} +3 -3
  142. package/dist/{chunk-VKWFNPBH.js → chunk-GR76OKET.js} +14 -5
  143. package/dist/{chunk-VKWFNPBH.js.map → chunk-GR76OKET.js.map} +1 -1
  144. package/dist/{chunk-J7FVMLBR.js → chunk-GWEZNCGA.js} +2 -2
  145. package/dist/{chunk-LFVZD5EC.js → chunk-GWNSKQDA.js} +3 -3
  146. package/dist/{chunk-MJC7UKH7.js → chunk-H2N6SLTR.js} +2 -2
  147. package/dist/{chunk-J4WGTN2N.js → chunk-HK44SV6K.js} +4 -4
  148. package/dist/{chunk-JDX2OA4R.js → chunk-HNHIHXSD.js} +2 -2
  149. package/dist/{chunk-IS2IDFJP.js → chunk-HO2P3FAX.js} +22 -22
  150. package/dist/chunk-HO2P3FAX.js.map +1 -0
  151. package/dist/{chunk-VQYWKCDR.js → chunk-HPMCKAET.js} +3 -3
  152. package/dist/{chunk-ROEFLU37.js → chunk-HSJU6JFT.js} +16 -86
  153. package/dist/chunk-HSJU6JFT.js.map +1 -0
  154. package/dist/{chunk-MVG3KXON.js → chunk-I65KB36L.js} +25 -25
  155. package/dist/chunk-IFBSZGW3.js +42 -0
  156. package/dist/chunk-IFBSZGW3.js.map +1 -0
  157. package/dist/{chunk-SFHLQPBF.js → chunk-IUTYNDFS.js} +118 -112
  158. package/dist/chunk-IUTYNDFS.js.map +1 -0
  159. package/dist/{chunk-AEOOGXMQ.js → chunk-J2MGTGKC.js} +4 -4
  160. package/dist/chunk-JATHBCAV.js +94 -0
  161. package/dist/chunk-JATHBCAV.js.map +1 -0
  162. package/dist/{chunk-PKUJNICO.js → chunk-JC2OBYYD.js} +2 -2
  163. package/dist/{chunk-5U7K4W6K.js → chunk-JDOBQPJY.js} +3 -3
  164. package/dist/{chunk-TG3FAM2S.js → chunk-JL4TQYM5.js} +48 -1
  165. package/dist/{chunk-TG3FAM2S.js.map → chunk-JL4TQYM5.js.map} +1 -1
  166. package/dist/{chunk-VQWBUPSJ.js → chunk-JMAP6L6Q.js} +2 -2
  167. package/dist/{chunk-7Z54NXVS.js → chunk-K27INAPR.js} +2 -2
  168. package/dist/{chunk-YTK5MVNF.js → chunk-KCKXOS4Y.js} +14 -13
  169. package/dist/chunk-KCKXOS4Y.js.map +1 -0
  170. package/dist/{chunk-7D6SER6A.js → chunk-KJQ4Y2PY.js} +14 -14
  171. package/dist/{chunk-DAZANIYU.js → chunk-L732NBPR.js} +87 -88
  172. package/dist/{chunk-DAZANIYU.js.map → chunk-L732NBPR.js.map} +1 -1
  173. package/dist/{chunk-QPVNK2VE.js → chunk-LCVYO3ON.js} +2 -2
  174. package/dist/{chunk-HIP6DKJJ.js → chunk-LQVXSRAJ.js} +2 -2
  175. package/dist/{chunk-A7GQBJP5.js → chunk-LVFI5LG7.js} +7 -7
  176. package/dist/{chunk-TO36VPZI.js → chunk-LWF6GOII.js} +2 -2
  177. package/dist/{chunk-62HFZNCJ.js → chunk-N7B6V7SG.js} +13 -12
  178. package/dist/{chunk-62HFZNCJ.js.map → chunk-N7B6V7SG.js.map} +1 -1
  179. package/dist/{chunk-ES5BUPYB.js → chunk-OCWFKD5Q.js} +2 -2
  180. package/dist/{chunk-IOPIGX7Y.js → chunk-OP722LOG.js} +2 -2
  181. package/dist/{chunk-62D2PAAM.js → chunk-PAAJWQH5.js} +4 -4
  182. package/dist/{chunk-V6EGNVUT.js → chunk-PIWFNPQT.js} +4 -4
  183. package/dist/{chunk-JOP7W24J.js → chunk-PLJ2MQFT.js} +4 -4
  184. package/dist/{chunk-37CAEC7E.js → chunk-PWPIERBM.js} +4 -4
  185. package/dist/{chunk-BXIJSPCL.js → chunk-Q62GA5U2.js} +2 -2
  186. package/dist/{chunk-CC37E3QM.js → chunk-QKCXRS5A.js} +16 -1
  187. package/dist/chunk-QKCXRS5A.js.map +1 -0
  188. package/dist/{chunk-I3H5LFOI.js → chunk-QNJQCLI6.js} +4 -4
  189. package/dist/{chunk-BYQX4IOG.js → chunk-R45VFSEV.js} +2 -2
  190. package/dist/{chunk-XVDZFTN5.js → chunk-RFIJH2OE.js} +5 -5
  191. package/dist/{chunk-K4A6UVPB.js → chunk-RJ7Z7YXK.js} +11 -11
  192. package/dist/{chunk-ZZCR2QYL.js → chunk-RSSLDMFX.js} +2 -2
  193. package/dist/{chunk-ZZCR2QYL.js.map → chunk-RSSLDMFX.js.map} +1 -1
  194. package/dist/{chunk-QE6YVNP5.js → chunk-RTXHUVOD.js} +53 -19
  195. package/dist/chunk-RTXHUVOD.js.map +1 -0
  196. package/dist/{chunk-HJUP3K6L.js → chunk-RXYO6NA6.js} +2 -2
  197. package/dist/{chunk-TBXAY2SS.js → chunk-SGHGCFVV.js} +5 -5
  198. package/dist/{chunk-THTF2W7M.js → chunk-TRTLWUDD.js} +19 -18
  199. package/dist/chunk-TRTLWUDD.js.map +1 -0
  200. package/dist/{chunk-2SKMZUOW.js → chunk-U26LB4WA.js} +7 -7
  201. package/dist/{chunk-6P4REYKL.js → chunk-UDAUULK2.js} +28 -2
  202. package/dist/{chunk-6P4REYKL.js.map → chunk-UDAUULK2.js.map} +1 -1
  203. package/dist/{chunk-KTOXQMW3.js → chunk-UHSOPTNB.js} +14 -4
  204. package/dist/chunk-UHSOPTNB.js.map +1 -0
  205. package/dist/{chunk-VHKXRYQN.js → chunk-VBK6SRNE.js} +2 -2
  206. package/dist/{chunk-KQAFEZQX.js → chunk-VDX2J7OX.js} +2 -2
  207. package/dist/{chunk-Z4GUX2M6.js → chunk-VSN2DMQK.js} +2 -2
  208. package/dist/{chunk-ZHXSOMYH.js → chunk-VVX5PZFS.js} +2 -2
  209. package/dist/{chunk-G2XZFGYN.js → chunk-WGZHSQDV.js} +4 -4
  210. package/dist/{chunk-H3TKENU4.js → chunk-WIKO4SCR.js} +5 -5
  211. package/dist/{chunk-MDIEES23.js → chunk-WN2OXGGH.js} +1 -1
  212. package/dist/chunk-WN2OXGGH.js.map +1 -0
  213. package/dist/{chunk-LKFVVN7R.js → chunk-WNPRRBOE.js} +2 -2
  214. package/dist/{chunk-SV4Z2S67.js → chunk-WUUGE7QC.js} +54 -21
  215. package/dist/chunk-WUUGE7QC.js.map +1 -0
  216. package/dist/{chunk-ZZUVBZL2.js → chunk-X2QPKLPL.js} +2 -2
  217. package/dist/{chunk-RDLPFM7I.js → chunk-XJLTQTAO.js} +2 -2
  218. package/dist/{chunk-ZRMMXWYI.js → chunk-YR5QT4SR.js} +32 -9
  219. package/dist/chunk-YR5QT4SR.js.map +1 -0
  220. package/dist/{chunk-CARRTDKC.js → chunk-Z22M4JCY.js} +4 -3
  221. package/dist/chunk-Z22M4JCY.js.map +1 -0
  222. package/dist/{chunk-XM46Y66S.js → chunk-ZFU6QNRN.js} +7 -7
  223. package/dist/{chunk-SUEOG2S4.js → chunk-ZGXHTV5Y.js} +2 -2
  224. package/dist/{chunk-ZX3AYNNV.js → chunk-ZOGKZ2XT.js} +3 -2
  225. package/dist/chunk-ZOGKZ2XT.js.map +1 -0
  226. package/dist/{chunk-46Z3VGWF.js → chunk-ZYRAY5FL.js} +3 -3
  227. package/dist/{chunk-3XPN7AVY.js → chunk-ZYSOT6HD.js} +2 -2
  228. package/dist/{cli-BWri5-am.d.ts → cli-Cx9s_VRn.d.ts} +5 -5
  229. package/dist/cli.d.ts +16 -15
  230. package/dist/cli.js +129 -127
  231. package/dist/coding/export-okf-codegraph.d.ts +1 -1
  232. package/dist/coding/export-okf-codegraph.js +22 -22
  233. package/dist/coding/pre-action-gate.d.ts +1 -1
  234. package/dist/compounding/engine.d.ts +2 -2
  235. package/dist/compounding/engine.js +24 -24
  236. package/dist/compounding/preference-consolidator.d.ts +1 -1
  237. package/dist/compression-optimizer.d.ts +1 -1
  238. package/dist/config.d.ts +1 -1
  239. package/dist/config.js +10 -10
  240. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  241. package/dist/connectors/codex-materialize-runner.js +24 -24
  242. package/dist/connectors/codex-materialize.d.ts +1 -1
  243. package/dist/connectors/codex-materialize.js +2 -2
  244. package/dist/connectors/index.d.ts +1 -1
  245. package/dist/connectors/index.js +25 -25
  246. package/dist/consolidation-provenance-check.d.ts +2 -2
  247. package/dist/consolidation-undo.d.ts +2 -2
  248. package/dist/contradiction/index.d.ts +4 -4
  249. package/dist/contradiction/index.js +7 -7
  250. package/dist/{contradiction-scan-BSGKZHYJ.js → contradiction-scan-GVD4JJ7B.js} +4 -4
  251. package/dist/converge-config.d.ts +1 -1
  252. package/dist/convergence-refresh.d.ts +2 -2
  253. package/dist/convergence-refresh.js +26 -26
  254. package/dist/conversation-index/backend.d.ts +1 -1
  255. package/dist/conversation-index/chunker.d.ts +1 -1
  256. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  257. package/dist/conversation-index/indexer.d.ts +1 -1
  258. package/dist/conversation-index/search.d.ts +1 -1
  259. package/dist/corpus-watermark.d.ts +1 -1
  260. package/dist/corpus-watermark.js +25 -25
  261. package/dist/cross-lingual-recall.d.ts +1 -1
  262. package/dist/dashboard-runtime.js +2 -2
  263. package/dist/day-summary.d.ts +1 -1
  264. package/dist/deep-recall-config.d.ts +12 -1
  265. package/dist/deep-recall-config.js +5 -3
  266. package/dist/deep-recall-http-glue.d.ts +17 -14
  267. package/dist/deep-recall-http-glue.js +7 -4
  268. package/dist/deep-recall-mcp-tools.d.ts +14 -13
  269. package/dist/deep-recall-policy-llm.d.ts +12 -2
  270. package/dist/deep-recall-policy-llm.js +3 -3
  271. package/dist/deep-recall-seeds.d.ts +4 -1
  272. package/dist/deep-recall-seeds.js +1 -1
  273. package/dist/deep-recall.d.ts +12 -1
  274. package/dist/deep-recall.js +3 -2
  275. package/dist/delinearize.d.ts +1 -1
  276. package/dist/dependency-propagation-config.d.ts +1 -1
  277. package/dist/{dependency-propagation-delivery-ueZlKTQB.d.ts → dependency-propagation-delivery-C2QFQ97b.d.ts} +1 -1
  278. package/dist/direct-answer-wiring.d.ts +1 -1
  279. package/dist/direct-answer.d.ts +1 -1
  280. package/dist/embedding-fallback.d.ts +1 -1
  281. package/dist/enrichment/index.d.ts +1 -1
  282. package/dist/entity-origin-fields.d.ts +1 -1
  283. package/dist/entity-retrieval.d.ts +2 -2
  284. package/dist/entity-retrieval.js +23 -23
  285. package/dist/entity-schema.d.ts +1 -1
  286. package/dist/episodic-context.d.ts +1 -1
  287. package/dist/eval-trajectory-contracts.d.ts +1 -1
  288. package/dist/eval-trajectory-store.d.ts +1 -1
  289. package/dist/eval-trajectory.d.ts +1 -1
  290. package/dist/explicit-capture.d.ts +11 -11
  291. package/dist/explicit-capture.js +6 -6
  292. package/dist/external-wiki-access.d.ts +14 -13
  293. package/dist/external-wiki-access.js +80 -79
  294. package/dist/external-wiki-collection-registration.d.ts +1 -1
  295. package/dist/external-wiki-collection.d.ts +1 -1
  296. package/dist/external-wiki-mcp-tools.d.ts +14 -13
  297. package/dist/extraction-error-classification.d.ts +1 -1
  298. package/dist/extraction-faithfulness.d.ts +2 -2
  299. package/dist/extraction-faithfulness.js +3 -3
  300. package/dist/extraction-judge-telemetry.d.ts +2 -2
  301. package/dist/extraction-judge-training.d.ts +2 -2
  302. package/dist/extraction-judge.d.ts +2 -2
  303. package/dist/extraction-judge.js +3 -3
  304. package/dist/extraction-liveness.d.ts +1 -1
  305. package/dist/extraction-normalization.d.ts +1 -1
  306. package/dist/extraction-prompt.d.ts +1 -1
  307. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  308. package/dist/extraction-source-grounding.d.ts +1 -1
  309. package/dist/extraction-span-config.d.ts +1 -1
  310. package/dist/extraction-span-materialize.d.ts +1 -1
  311. package/dist/extraction.d.ts +2 -2
  312. package/dist/extraction.js +38 -38
  313. package/dist/fallback-llm-codex-subscription.d.ts +15 -5
  314. package/dist/fallback-llm-codex-subscription.js +3 -1
  315. package/dist/fallback-llm.d.ts +1 -1
  316. package/dist/fallback-llm.js +2 -2
  317. package/dist/{first-start-migration-ZWMV5CX4.js → first-start-migration-L3UFX5CU.js} +4 -4
  318. package/dist/{generic-recall-paths-CpyVmA88.d.ts → generic-recall-paths-CeKQsQEn.d.ts} +1 -1
  319. package/dist/graph-append-error.d.ts +1 -1
  320. package/dist/graph-dashboard-diff.d.ts +1 -1
  321. package/dist/graph-dashboard-key.d.ts +1 -1
  322. package/dist/graph-dashboard-parser.d.ts +1 -1
  323. package/dist/graph-edge-reinforcement.d.ts +1 -1
  324. package/dist/graph-jsonl.d.ts +1 -1
  325. package/dist/graph-path-reconstruction.d.ts +1 -1
  326. package/dist/graph-path-scoring.d.ts +1 -1
  327. package/dist/graph-snapshot.d.ts +1 -1
  328. package/dist/graph.d.ts +1 -1
  329. package/dist/harmonic-retrieval.js +3 -3
  330. package/dist/importance.d.ts +1 -1
  331. package/dist/importers/index.d.ts +1 -1
  332. package/dist/importers/test-utils.d.ts +1 -1
  333. package/dist/in-flight-reads.d.ts +1 -1
  334. package/dist/{index-BvUA4S7M.d.ts → index-Bau-Wl0H.d.ts} +3 -3
  335. package/dist/index.d.ts +703 -702
  336. package/dist/index.js +331 -327
  337. package/dist/intent.d.ts +1 -1
  338. package/dist/lcm/engine.d.ts +1 -1
  339. package/dist/lcm/engine.js +3 -3
  340. package/dist/lcm/index.d.ts +1 -1
  341. package/dist/lcm/index.js +8 -8
  342. package/dist/lcm/tools.d.ts +1 -1
  343. package/dist/lifecycle.d.ts +1 -1
  344. package/dist/live-connectors-runner.d.ts +1 -1
  345. package/dist/{local-llm-BsJGulur.d.ts → local-llm-Bj-m01Ro.d.ts} +1 -1
  346. package/dist/local-llm-helpers.d.ts +2 -2
  347. package/dist/local-llm.d.ts +2 -2
  348. package/dist/local-llm.js +2 -2
  349. package/dist/local-model-endpoint.d.ts +1 -1
  350. package/dist/location/index.d.ts +6 -209
  351. package/dist/location/index.js +77 -71
  352. package/dist/maintenance/memory-governance.d.ts +1 -1
  353. package/dist/maintenance/memory-governance.js +23 -23
  354. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  355. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +23 -23
  356. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  357. package/dist/maintenance/rebuild-memory-projection.js +25 -25
  358. package/dist/{maintenance-CYubtIRr.d.ts → maintenance-Ye-y-c7f.d.ts} +7 -6
  359. package/dist/mcp-memory-inspector-app.d.ts +14 -13
  360. package/dist/memory-action-policy.d.ts +1 -1
  361. package/dist/memory-cache.d.ts +1 -1
  362. package/dist/memory-controller.d.ts +1 -1
  363. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  364. package/dist/memory-projection-store.d.ts +1 -1
  365. package/dist/memory-provenance.d.ts +1 -1
  366. package/dist/memory-snapshot.d.ts +1 -1
  367. package/dist/memory-subject-cli.d.ts +14 -13
  368. package/dist/memory-subject.d.ts +14 -13
  369. package/dist/memory-worth-outcomes.d.ts +2 -2
  370. package/dist/models-json.d.ts +1 -1
  371. package/dist/namespaces/migrate.d.ts +3 -3
  372. package/dist/namespaces/migrate.js +23 -23
  373. package/dist/namespaces/principal.d.ts +1 -1
  374. package/dist/namespaces/search.d.ts +1 -1
  375. package/dist/namespaces/search.js +3 -3
  376. package/dist/namespaces/storage.d.ts +3 -3
  377. package/dist/namespaces/storage.js +22 -22
  378. package/dist/native-knowledge.d.ts +1 -1
  379. package/dist/offline-sync-impression-drain.d.ts +1 -1
  380. package/dist/offline-sync-impression-drain.js +5 -5
  381. package/dist/operator-doctor-corpus.d.ts +1 -1
  382. package/dist/operator-doctor-corpus.js +26 -26
  383. package/dist/operator-doctor-replica.d.ts +1 -1
  384. package/dist/operator-toolkit.d.ts +3 -3
  385. package/dist/operator-toolkit.js +44 -44
  386. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  387. package/dist/orchestration/maintenance.d.ts +4 -4
  388. package/dist/orchestration/maintenance.js +39 -39
  389. package/dist/{orchestrator-BWDRJ_0d.d.ts → orchestrator-fFDDYUUV.d.ts} +20 -10
  390. package/dist/orchestrator.d.ts +11 -11
  391. package/dist/orchestrator.js +170 -168
  392. package/dist/patterns-cli.d.ts +1 -1
  393. package/dist/{pipeline-7JMn2yMH.d.ts → pipeline-D_j5n_Ih.d.ts} +1 -1
  394. package/dist/policy-runtime.d.ts +1 -1
  395. package/dist/proactive-contention.d.ts +2 -2
  396. package/dist/provenance.d.ts +1 -1
  397. package/dist/{public-http-CJWs3mo9.d.ts → public-http-CjiSqxUx.d.ts} +1 -1
  398. package/dist/{qmd-CxCH9G9m.d.ts → qmd-CnxVjKrv.d.ts} +1 -1
  399. package/dist/qmd-preflight.d.ts +2 -2
  400. package/dist/qmd-recall-cache.d.ts +1 -1
  401. package/dist/qmd.d.ts +2 -2
  402. package/dist/recall-concurrency-config.d.ts +1 -1
  403. package/dist/recall-disclosure-escalation.d.ts +1 -1
  404. package/dist/recall-explain-renderer.d.ts +1 -1
  405. package/dist/recall-explain-renderer.js +3 -3
  406. package/dist/recall-memory-map.d.ts +1 -1
  407. package/dist/recall-navigate-access.d.ts +1 -1
  408. package/dist/recall-navigate-access.js +2 -2
  409. package/dist/recall-navigate-disclosure.d.ts +1 -1
  410. package/dist/recall-navigate-disclosure.js +1 -1
  411. package/dist/recall-navigate.d.ts +1 -1
  412. package/dist/recall-navigate.js +2 -2
  413. package/dist/recall-planner-llm.d.ts +1 -1
  414. package/dist/recall-planner-llm.js +2 -2
  415. package/dist/recall-state-view-admission.d.ts +2 -2
  416. package/dist/recall-state-view-admission.js +8 -8
  417. package/dist/recall-state-view-anchors.d.ts +1 -1
  418. package/dist/recall-state-view-anchors.js +2 -2
  419. package/dist/recall-state-view-inject.js +2 -2
  420. package/dist/recall-state-view-render.js +2 -2
  421. package/dist/recall-state-view-widen.js +2 -2
  422. package/dist/recall-state-view-wire.js +3 -3
  423. package/dist/recall-state-view.d.ts +9 -1
  424. package/dist/recall-state-view.js +5 -3
  425. package/dist/recall-state.d.ts +1 -1
  426. package/dist/recall-tag-filter.d.ts +1 -1
  427. package/dist/recall-timings.d.ts +1 -1
  428. package/dist/recall-xray-cli.d.ts +1 -1
  429. package/dist/recall-xray-cli.js +4 -4
  430. package/dist/recall-xray-renderer.d.ts +1 -1
  431. package/dist/recall-xray-renderer.js +3 -3
  432. package/dist/recall-xray.d.ts +1 -1
  433. package/dist/recall-xray.js +2 -2
  434. package/dist/reconcile/cursor.d.ts +1 -1
  435. package/dist/reconcile/cursor.js +2 -2
  436. package/dist/reconcile/manifest.d.ts +1 -1
  437. package/dist/reconcile/manifest.js +4 -4
  438. package/dist/reconcile/plan.d.ts +1 -1
  439. package/dist/reconcile/plan.js +2 -2
  440. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  441. package/dist/replay/normalizers/claude.d.ts +1 -1
  442. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  443. package/dist/replay/normalizers/shared.d.ts +1 -1
  444. package/dist/replay/runner.d.ts +1 -1
  445. package/dist/replay/types.d.ts +1 -1
  446. package/dist/replica-divergence.d.ts +1 -1
  447. package/dist/replica-peers-config.d.ts +1 -1
  448. package/dist/{resolution-4GG3QZRJ.js → resolution-LXFQQ4AE.js} +8 -8
  449. package/dist/resolution-LXFQQ4AE.js.map +1 -0
  450. package/dist/resolve-auth-token.d.ts +1 -1
  451. package/dist/resume-bundles.js +12 -12
  452. package/dist/retrieval-agents.d.ts +2 -2
  453. package/dist/retrieval-tiers.d.ts +1 -1
  454. package/dist/routing/engine.d.ts +1 -1
  455. package/dist/routing/store.d.ts +1 -1
  456. package/dist/salvage-envelope.d.ts +1 -1
  457. package/dist/schemas.d.ts +160 -160
  458. package/dist/{scope-profiles-BGAUqhBR.d.ts → scope-profiles-BajH5zAT.d.ts} +1 -1
  459. package/dist/search/embed-helper.d.ts +1 -1
  460. package/dist/search/factory.d.ts +1 -1
  461. package/dist/search/factory.js +2 -2
  462. package/dist/search/index.d.ts +1 -1
  463. package/dist/search/index.js +4 -4
  464. package/dist/search/lancedb-backend.d.ts +1 -1
  465. package/dist/search/meilisearch-backend.d.ts +1 -1
  466. package/dist/search/noop-backend.d.ts +1 -1
  467. package/dist/search/orama-backend.d.ts +1 -1
  468. package/dist/search/port.d.ts +1 -1
  469. package/dist/search/remote-backend.d.ts +1 -1
  470. package/dist/{semantic-consolidation-CCeRD9pV.d.ts → semantic-consolidation-Bu6d3O7R.d.ts} +1 -1
  471. package/dist/semantic-consolidation.d.ts +2 -2
  472. package/dist/semantic-consolidation.js +25 -25
  473. package/dist/semantic-rule-promotion.js +22 -22
  474. package/dist/semantic-rule-verifier.d.ts +1 -1
  475. package/dist/semantic-rule-verifier.js +22 -22
  476. package/dist/{service-BwpzRduk.d.ts → service-ChFwWtLS.d.ts} +13 -2
  477. package/dist/session-observer-bands.d.ts +1 -1
  478. package/dist/session-observer-state.d.ts +1 -1
  479. package/dist/shared-context/manager.d.ts +7 -7
  480. package/dist/shared-context/manager.js +2 -2
  481. package/dist/shared-context/write-output-controls.d.ts +34 -0
  482. package/dist/shared-context/write-output-controls.js +10 -0
  483. package/dist/shared-context/write-output-controls.js.map +1 -0
  484. package/dist/signal.d.ts +1 -1
  485. package/dist/source-agent-qualifier.d.ts +1 -1
  486. package/dist/source-agent-qualifier.js +33 -33
  487. package/dist/source-attribution.d.ts +23 -1
  488. package/dist/source-attribution.js +13 -3
  489. package/dist/standup/build.js +23 -23
  490. package/dist/{storage-BprAGBG0.d.ts → storage-BDKQdsmB.d.ts} +1 -1
  491. package/dist/storage.d.ts +2 -2
  492. package/dist/storage.js +21 -21
  493. package/dist/subject-config.d.ts +1 -1
  494. package/dist/subject-config.js +2 -2
  495. package/dist/summarizer.d.ts +1 -1
  496. package/dist/summarizer.js +6 -6
  497. package/dist/summary-snapshot.d.ts +1 -1
  498. package/dist/support-passport/index.d.ts +17 -16
  499. package/dist/support-passport/index.js +82 -81
  500. package/dist/tagging-CwK6um2q.d.ts +240 -0
  501. package/dist/temporal-supersession.d.ts +2 -2
  502. package/dist/temporal-timeline-recall.d.ts +1 -1
  503. package/dist/temporal-validity.d.ts +1 -1
  504. package/dist/threading.d.ts +1 -1
  505. package/dist/tier-migration.d.ts +2 -2
  506. package/dist/tier-routing.d.ts +1 -1
  507. package/dist/tier-routing.js +3 -3
  508. package/dist/{tier-stats-LUSUUNU6.js → tier-stats-VK5PCO2L.js} +4 -4
  509. package/dist/topics.d.ts +1 -1
  510. package/dist/transcript.d.ts +1 -1
  511. package/dist/transfer/backup.js +2 -2
  512. package/dist/transfer/capsule-export.js +2 -2
  513. package/dist/transfer/capsule-import.js +3 -3
  514. package/dist/transfer/export-okf.d.ts +1 -1
  515. package/dist/transfer/export-okf.js +22 -22
  516. package/dist/transfer/types.d.ts +78 -78
  517. package/dist/trust-score-stage.d.ts +1 -1
  518. package/dist/trust-score.d.ts +1 -1
  519. package/dist/{types-nJV23pa3.d.ts → types-B65IoepH.d.ts} +6 -1
  520. package/dist/types.d.ts +1 -1
  521. package/dist/types.js +1 -1
  522. package/dist/utility-runtime.d.ts +1 -1
  523. package/dist/verified-recall.js +22 -22
  524. package/dist/who-knows-cli.d.ts +14 -13
  525. package/dist/who-knows-cli.js +23 -23
  526. package/dist/who-knows.d.ts +14 -13
  527. package/dist/who-knows.js +22 -22
  528. package/dist/write-envelope.d.ts +1 -1
  529. package/package.json +12 -2
  530. package/src/access-http.test.ts +1 -0
  531. package/src/access-http.ts +1 -1
  532. package/src/access-mcp-shared-context-tools.ts +103 -0
  533. package/src/access-mcp.ts +7 -80
  534. package/src/access-observe-write-category.ts +1 -0
  535. package/src/access-observe-write-surface.ts +3 -3
  536. package/src/access-operations-batch.ts +47 -4
  537. package/src/access-schema.ts +1 -0
  538. package/src/access-service.ts +18 -12
  539. package/src/activity/timeline/regenerate.test.ts +48 -0
  540. package/src/activity/timeline/regenerate.ts +7 -5
  541. package/src/cli/deep-recall-commands.ts +22 -10
  542. package/src/config.ts +5 -0
  543. package/src/dedup/merge.test.ts +283 -0
  544. package/src/deep-recall-boundary.test.ts +66 -0
  545. package/src/deep-recall-cli.test.ts +82 -0
  546. package/src/deep-recall-config.test.ts +56 -0
  547. package/src/deep-recall-config.ts +32 -0
  548. package/src/deep-recall-http-glue.ts +10 -10
  549. package/src/deep-recall-policy-llm.test.ts +242 -0
  550. package/src/deep-recall-policy-llm.ts +37 -7
  551. package/src/deep-recall-seeds.test.ts +53 -0
  552. package/src/deep-recall-seeds.ts +7 -1
  553. package/src/deep-recall-surface.test.ts +93 -0
  554. package/src/deep-recall.test.ts +121 -0
  555. package/src/deep-recall.ts +88 -28
  556. package/src/fallback-llm-codex-subscription.ts +27 -5
  557. package/src/fallback-llm.test.ts +120 -0
  558. package/src/fallback-llm.ts +17 -16
  559. package/src/location/phase5-wiring.test.ts +408 -0
  560. package/src/location/tagging.ts +58 -0
  561. package/src/meetings/config.test.ts +58 -0
  562. package/src/orchestration/extraction-persist.ts +1 -1
  563. package/src/orchestration/orchestrator-helpers.ts +2 -0
  564. package/src/orchestration/recall-entry.ts +15 -1
  565. package/src/orchestration/recall-internal.ts +1 -0
  566. package/src/orchestration/recall-section-coordinator.ts +65 -28
  567. package/src/orchestration/recall-state-view-pipeline.test.ts +8 -2
  568. package/src/orchestration/semantic-merge-commit-effects.ts +45 -16
  569. package/src/orchestration/semantic-merge-persist.ts +23 -36
  570. package/src/orchestration/workspace-ops.ts +14 -0
  571. package/src/providers/codex-subscription.test.ts +127 -0
  572. package/src/providers/codex-subscription.ts +1 -1
  573. package/src/recall-state-view-budget.test.ts +424 -0
  574. package/src/recall-state-view.ts +30 -16
  575. package/src/shared-context/envelope-io.ts +25 -0
  576. package/src/shared-context/envelope-wiring.test.ts +4 -2
  577. package/src/shared-context/manager.ts +1 -0
  578. package/src/shared-context/write-output-controls.test.ts +192 -0
  579. package/src/shared-context/write-output-controls.ts +72 -0
  580. package/src/source-attribution.test.ts +39 -0
  581. package/src/source-attribution.ts +72 -0
  582. package/src/types.ts +5 -0
  583. package/src/wearables/pipeline.ts +19 -0
  584. package/src/wearables/service.ts +8 -0
  585. package/dist/chunk-5LYSEZOF.js.map +0 -1
  586. package/dist/chunk-CARRTDKC.js.map +0 -1
  587. package/dist/chunk-CC37E3QM.js.map +0 -1
  588. package/dist/chunk-IS2IDFJP.js.map +0 -1
  589. package/dist/chunk-K75A5XWU.js.map +0 -1
  590. package/dist/chunk-KTOXQMW3.js.map +0 -1
  591. package/dist/chunk-MDIEES23.js.map +0 -1
  592. package/dist/chunk-OEDW4ER7.js.map +0 -1
  593. package/dist/chunk-QE6YVNP5.js.map +0 -1
  594. package/dist/chunk-ROEFLU37.js.map +0 -1
  595. package/dist/chunk-SFHLQPBF.js.map +0 -1
  596. package/dist/chunk-SV4Z2S67.js.map +0 -1
  597. package/dist/chunk-THTF2W7M.js.map +0 -1
  598. package/dist/chunk-UZ6JYPJ6.js.map +0 -1
  599. package/dist/chunk-YTK5MVNF.js.map +0 -1
  600. package/dist/chunk-ZRMMXWYI.js.map +0 -1
  601. package/dist/chunk-ZX3AYNNV.js.map +0 -1
  602. /package/dist/{capsule-crypto-7FJQINUR.js.map → access-mcp-shared-context-tools.js.map} +0 -0
  603. /package/dist/{contradiction-scan-BSGKZHYJ.js.map → capsule-crypto-YO5QJ6L3.js.map} +0 -0
  604. /package/dist/{capsule-merge-IPG4IOFP.js.map → capsule-merge-3MNURAQ3.js.map} +0 -0
  605. /package/dist/{chunk-JAJIMTFB.js.map → chunk-2PDMIPMP.js.map} +0 -0
  606. /package/dist/{chunk-6L2II3KS.js.map → chunk-3D75XIYO.js.map} +0 -0
  607. /package/dist/{chunk-XCPNH2MG.js.map → chunk-3KJTSCSX.js.map} +0 -0
  608. /package/dist/{chunk-YTZN2UZO.js.map → chunk-3RLWUW7G.js.map} +0 -0
  609. /package/dist/{chunk-J272ODKJ.js.map → chunk-42DJ235G.js.map} +0 -0
  610. /package/dist/{chunk-NVVZPBKI.js.map → chunk-46FVFU7S.js.map} +0 -0
  611. /package/dist/{chunk-JUDT33RX.js.map → chunk-4AX5OYKC.js.map} +0 -0
  612. /package/dist/{chunk-GSSDHAYH.js.map → chunk-4IGOLIWM.js.map} +0 -0
  613. /package/dist/{chunk-23HFXQ5J.js.map → chunk-6EGIQEKC.js.map} +0 -0
  614. /package/dist/{chunk-TVVEYCNW.js.map → chunk-7K5Q6COX.js.map} +0 -0
  615. /package/dist/{chunk-GO5LOHCD.js.map → chunk-7L54ARML.js.map} +0 -0
  616. /package/dist/{chunk-TEMKBSV6.js.map → chunk-7PSRCGWT.js.map} +0 -0
  617. /package/dist/{chunk-ICNJ6J46.js.map → chunk-AAAFZW3U.js.map} +0 -0
  618. /package/dist/{chunk-K4JKAXMO.js.map → chunk-AAX22E4K.js.map} +0 -0
  619. /package/dist/{chunk-KY236SP5.js.map → chunk-AHHFBJX7.js.map} +0 -0
  620. /package/dist/{chunk-TZ44E732.js.map → chunk-AIVRD66I.js.map} +0 -0
  621. /package/dist/{chunk-YRIFXXMI.js.map → chunk-AOGICQMH.js.map} +0 -0
  622. /package/dist/{chunk-KOTG3RXE.js.map → chunk-AUSRUOMQ.js.map} +0 -0
  623. /package/dist/{chunk-C5R73BON.js.map → chunk-BIANISES.js.map} +0 -0
  624. /package/dist/{chunk-IMBQFHRV.js.map → chunk-BPXJINHW.js.map} +0 -0
  625. /package/dist/{chunk-2NLLXCJG.js.map → chunk-BXLOS5AJ.js.map} +0 -0
  626. /package/dist/{chunk-2J3V5QEO.js.map → chunk-C3QXITIP.js.map} +0 -0
  627. /package/dist/{chunk-2SNCQHJZ.js.map → chunk-CQ4BTPX6.js.map} +0 -0
  628. /package/dist/{chunk-3QEVOQF5.js.map → chunk-CTETTVDN.js.map} +0 -0
  629. /package/dist/{chunk-DFVSJFHK.js.map → chunk-DBB5JPSL.js.map} +0 -0
  630. /package/dist/{chunk-W23JARAQ.js.map → chunk-DLPMOSNH.js.map} +0 -0
  631. /package/dist/{chunk-BGRTZOJB.js.map → chunk-DMTSKY4W.js.map} +0 -0
  632. /package/dist/{chunk-X7Y7WX73.js.map → chunk-DQEMWVMT.js.map} +0 -0
  633. /package/dist/{chunk-QS5Q5RBV.js.map → chunk-E4FRR4MA.js.map} +0 -0
  634. /package/dist/{chunk-RJQAP333.js.map → chunk-ETE3SGAH.js.map} +0 -0
  635. /package/dist/{chunk-YNDLCWXS.js.map → chunk-EZ25VE3G.js.map} +0 -0
  636. /package/dist/{chunk-RLU2Y5GV.js.map → chunk-F2FJTOV6.js.map} +0 -0
  637. /package/dist/{chunk-V2ZA4YWE.js.map → chunk-F5H6YG5P.js.map} +0 -0
  638. /package/dist/{chunk-4CMXI55L.js.map → chunk-FSUFKIFS.js.map} +0 -0
  639. /package/dist/{chunk-ZAEPD4C2.js.map → chunk-G3NTZZWT.js.map} +0 -0
  640. /package/dist/{chunk-ZMWSYUUL.js.map → chunk-GCBIXUPT.js.map} +0 -0
  641. /package/dist/{chunk-WZYHPAG5.js.map → chunk-GIM2AGFL.js.map} +0 -0
  642. /package/dist/{chunk-J7FVMLBR.js.map → chunk-GWEZNCGA.js.map} +0 -0
  643. /package/dist/{chunk-LFVZD5EC.js.map → chunk-GWNSKQDA.js.map} +0 -0
  644. /package/dist/{chunk-MJC7UKH7.js.map → chunk-H2N6SLTR.js.map} +0 -0
  645. /package/dist/{chunk-J4WGTN2N.js.map → chunk-HK44SV6K.js.map} +0 -0
  646. /package/dist/{chunk-JDX2OA4R.js.map → chunk-HNHIHXSD.js.map} +0 -0
  647. /package/dist/{chunk-VQYWKCDR.js.map → chunk-HPMCKAET.js.map} +0 -0
  648. /package/dist/{chunk-MVG3KXON.js.map → chunk-I65KB36L.js.map} +0 -0
  649. /package/dist/{chunk-AEOOGXMQ.js.map → chunk-J2MGTGKC.js.map} +0 -0
  650. /package/dist/{chunk-PKUJNICO.js.map → chunk-JC2OBYYD.js.map} +0 -0
  651. /package/dist/{chunk-5U7K4W6K.js.map → chunk-JDOBQPJY.js.map} +0 -0
  652. /package/dist/{chunk-VQWBUPSJ.js.map → chunk-JMAP6L6Q.js.map} +0 -0
  653. /package/dist/{chunk-7Z54NXVS.js.map → chunk-K27INAPR.js.map} +0 -0
  654. /package/dist/{chunk-7D6SER6A.js.map → chunk-KJQ4Y2PY.js.map} +0 -0
  655. /package/dist/{chunk-QPVNK2VE.js.map → chunk-LCVYO3ON.js.map} +0 -0
  656. /package/dist/{chunk-HIP6DKJJ.js.map → chunk-LQVXSRAJ.js.map} +0 -0
  657. /package/dist/{chunk-A7GQBJP5.js.map → chunk-LVFI5LG7.js.map} +0 -0
  658. /package/dist/{chunk-TO36VPZI.js.map → chunk-LWF6GOII.js.map} +0 -0
  659. /package/dist/{chunk-ES5BUPYB.js.map → chunk-OCWFKD5Q.js.map} +0 -0
  660. /package/dist/{chunk-IOPIGX7Y.js.map → chunk-OP722LOG.js.map} +0 -0
  661. /package/dist/{chunk-62D2PAAM.js.map → chunk-PAAJWQH5.js.map} +0 -0
  662. /package/dist/{chunk-V6EGNVUT.js.map → chunk-PIWFNPQT.js.map} +0 -0
  663. /package/dist/{chunk-JOP7W24J.js.map → chunk-PLJ2MQFT.js.map} +0 -0
  664. /package/dist/{chunk-37CAEC7E.js.map → chunk-PWPIERBM.js.map} +0 -0
  665. /package/dist/{chunk-BXIJSPCL.js.map → chunk-Q62GA5U2.js.map} +0 -0
  666. /package/dist/{chunk-I3H5LFOI.js.map → chunk-QNJQCLI6.js.map} +0 -0
  667. /package/dist/{chunk-BYQX4IOG.js.map → chunk-R45VFSEV.js.map} +0 -0
  668. /package/dist/{chunk-XVDZFTN5.js.map → chunk-RFIJH2OE.js.map} +0 -0
  669. /package/dist/{chunk-K4A6UVPB.js.map → chunk-RJ7Z7YXK.js.map} +0 -0
  670. /package/dist/{chunk-HJUP3K6L.js.map → chunk-RXYO6NA6.js.map} +0 -0
  671. /package/dist/{chunk-TBXAY2SS.js.map → chunk-SGHGCFVV.js.map} +0 -0
  672. /package/dist/{chunk-2SKMZUOW.js.map → chunk-U26LB4WA.js.map} +0 -0
  673. /package/dist/{chunk-VHKXRYQN.js.map → chunk-VBK6SRNE.js.map} +0 -0
  674. /package/dist/{chunk-KQAFEZQX.js.map → chunk-VDX2J7OX.js.map} +0 -0
  675. /package/dist/{chunk-Z4GUX2M6.js.map → chunk-VSN2DMQK.js.map} +0 -0
  676. /package/dist/{chunk-ZHXSOMYH.js.map → chunk-VVX5PZFS.js.map} +0 -0
  677. /package/dist/{chunk-G2XZFGYN.js.map → chunk-WGZHSQDV.js.map} +0 -0
  678. /package/dist/{chunk-H3TKENU4.js.map → chunk-WIKO4SCR.js.map} +0 -0
  679. /package/dist/{chunk-LKFVVN7R.js.map → chunk-WNPRRBOE.js.map} +0 -0
  680. /package/dist/{chunk-ZZUVBZL2.js.map → chunk-X2QPKLPL.js.map} +0 -0
  681. /package/dist/{chunk-RDLPFM7I.js.map → chunk-XJLTQTAO.js.map} +0 -0
  682. /package/dist/{chunk-XM46Y66S.js.map → chunk-ZFU6QNRN.js.map} +0 -0
  683. /package/dist/{chunk-SUEOG2S4.js.map → chunk-ZGXHTV5Y.js.map} +0 -0
  684. /package/dist/{chunk-46Z3VGWF.js.map → chunk-ZYRAY5FL.js.map} +0 -0
  685. /package/dist/{chunk-3XPN7AVY.js.map → chunk-ZYSOT6HD.js.map} +0 -0
  686. /package/dist/{resolution-4GG3QZRJ.js.map → contradiction-scan-GVD4JJ7B.js.map} +0 -0
  687. /package/dist/{first-start-migration-ZWMV5CX4.js.map → first-start-migration-L3UFX5CU.js.map} +0 -0
  688. /package/dist/{tier-stats-LUSUUNU6.js.map → tier-stats-VK5PCO2L.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/orchestration/orchestrator-helpers.ts"],"sourcesContent":["/**\n * Orchestrator module-level helpers — relocated from orchestrator.ts\n * (issue #1526, seam 25).\n *\n * Pure functions, types, and constants that previously lived at module\n * level in orchestrator.ts: recall-mode planning, recall snapshots and\n * parsers, abort/race helpers, artifact recall limits, replay\n * source-time slicing, day-summary date utilities, and QMD startup\n * checks. orchestrator.ts re-exports the previously-public names so\n * every existing importer (coordinators, tests, root shims) keeps\n * working unchanged.\n *\n * Behavior-preserving move — no logic changes.\n */\n\nimport { createHash } from \"node:crypto\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { abortError as sharedAbortError, throwIfAborted as sharedThrowIfAborted } from \"../abort-error.js\";\nimport type { CapabilitySet } from \"../capabilities.js\";\nimport { buildCompressionGuidelinesMarkdown as buildCompressionGuidelinesMarkdownV2 } from \"../compression-optimizer.js\";\nimport { FallbackLlmClient } from \"../fallback-llm.js\";\nimport { hasBroadGraphIntent, planRecallMode } from \"../intent.js\";\nimport { resolveLifecycleState } from \"../lifecycle.js\";\nimport { log } from \"../logger.js\";\nimport type { GraphRecallRankedResult, GraphRecallShadowComparison } from \"./graph-recall-coordinator.js\";\nimport { parseQmdExplain } from \"../qmd.js\";\nimport type { GraphRecallExpandedEntry } from \"../recall-state.js\";\nimport type { RecallXrayServedBy } from \"../recall-xray.js\";\nimport type { RecallContextComposition } from \"../recall-context-composition.js\";\nimport { type BufferTurn, type MemoryActionEvent, type MemoryFile, type MemoryFrontmatter, type MemoryIntent, type PluginConfig, type QmdSearchResult, type RecallPlanMode, confidenceTier } from \"../types.js\";\nimport { categoryDirName } from \"../utils/category-dir.js\";\nimport { parseFlexibleIsoTimestamp } from \"../utils/iso-timestamp.js\";\n\n/** Freshness window for the artifact source status cache read by NamespaceReadFanoutCoordinator. */\nexport const ARTIFACT_STATUS_CACHE_TTL_MS = 60_000;\nexport interface BulkImportBatchIngestResult {\n attemptedTurnCount: number;\n extractionCount: number;\n persistedCount: number;\n durableOutputCount: number;\n skippedCount: number;\n failedCount: number;\n postPersistMetadataFailureCount: number;\n processedTurnCount: number;\n}\n\nexport class BulkImportBatchPartialFailureError extends Error {\n readonly partialResult: BulkImportBatchIngestResult;\n\n readonly originalError: unknown;\n\n constructor(\n message: string,\n partialResult: BulkImportBatchIngestResult,\n originalError: unknown,\n ) {\n super(message);\n this.name = \"BulkImportBatchPartialFailureError\";\n this.partialResult = partialResult;\n this.originalError = originalError;\n }\n}\n\nexport interface GraphRecallSnapshot {\n recordedAt: string;\n mode: RecallPlanMode | string;\n queryHash: string;\n queryLength: number;\n namespaces: string[];\n seedCount: number;\n expandedCount: number;\n seeds: string[];\n expanded: GraphRecallExpandedEntry[];\n status?: \"completed\" | \"skipped\" | \"aborted\";\n reason?: string;\n shadowMode?: boolean;\n queryIntent?: MemoryIntent;\n seedResults?: GraphRecallRankedResult[];\n finalResults?: GraphRecallRankedResult[];\n shadowComparison?: GraphRecallShadowComparison;\n}\n\nexport interface IntentDebugSnapshot {\n recordedAt: string;\n promptHash: string;\n promptLength: number;\n retrievalQueryHash: string;\n retrievalQueryLength: number;\n plannerEnabled: boolean;\n plannedMode: RecallPlanMode;\n effectiveMode: RecallPlanMode;\n recallResultLimit: number;\n queryIntent: MemoryIntent;\n graphExpandedIntentDetected: boolean;\n graphDecision: {\n status: \"not_requested\" | \"skipped\" | \"completed\" | \"aborted\";\n reason?: string;\n shadowMode: boolean;\n qmdAvailable: boolean;\n graphRecallEnabled: boolean;\n multiGraphMemoryEnabled: boolean;\n };\n}\n\nexport interface QmdRecallSnapshot {\n recordedAt: string;\n queryHash: string;\n queryLength: number;\n collection?: string;\n namespaces: string[];\n fetchLimit: number;\n primaryResultCount: number;\n hybridResultCount: number;\n queryAwareSeedCount: number;\n resultCount: number;\n intentHint?: string;\n explainEnabled: boolean;\n hybridTopUpUsed: boolean;\n hybridTopUpSkippedReason?: string;\n results: QmdSearchResult[];\n}\n\nexport interface RecallModeDecision {\n plannedMode: RecallPlanMode;\n effectiveMode: RecallPlanMode;\n graphExpandedIntentDetected: boolean;\n graphReason?: string;\n /**\n * Where `plannedMode` came from (issue #1367 / Option C). `\"heuristic\"` for\n * the regex planner; `\"llm\"` when the LLM planner classified it; and\n * `\"heuristic-fallback\"` when the LLM was enabled but errored/timed out and we\n * fell back. Absent on the synchronous heuristic-only path.\n */\n plannerSource?: \"heuristic\" | \"llm\" | \"heuristic-fallback\";\n /** Short rationale from the planner (for telemetry / x-ray). */\n plannerReason?: string;\n /** Wall-clock spent in the LLM planner call, when one was made. */\n plannerLatencyMs?: number;\n /** True when the LLM planner was enabled but fell back to the heuristic. */\n plannerFallbackUsed?: boolean;\n /** Model that served the LLM classification, when one was used. */\n plannerModelUsed?: string;\n /**\n * The regex-heuristic baseline mode, captured whenever the LLM planner ran\n * (any source). Lets operators compare planned-vs-heuristic during rollout —\n * distinct from `plannedMode`, which on the LLM path is the LLM's choice.\n */\n plannerHeuristicMode?: RecallPlanMode;\n /**\n * In shadow mode, the mode the LLM *would* have chosen (recorded for\n * comparison) while `effectiveMode` stays on the heuristic decision.\n */\n shadowLlmMode?: RecallPlanMode;\n}\n\n/**\n * Map the orchestrator's internal `recallSource` strings to the\n * X-ray `servedBy` vocabulary (issue #570 PR 1). The X-ray tier\n * ladder intentionally flattens QMD / embedding / cold-fallback to\n * the `hybrid` tier because they all materialize through the same\n * hybrid BM25+vector pipeline from the caller's perspective. The\n * `recent_scan` path gets its own dedicated tier because it bypasses\n * the hybrid pipeline entirely. `none` is treated as `hybrid` on the\n * theory that a query that returned nothing still routed through the\n * hybrid pipeline — but callers should normally gate capture on\n * `recalledMemoryIds.length > 0`.\n */\nexport function mapRecallSourceToXrayServedBy(\n source:\n | \"none\"\n | \"hot_qmd\"\n | \"hot_embedding\"\n | \"cold_fallback\"\n | \"recent_scan\",\n): RecallXrayServedBy {\n // Exhaustive switch: every current union member is explicitly\n // listed so TypeScript surfaces a compile error if a new source is\n // added without a deliberate mapping. The `never`-typed fallthrough\n // keeps the function total at runtime — if the caller passes an\n // unexpected value that slipped past the type system (e.g. a JSON\n // deserialization), we still fall back to `hybrid`.\n switch (source) {\n case \"recent_scan\":\n return \"recent-scan\";\n case \"hot_qmd\":\n case \"hot_embedding\":\n case \"cold_fallback\":\n case \"none\":\n return \"hybrid\";\n }\n const _exhaustive: never = source;\n void _exhaustive;\n return \"hybrid\";\n}\n\nexport interface RecallInvocationOptions {\n namespace?: string;\n topK?: number;\n mode?: RecallPlanMode;\n abortSignal?: AbortSignal;\n /** Server-resolved identity of the connector performing this recall. */\n sourceConnector?: string;\n /**\n * Capture a `RecallXraySnapshot` for this recall (issue #570). When\n * `true`, the orchestrator builds a snapshot from the data it has\n * already gathered and stashes it in memory, accessible via\n * `getLastXraySnapshot()`. When `false` or absent, nothing is\n * captured and recall behavior is unchanged (schema-only slice).\n */\n xrayCapture?: boolean;\n /**\n * Per-invocation override for `recallBudgetChars` (issue #570 PR 3/4).\n * Flows through `getRecallBudgetChars()` for this recall only — no\n * shared config mutation, so concurrent recalls on the same\n * orchestrator are not affected (CLAUDE.md rule 47: no shared\n * mutable state across async boundaries). Must be a non-negative\n * finite integer; non-conforming values are ignored and the\n * configured budget is used.\n */\n budgetCharsOverride?: number;\n /**\n * Per-invocation principal override (issue #570 PR 4). When set,\n * the orchestrator uses this principal for ACL / namespace checks\n * instead of `resolvePrincipal(sessionKey, config)`. This is the\n * escape hatch for access surfaces (HTTP / MCP) that have already\n * authenticated the caller upstream — threading an unmapped\n * principal through the session-key-based resolver would otherwise\n * collapse it to `\"default\"` and produce false denials in\n * namespace-enabled deployments (CLAUDE.md rule 42).\n */\n principalOverride?: string;\n /**\n * Historical recall point (issue #680). When set, the orchestrator\n * filters out memories whose `valid_at` is after this timestamp OR\n * whose `invalid_at` is at-or-before this timestamp, so callers see\n * the corpus as it existed at `asOf`. ISO 8601 string; comparisons\n * use `Date.parse()` so timezone-aware values round-trip correctly\n * (CLAUDE.md gotcha — never compare ISO strings lexicographically).\n * Invalid values must be rejected at input boundaries (CLAUDE.md\n * rule 51); the orchestrator does NOT silently fall back here.\n */\n asOf?: string;\n /**\n * Issue #681 — when `true`, bypasses `graphTraversalConfidenceFloor`\n * and includes edges below the floor in graph traversal. Useful for\n * diagnostic recall queries that need to surface results that would\n * normally be pruned by confidence decay. Default `false`.\n */\n includeLowConfidence?: boolean;\n /**\n * #1952 — per-call override enabling state-aware recall views for this\n * recall only (MCP `stateView` boolean). ORs with the `recallStateViews`\n * config flag; a change-intent query is still required for any effect.\n */\n stateView?: boolean;\n /**\n * User-aware context scopes active for this recall. Used by X-ray\n * provenance safety checks so boundary-scoped memories are evaluated\n * against the caller's real context.\n */\n currentContextScopes?: readonly unknown[];\n /**\n * Wall-clock ms the caller waited to begin execution — per-principal\n * semaphore queue + single-flight wait (issue #1906). Folded into\n * recall-timings additively as `queueWaitMs`; omitted phases are simply\n * absent, so existing timing consumers are unaffected.\n */\n queueWaitMs?: number;\n onContextComposition?: (composition: RecallContextComposition) => void | PromiseLike<void>;\n}\n\nexport type QueryAwarePrefilter = {\n candidatePaths: Set<string> | null;\n temporalFromDate: string | null;\n matchedTags: string[];\n expandedTags: string[];\n combination: \"none\" | \"temporal\" | \"tag\" | \"intersection\" | \"union\";\n filteredToFullSearch: boolean;\n};\n\n// Recall-specific abort helpers. Thin wrappers over the shared\n// `abort-error.ts` module so every abort in the codebase shares the\n// same `name === \"AbortError\"` classification contract (`isAbortError`\n// works uniformly). We keep the \"recall aborted\" default message for\n// back-compat with call-site logs; callers that pass an explicit\n// message (e.g. \"extraction aborted (before_extract)\") are unaffected.\nexport const abortRecallError = sharedAbortError;\n\nexport function throwIfRecallAborted(\n signal?: AbortSignal,\n message = \"recall aborted\",\n): void {\n sharedThrowIfAborted(signal, message);\n}\n\nexport async function raceRecallAbort<T>(\n promise: Promise<T>,\n signal?: AbortSignal,\n message = \"recall aborted\",\n): Promise<T> {\n throwIfRecallAborted(signal, message);\n if (!signal) return promise;\n\n let onAbort: (() => void) | null = null;\n const abortPromise = new Promise<T>((_resolve, reject) => {\n onAbort = () => reject(abortRecallError(message));\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n\n try {\n return await Promise.race([promise, abortPromise]);\n } finally {\n if (onAbort) {\n signal.removeEventListener(\"abort\", onAbort);\n }\n }\n}\n\n/** Maximum age (ms) before a compaction-reset signal file is considered stale and removed. */\nexport const COMPACTION_SIGNAL_MAX_AGE_MS = 60 * 60 * 1000; // 1 hour\n\nexport const DEFAULT_QMD_STARTUP_COLLECTION_CHECK_TIMEOUT_MS = 10_000;\n\nexport type DaySummaryGatherOptions = {\n timeZone?: string;\n now?: Date;\n};\n\nexport function normalizeIanaTimeZone(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n if (!trimmed) return undefined;\n try {\n Intl.DateTimeFormat(undefined, { timeZone: trimmed });\n return trimmed;\n } catch {\n return undefined;\n }\n}\n\nexport function formatDateInTimeZone(date: Date, timeZone: string): string {\n const parts = new Intl.DateTimeFormat(\"en-US\", {\n timeZone,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n }).formatToParts(date);\n const get = (type: string): string => parts.find((part) => part.type === type)?.value ?? \"\";\n return `${get(\"year\")}-${get(\"month\")}-${get(\"day\")}`;\n}\n\nexport function utcDateKey(date: Date): string {\n return date.toISOString().slice(0, 10);\n}\n\nexport function utcDateKeysAround(date: Date): string[] {\n const dayMs = 86_400_000;\n const keys = [\n utcDateKey(new Date(date.getTime() - dayMs)),\n utcDateKey(date),\n utcDateKey(new Date(date.getTime() + dayMs)),\n ];\n return keys.filter((value, index, array) => array.indexOf(value) === index);\n}\n\nexport function utcDateKeysForLocalDay(date: Date, timeZone: string): string[] {\n const targetLocalDate = formatDateInTimeZone(date, timeZone);\n const keys = new Set<string>();\n const hourMs = 3_600_000;\n const scanStart = date.getTime() - 48 * hourMs;\n const scanEnd = date.getTime() + 48 * hourMs;\n for (let ms = scanStart; ms <= scanEnd; ms += hourMs) {\n const candidate = new Date(ms);\n if (formatDateInTimeZone(candidate, timeZone) === targetLocalDate) {\n keys.add(utcDateKey(candidate));\n }\n }\n return keys.size > 0 ? [...keys].sort() : utcDateKeysAround(date);\n}\n\nexport function parseFiniteDate(value: unknown): Date | null {\n if (typeof value !== \"string\" || value.trim().length === 0) return null;\n const parsed = new Date(value);\n return Number.isFinite(parsed.getTime()) ? parsed : null;\n}\n\nexport function filterHourlySummaryMarkdownForLocalDay(\n raw: string,\n utcDate: string,\n timeZone: string,\n targetLocalDate: string,\n): string | null {\n const hourHeaderPattern = /^## ([01]\\d|2[0-3]):00[ \\t]*$/gm;\n const matches = Array.from(raw.matchAll(hourHeaderPattern));\n if (matches.length === 0) return null;\n\n const firstSectionStart = matches[0]?.index ?? 0;\n const preamble = raw.slice(0, firstSectionStart).trim();\n const sections: string[] = [];\n for (let index = 0; index < matches.length; index += 1) {\n const match = matches[index];\n const hour = match[1];\n if (!hour) continue;\n const sectionTimestamp = parseFiniteDate(`${utcDate}T${hour}:00:00.000Z`);\n if (\n !sectionTimestamp ||\n formatDateInTimeZone(sectionTimestamp, timeZone) !== targetLocalDate\n ) {\n continue;\n }\n const sectionStart = match.index ?? 0;\n const sectionEnd = matches[index + 1]?.index ?? raw.length;\n const section = raw.slice(sectionStart, sectionEnd).trim();\n if (section.length > 0) sections.push(section);\n }\n\n if (sections.length === 0) return null;\n return [preamble, ...sections]\n .filter((section) => section.length > 0)\n .join(\"\\n\\n\");\n}\n\nexport type SearchCollectionState = \"present\" | \"missing\" | \"unknown\" | \"skipped\";\n\nexport function qmdStartupCollectionCheckTimeoutMs(): number {\n const raw =\n process.env.REMNIC_QMD_STARTUP_COLLECTION_CHECK_TIMEOUT_MS ??\n process.env.ENGRAM_QMD_STARTUP_COLLECTION_CHECK_TIMEOUT_MS;\n if (raw === undefined) return DEFAULT_QMD_STARTUP_COLLECTION_CHECK_TIMEOUT_MS;\n const parsed = Number(raw);\n return Number.isFinite(parsed) && parsed >= 1_000\n ? Math.floor(parsed)\n : DEFAULT_QMD_STARTUP_COLLECTION_CHECK_TIMEOUT_MS;\n}\n\nexport async function qmdStartupCollectionCheckWithTimeout(\n promise: Promise<SearchCollectionState>,\n controller: AbortController,\n label: string,\n): Promise<SearchCollectionState> {\n const timeoutMs = qmdStartupCollectionCheckTimeoutMs();\n let timer: NodeJS.Timeout | undefined;\n let settled = false;\n\n const timeoutPromise = new Promise<SearchCollectionState>((resolve) => {\n timer = setTimeout(() => {\n if (settled) return;\n controller.abort();\n log.warn(\n `QMD startup collection check for ${label} timed out after ${timeoutMs}ms; keeping search enabled fail-open`,\n );\n resolve(\"unknown\");\n }, timeoutMs);\n timer.unref?.();\n });\n\n const checkedPromise = promise\n .catch((err): SearchCollectionState => {\n log.warn(\n `QMD startup collection check for ${label} failed; keeping search enabled fail-open: ${err}`,\n );\n return \"unknown\";\n })\n .finally(() => {\n settled = true;\n if (timer) clearTimeout(timer);\n });\n\n return await Promise.race([checkedPromise, timeoutPromise]);\n}\n\n/** Default workspace directory when no per-agent or config workspace is available. */\nexport function defaultWorkspaceDir(): string {\n return path.join(os.homedir(), \".openclaw\", \"workspace\");\n}\n\n/**\n * Produce a collision-resistant, filesystem-safe identifier from a session key.\n *\n * Session keys follow colon-delimited forms (e.g., `agent:gpucodebot:main`).\n * A naive replace (`:` → `_`) is lossy: different keys like `agent:alpha` and\n * `agent/alpha` would collide. Instead we append a short SHA-256 hash of the\n * original key to the human-readable sanitized prefix, guaranteeing uniqueness\n * while keeping filenames debuggable.\n *\n * Format: `<sanitized>-<12-char-hex-hash>`\n * Example: `agent:gpucodebot:main` → `agent_gpucodebot_main-a1b2c3d4e5f6`\n */\nexport function sanitizeSessionKeyForFilename(sessionKey: string): string {\n const readable = sessionKey.replace(/[^a-zA-Z0-9._-]/g, \"_\");\n const hash = createHash(\"sha256\")\n .update(sessionKey)\n .digest(\"hex\")\n .slice(0, 12);\n return `${readable}-${hash}`;\n}\n\nexport function sourceValidAtMs(turn: BufferTurn): number | null {\n if (typeof turn.sourceValidAt !== \"string\") return null;\n return parseFlexibleIsoTimestamp(turn.sourceValidAt.trim());\n}\n\nexport const SOURCE_VALID_AT_CONTEXT_TURNS = 2;\n\nexport function sourceValidAtSliceKey(turn: BufferTurn, index: number): string {\n const validAtMs = sourceValidAtMs(turn);\n return validAtMs === null ? `unknown:${index}` : String(validAtMs);\n}\n\nexport function asExtractionContextTurn(turn: BufferTurn): BufferTurn {\n return { ...turn, extractionContextOnly: true };\n}\n\nexport function asExtractionTargetTurn(turn: BufferTurn): BufferTurn {\n const { extractionContextOnly: _contextOnly, ...targetTurn } = turn;\n return targetTurn;\n}\n\nexport function sourceValidAtContextTurns(\n turns: readonly BufferTurn[],\n targetStart: number,\n targetEnd: number,\n targetValidAtMs: number | null,\n): BufferTurn[] {\n if (targetValidAtMs === null) return [];\n return turns\n .flatMap((turn, index) => {\n if (index >= targetStart && index < targetEnd) return [];\n const contextValidAtMs = sourceValidAtMs(turn);\n if (contextValidAtMs === null || contextValidAtMs > targetValidAtMs) {\n return [];\n }\n return [{ turn, index, validAtMs: contextValidAtMs }];\n })\n .sort((a, b) => {\n if (a.validAtMs < b.validAtMs) return -1;\n if (a.validAtMs > b.validAtMs) return 1;\n if (a.index === b.index) return 0;\n return a.index < b.index ? -1 : 1;\n })\n .slice(-SOURCE_VALID_AT_CONTEXT_TURNS)\n .map(({ turn }) => asExtractionContextTurn(turn));\n}\n\nexport function targetSourceValidAtSortMs(turns: readonly BufferTurn[]): number {\n let latestMs: number | null = null;\n for (const turn of turns) {\n if (turn.extractionContextOnly === true) continue;\n const validAtMs = sourceValidAtMs(turn);\n if (validAtMs === null) continue;\n if (latestMs === null || validAtMs > latestMs) {\n latestMs = validAtMs;\n }\n }\n return latestMs ?? Number.POSITIVE_INFINITY;\n}\n\nexport function sortSourceValidAtSlicesChronologically(\n slices: BufferTurn[][],\n): BufferTurn[][] {\n return slices\n .map((turns, order) => ({\n turns,\n order,\n targetValidAtMs: targetSourceValidAtSortMs(turns),\n }))\n .sort((a, b) => {\n if (a.targetValidAtMs < b.targetValidAtMs) return -1;\n if (a.targetValidAtMs > b.targetValidAtMs) return 1;\n if (a.order === b.order) return 0;\n return a.order < b.order ? -1 : 1;\n })\n .map((slice) => slice.turns);\n}\n\nexport function splitTurnsBySourceValidAt(\n turns: readonly BufferTurn[],\n options: { includeContext?: boolean } = {},\n): BufferTurn[][] {\n if (turns.length === 0) return [];\n if (!turns.some((turn) => sourceValidAtMs(turn) !== null)) {\n return [[...turns]];\n }\n\n const slices: BufferTurn[][] = [];\n let start = 0;\n while (start < turns.length) {\n const targetValidAtMs = sourceValidAtMs(turns[start]);\n const activeKey = sourceValidAtSliceKey(turns[start], start);\n let end = start + 1;\n while (\n end < turns.length &&\n sourceValidAtSliceKey(turns[end], end) === activeKey\n ) {\n end += 1;\n }\n\n const contextTurns =\n options.includeContext === false\n ? []\n : sourceValidAtContextTurns(turns, start, end, targetValidAtMs);\n slices.push([\n ...contextTurns,\n ...turns.slice(start, end).map(asExtractionTargetTurn),\n ]);\n start = end;\n }\n return sortSourceValidAtSlicesChronologically(slices);\n}\n\nexport function isArtifactMemoryPath(filePath: string): boolean {\n return /(?:^|[\\\\/])artifacts(?:[\\\\/]|$)/i.test(filePath);\n}\n\n/**\n * Meeting records (issue #1900) live at\n * `<root>/meetings/<YYYY-MM-DD>/mtg-<YYYY-MM-DD>-<hash>.md` — inside the QMD\n * collection root (full-text searchable) but NEVER surfaced through generic\n * recall, exactly like `artifacts/`. The predicate matches the FULL record\n * shape (anchored at the filename) rather than any `meetings` path segment, so\n * a namespaced deployment whose non-default namespace is literally named\n * `meetings` (`.../namespaces/meetings/facts/…`) keeps its ordinary memories in\n * recall — only true meeting records are excluded.\n */\nexport function isMeetingRecordPath(filePath: string): boolean {\n return /(?:^|[\\\\/])meetings[\\\\/]\\d{4}-\\d{2}-\\d{2}[\\\\/]mtg-\\d{4}-\\d{2}-\\d{2}-[0-9a-f]{8}\\.md$/i.test(filePath);\n}\n\n/** Exactly `activity/<YYYY-MM-DD>.md`, at the top level of a memory root. */\nconst ACTIVITY_DIGEST_TOPLEVEL = /^activity[\\\\/]\\d{4}-\\d{2}-\\d{2}\\.md$/i;\n/** The digest FILE shape anywhere in a path (root-unaware best-effort). */\nconst ACTIVITY_DIGEST_ANYWHERE = /(?:^|[\\\\/])activity[\\\\/]\\d{4}-\\d{2}-\\d{2}\\.md$/i;\n\n/**\n * Activity day-digests live at `<memoryRoot>/activity/<YYYY-MM-DD>.md` — a\n * dedicated searchable surface (explicit activity search), never generic recall.\n * Captured screen text must not auto-inject into ordinary prompts (issue #1899).\n * Keyed on the path (parseFrontmatter drops the digest's `kind` marker).\n *\n * Root-aware: when `memoryRoot` is given, the path is resolved relative to it and\n * must be the TOP-LEVEL `activity/<date>.md`, so an ordinary memory nested under\n * a category (e.g. `facts/proj/activity/<date>.md`) stays recallable. Without a\n * root, falls back to the digest file shape anywhere (best-effort).\n */\nexport function isActivityDigestPath(filePath: string, memoryRoot?: string): boolean {\n if (memoryRoot !== undefined && memoryRoot.length > 0) {\n const relative = path.relative(memoryRoot, path.resolve(memoryRoot, filePath));\n return ACTIVITY_DIGEST_TOPLEVEL.test(relative);\n }\n return ACTIVITY_DIGEST_ANYWHERE.test(filePath);\n}\n\n/** Exactly `locations/<YYYY-MM-DD>.md`, at the top level of a memory root. */\nconst LOCATION_DAY_TOPLEVEL = /^locations[\\\\/]\\d{4}-\\d{2}-\\d{2}\\.md$/i;\n/** The day-file shape anywhere in a path (root-unaware best-effort). */\nconst LOCATION_DAY_ANYWHERE = /(?:^|[\\\\/])locations[\\\\/]\\d{4}-\\d{2}-\\d{2}\\.md$/i;\n\n/**\n * Location day documents (issue #2044) live at\n * `<memoryRoot>/locations/<YYYY-MM-DD>.md` — a dedicated searchable surface,\n * never generic recall (place history must not auto-inject into ordinary\n * prompts). Root-aware exactly like `isActivityDigestPath`: with a root, only\n * the top-level `locations/<date>.md` matches, so an ordinary memory nested\n * under a category (e.g. `facts/locations-note.md`) stays recallable; without\n * a root, falls back to the day-file shape anywhere (best-effort).\n */\nexport function isLocationDayPath(filePath: string, memoryRoot?: string): boolean {\n if (memoryRoot !== undefined && memoryRoot.length > 0) {\n const relative = path.relative(memoryRoot, path.resolve(memoryRoot, filePath));\n return LOCATION_DAY_TOPLEVEL.test(relative);\n }\n return LOCATION_DAY_ANYWHERE.test(filePath);\n}\n\nexport function buildCompressionGuidelinesMarkdown(\n events: MemoryActionEvent[],\n generatedAtIso: string = new Date().toISOString(),\n): string {\n return buildCompressionGuidelinesMarkdownV2(events, generatedAtIso);\n}\n\n\nexport function applyQueryAwareCandidateFilter(\n candidates: QmdSearchResult[],\n candidatePaths: Set<string> | null,\n): QmdSearchResult[] {\n if (!candidatePaths) return candidates;\n if (candidatePaths.size === 0) return [];\n const filtered = candidates.filter((candidate) =>\n candidatePaths.has(candidate.path),\n );\n return filtered.length > 0 ? filtered : candidates;\n}\n\nexport function tokenizeRecallQuery(prompt: string): string[] {\n return prompt\n .toLowerCase()\n .split(/[^a-z0-9]+/i)\n .map((t) => t.trim())\n .filter((t) => t.length >= 3);\n}\n\nexport function hasLifecycleMetadata(frontmatter: MemoryFrontmatter): boolean {\n return (\n frontmatter.lifecycleState !== undefined ||\n frontmatter.verificationState !== undefined ||\n frontmatter.policyClass !== undefined ||\n frontmatter.lastValidatedAt !== undefined ||\n frontmatter.decayScore !== undefined ||\n frontmatter.heatScore !== undefined\n );\n}\n\nexport function shouldFilterLifecycleRecallCandidate(\n frontmatter: MemoryFrontmatter,\n options: {\n lifecyclePolicyEnabled: boolean;\n lifecycleFilterStaleEnabled: boolean;\n },\n): boolean {\n if (!options.lifecyclePolicyEnabled || !options.lifecycleFilterStaleEnabled)\n return false;\n if (!hasLifecycleMetadata(frontmatter)) return false;\n const lifecycleState = resolveLifecycleState(frontmatter);\n return lifecycleState === \"stale\" || lifecycleState === \"archived\";\n}\n\nexport function lifecycleRecallScoreAdjustment(\n frontmatter: MemoryFrontmatter,\n options: {\n lifecyclePolicyEnabled: boolean;\n },\n): number {\n if (!options.lifecyclePolicyEnabled) return 0;\n if (!hasLifecycleMetadata(frontmatter)) return 0;\n\n let delta = 0;\n const lifecycleState = resolveLifecycleState(frontmatter);\n switch (lifecycleState) {\n case \"active\":\n delta += 0.05;\n break;\n case \"validated\":\n delta += 0.03;\n break;\n case \"candidate\":\n delta -= 0.01;\n break;\n case \"stale\":\n delta -= 0.06;\n break;\n case \"archived\":\n delta -= 0.08;\n break;\n }\n if (frontmatter.verificationState === \"disputed\") {\n delta -= 0.12;\n }\n return delta;\n}\n\nexport function computeArtifactRecallLimit(\n recallMode: RecallPlanMode,\n recallResultLimit: number,\n verbatimArtifactsMaxRecall: number,\n): number {\n if (recallMode === \"no_recall\") return 0;\n if (Math.max(0, recallResultLimit) === 0) return 0;\n const base = Math.max(0, verbatimArtifactsMaxRecall);\n if (recallMode === \"minimal\") {\n return Math.min(base, Math.max(0, recallResultLimit));\n }\n return base;\n}\n\nexport function resolveEffectiveRecallMode(options: {\n plannerEnabled: boolean;\n graphRecallEnabled: boolean;\n multiGraphMemoryEnabled: boolean;\n graphExpandedIntentEnabled?: boolean;\n prompt: string;\n}): RecallPlanMode {\n return resolveRecallModeDecision(options).effectiveMode;\n}\n\nexport interface RecallModeGraphOptions {\n plannerEnabled: boolean;\n graphRecallEnabled: boolean;\n multiGraphMemoryEnabled: boolean;\n graphExpandedIntentEnabled?: boolean;\n prompt: string;\n}\n\n/**\n * Apply the graph-mode overlay + gating to a planner-produced mode.\n *\n * Shared by the heuristic ({@link resolveRecallModeDecision}) and LLM\n * ({@link resolveRecallModeDecisionAsync}) paths so graph promotion and the\n * \"graph disabled → fall back to full\" gating behave identically regardless of\n * which planner produced `plannedModeRaw` (gotcha #39).\n */\nexport function finalizeRecallModeDecision(\n plannedModeRaw: RecallPlanMode,\n options: RecallModeGraphOptions,\n): RecallModeDecision {\n let plannedMode: RecallPlanMode = plannedModeRaw;\n const graphExpandedIntentDetected =\n options.plannerEnabled &&\n options.graphExpandedIntentEnabled === true &&\n hasBroadGraphIntent(options.prompt);\n if (plannedMode !== \"graph_mode\" && graphExpandedIntentDetected) {\n plannedMode = \"graph_mode\";\n }\n if (\n plannedMode === \"graph_mode\" &&\n (!options.graphRecallEnabled || !options.multiGraphMemoryEnabled)\n ) {\n return {\n plannedMode,\n effectiveMode: \"full\",\n graphExpandedIntentDetected,\n graphReason: !options.graphRecallEnabled\n ? \"graph recall disabled by config\"\n : \"multi-graph memory disabled by config\",\n };\n }\n return {\n plannedMode,\n effectiveMode: plannedMode,\n graphExpandedIntentDetected,\n };\n}\n\nexport function resolveRecallModeDecision(options: RecallModeGraphOptions): RecallModeDecision {\n const plannedMode: RecallPlanMode = options.plannerEnabled\n ? planRecallMode(options.prompt)\n : \"full\";\n return finalizeRecallModeDecision(plannedMode, options);\n}\n\n/**\n * Async recall-mode decision with optional LLM-based planning (issue #1367 /\n * Option C). Falls back to the heuristic decision when the LLM planner is\n * disabled, in shadow mode, or unavailable/failed — so this is always safe to\n * await on the recall hot path. Provider-agnostic: the LLM call routes through\n * the gateway/fallback chain.\n *\n * `recallPlannerEnabled === false` keeps the legacy \"always full\" behavior and\n * skips the LLM entirely (the planner as a whole is off).\n */\nexport async function resolveRecallModeDecisionAsync(\n options: RecallModeGraphOptions & {\n config: PluginConfig;\n /**\n * Recall-operation capability gates (issue #1523). REQUIRED: the recall\n * orchestrator always passes a resolved set — the LLM planner gate reads\n * `caps.recallPlannerLlm`, never re-derives from config.\n */\n caps: CapabilitySet;\n hints?: string[];\n llm?: FallbackLlmClient;\n signal?: AbortSignal;\n },\n): Promise<RecallModeDecision> {\n const heuristicDecision = resolveRecallModeDecision(options);\n\n // Planner globally off, or LLM planning not opted into → heuristic only.\n // Read the resolved capability (issue #1523) — never re-derive from config.\n const plannerLlmEnabled = options.caps.recallPlannerLlm;\n if (!options.plannerEnabled || !plannerLlmEnabled) {\n return heuristicDecision;\n }\n\n const { planRecallModeLLM } = await import(\"../recall-planner-llm.js\");\n const planned = await planRecallModeLLM(\n options.prompt,\n options.hints,\n options.config,\n options.caps,\n options.llm,\n options.signal,\n );\n\n // Shadow mode: record what the LLM would have chosen but keep the heuristic\n // effective decision (safe rollout / comparison — gotcha #30).\n if (options.config.recallPlannerShadowMode) {\n return {\n ...heuristicDecision,\n plannerSource: planned.source,\n plannerReason: `shadow:${planned.reason}`,\n plannerLatencyMs: planned.latencyMs,\n plannerFallbackUsed: planned.fallbackUsed,\n plannerModelUsed: planned.modelUsed,\n plannerHeuristicMode: planned.heuristicMode,\n shadowLlmMode: planned.mode,\n };\n }\n\n const llmDecision = finalizeRecallModeDecision(planned.mode, options);\n return {\n ...llmDecision,\n plannerSource: planned.source,\n plannerReason: planned.reason,\n plannerLatencyMs: planned.latencyMs,\n plannerFallbackUsed: planned.fallbackUsed,\n plannerModelUsed: planned.modelUsed,\n plannerHeuristicMode: planned.heuristicMode,\n };\n}\n\nexport function computeArtifactCandidateFetchLimit(\n targetCount: number,\n): number {\n const cappedTarget = Math.max(0, targetCount);\n if (cappedTarget === 0) return 0;\n const headroom = Math.max(8, cappedTarget * 4);\n return Math.min(200, cappedTarget + headroom);\n}\n\nexport function computeQmdHybridFetchLimit(\n recallFetchLimit: number,\n artifactsEnabled: boolean,\n maxArtifactRecall: number,\n): number {\n const cappedRecallLimit = Math.max(0, recallFetchLimit);\n if (cappedRecallLimit === 0) return 0;\n if (!artifactsEnabled) return cappedRecallLimit;\n // Overscan when artifacts are enabled, then filter artifact paths before\n // re-applying the recall cap to avoid artifact-dominated top-N starvation.\n const artifactHeadroom = Math.max(20, Math.max(0, maxArtifactRecall) * 8);\n return Math.min(400, cappedRecallLimit + artifactHeadroom);\n}\n\nexport function summarizeGraphShadowComparison(\n baseline: QmdSearchResult[],\n merged: QmdSearchResult[],\n topN: number,\n): {\n baselineCount: number;\n graphCount: number;\n overlapCount: number;\n overlapRatio: number;\n averageOverlapDelta: number;\n} {\n const limit = Math.max(0, Math.floor(topN));\n const baselineTop = limit > 0 ? baseline.slice(0, limit) : [];\n const graphTop = limit > 0 ? merged.slice(0, limit) : [];\n const baselineByPath = new Map(\n baselineTop.map((item) => [item.path, item.score]),\n );\n const graphByPath = new Map(graphTop.map((item) => [item.path, item.score]));\n\n let overlapCount = 0;\n let overlapDeltaSum = 0;\n for (const [p, baselineScore] of baselineByPath.entries()) {\n const graphScore = graphByPath.get(p);\n if (typeof graphScore !== \"number\") continue;\n overlapCount += 1;\n overlapDeltaSum += graphScore - baselineScore;\n }\n\n const baselineCount = baselineTop.length;\n return {\n baselineCount,\n graphCount: graphTop.length,\n overlapCount,\n overlapRatio: baselineCount > 0 ? overlapCount / baselineCount : 0,\n averageOverlapDelta: overlapCount > 0 ? overlapDeltaSum / overlapCount : 0,\n };\n}\n\nexport function parseGraphRecallRankedResults(\n value: unknown,\n): GraphRecallRankedResult[] {\n if (!Array.isArray(value)) return [];\n const parsed: GraphRecallRankedResult[] = [];\n for (const entry of value) {\n if (!entry || typeof entry !== \"object\") continue;\n const candidate = entry as Partial<GraphRecallRankedResult>;\n if (\n typeof candidate.path !== \"string\" ||\n typeof candidate.score !== \"number\"\n )\n continue;\n parsed.push({\n path: candidate.path,\n score: candidate.score,\n docid: typeof candidate.docid === \"string\" ? candidate.docid : undefined,\n sourceLabels: Array.isArray(candidate.sourceLabels)\n ? candidate.sourceLabels.filter(\n (item): item is string => typeof item === \"string\",\n )\n : [],\n });\n }\n return parsed.slice(0, 64);\n}\n\nexport function parseMemoryIntentSnapshot(value: unknown): MemoryIntent {\n const candidate =\n value && typeof value === \"object\" ? (value as Partial<MemoryIntent>) : {};\n return {\n goal: typeof candidate.goal === \"string\" ? candidate.goal : \"unknown\",\n actionType:\n typeof candidate.actionType === \"string\"\n ? candidate.actionType\n : \"unknown\",\n entityTypes: Array.isArray(candidate.entityTypes)\n ? candidate.entityTypes.filter(\n (item): item is string => typeof item === \"string\",\n )\n : [],\n taskInitiation: candidate.taskInitiation === true,\n };\n}\n\nexport function buildQmdIntentHint(intent: MemoryIntent): string | undefined {\n const parts: string[] = [];\n if (intent.goal !== \"unknown\") {\n parts.push(`goal:${intent.goal.replace(/_/g, \" \")}`);\n }\n if (intent.actionType !== \"unknown\") {\n parts.push(`action:${intent.actionType.replace(/_/g, \" \")}`);\n }\n if (intent.entityTypes.length > 0) {\n parts.push(`entities:${intent.entityTypes.join(\",\")}`);\n }\n if (intent.taskInitiation === true) {\n parts.push(\"task_initiation\");\n }\n return parts.length > 0 ? parts.join(\" \") : undefined;\n}\n\nexport function parseQmdRecallResults(value: unknown): QmdSearchResult[] {\n if (!Array.isArray(value)) return [];\n const parsed: QmdSearchResult[] = [];\n for (const entry of value) {\n if (!entry || typeof entry !== \"object\") continue;\n const candidate = entry as Partial<QmdSearchResult>;\n if (\n typeof candidate.path !== \"string\" ||\n typeof candidate.score !== \"number\"\n )\n continue;\n parsed.push({\n docid: typeof candidate.docid === \"string\" ? candidate.docid : \"\",\n path: candidate.path,\n snippet: typeof candidate.snippet === \"string\" ? candidate.snippet : \"\",\n score: candidate.score,\n explain: parseQmdExplain(candidate.explain),\n transport:\n candidate.transport === \"daemon\" ||\n candidate.transport === \"subprocess\" ||\n candidate.transport === \"hybrid\" ||\n candidate.transport === \"scoped_prefilter\"\n ? candidate.transport\n : undefined,\n });\n }\n return parsed.slice(0, 32);\n}\n\nexport function mergeArtifactRecallCandidates(\n candidatesByNamespace: MemoryFile[][],\n limit: number,\n): MemoryFile[] {\n const cappedLimit = Math.max(0, limit);\n if (cappedLimit === 0) return [];\n\n const out: MemoryFile[] = [];\n const seen = new Set<string>();\n let offset = 0;\n while (out.length < cappedLimit) {\n let hasAnyCandidateAtOffset = false;\n for (const list of candidatesByNamespace) {\n if (offset >= list.length) continue;\n hasAnyCandidateAtOffset = true;\n const item = list[offset];\n const dedupeKey = `${item.frontmatter.id}:${item.frontmatter.sourceMemoryId ?? \"\"}:${item.content}`;\n if (seen.has(dedupeKey)) continue;\n seen.add(dedupeKey);\n out.push(item);\n if (out.length >= cappedLimit) break;\n }\n if (!hasAnyCandidateAtOffset) break;\n offset += 1;\n }\n return out;\n}\n\nexport function resolveRecentThreadMemoryPaths(options: {\n threadEpisodeIds: string[];\n currentMemoryId: string;\n allMemsForGraph: MemoryFile[] | null | undefined;\n pathById?: Map<string, string>;\n storageDir: string;\n maxRecent: number;\n}): string[] {\n const maxRecent = Math.max(0, options.maxRecent);\n if (options.threadEpisodeIds.length === 0 || maxRecent === 0) return [];\n const pathById =\n options.pathById ??\n buildMemoryPathById(options.allMemsForGraph, options.storageDir);\n if (pathById.size === 0) return [];\n\n // #1635 (defensive): skip pending_review ids from legacy episode sets.\n const pendingReviewIds = new Set<string>(\n (options.allMemsForGraph ?? [])\n .filter((m) => m.frontmatter.status === \"pending_review\" && m.frontmatter.id)\n .map((m) => m.frontmatter.id as string),\n );\n\n return options.threadEpisodeIds\n .filter((id) => id !== options.currentMemoryId)\n .filter((id) => !pendingReviewIds.has(id))\n .slice(-maxRecent)\n .map((id) => pathById.get(id))\n .filter((p): p is string => typeof p === \"string\" && p.length > 0);\n}\n\nexport function buildMemoryPathById(\n allMemsForGraph: MemoryFile[] | null | undefined,\n storageDir: string,\n): Map<string, string> {\n const pathById = new Map<string, string>();\n for (const mem of allMemsForGraph ?? []) {\n const id = mem.frontmatter.id;\n if (!id) continue;\n pathById.set(id, path.relative(storageDir, mem.path));\n }\n return pathById;\n}\n\nexport function appendMemoryToGraphContext(options: {\n allMemsForGraph: MemoryFile[] | null | undefined;\n storageDir: string;\n memoryRelPath: string;\n memoryId: string;\n category: MemoryFile[\"frontmatter\"][\"category\"];\n content: string;\n entityRef: string | undefined;\n}): void {\n if (!Array.isArray(options.allMemsForGraph)) return;\n\n const nowIso = new Date().toISOString();\n options.allMemsForGraph.push({\n path: path.join(options.storageDir, options.memoryRelPath),\n content: options.content,\n frontmatter: {\n id: options.memoryId,\n category: options.category,\n created: nowIso,\n updated: nowIso,\n source: \"extraction\",\n confidence: 0.8,\n confidenceTier: \"implied\",\n tags: [],\n entityRef: options.entityRef,\n status: \"active\",\n },\n });\n}\n\nexport function resolvePersistedMemoryRelativePath(options: {\n memoryId: string;\n pathById: Map<string, string>;\n category: string;\n}): string {\n const persisted = options.pathById.get(options.memoryId);\n if (persisted) return persisted;\n if (options.category === \"correction\") {\n return path.join(\"corrections\", `${options.memoryId}.md`);\n }\n // Pick the subtree that matches the StorageManager.writeMemory routing\n // so fallback paths (used before memoryPathById has seen the fresh\n // write) agree with where the file actually lives. Routing goes through\n // the shared categoryDirName() chokepoint (utils/category-dir.ts) so\n // every category — decisions/, preferences/, reasoning-traces/, ... —\n // resolves to the same dir the writer used; otherwise graph edges point\n // at the wrong subtree and graph expansion silently drops those nodes\n // when readMemoryByPath cannot resolve them (issue #564 PR 3 / #1546).\n const subtree = categoryDirName(options.category);\n const idParts = options.memoryId.split(\"-\");\n const maybeTimestamp = Number(idParts[1]);\n if (Number.isFinite(maybeTimestamp) && maybeTimestamp > 0) {\n const day = new Date(maybeTimestamp).toISOString().slice(0, 10);\n return path.join(subtree, day, `${options.memoryId}.md`);\n }\n return path.join(subtree, `${options.memoryId}.md`);\n}\n"],"mappings":"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","names":["buildCompressionGuidelinesMarkdown"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/fallback-llm-codex-subscription.ts","../src/providers/codex-subscription.ts"],"sourcesContent":["/**\n * Helpers extracted from FallbackLlmClient so fallback-llm.ts stays under\n * the 1200-line cap: Codex-subscription lifecycle (issue #2833) plus\n * generic chain helpers used by the same client.\n */\n\nimport path from \"node:path\";\nimport { raceAbort } from \"./abort-error.js\";\nimport { callCodexCliFallback, isCodexCliFallbackRunnerRegistered } from \"./cli-fallback.js\";\nimport type { CodexCliFallbackRunner } from \"./cli-fallback.js\";\nimport {\n CODEX_SUBSCRIPTION_PROVIDER_ID,\n CodexSubscriptionAuthError,\n CodexSubscriptionConfigError,\n CodexSubscriptionTimeoutError,\n assertNoApiKeyConfig,\n ensureCodexSubscriptionRunnerRegistered,\n getCodexSubscriptionRunnerForOwner,\n getCodexSubscriptionShutdownSignal,\n isDefaultRegisteredCodexSubscriptionRunner,\n} from \"./providers/codex-subscription.js\";\nimport type { GetRuntimeAuthForModelFn, ResolveApiKeyFn } from \"./resolve-provider-secret.js\";\nimport { resolveHomeDir } from \"./runtime/env.js\";\nimport type { GatewayConfig, ModelProviderConfig } from \"./types.js\";\nimport { expandTildePath } from \"./utils/path.js\";\n\ntype CodexSubscriptionAttemptResult = {\n content: string;\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n };\n};\n\n/**\n * Terminal codex-subscription failures (timeout, auth, config contract).\n * These carry documented caller guidance (`TimeoutError` name, `codex login`\n * steps), so they must survive the chain instead of collapsing into a\n * generic empty/http_error result (issue #2833).\n */\nexport function isTerminalCodexSubscriptionError(error: unknown): boolean {\n return (\n error instanceof CodexSubscriptionTimeoutError ||\n error instanceof CodexSubscriptionAuthError ||\n error instanceof CodexSubscriptionConfigError\n );\n}\n\n/**\n * Settle a fallback-LLM chain at the caller deadline. Abort the in-flight\n * work, return immediately, and observe the abandoned promise so a late\n * rejection cannot become unhandled.\n */\nexport async function raceFallbackLlmDeadline<T>(\n work: Promise<T>,\n timeoutMs: number,\n abortOnTimeout: () => void,\n): Promise<{ timedOut: true } | { timedOut: false; value: T }> {\n const deadline = new AbortController();\n const timer = setTimeout(() => deadline.abort(), timeoutMs);\n deadline.signal.addEventListener(\"abort\", abortOnTimeout, { once: true });\n try {\n const value = await raceAbort(\n work,\n deadline.signal,\n `fallback LLM timed out after ${timeoutMs}ms`,\n );\n return { timedOut: false, value };\n } catch (error) {\n if (!deadline.signal.aborted) throw error;\n const afterAbort = await Promise.race([\n work.then(\n (value) => ({ state: \"value\" as const, value }),\n (lateError) => ({ state: \"error\" as const, error: lateError }),\n ),\n new Promise<{ state: \"pending\" }>((resolve) => {\n setImmediate(() => resolve({ state: \"pending\" }));\n }),\n ]);\n if (afterAbort.state === \"value\") return { timedOut: false, value: afterAbort.value };\n if (afterAbort.state === \"error\") throw afterAbort.error;\n void work.then(\n () => undefined,\n () => undefined,\n );\n return { timedOut: true };\n } finally {\n clearTimeout(timer);\n deadline.signal.removeEventListener(\"abort\", abortOnTimeout);\n }\n}\n\n/**\n * Attempt the Codex CLI / subscription provider. Returns `undefined` when the\n * model is not `api: \"codex-cli\"` so the generic FallbackLlmClient path runs.\n *\n * Subscription ids reject a configured apiKey before generic secret resolution\n * — otherwise an unresolvable ref throws a generic error and the provider's\n * `codex login` guidance never surfaces (issue #2833). Other `codex-cli`\n * providers still resolve a configured key. Runtime auth is skipped: the CLI\n * login is the credential.\n */\nexport async function tryCodexSubscriptionProvider(\n model: {\n providerId: string;\n modelId: string;\n providerConfig: ModelProviderConfig;\n },\n messages: Array<{ role: \"system\" | \"user\" | \"assistant\"; content: string }>,\n options: { timeoutMs?: number; signal?: AbortSignal },\n resolveFallbackApiKey: () => Promise<string | undefined>,\n runner?: CodexCliFallbackRunner,\n): Promise<CodexSubscriptionAttemptResult | undefined> {\n if (model.providerConfig.api !== \"codex-cli\") return undefined;\n\n if (model.providerId === CODEX_SUBSCRIPTION_PROVIDER_ID) {\n assertNoApiKeyConfig(model.providerConfig);\n }\n\n const resolvedApiKey =\n model.providerConfig.apiKey === undefined ? undefined : await resolveFallbackApiKey();\n const rawKey = model.providerConfig.apiKey;\n const needsResolution =\n rawKey === \"secretref-managed\" || (typeof rawKey === \"object\" && rawKey !== null);\n if (needsResolution && !resolvedApiKey) {\n throw new Error(`API key for provider \"${model.providerId}\" could not be resolved from secret ref`);\n }\n\n const effectiveConfig: ModelProviderConfig = {\n ...model.providerConfig,\n ...(resolvedApiKey ? { apiKey: resolvedApiKey } : {}),\n };\n\n // Let the provider surface its typed timeout before the generic outer deadline.\n const callOptions = {\n timeoutMs: options.timeoutMs === undefined\n ? undefined\n : Math.max(1, options.timeoutMs - Math.min(100, Math.max(5, Math.floor(options.timeoutMs / 5)))),\n signal: options.signal,\n };\n // A host/benchmark runner on the process seam still wins. The core\n // default runner does not: prefer the owning runtime so shutdown\n // terminates the request that runtime started.\n if (isCodexCliFallbackRunnerRegistered() && !(runner && isDefaultRegisteredCodexSubscriptionRunner())) {\n return await callCodexCliFallback(effectiveConfig, model.modelId, messages, callOptions);\n }\n if (runner) {\n return await callCodexCliFallback(effectiveConfig, model.modelId, messages, callOptions, runner);\n }\n ensureCodexSubscriptionRunnerRegistered();\n return await callCodexCliFallback(effectiveConfig, model.modelId, messages, callOptions);\n}\n\nexport function abortReason(signal: AbortSignal | undefined): Error {\n const reason = signal?.reason;\n return reason instanceof Error ? reason : new Error(\"task LLM request aborted\");\n}\n\nexport function withCodexRuntimeShutdown<T extends { signal?: AbortSignal }>(\n options: T,\n runner: CodexCliFallbackRunner | undefined,\n): T {\n if (!runner) return options;\n const shutdown = getCodexSubscriptionShutdownSignal(runner);\n if (!shutdown) return options;\n return {\n ...options,\n signal: options.signal ? AbortSignal.any([options.signal, shutdown]) : shutdown,\n };\n}\n\nexport function isUnsupportedJsonSchemaError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n // Require an HTTP status plus explicit schema/format context. A bare\n // \"unsupported\" (e.g. \"'temperature' is unsupported with this model\") must\n // NOT trigger the schema-stripping retry, or we pay a duplicate request\n // for unrelated provider errors.\n if (!/\\b(?:400|404|422)\\b/.test(message)) {\n return false;\n }\n if (/(?:response[_ ]?format|json[_ ]?schema|structured[_ ]?output)/i.test(message)) {\n return true;\n }\n // \"unsupported\" only counts when adjacent to schema/format terminology.\n return /\\bunsupported\\b[\\s\\S]{0,40}\\b(?:schema|format)\\b/i.test(message);\n}\n\nexport function extractResponsesOutputText(data: {\n output_text?: string;\n output?: Array<{\n type?: string;\n text?: string;\n content?: Array<{\n type?: string;\n text?: string;\n }>;\n }>;\n}): string | null {\n if (typeof data.output_text === \"string\" && data.output_text.trim().length > 0) {\n return data.output_text;\n }\n\n const chunks: string[] = [];\n for (const item of data.output ?? []) {\n if (typeof item.text === \"string\" && item.text.trim().length > 0) {\n chunks.push(item.text);\n }\n for (const part of item.content ?? []) {\n if (\n (part.type === \"output_text\" || part.type === \"text\") &&\n typeof part.text === \"string\" &&\n part.text.trim().length > 0\n ) {\n chunks.push(part.text);\n }\n }\n }\n\n const joined = chunks.join(\"\\n\").trim();\n return joined.length > 0 ? joined : null;\n}\n\nexport type StructuredParseFailureReason =\n | \"no_models\"\n | \"empty\"\n | \"http_error\"\n | \"schema_rejection\"\n | \"timeout\";\n\nexport interface StructuredParseFailure {\n result: null;\n failureReason: StructuredParseFailureReason;\n /** Model string of the last attempt, when one was selected. Not `modelUsed`. */\n attemptedModel?: string;\n /** HTTP status when known. Never a response body. */\n httpStatus?: number;\n /** Coarse class: http_4xx / http_5xx / timeout / network / empty / schema_rejection / no_models. */\n errorClass?: string;\n}\n\nexport type StructuredParseResult<T> =\n | { result: T; modelUsed: string }\n | StructuredParseFailure;\n\nexport interface FallbackLlmRuntimeContext {\n agentDir?: string;\n getRuntimeAuthForModel?: GetRuntimeAuthForModelFn | null;\n resolveApiKeyForProvider?: ResolveApiKeyFn | null;\n workspaceDir?: string;\n /** Per-runtime Codex child owner. Shutdown must terminate only this runner. */\n codexSubscriptionRunner?: CodexCliFallbackRunner;\n}\n\ntype GatewayBackedRuntimeConfig = {\n providerApiKeyResolver?: ResolveApiKeyFn | null;\n runtimeAuthForModelResolver?: GetRuntimeAuthForModelFn | null;\n workspaceDir?: string;\n};\n\nexport function fallbackLlmRuntimeContextFromConfig(\n config: Pick<\n GatewayBackedRuntimeConfig,\n \"providerApiKeyResolver\" | \"runtimeAuthForModelResolver\" | \"workspaceDir\"\n >,\n overrides: FallbackLlmRuntimeContext = {},\n): FallbackLlmRuntimeContext {\n return {\n workspaceDir: config.workspaceDir,\n resolveApiKeyForProvider: config.providerApiKeyResolver,\n getRuntimeAuthForModel: config.runtimeAuthForModelResolver,\n codexSubscriptionRunner: getCodexSubscriptionRunnerForOwner(config),\n ...overrides,\n };\n}\n\nconst HTTP_STATUS_IN_MESSAGE = /\\b([1-5]\\d{2})\\b/;\n\nexport function isTimeoutError(err: unknown): boolean {\n const msg = err instanceof Error ? err.message : String(err);\n return /timed out after \\d+ms/i.test(msg) || /timed out before request started/i.test(msg);\n}\n\nfunction isEmptyProviderResponse(err: unknown): boolean {\n const msg = err instanceof Error ? err.message : String(err);\n return /^Empty response from /i.test(msg);\n}\n\nfunction finiteHttpStatus(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value) || !Number.isInteger(value)) return undefined;\n if (value < 100 || value > 599) return undefined;\n return value;\n}\n\nfunction httpStatusFromProviderError(err: unknown): number | undefined {\n if (err && typeof err === \"object\") {\n if (\"status\" in err) {\n const status = finiteHttpStatus(err.status);\n if (status !== undefined) return status;\n }\n if (\"statusCode\" in err) {\n const status = finiteHttpStatus(err.statusCode);\n if (status !== undefined) return status;\n }\n }\n const msg = err instanceof Error ? err.message : String(err);\n const match = HTTP_STATUS_IN_MESSAGE.exec(msg);\n if (!match) return undefined;\n return finiteHttpStatus(Number(match[1]));\n}\n\nfunction errorClassForHttpStatus(status: number): string {\n if (status >= 500) return \"http_5xx\";\n if (status >= 400) return \"http_4xx\";\n return `http_${status}`;\n}\n\nexport function classifyThrownProviderError(err: unknown): Omit<StructuredParseFailure, \"result\"> {\n if (isTimeoutError(err)) {\n return { failureReason: \"timeout\", errorClass: \"timeout\" };\n }\n if (isEmptyProviderResponse(err)) {\n return { failureReason: \"empty\", errorClass: \"empty\" };\n }\n const httpStatus = httpStatusFromProviderError(err);\n if (httpStatus !== undefined) {\n return {\n failureReason: \"http_error\",\n httpStatus,\n errorClass: errorClassForHttpStatus(httpStatus),\n };\n }\n return { failureReason: \"http_error\", errorClass: \"network\" };\n}\n\nexport function normalizeRuntimePath(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? expandTildePath(trimmed) : undefined;\n}\n\nexport function readGatewayWorkspaceDir(gatewayConfig: GatewayConfig | undefined): string | undefined {\n if (!gatewayConfig || typeof gatewayConfig !== \"object\") return undefined;\n const raw = gatewayConfig as Record<string, unknown>;\n return (\n normalizeRuntimePath(raw.workspaceDir) ??\n normalizeRuntimePath(raw.workspacePath) ??\n normalizeRuntimePath(raw.workspace)\n );\n}\n\nexport function defaultOpenClawWorkspaceDir(): string {\n return path.join(resolveHomeDir(), \".openclaw\", \"workspace\");\n}\n","/**\n * Codex subscription extraction provider (issue #2784).\n *\n * Routes extraction/consolidation LLM calls through the `codex` CLI so the\n * operator's Codex subscription (ChatGPT OAuth login) authenticates the\n * request — no OpenAI API key and no codex-openai-proxy. Credentials stay in\n * the CLI's own auth store; this module never reads, accepts, or logs tokens.\n *\n * Transport contract mirrors `packages/bench/src/providers/codex-cli.ts`\n * (`codex exec --json --output-last-message`, env allowlist, login-status\n * precheck) but lives in core so the standalone daemon and host plugins get\n * a working `api: \"codex-cli\"` transport without importing the optional\n * bench package. Registered through the existing\n * `setCodexCliFallbackRunnerForProcess` seam, and only when no host or\n * benchmark runner has claimed it first.\n */\n\nimport { mkdir, mkdtemp, readFile, rm, stat } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport type {\n CodexCliFallbackConfig,\n CodexCliFallbackMessage,\n CodexCliFallbackRequest,\n CodexCliFallbackResult,\n CodexCliFallbackRunner,\n} from \"../cli-fallback.js\";\nimport { getCodexCliFallbackRunnerForProcess, isCodexCliFallbackRunnerRegistered, normalizeCodexCliTimeoutMs, setCodexCliFallbackRunnerForProcess } from \"../cli-fallback.js\";\nimport { log } from \"../logger.js\";\nimport { launchProcess } from \"../runtime/child-process.js\";\nimport type { CodexCliReasoningEffort, ModelProviderConfig } from \"../types.js\";\nimport { expandTildePath } from \"../utils/path.js\";\n\nexport const CODEX_SUBSCRIPTION_PROVIDER_ID = \"codex-subscription\";\n\n/** Env var overriding the codex executable (mirrors the bench provider). */\nconst CODEX_EXECUTABLE_ENV = \"REMNIC_CODEX_EXECUTABLE\";\n\nconst DEFAULT_REASONING_EFFORT: CodexCliReasoningEffort = \"medium\";\nconst DEFAULT_TIMEOUT_MS = 120_000;\nconst LOGIN_STATUS_TIMEOUT_MS = 10_000;\nconst LOGIN_STATUS_CACHE_TTL_MS = 10 * 60_000;\nconst STDIO_LIMIT = 64_000;\nconst OUTPUT_SUMMARY_LIMIT = 500;\n/**\n * Env keys whose value is a filesystem path. Relative values resolve against\n * the original process cwd before either child launches, because the exec\n * child runs with cwd = the ephemeral workspace (same rule as executables).\n */\nconst PATH_BEARING_ENV_KEYS: Readonly<Record<string, true>> = Object.freeze({ CODEX_HOME: true, HOME: true, USERPROFILE: true });\n\n/**\n * Environment keys forwarded to the codex child. Everything else — including\n * ambient `OPENAI_API_KEY` / `OPENAI_BASE_URL` — is stripped so the CLI cannot\n * silently fall back to metered API-key auth instead of the subscription\n * login. Mirrors the bench provider's allowlist.\n */\nconst CODEX_RUNTIME_ENV_ALLOWLIST: Readonly<Record<string, true>> = Object.freeze({\n ALL_PROXY: true,\n APPDATA: true,\n CODEX_HOME: true,\n COLORTERM: true,\n COMSPEC: true,\n FORCE_COLOR: true,\n HOME: true,\n HOMEDRIVE: true,\n HOMEPATH: true,\n LANG: true,\n LOCALAPPDATA: true,\n LOGNAME: true,\n NO_COLOR: true,\n NODE_EXTRA_CA_CERTS: true,\n NO_PROXY: true,\n NUMBER_OF_PROCESSORS: true,\n OS: true,\n PATH: true,\n PATHEXT: true,\n PROGRAMDATA: true,\n PROCESSOR_ARCHITECTURE: true,\n HTTP_PROXY: true,\n HTTPS_PROXY: true,\n SHELL: true,\n SSL_CERT_DIR: true,\n SSL_CERT_FILE: true,\n SYSTEMDRIVE: true,\n SYSTEMROOT: true,\n TEMP: true,\n TERM: true,\n TMP: true,\n TMPDIR: true,\n USER: true,\n USERNAME: true,\n USERPROFILE: true,\n WINDIR: true,\n XDG_CACHE_HOME: true,\n XDG_CONFIG_HOME: true,\n XDG_DATA_HOME: true,\n XDG_RUNTIME_DIR: true,\n});\n\nconst LOGIN_OK_PATTERN = /logged in using chatgpt/i;\nconst LOGIN_API_KEY_PATTERN = /api key/i;\n/** CLI output shapes that mean the subscription session was rejected. */\nconst AUTH_FAILURE_PATTERN =\n /\\b401\\b|\\b403\\b|unauthorized|forbidden|not logged in|no active|re-?authenticat|token expired|session expired|please log ?in/i;\nconst TIMEOUT_PATTERN = /timed out after \\d+ms/i;\n/** Secret shapes a codex CLI could echo into errors; replaced before surfacing. */\nconst SECRET_ECHO_PATTERNS: readonly RegExp[] = [\n /sk-[A-Za-z0-9_-]{8,}/g,\n /Bearer\\s+[A-Za-z0-9._-]{8,}/g,\n /eyJ[A-Za-z0-9._-]{10,}/g,\n];\n\n/**\n * Built-in provider entry so `\"codex-subscription/<model>\"` chains resolve\n * with no models.json and no apiKey — the transport owns authentication.\n */\nexport function codexSubscriptionBuiltinProviderConfig(): ModelProviderConfig {\n return {\n baseUrl: \"codex-cli://subscription\",\n api: \"codex-cli\",\n models: [],\n };\n}\n\nexport type CodexSubscriptionAuthReason = \"unauthenticated\" | \"expired_or_revoked\";\n\n/** Login/authorization failure with actionable re-auth guidance. */\nexport class CodexSubscriptionAuthError extends Error {\n readonly reason: CodexSubscriptionAuthReason;\n\n constructor(reason: CodexSubscriptionAuthReason, message: string) {\n super(message);\n this.name = \"CodexSubscriptionAuthError\";\n this.reason = reason;\n }\n}\n\n/** Provider config violated the no-raw-credentials contract. */\nexport class CodexSubscriptionConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CodexSubscriptionConfigError\";\n }\n}\n\n/** Request exceeded its deadline. Abort-driven cancellations rethrow the\n * caller's own abort reason instead, preserving the AbortError contract. */\nexport class CodexSubscriptionTimeoutError extends Error {\n constructor(timeoutMs: number) {\n super(`codex-subscription request timed out after ${timeoutMs}ms`);\n this.name = \"TimeoutError\";\n }\n}\n\nexport interface CodexSubscriptionExecRequest {\n executable: string;\n args: string[];\n input: string;\n env: NodeJS.ProcessEnv;\n outputPath: string;\n workspacePath: string;\n timeoutMs?: number;\n signal?: AbortSignal;\n}\n\nexport interface CodexSubscriptionExecResult {\n status: number | null;\n signal?: NodeJS.Signals | null;\n stdout: string;\n stderr: string;\n outputText: string;\n}\n\nexport interface CodexSubscriptionRunnerDeps {\n /** Runs `codex exec`. Default: isolated subprocess via launchProcess. */\n runCodexExec?: (request: CodexSubscriptionExecRequest) => Promise<CodexSubscriptionExecResult>;\n /** Runs `codex login status`. Default: isolated subprocess. Receives the\n * login-status timeout budget (capped by the request deadline) and the\n * shared-check abort signal (fires when the last waiter leaves). */\n runLoginStatus?: (\n executable: string,\n env: NodeJS.ProcessEnv,\n timeoutMs: number,\n signal?: AbortSignal\n ) => Promise<{ status: number | null; stdout: string; stderr: string }>;\n /** Environment the isolated child env is filtered from. Tests inject fakes. */\n env?: NodeJS.ProcessEnv;\n tmpdir?: () => string;\n now?: () => number;\n}\n\ninterface CommandOutput {\n status: number | null;\n signal?: NodeJS.Signals | null;\n stdout: string;\n stderr: string;\n}\n\ninterface LoginStatusCacheEntry {\n at: number;\n promise: Promise<void>;\n /** Auth-store fingerprint at check time; a mismatch invalidates the entry. */\n fingerprint: string | null;\n /** Live waiters. The in-flight check aborts when the last waiter leaves. */\n waiters: number;\n settled: boolean;\n controller: AbortController;\n}\n\nconst loginStatusCache = new Map<string, LoginStatusCacheEntry>();\nconst childrenByRunner = new WeakMap<CodexCliFallbackRunner, Set<number>>();\nconst runnerByOwner = new WeakMap<object, CodexCliFallbackRunner>();\nconst shutdownByRunner = new WeakMap<CodexCliFallbackRunner, AbortController>();\nlet defaultRegisteredRunner: CodexCliFallbackRunner | undefined;\nlet coreRunnerRegistered = false;\n\nexport function createCodexSubscriptionRunner(deps: CodexSubscriptionRunnerDeps = {}): CodexCliFallbackRunner {\n const envSource = deps.env ?? process.env;\n const children = new Set<number>();\n const shutdown = new AbortController();\n const runnerDeps: CodexSubscriptionRunnerDeps = {\n ...deps,\n runCodexExec: deps.runCodexExec ?? ((request) => runCodexExecSubprocess(request, children)),\n runLoginStatus:\n deps.runLoginStatus ??\n ((executable, env, timeoutMs, signal) =>\n runLoginStatusSubprocess(executable, env, timeoutMs, signal, children)),\n };\n const runner: CodexCliFallbackRunner = (request) => {\n const signal = request.options.signal\n ? AbortSignal.any([request.options.signal, shutdown.signal])\n : shutdown.signal;\n if (signal.aborted) {\n return Promise.reject(abortErrorOf(signal));\n }\n return runCodexSubscriptionRequest(\n { ...request, options: { ...request.options, signal } },\n runnerDeps,\n envSource,\n );\n };\n childrenByRunner.set(runner, children);\n shutdownByRunner.set(runner, shutdown);\n return runner;\n}\n\n/** One runner per owning runtime/config object so teardown cannot cross instances. */\nexport function getCodexSubscriptionRunnerForOwner(owner: object): CodexCliFallbackRunner {\n let runner = runnerByOwner.get(owner);\n const shutdown = runner ? shutdownByRunner.get(runner) : undefined;\n if (!runner || shutdown?.signal.aborted) {\n runner = createCodexSubscriptionRunner();\n runnerByOwner.set(owner, runner);\n }\n return runner;\n}\n\n/** Shutdown signal for the owning runner, if this function is a core runner. */\nexport function getCodexSubscriptionShutdownSignal(\n runner: CodexCliFallbackRunner,\n): AbortSignal | undefined {\n return shutdownByRunner.get(runner)?.signal;\n}\n\n/**\n * Registers the core subprocess transport on the codex-cli seam, but only\n * when no runner is registered yet — a host or benchmark runner that claimed\n * the seam first always wins. If the seam was cleared afterwards\n * (setCodexCliFallbackRunnerForProcess(undefined)), the core runner is\n * re-registered so the next call still routes. Idempotent.\n */\nexport function ensureCodexSubscriptionRunnerRegistered(deps: CodexSubscriptionRunnerDeps = {}): boolean {\n if (isCodexCliFallbackRunnerRegistered()) return false;\n defaultRegisteredRunner = createCodexSubscriptionRunner(deps);\n setCodexCliFallbackRunnerForProcess(defaultRegisteredRunner);\n coreRunnerRegistered = true;\n return true;\n}\n\n/** True when the process seam still holds the core default runner. */\nexport function isDefaultRegisteredCodexSubscriptionRunner(): boolean {\n return defaultRegisteredRunner !== undefined\n && getCodexCliFallbackRunnerForProcess() === defaultRegisteredRunner;\n}\n\n/** Host shutdown hook: terminate this runtime's detached Codex children. Does not exit. */\nexport function terminateActiveCodexSubscriptionChildren(\n signal: NodeJS.Signals = \"SIGTERM\",\n runner?: CodexCliFallbackRunner,\n): void {\n const target = runner ?? defaultRegisteredRunner;\n if (!target) return;\n const shutdown = shutdownByRunner.get(target);\n if (shutdown && !shutdown.signal.aborted) {\n shutdown.abort(new DOMException(\"The operation was aborted.\", \"AbortError\"));\n }\n const pids = childrenByRunner.get(target);\n if (!pids) return;\n for (const pid of pids) {\n terminateCodexChildPid(pid, signal);\n }\n}\n\n/** SIGTERM now, SIGKILL after a bound, even if the caller later awaits drain. */\nexport function beginCodexSubscriptionShutdown(\n runner?: CodexCliFallbackRunner,\n forceKillAfterMs = 1_000,\n): () => void {\n terminateActiveCodexSubscriptionChildren(\"SIGTERM\", runner);\n const timer = setTimeout(() => {\n terminateActiveCodexSubscriptionChildren(\"SIGKILL\", runner);\n }, forceKillAfterMs);\n timer.unref();\n return () => {\n clearTimeout(timer);\n terminateActiveCodexSubscriptionChildren(\"SIGKILL\", runner);\n };\n}\nasync function runCodexSubscriptionRequest(\n request: CodexCliFallbackRequest,\n deps: CodexSubscriptionRunnerDeps,\n envSource: NodeJS.ProcessEnv\n): Promise<CodexCliFallbackResult> {\n const { config } = request;\n assertNoApiKeyConfig(config);\n const executable = resolveExecutable(config, envSource);\n const env = buildIsolatedEnv(envSource);\n\n const providerTimeoutMs = config.retryOptions?.timeoutMs !== undefined\n ? normalizeCodexCliTimeoutMs(config.retryOptions.timeoutMs)\n : undefined;\n const timeoutMs = request.options.timeoutMs ?? providerTimeoutMs ?? DEFAULT_TIMEOUT_MS;\n // The effective deadline starts BEFORE the login-status precheck: login\n // consumes the same call/provider timeout budget, it is not additive.\n const now = deps.now ?? Date.now;\n const deadlineStartedAt = now();\n if (request.options.signal?.aborted) {\n throw abortErrorOf(request.options.signal);\n }\n await assertSubscriptionLogin(executable, env, deps, {\n loginStatusTimeoutMs: Math.min(LOGIN_STATUS_TIMEOUT_MS, timeoutMs),\n callerTimeoutMs: timeoutMs,\n deadlineStartedAt,\n signal: request.options.signal,\n });\n\n if (request.options.signal?.aborted) {\n throw abortErrorOf(request.options.signal);\n }\n\n const remainingTimeoutMs = timeoutMs - (now() - deadlineStartedAt);\n if (remainingTimeoutMs <= 0) {\n throw new CodexSubscriptionTimeoutError(timeoutMs);\n }\n let tempDir: string | undefined;\n try {\n tempDir = await mkdtemp(path.join(deps.tmpdir?.() ?? os.tmpdir(), \"remnic-codex-sub-\"));\n const workspacePath = path.join(tempDir, \"workspace\");\n const outputPath = path.join(tempDir, \"last-message.txt\");\n await mkdir(workspacePath, { recursive: true });\n\n const runCodexExec = deps.runCodexExec!;\n const result = await runCodexExec({\n executable,\n args: buildExecArgs(request.modelId, config, workspacePath, outputPath),\n input: buildPrompt(request.messages),\n env,\n outputPath,\n workspacePath,\n timeoutMs: remainingTimeoutMs,\n signal: request.options.signal,\n });\n\n if (result.status !== 0) {\n const failure = execFailureError(result, remainingTimeoutMs, executable, env);\n if (failure instanceof CodexSubscriptionTimeoutError) {\n throw failure;\n }\n if (request.options.signal?.aborted) {\n throw abortErrorOf(request.options.signal);\n }\n throw failure;\n }\n if (request.options.signal?.aborted) {\n throw abortErrorOf(request.options.signal);\n }\n\n const content = result.outputText.trim();\n if (content.length === 0) {\n throw new Error(\n `codex-subscription: codex exec returned no final message (${summarizeOutput(result.stderr, result.stdout)})`\n );\n }\n return { content, ...usageFrom(result) };\n } finally {\n if (tempDir) {\n await rm(tempDir, { force: true, recursive: true }).catch(() => {});\n }\n }\n}\n\n/**\n * This provider authenticates exclusively through the codex CLI login, so a\n * configured apiKey is a configuration mistake — reject it without echoing\n * the value.\n */\nexport function assertNoApiKeyConfig(config: CodexCliFallbackConfig): void {\n if (config.apiKey !== undefined && config.apiKey !== \"\") {\n throw new CodexSubscriptionConfigError(\n `${CODEX_SUBSCRIPTION_PROVIDER_ID} does not accept apiKey configuration: it authenticates through the Codex CLI login. Remove the apiKey field and run \\`codex login\\` with a ChatGPT account instead.`\n );\n }\n}\n\nfunction resolveExecutable(config: CodexCliFallbackConfig, env: NodeJS.ProcessEnv): string {\n const configured = config.codexCliExecutable ?? config.executable ?? env[CODEX_EXECUTABLE_ENV] ?? \"codex\";\n const expanded = expandTildePath(String(configured).trim());\n if (expanded.trim().length === 0) {\n throw new CodexSubscriptionConfigError(`${CODEX_EXECUTABLE_ENV} / executable must not be empty`);\n }\n // The exec child runs with cwd = the temp workspace, and spawn resolves a\n // relative executable against the CHILD cwd. Resolve relative paths against\n // the original process cwd now so `./codex` stays valid; bare names keep\n // PATH lookup.\n if (expanded.includes(\"/\") || expanded.includes(\"\\\\\")) {\n return path.resolve(expanded);\n }\n return expanded;\n}\n\nfunction buildIsolatedEnv(source: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = {};\n for (const [key, value] of Object.entries(source)) {\n if (value !== undefined && isAllowedEnvKey(key)) {\n env[key] = PATH_BEARING_ENV_KEYS[key.toUpperCase()] === true\n ? normalizePathEnvValue(value)\n : value;\n }\n }\n return env;\n}\n\n/**\n * The exec child runs with cwd = the ephemeral workspace while the login\n * child runs with cwd = this process, so a relative HOME/CODEX_HOME would\n * resolve differently per child. Anchor both to the original process cwd.\n */\nfunction normalizePathEnvValue(value: string): string {\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n return value;\n }\n const expanded = expandTildePath(trimmed);\n return path.isAbsolute(expanded) ? expanded : path.resolve(expanded);\n}\nfunction isAllowedEnvKey(key: string): boolean {\n const normalized = key.toUpperCase();\n return CODEX_RUNTIME_ENV_ALLOWLIST[normalized] === true || normalized.startsWith(\"LC_\");\n}\n\ninterface LoginCheckContext {\n /** Budget for the login-status subprocess itself. */\n loginStatusTimeoutMs: number;\n /** The caller's overall effective deadline (login + exec). */\n callerTimeoutMs: number;\n deadlineStartedAt: number;\n signal?: AbortSignal;\n}\n\n/**\n * Verifies the operator's Codex subscription login via `codex login status`.\n * Success is cached briefly; failures are never cached so a re-login takes\n * effect on the next request. A cached success is also invalidated when the\n * auth store changes on disk (e.g. another process switches the same Codex\n * home from a ChatGPT login to an API key), so the cache can never mask a\n * later non-subscription login mode.\n */\nasync function assertSubscriptionLogin(\n executable: string,\n env: NodeJS.ProcessEnv,\n deps: CodexSubscriptionRunnerDeps,\n ctx: LoginCheckContext\n): Promise<void> {\n const now = deps.now ?? Date.now;\n const cacheKey = `${executable}\\0${resolveCodexAuthHome(env) ?? \"\"}`;\n const cached = loginStatusCache.get(cacheKey);\n if (cached && now() - cached.at < LOGIN_STATUS_CACHE_TTL_MS) {\n if (!cached.settled || (await authStoreFingerprint(env)) === cached.fingerprint) {\n await waitForLoginEntry(cached, cacheKey, ctx, now);\n return;\n }\n }\n loginStatusCache.delete(cacheKey);\n if (ctx.signal?.aborted) {\n throw abortErrorOf(ctx.signal);\n }\n const entry: LoginStatusCacheEntry = {\n at: now(),\n fingerprint: null,\n waiters: 0,\n settled: false,\n controller: new AbortController(),\n promise: Promise.resolve(undefined),\n };\n entry.promise = runLoginStatusCheck(executable, env, deps, ctx, entry);\n entry.promise.then(\n () => {\n entry.settled = true;\n },\n () => {\n entry.settled = true;\n if (loginStatusCache.get(cacheKey) === entry) {\n loginStatusCache.delete(cacheKey);\n }\n }\n );\n loginStatusCache.set(cacheKey, entry);\n await waitForLoginEntry(entry, cacheKey, ctx, now);\n}\n\nasync function runLoginStatusCheck(\n executable: string,\n env: NodeJS.ProcessEnv,\n deps: CodexSubscriptionRunnerDeps,\n ctx: LoginCheckContext,\n entry: LoginStatusCacheEntry\n): Promise<void> {\n const runLoginStatus = deps.runLoginStatus!;\n const result = await runLoginStatus(executable, env, ctx.loginStatusTimeoutMs, entry.controller.signal);\n const output = `${result.stdout}\\n${result.stderr}`.trim();\n if (TIMEOUT_PATTERN.test(output)) {\n // A login-status subprocess timeout is a deadline expiry, not an auth\n // failure — never report it as \"unauthenticated\".\n throw new CodexSubscriptionTimeoutError(ctx.loginStatusTimeoutMs);\n }\n if (result.status === 0 && LOGIN_OK_PATTERN.test(output)) {\n entry.fingerprint = await authStoreFingerprint(env);\n return;\n }\n const apiKeyNote = LOGIN_API_KEY_PATTERN.test(output)\n ? \" The CLI currently reports an API-key login; subscription extraction needs a ChatGPT login.\"\n : \"\";\n throw new CodexSubscriptionAuthError(\n \"unauthenticated\",\n `codex-subscription: no ChatGPT-backed Codex login found. Run \\`codex login\\` and choose the ChatGPT account option, then retry.${apiKeyNote}`\n );\n}\n\n/**\n * Waits on a shared login check with this caller's own budget. A deadline or\n * caller abort rejects immediately — without cancelling the shared check\n * while other callers still wait on it. When the LAST waiter leaves an\n * in-flight check, the subprocess is aborted and the entry dropped so a later\n * caller starts a fresh check.\n */\nasync function waitForLoginEntry(\n entry: LoginStatusCacheEntry,\n cacheKey: string,\n ctx: LoginCheckContext,\n now: () => number\n): Promise<void> {\n const remainingMs = ctx.callerTimeoutMs - (now() - ctx.deadlineStartedAt);\n if (remainingMs <= 0) {\n throw new CodexSubscriptionTimeoutError(ctx.callerTimeoutMs);\n }\n const signal = ctx.signal;\n let rejectOnAbort!: (reason?: unknown) => void;\n const abortWait = new Promise<never>((_resolve, reject) => {\n rejectOnAbort = reject;\n });\n // Identity matters: the same reference is removed in the finally below.\n const onAbort = (): void => {\n if (signal === undefined) return;\n rejectOnAbort(abortErrorOf(signal));\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n entry.waiters++;\n // The deadline timer intentionally holds the event loop: this caller's\n // await is backed by nothing else while the shared check is in flight.\n let deadlineTimer: ReturnType<typeof setTimeout> | undefined;\n try {\n await Promise.race([\n entry.promise,\n abortWait,\n new Promise<never>((_resolve, reject) => {\n deadlineTimer = setTimeout(\n () => reject(new CodexSubscriptionTimeoutError(ctx.callerTimeoutMs)),\n remainingMs\n );\n }),\n ]);\n } catch (err) {\n if (signal?.aborted) {\n throw abortErrorOf(signal);\n }\n throw err;\n } finally {\n clearTimeout(deadlineTimer);\n signal?.removeEventListener(\"abort\", onAbort);\n entry.waiters--;\n if (entry.waiters <= 0 && !entry.settled) {\n entry.controller.abort();\n if (loginStatusCache.get(cacheKey) === entry) {\n loginStatusCache.delete(cacheKey);\n }\n }\n }\n}\n\n/**\n * `mtimeMs:size` of the Codex auth store, read as metadata only — the\n * provider never reads the store's contents. A change between the cached\n * check and now invalidates the cached login mode.\n */\nasync function authStoreFingerprint(env: NodeJS.ProcessEnv): Promise<string | null> {\n const home = resolveCodexAuthHome(env);\n if (!home) {\n return null;\n }\n try {\n const stats = await stat(path.join(home, \"auth.json\"));\n return `${stats.mtimeMs}:${stats.size}`;\n } catch {\n return null;\n }\n}\n\nfunction resolveCodexAuthHome(env: NodeJS.ProcessEnv): string | undefined {\n if (env.CODEX_HOME) return env.CODEX_HOME;\n const profile = env.HOME ?? env.USERPROFILE;\n return profile ? path.join(profile, \".codex\") : undefined;\n}\n\n/**\n * Args mirror the bench provider: fully sandboxed, ephemeral, no tools/hooks/\n * plugins/memories — extraction must behave as a plain completion endpoint.\n */\nfunction buildExecArgs(\n modelId: string,\n config: CodexCliFallbackConfig,\n workspacePath: string,\n outputPath: string\n): string[] {\n const reasoningEffort = readReasoningEffort(config) ?? DEFAULT_REASONING_EFFORT;\n return [\n \"exec\",\n \"--strict-config\",\n \"--model\",\n modelId,\n \"--config\",\n `model_reasoning_effort=${JSON.stringify(reasoningEffort)}`,\n \"--config\",\n 'approval_policy=\"never\"',\n \"--config\",\n 'web_search=\"disabled\"',\n \"--disable\",\n \"hooks\",\n \"--disable\",\n \"shell_tool\",\n \"--disable\",\n \"unified_exec\",\n \"--disable\",\n \"apps\",\n \"--disable\",\n \"plugins\",\n \"--disable\",\n \"remote_plugin\",\n \"--disable\",\n \"multi_agent\",\n \"--disable\",\n \"browser_use\",\n \"--disable\",\n \"browser_use_external\",\n \"--disable\",\n \"computer_use\",\n \"--disable\",\n \"image_generation\",\n \"--disable\",\n \"in_app_browser\",\n \"--disable\",\n \"goals\",\n \"--disable\",\n \"memories\",\n \"--disable\",\n \"chronicle\",\n \"--disable\",\n \"tool_suggest\",\n \"--disable\",\n \"workspace_dependencies\",\n \"--disable\",\n \"shell_snapshot\",\n \"--ephemeral\",\n \"--ignore-user-config\",\n \"--ignore-rules\",\n \"--sandbox\",\n \"read-only\",\n \"--cd\",\n workspacePath,\n \"--skip-git-repo-check\",\n \"--json\",\n \"--output-last-message\",\n outputPath,\n \"-\",\n ];\n}\n\nfunction readReasoningEffort(config: CodexCliFallbackConfig): CodexCliReasoningEffort | undefined {\n for (const value of [config.codexCliReasoningEffort, config.reasoningEffort]) {\n if (typeof value === \"string\") {\n const normalized = value.trim().toLowerCase();\n if (normalized === \"low\" || normalized === \"medium\" || normalized === \"high\" || normalized === \"xhigh\") {\n return normalized;\n }\n throw new CodexSubscriptionConfigError(\n \"codex-subscription reasoningEffort must be one of low, medium, high, xhigh (got unrecognized value)\"\n );\n }\n }\n return undefined;\n}\n\n/**\n * One JSON object per message: role boundaries are structural (JSON string\n * escaping), so literal `[system]`/role-marker text inside message content\n * can never forge another role's turn. Content stays model-visible verbatim.\n */\nfunction buildPrompt(messages: readonly CodexCliFallbackMessage[]): string {\n const transcript = messages\n .map((message) => JSON.stringify({ role: message.role, content: message.content }))\n .join(\"\\n\");\n return [\n \"You are acting as an LLM completion endpoint for a memory-extraction pipeline, not as a coding agent.\",\n \"Answer the request in the transcript below. Do not inspect files, run commands, browse, or use tools.\",\n \"Return only the final answer text. If the request asks for JSON, return raw JSON only.\",\n \"\",\n 'TRANSCRIPT (JSON Lines: one {\"role\":\"...\",\"content\":\"...\"} object per message; newlines inside content are escaped):',\n transcript,\n ].join(\"\\n\");\n}\n\nfunction execFailureError(\n result: CodexSubscriptionExecResult,\n timeoutMs: number,\n executable: string,\n env: NodeJS.ProcessEnv\n): Error {\n const combined = `${result.stderr}\\n${result.stdout}`;\n // The authoritative timeout marker wins over auth-pattern text: a timed-out\n // exec may have already printed model/diagnostic output containing 401/403\n // before the deadline fired (issue #2833).\n if (TIMEOUT_PATTERN.test(combined)) {\n return new CodexSubscriptionTimeoutError(timeoutMs);\n }\n if (AUTH_FAILURE_PATTERN.test(combined)) {\n // Re-check login on the next request; the cached status is now stale.\n loginStatusCache.delete(`${executable}\\0${env.CODEX_HOME ?? env.HOME ?? \"\"}`);\n return new CodexSubscriptionAuthError(\n \"expired_or_revoked\",\n \"codex-subscription: the Codex CLI rejected the request as unauthenticated \" +\n \"(session expired or revoked). Run `codex login` again to re-authenticate, then retry.\"\n );\n }\n\n const exitLabel = result.signal ? `signal ${result.signal}` : `exit ${result.status ?? \"unknown\"}`;\n return new Error(\n `codex-subscription: codex exec failed (${exitLabel}): ${summarizeOutput(result.stderr, result.stdout)}`\n );\n}\n\n/** Secret-redacted, then bounded tail of child output — the only child text\n * that ever reaches a thrown error. Redaction runs BEFORE bounding so a\n * secret straddling the cutoff cannot survive as an unmatchable fragment. */\nfunction summarizeOutput(stderr: string, stdout: string): string {\n const summary = [stderr.trim(), stdout.trim()].filter((part) => part.length > 0).join(\"\\n\");\n if (summary.length === 0) {\n return \"no process output\";\n }\n return redactSecretEchoes(summary).slice(-OUTPUT_SUMMARY_LIMIT);\n}\n\nexport function redactSecretEchoes(value: string): string {\n let redacted = value;\n for (const pattern of SECRET_ECHO_PATTERNS) {\n redacted = redacted.replace(pattern, \"[redacted]\");\n }\n return redacted;\n}\ntype CodexSubscriptionUsage = Pick<CodexCliFallbackResult, \"usage\">;\n\nfunction usageFrom(result: CodexSubscriptionExecResult): CodexSubscriptionUsage {\n const usage = parseCodexJsonlUsage(`${result.stdout}\\n${result.stderr}`);\n if (!usage) {\n return {};\n }\n return {\n usage: {\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n totalTokens: usage.inputTokens + usage.outputTokens,\n },\n };\n}\n\nexport function parseCodexJsonlUsage(output: string): { inputTokens: number; outputTokens: number } | undefined {\n let usage: { inputTokens: number; outputTokens: number } | undefined;\n for (const line of output.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (!trimmed.startsWith(\"{\")) continue;\n try {\n const event = JSON.parse(trimmed) as {\n type?: unknown;\n usage?: Record<string, unknown>;\n };\n if (event.type !== \"turn.completed\" || !event.usage) continue;\n const inputTokens = readCounter(event.usage.input_tokens);\n const outputTokens = readCounter(event.usage.output_tokens);\n if (inputTokens !== undefined && outputTokens !== undefined) {\n usage = { inputTokens, outputTokens };\n }\n } catch {\n // codex exec prints non-JSON status text alongside JSONL; ignore it\n }\n }\n return usage;\n}\n\nfunction readCounter(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n return undefined;\n }\n return value;\n}\n\nfunction abortErrorOf(signal: AbortSignal): Error {\n if (signal.reason instanceof CodexSubscriptionTimeoutError) return signal.reason;\n const reason =\n signal.reason instanceof Error\n ? signal.reason\n : signal.reason !== undefined\n ? new Error(String(signal.reason))\n : new DOMException(\"The operation was aborted.\", \"AbortError\");\n const match = /fallback LLM timed out after (\\d+)ms/i.exec(reason.message);\n if (match) {\n return new CodexSubscriptionTimeoutError(Number(match[1]));\n }\n return reason;\n}\n\n/** Bounds streamed child output to STDIO_LIMIT, keeping the TAIL — codex\n * prints its final error or turn.completed result last. Secrets are redacted\n * BEFORE bounding so one straddling the cutoff cannot leak a fragment. */\nfunction appendBounded(existing: string, next: string): string {\n const redacted = redactSecretEchoes(existing + next);\n return redacted.length > STDIO_LIMIT ? redacted.slice(-STDIO_LIMIT) : redacted;\n}\n\nasync function runLoginStatusSubprocess(\n executable: string,\n env: NodeJS.ProcessEnv,\n timeoutMs: number,\n signal: AbortSignal | undefined,\n children: Set<number>,\n): Promise<{ status: number | null; stdout: string; stderr: string }> {\n return await runSubprocess(executable, [\"login\", \"status\"], {\n env,\n stdin: undefined,\n timeoutMs,\n timeoutLabel: \"login status\",\n signal,\n children,\n });\n}\n\nasync function runCodexExecSubprocess(\n request: CodexSubscriptionExecRequest,\n children: Set<number>,\n): Promise<CodexSubscriptionExecResult> {\n const result = await runSubprocess(request.executable, request.args, {\n env: request.env,\n stdin: request.input,\n timeoutMs: request.timeoutMs,\n timeoutLabel: \"exec\",\n signal: request.signal,\n cwd: request.workspacePath,\n children,\n });\n if (result.status === 124) return { ...result, outputText: \"\" };\n let outputText = \"\";\n try {\n outputText = (await readFile(request.outputPath, \"utf8\")).trim();\n } catch {\n // Missing output file surfaces as the no-final-message error path.\n }\n return { ...result, outputText };\n}\n\ninterface SubprocessOptions {\n env: NodeJS.ProcessEnv;\n stdin?: string;\n timeoutMs?: number;\n timeoutLabel: string;\n signal?: AbortSignal;\n cwd?: string;\n children: Set<number>;\n}\n\nasync function runSubprocess(executable: string, args: string[], options: SubprocessOptions): Promise<CommandOutput> {\n return await new Promise<CommandOutput>((resolve, reject) => {\n if (options.signal?.aborted) {\n reject(abortErrorOf(options.signal));\n return;\n }\n const child = launchProcess(executable, args, {\n ...(options.cwd ? { cwd: options.cwd } : {}),\n env: options.env,\n stdio: [options.stdin === undefined ? \"ignore\" : \"pipe\", \"pipe\", \"pipe\"],\n detached: process.platform !== \"win32\",\n windowsHide: true,\n });\n registerActiveCodexChild(child.pid, options.children);\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n let settled = false;\n let killTimeout: ReturnType<typeof setTimeout> | undefined;\n const clearKillTimeout = (): void => {\n if (killTimeout) {\n clearTimeout(killTimeout);\n killTimeout = undefined;\n }\n };\n const terminate = (signal: NodeJS.Signals): void => {\n if (child.pid && process.platform !== \"win32\") {\n try {\n process.kill(-child.pid, signal);\n return;\n } catch {\n // fall through to killing the direct child\n }\n }\n child.kill(signal);\n };\n const scheduleForcedKill = (): void => {\n clearKillTimeout();\n killTimeout = setTimeout(() => terminate(\"SIGKILL\"), 1_000);\n killTimeout.unref();\n };\n const finish = (fn: () => void): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timeout);\n options.signal?.removeEventListener(\"abort\", onAbort);\n fn();\n };\n const settleTimeout = (): void => {\n timedOut = true;\n stderr = appendBounded(\n stderr,\n `\\ncodex-subscription: ${options.timeoutLabel} timed out after ${options.timeoutMs}ms.`\n );\n finish(() => {\n resolve({\n status: 124,\n signal: \"SIGTERM\",\n stdout,\n stderr,\n });\n });\n };\n const onAbort = (): void => {\n const reasonText =\n options.signal?.reason instanceof Error\n ? options.signal.reason.message\n : String(options.signal?.reason ?? \"\");\n terminate(\"SIGTERM\");\n scheduleForcedKill();\n if (/fallback LLM timed out after \\d+ms/i.test(reasonText)) {\n settleTimeout();\n return;\n }\n finish(() => reject(abortErrorOf(options.signal!)));\n };\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n const timeout = options.timeoutMs\n ? setTimeout(() => {\n terminate(\"SIGTERM\");\n scheduleForcedKill();\n settleTimeout();\n }, options.timeoutMs)\n : undefined;\n timeout?.unref();\n child.stdout?.setEncoding(\"utf8\");\n child.stderr?.setEncoding(\"utf8\");\n child.stdout?.on(\"data\", (chunk: string) => {\n stdout = appendBounded(stdout, chunk);\n });\n child.stderr?.on(\"data\", (chunk: string) => {\n stderr = appendBounded(stderr, chunk);\n });\n child.stdin?.on(\"error\", (error: NodeJS.ErrnoException) => {\n stderr = appendBounded(stderr, `\\ncodex-subscription: stdin error: ${error.code ?? error.message}`);\n });\n child.on(\"error\", (error) => {\n unregisterActiveCodexChild(child.pid, options.children);\n finish(() => {\n reject(\n child.pid\n ? new Error(`codex-subscription: codex CLI failed after start: ${safeMessage(error)}`, { cause: error })\n : new CodexSubscriptionAuthError(\n \"unauthenticated\",\n `codex-subscription: codex CLI not found at \\`${executable}\\` — install the Codex CLI and run \\`codex login\\` with a ChatGPT account, then retry.`\n )\n );\n });\n });\n child.on(\"close\", (status, signal) => {\n clearKillTimeout();\n unregisterActiveCodexChild(child.pid, options.children);\n finish(() => {\n resolve({\n status: timedOut ? (status === null || status === 0 ? 124 : status) : status,\n signal: timedOut ? (signal ?? \"SIGTERM\") : signal,\n stdout,\n stderr,\n });\n });\n });\n if (options.stdin !== undefined) {\n try {\n child.stdin?.end(options.stdin);\n } catch (error) {\n log.debug(`codex-subscription: failed writing prompt to stdin: ${safeMessage(error)}`);\n }\n }\n });\n}\n\nfunction safeMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nexport const __codexSubscriptionTestHooks = {\n activeCodexChildCount: (runner?: CodexCliFallbackRunner): number => {\n const target = runner ?? defaultRegisteredRunner;\n return target ? (childrenByRunner.get(target)?.size ?? 0) : 0;\n },\n appendBounded,\n resetLoginStatusCache: (): void => {\n loginStatusCache.clear();\n },\n isCoreRunnerRegistered: (): boolean => coreRunnerRegistered,\n resetCoreRunnerRegistered: (): void => {\n coreRunnerRegistered = false;\n defaultRegisteredRunner = undefined;\n },\n};\n\nfunction registerActiveCodexChild(pid: number | undefined, children: Set<number>): void {\n if (pid === undefined) return;\n children.add(pid);\n}\n\nfunction unregisterActiveCodexChild(pid: number | undefined, children: Set<number>): void {\n if (pid === undefined) return;\n children.delete(pid);\n}\n\nfunction terminateCodexChildPid(pid: number, signal: NodeJS.Signals): void {\n if (process.platform !== \"win32\") {\n try {\n process.kill(-pid, signal);\n return;\n } catch {\n // Fall back to killing the direct child below.\n }\n }\n\n try {\n process.kill(pid, signal);\n } catch {\n // The child may already have exited.\n }\n}\n"],"mappings":"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","names":["path","path"]}