@remnic/core 9.69.43 → 9.69.45

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 (508) hide show
  1. package/dist/access-admin-ops-surface.d.ts +14 -14
  2. package/dist/access-admin-ops-surface.js +24 -24
  3. package/dist/access-authorization-probe.d.ts +14 -14
  4. package/dist/access-authorization-probe.js +25 -25
  5. package/dist/access-boundary.d.ts +14 -14
  6. package/dist/access-boundary.js +24 -24
  7. package/dist/access-cli.js +71 -69
  8. package/dist/access-cli.js.map +1 -1
  9. package/dist/access-coding-context-resolution.d.ts +1 -1
  10. package/dist/access-extraction-force-flush.d.ts +14 -14
  11. package/dist/access-extraction-force-flush.js +24 -24
  12. package/dist/access-health-types.d.ts +1 -1
  13. package/dist/access-http-briefing.d.ts +14 -14
  14. package/dist/access-http-briefing.js +25 -25
  15. package/dist/access-http-lcm-compaction.d.ts +14 -14
  16. package/dist/access-http-lifecycle-flush.d.ts +14 -14
  17. package/dist/access-http-offline-stream.d.ts +14 -14
  18. package/dist/access-http-query.d.ts +2 -2
  19. package/dist/access-http-query.js +26 -26
  20. package/dist/access-http.d.ts +15 -15
  21. package/dist/access-http.js +40 -40
  22. package/dist/access-identity-continuity-surface.d.ts +11 -11
  23. package/dist/access-identity-continuity-surface.js +24 -24
  24. package/dist/access-lcm-surface.d.ts +14 -14
  25. package/dist/access-lcm-surface.js +24 -24
  26. package/dist/access-mcp-shared-context-tools.d.ts +14 -14
  27. package/dist/access-mcp.d.ts +14 -14
  28. package/dist/access-mcp.js +32 -32
  29. package/dist/access-memory-search-fanout.d.ts +2 -2
  30. package/dist/{access-namespace-preflight-CE-RrXKu.d.ts → access-namespace-preflight-DDnsN22V.d.ts} +1 -1
  31. package/dist/access-namespace-preflight.d.ts +3 -3
  32. package/dist/access-namespace-preflight.js +24 -24
  33. package/dist/access-observe-transcript.d.ts +11 -11
  34. package/dist/access-observe-write-category.d.ts +4 -3
  35. package/dist/access-observe-write-category.js +2 -2
  36. package/dist/access-observe-write-surface.d.ts +14 -14
  37. package/dist/access-observe-write-surface.js +24 -24
  38. package/dist/access-offline-manifest.d.ts +11 -11
  39. package/dist/access-offline-manifest.js +3 -3
  40. package/dist/access-operations-batch.js +25 -25
  41. package/dist/access-operations.d.ts +14 -14
  42. package/dist/access-operations.js +31 -31
  43. package/dist/access-recall-concurrency.d.ts +14 -14
  44. package/dist/access-recall-concurrency.js +24 -24
  45. package/dist/access-recall-response.d.ts +14 -14
  46. package/dist/access-recall-response.js +24 -24
  47. package/dist/access-recall-surface.d.ts +14 -14
  48. package/dist/access-recall-surface.js +24 -24
  49. package/dist/access-schema.d.ts +9 -2
  50. package/dist/access-schema.js +3 -1
  51. package/dist/{access-service-DxTTTg9O.d.ts → access-service-CDteK_Gt.d.ts} +9 -9
  52. package/dist/access-service-helpers.d.ts +14 -14
  53. package/dist/access-service.d.ts +14 -14
  54. package/dist/access-service.js +24 -24
  55. package/dist/access-surface-catalog.d.ts +14 -14
  56. package/dist/access-surface-catalog.js +26 -26
  57. package/dist/access-wearables-meetings-surface.d.ts +4 -4
  58. package/dist/action-confidence.d.ts +1 -1
  59. package/dist/active-memory-bridge.d.ts +1 -1
  60. package/dist/active-recall.d.ts +1 -1
  61. package/dist/active-recall.js +2 -2
  62. package/dist/activity/digest.d.ts +1 -1
  63. package/dist/ambient-provenance.d.ts +1 -1
  64. package/dist/artifact-search.d.ts +1 -1
  65. package/dist/{auto-sync-QZD4RD6H.js → auto-sync-DG5KEOF5.js} +5 -5
  66. package/dist/background-generation.d.ts +1 -1
  67. package/dist/behavior-learner.d.ts +1 -1
  68. package/dist/behavior-signals.d.ts +1 -1
  69. package/dist/bootstrap.d.ts +11 -11
  70. package/dist/briefing-window.d.ts +2 -2
  71. package/dist/briefing.d.ts +2 -2
  72. package/dist/briefing.js +6 -6
  73. package/dist/buffer-surprise-report.d.ts +1 -1
  74. package/dist/buffer-turn-helpers.d.ts +1 -1
  75. package/dist/buffer.d.ts +2 -2
  76. package/dist/buffer.js +3 -3
  77. package/dist/bulk-import/index.d.ts +3 -3
  78. package/dist/calibration.d.ts +1 -1
  79. package/dist/calibration.js +2 -2
  80. package/dist/capabilities.d.ts +1 -1
  81. package/dist/{catalog-Ya3DDn_T.d.ts → catalog-Dl2hYqpS.d.ts} +1 -1
  82. package/dist/causal-behavior.d.ts +1 -1
  83. package/dist/causal-consolidation.d.ts +1 -1
  84. package/dist/causal-consolidation.js +7 -7
  85. package/dist/causal-trajectory-graph.d.ts +1 -1
  86. package/dist/{chunk-BZDK5EOD.js → chunk-2LRO73MN.js} +2 -2
  87. package/dist/chunk-2WMXZYMS.js +25 -0
  88. package/dist/chunk-2WMXZYMS.js.map +1 -0
  89. package/dist/{chunk-JDL5BYYF.js → chunk-46A4RGBC.js} +2 -2
  90. package/dist/{chunk-6EGIQEKC.js → chunk-4HTQ76O4.js} +2 -2
  91. package/dist/{chunk-7L54ARML.js → chunk-4XTSKGLX.js} +2 -2
  92. package/dist/{chunk-KOM36ILJ.js → chunk-5TKHJ5RW.js} +13 -13
  93. package/dist/{chunk-IB7FDRRC.js → chunk-5XTILJRI.js} +2 -2
  94. package/dist/{chunk-J2MGTGKC.js → chunk-5ZXGH2ZL.js} +20 -3
  95. package/dist/chunk-5ZXGH2ZL.js.map +1 -0
  96. package/dist/{chunk-VJXMFBVR.js → chunk-6II55MXS.js} +2 -2
  97. package/dist/{chunk-LT4H7SL5.js → chunk-7LKXP4QG.js} +19 -19
  98. package/dist/{chunk-PF7LQ22G.js → chunk-A2YN3FR4.js} +3 -3
  99. package/dist/chunk-AAQA6ZUP.js +41 -0
  100. package/dist/chunk-AAQA6ZUP.js.map +1 -0
  101. package/dist/{chunk-RJ7Z7YXK.js → chunk-AG6PANBG.js} +14 -20
  102. package/dist/chunk-AG6PANBG.js.map +1 -0
  103. package/dist/{chunk-KDLOKVX7.js → chunk-AOMUIF3R.js} +2 -2
  104. package/dist/{chunk-2YIUUXNK.js → chunk-B55FYF6F.js} +2 -2
  105. package/dist/{chunk-2HDLDBJW.js → chunk-BOWAP64Q.js} +2 -2
  106. package/dist/{chunk-PPDZSJXB.js → chunk-C3MCMFNV.js} +2 -2
  107. package/dist/{chunk-DABSYX7V.js → chunk-D3DJYGU2.js} +3 -3
  108. package/dist/{chunk-F2FJTOV6.js → chunk-DO6R3LIE.js} +2 -2
  109. package/dist/{chunk-LD22AAJI.js → chunk-DSHSQGSN.js} +2 -2
  110. package/dist/{chunk-3254BYQV.js → chunk-E5VOKZQV.js} +1 -1
  111. package/dist/{chunk-46FVFU7S.js → chunk-EC5SVM6H.js} +2 -2
  112. package/dist/{chunk-UHSOPTNB.js → chunk-EP6BA7VV.js} +50 -15
  113. package/dist/chunk-EP6BA7VV.js.map +1 -0
  114. package/dist/{chunk-BPXJINHW.js → chunk-EUP4AXIW.js} +2 -2
  115. package/dist/{chunk-KY75VZKG.js → chunk-F6AYWLRN.js} +2 -2
  116. package/dist/{chunk-4AX5OYKC.js → chunk-FDDCZDBI.js} +2 -2
  117. package/dist/{chunk-VHANUT45.js → chunk-HBGSZ62Z.js} +7 -7
  118. package/dist/{chunk-M7H56FOQ.js → chunk-HVGCQMTQ.js} +2 -2
  119. package/dist/{chunk-GMU7MAHS.js → chunk-IAT5WFEU.js} +3 -3
  120. package/dist/{chunk-R3H2AXO2.js → chunk-IFULZYYQ.js} +2 -2
  121. package/dist/{chunk-ZYSOT6HD.js → chunk-J3IWHCMF.js} +2 -2
  122. package/dist/{chunk-QCTXQ2HW.js → chunk-J6NEOCQC.js} +2 -2
  123. package/dist/{chunk-H2N6SLTR.js → chunk-JIWZVOQM.js} +2 -2
  124. package/dist/{chunk-LUAQHDUI.js → chunk-JMBTNVMW.js} +2 -2
  125. package/dist/{chunk-HKQAI6XI.js → chunk-JPNUKKSL.js} +2 -2
  126. package/dist/{chunk-CRK6F6N3.js → chunk-JUOJGZPV.js} +5 -1
  127. package/dist/chunk-JUOJGZPV.js.map +1 -0
  128. package/dist/{chunk-F6PTJLEM.js → chunk-K4KE5MYE.js} +1 -1
  129. package/dist/{chunk-5AJZ7EUW.js → chunk-K75H7FSO.js} +2 -2
  130. package/dist/{chunk-JL4TQYM5.js → chunk-L272A5QW.js} +33 -2
  131. package/dist/{chunk-JL4TQYM5.js.map → chunk-L272A5QW.js.map} +1 -1
  132. package/dist/{chunk-7F47R4H4.js → chunk-LZAJONO5.js} +2 -2
  133. package/dist/{chunk-2WFOVXVJ.js → chunk-M7ECD3KN.js} +2 -2
  134. package/dist/{chunk-KORQWGUA.js → chunk-MDYZCPNQ.js} +2 -2
  135. package/dist/{chunk-IWHNT35B.js → chunk-N6I257OM.js} +3 -3
  136. package/dist/{chunk-YR5QT4SR.js → chunk-NAFPHFDM.js} +2 -2
  137. package/dist/{chunk-D7UUB33A.js → chunk-NGAFYIHQ.js} +2 -2
  138. package/dist/{chunk-LXMZM7LM.js → chunk-NKDQXDFL.js} +16 -16
  139. package/dist/{chunk-ZBSP4BSN.js → chunk-NRFUYVW7.js} +2 -2
  140. package/dist/{chunk-VNQRRUNS.js → chunk-O6ZSWHVR.js} +2 -3
  141. package/dist/chunk-O6ZSWHVR.js.map +1 -0
  142. package/dist/{chunk-XOCGC3FJ.js → chunk-OFBJD3V5.js} +2 -2
  143. package/dist/{chunk-YPB3Y57U.js → chunk-OOBUWMPY.js} +4 -4
  144. package/dist/{chunk-324HBGS4.js → chunk-OREGA7GY.js} +6 -6
  145. package/dist/{chunk-4WMGRLTV.js → chunk-Q4MI2KCG.js} +2 -2
  146. package/dist/{chunk-MOL7JK4F.js → chunk-R4HFCATE.js} +2 -2
  147. package/dist/{chunk-AKB44K3D.js → chunk-SPN5YFXN.js} +8 -8
  148. package/dist/{chunk-2PIC6CEN.js → chunk-T2ZNUWUY.js} +2 -2
  149. package/dist/{chunk-NHFXGNGC.js → chunk-TFS5FAAC.js} +36 -36
  150. package/dist/{chunk-JDOBQPJY.js → chunk-TNQR7N52.js} +2 -2
  151. package/dist/{chunk-JWBDHA4F.js → chunk-UJXNBZYJ.js} +4 -4
  152. package/dist/{chunk-DDGQDNQW.js → chunk-VA5QRTZX.js} +2 -2
  153. package/dist/{chunk-XIJHRQ4A.js → chunk-W6YDAIVB.js} +2 -2
  154. package/dist/{chunk-GKKLI23D.js → chunk-WCQ7L54B.js} +2 -2
  155. package/dist/{chunk-3YQ7VLP3.js → chunk-WMTYEQO5.js} +2 -2
  156. package/dist/{chunk-VKDXYEA6.js → chunk-WNMVUWI7.js} +2 -2
  157. package/dist/{chunk-OGAKUA7I.js → chunk-YHSEUZV5.js} +2 -2
  158. package/dist/{chunk-GR76OKET.js → chunk-YSBYNCCN.js} +2 -2
  159. package/dist/{chunk-QUBPZQED.js → chunk-Z5YNVWRD.js} +2 -2
  160. package/dist/{chunk-UCLWIMVW.js → chunk-ZLVURGAJ.js} +2 -2
  161. package/dist/{chunk-M6FKXOYV.js → chunk-ZQ533JDE.js} +2 -2
  162. package/dist/{chunk-TRTLWUDD.js → chunk-ZTHGFTMW.js} +2 -2
  163. package/dist/{cli-BfCl5kWD.d.ts → cli-CZDhIcxu.d.ts} +5 -5
  164. package/dist/cli.d.ts +16 -16
  165. package/dist/cli.js +53 -53
  166. package/dist/coding/export-okf-codegraph.d.ts +1 -1
  167. package/dist/coding/export-okf-codegraph.js +5 -5
  168. package/dist/coding/pre-action-gate.d.ts +1 -1
  169. package/dist/compounding/engine.d.ts +2 -2
  170. package/dist/compounding/engine.js +6 -6
  171. package/dist/compounding/preference-consolidator.d.ts +1 -1
  172. package/dist/compression-optimizer.d.ts +1 -1
  173. package/dist/config.d.ts +1 -1
  174. package/dist/config.js +2 -2
  175. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  176. package/dist/connectors/codex-materialize-runner.js +6 -6
  177. package/dist/connectors/codex-materialize.d.ts +1 -1
  178. package/dist/connectors/index.d.ts +1 -1
  179. package/dist/connectors/index.js +6 -6
  180. package/dist/consolidation-provenance-check.d.ts +2 -2
  181. package/dist/consolidation-undo.d.ts +2 -2
  182. package/dist/contradiction/index.d.ts +4 -4
  183. package/dist/converge-config.d.ts +1 -1
  184. package/dist/convergence-refresh.d.ts +2 -2
  185. package/dist/convergence-refresh.js +8 -8
  186. package/dist/conversation-index/backend.d.ts +1 -1
  187. package/dist/conversation-index/chunker.d.ts +1 -1
  188. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  189. package/dist/conversation-index/indexer.d.ts +1 -1
  190. package/dist/conversation-index/search.d.ts +1 -1
  191. package/dist/corpus-watermark.d.ts +1 -1
  192. package/dist/corpus-watermark.js +8 -8
  193. package/dist/cross-lingual-recall.d.ts +1 -1
  194. package/dist/day-summary.d.ts +1 -1
  195. package/dist/deep-recall-http-glue.d.ts +14 -14
  196. package/dist/deep-recall-http-glue.js +2 -2
  197. package/dist/deep-recall-mcp-tools.d.ts +14 -14
  198. package/dist/deep-recall-policy-llm.d.ts +2 -2
  199. package/dist/deep-recall-policy-llm.js +3 -3
  200. package/dist/deep-recall-seeds.d.ts +1 -1
  201. package/dist/delinearize.d.ts +1 -1
  202. package/dist/dependency-propagation-config.d.ts +1 -1
  203. package/dist/{dependency-propagation-delivery-CggS9BFT.d.ts → dependency-propagation-delivery-BXaUoVUf.d.ts} +1 -1
  204. package/dist/direct-answer-wiring.d.ts +1 -1
  205. package/dist/direct-answer.d.ts +1 -1
  206. package/dist/embedding-fallback.d.ts +1 -1
  207. package/dist/enrichment/index.d.ts +1 -1
  208. package/dist/entity-origin-fields.d.ts +1 -1
  209. package/dist/entity-retrieval.d.ts +2 -2
  210. package/dist/entity-retrieval.js +6 -6
  211. package/dist/entity-schema.d.ts +1 -1
  212. package/dist/episodic-context.d.ts +1 -1
  213. package/dist/eval-trajectory-contracts.d.ts +1 -1
  214. package/dist/eval-trajectory-store.d.ts +1 -1
  215. package/dist/eval-trajectory.d.ts +1 -1
  216. package/dist/explicit-capture.d.ts +11 -11
  217. package/dist/external-wiki-access.d.ts +14 -14
  218. package/dist/external-wiki-access.js +25 -25
  219. package/dist/external-wiki-collection-registration.d.ts +1 -1
  220. package/dist/external-wiki-collection.d.ts +1 -1
  221. package/dist/external-wiki-mcp-tools.d.ts +14 -14
  222. package/dist/extraction-error-classification.d.ts +1 -1
  223. package/dist/extraction-faithfulness.d.ts +2 -2
  224. package/dist/extraction-faithfulness.js +3 -3
  225. package/dist/extraction-judge-telemetry.d.ts +2 -2
  226. package/dist/extraction-judge-training.d.ts +2 -2
  227. package/dist/extraction-judge.d.ts +2 -2
  228. package/dist/extraction-judge.js +3 -3
  229. package/dist/extraction-liveness.d.ts +1 -1
  230. package/dist/extraction-normalization.d.ts +1 -1
  231. package/dist/extraction-prompt.d.ts +1 -1
  232. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  233. package/dist/extraction-source-grounding.d.ts +1 -1
  234. package/dist/extraction-span-config.d.ts +1 -1
  235. package/dist/extraction-span-materialize.d.ts +1 -1
  236. package/dist/extraction-span-wire.d.ts +23 -4
  237. package/dist/extraction-span-wire.js +7 -8
  238. package/dist/extraction-span-wire.js.map +1 -1
  239. package/dist/extraction.d.ts +2 -2
  240. package/dist/extraction.js +13 -11
  241. package/dist/fallback-llm-codex-subscription.d.ts +1 -1
  242. package/dist/fallback-llm-codex-subscription.js +1 -1
  243. package/dist/fallback-llm.d.ts +1 -1
  244. package/dist/fallback-llm.js +2 -2
  245. package/dist/{generic-recall-paths-CoXPSnCw.d.ts → generic-recall-paths-BkVVEoeO.d.ts} +1 -1
  246. package/dist/graph-append-error.d.ts +1 -1
  247. package/dist/graph-dashboard-diff.d.ts +1 -1
  248. package/dist/graph-dashboard-key.d.ts +1 -1
  249. package/dist/graph-dashboard-parser.d.ts +1 -1
  250. package/dist/graph-edge-reinforcement.d.ts +1 -1
  251. package/dist/graph-jsonl.d.ts +1 -1
  252. package/dist/graph-path-reconstruction.d.ts +1 -1
  253. package/dist/graph-path-scoring.d.ts +1 -1
  254. package/dist/graph-snapshot.d.ts +1 -1
  255. package/dist/graph.d.ts +1 -1
  256. package/dist/harmonic-retrieval.js +1 -1
  257. package/dist/importance.d.ts +1 -1
  258. package/dist/importers/index.d.ts +1 -1
  259. package/dist/importers/test-utils.d.ts +1 -1
  260. package/dist/in-flight-reads.d.ts +1 -1
  261. package/dist/{index-fdw_oK5a.d.ts → index-TBPe6NvB.d.ts} +3 -3
  262. package/dist/index.d.ts +28 -28
  263. package/dist/index.js +73 -69
  264. package/dist/intent.d.ts +1 -1
  265. package/dist/lcm/engine.d.ts +1 -1
  266. package/dist/lcm/index.d.ts +1 -1
  267. package/dist/lcm/tools.d.ts +1 -1
  268. package/dist/lifecycle.d.ts +1 -1
  269. package/dist/live-connectors-runner.d.ts +1 -1
  270. package/dist/{local-llm-3-jtw52a.d.ts → local-llm-DdrhmecM.d.ts} +1 -1
  271. package/dist/local-llm-config.js +1 -1
  272. package/dist/local-llm-helpers.d.ts +2 -2
  273. package/dist/local-llm.d.ts +2 -2
  274. package/dist/local-model-endpoint.d.ts +1 -1
  275. package/dist/location/index.d.ts +5 -5
  276. package/dist/location/index.js +8 -8
  277. package/dist/maintenance/memory-governance.d.ts +1 -1
  278. package/dist/maintenance/memory-governance.js +6 -6
  279. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  280. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +6 -6
  281. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  282. package/dist/maintenance/rebuild-memory-projection.js +7 -7
  283. package/dist/{maintenance-DgeeH0a1.d.ts → maintenance-B813YFWJ.d.ts} +3 -3
  284. package/dist/mcp-memory-inspector-app.d.ts +14 -14
  285. package/dist/memory-action-policy.d.ts +1 -1
  286. package/dist/memory-cache.d.ts +1 -1
  287. package/dist/memory-controller.d.ts +1 -1
  288. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  289. package/dist/memory-projection-store.d.ts +1 -1
  290. package/dist/memory-provenance.d.ts +1 -1
  291. package/dist/memory-snapshot.d.ts +1 -1
  292. package/dist/memory-subject-cli.d.ts +14 -14
  293. package/dist/memory-subject.d.ts +14 -14
  294. package/dist/memory-worth-outcomes.d.ts +2 -2
  295. package/dist/models-json.d.ts +1 -1
  296. package/dist/namespaces/migrate.d.ts +3 -3
  297. package/dist/namespaces/migrate.js +7 -7
  298. package/dist/namespaces/principal.d.ts +1 -1
  299. package/dist/namespaces/search.d.ts +1 -1
  300. package/dist/namespaces/storage.d.ts +3 -3
  301. package/dist/namespaces/storage.js +6 -6
  302. package/dist/native-knowledge.d.ts +1 -1
  303. package/dist/offline-sync-impression-drain.d.ts +1 -1
  304. package/dist/operator-doctor-corpus.d.ts +1 -1
  305. package/dist/operator-doctor-corpus.js +9 -9
  306. package/dist/operator-doctor-replica.d.ts +1 -1
  307. package/dist/operator-toolkit.d.ts +3 -3
  308. package/dist/operator-toolkit.js +16 -16
  309. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  310. package/dist/orchestration/maintenance.d.ts +4 -4
  311. package/dist/orchestration/maintenance.js +14 -14
  312. package/dist/{orchestrator-VXWKdatm.d.ts → orchestrator-BCvQavIS.d.ts} +10 -10
  313. package/dist/orchestrator.d.ts +11 -11
  314. package/dist/orchestrator.js +71 -69
  315. package/dist/patterns-cli.d.ts +1 -1
  316. package/dist/{pipeline-CwXZBKR5.d.ts → pipeline-4lqKJZ_0.d.ts} +1 -1
  317. package/dist/policy-runtime.d.ts +1 -1
  318. package/dist/proactive-contention.d.ts +2 -2
  319. package/dist/provenance.d.ts +1 -1
  320. package/dist/{public-http-B55s59aR.d.ts → public-http-NH72a6aa.d.ts} +1 -1
  321. package/dist/{qmd-DOLTPIQg.d.ts → qmd-DnoWaXKb.d.ts} +1 -1
  322. package/dist/qmd-preflight.d.ts +2 -2
  323. package/dist/qmd-recall-cache.d.ts +1 -1
  324. package/dist/qmd.d.ts +2 -2
  325. package/dist/recall-concurrency-config.d.ts +1 -1
  326. package/dist/recall-disclosure-escalation.d.ts +1 -1
  327. package/dist/recall-explain-renderer.d.ts +1 -1
  328. package/dist/recall-memory-map.d.ts +1 -1
  329. package/dist/recall-navigate-access.d.ts +1 -1
  330. package/dist/recall-navigate-disclosure.d.ts +1 -1
  331. package/dist/recall-navigate.d.ts +1 -1
  332. package/dist/recall-navigation-http-glue.d.ts +14 -14
  333. package/dist/recall-navigation-mcp-tools.d.ts +14 -14
  334. package/dist/recall-navigation-operations.js +25 -25
  335. package/dist/recall-navigation-renderer.d.ts +1 -1
  336. package/dist/recall-navigation.d.ts +1 -1
  337. package/dist/recall-navigation.js +24 -24
  338. package/dist/recall-planner-llm.d.ts +1 -1
  339. package/dist/recall-planner-llm.js +2 -2
  340. package/dist/recall-state-view-admission.d.ts +2 -2
  341. package/dist/recall-state-view-admission.js +3 -3
  342. package/dist/recall-state-view-anchors.d.ts +1 -1
  343. package/dist/recall-state.d.ts +1 -1
  344. package/dist/recall-tag-filter.d.ts +1 -1
  345. package/dist/recall-timings.d.ts +1 -1
  346. package/dist/recall-xray-cli.d.ts +1 -1
  347. package/dist/recall-xray-renderer.d.ts +1 -1
  348. package/dist/recall-xray.d.ts +1 -1
  349. package/dist/reconcile/cursor.d.ts +1 -1
  350. package/dist/reconcile/manifest.d.ts +1 -1
  351. package/dist/reconcile/manifest.js +2 -2
  352. package/dist/reconcile/plan.d.ts +1 -1
  353. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  354. package/dist/replay/normalizers/claude.d.ts +1 -1
  355. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  356. package/dist/replay/normalizers/shared.d.ts +1 -1
  357. package/dist/replay/runner.d.ts +1 -1
  358. package/dist/replay/types.d.ts +1 -1
  359. package/dist/replica-divergence.d.ts +1 -1
  360. package/dist/replica-peers-config.d.ts +1 -1
  361. package/dist/resolve-auth-token.d.ts +1 -1
  362. package/dist/resume-bundles.js +3 -3
  363. package/dist/retrieval-agents.d.ts +2 -2
  364. package/dist/retrieval-tiers.d.ts +1 -1
  365. package/dist/routing/engine.d.ts +1 -1
  366. package/dist/routing/store.d.ts +1 -1
  367. package/dist/salvage-envelope.d.ts +1 -1
  368. package/dist/{scope-profiles-C564-hrv.d.ts → scope-profiles-crazXegZ.d.ts} +1 -1
  369. package/dist/search/embed-helper.d.ts +1 -1
  370. package/dist/search/factory.d.ts +1 -1
  371. package/dist/search/index.d.ts +1 -1
  372. package/dist/search/lancedb-backend.d.ts +1 -1
  373. package/dist/search/meilisearch-backend.d.ts +1 -1
  374. package/dist/search/noop-backend.d.ts +1 -1
  375. package/dist/search/orama-backend.d.ts +1 -1
  376. package/dist/search/port.d.ts +1 -1
  377. package/dist/search/remote-backend.d.ts +1 -1
  378. package/dist/{semantic-consolidation-g6x-ShY8.d.ts → semantic-consolidation-B09JI9WM.d.ts} +1 -1
  379. package/dist/semantic-consolidation.d.ts +2 -2
  380. package/dist/semantic-consolidation.js +7 -7
  381. package/dist/semantic-rule-promotion.js +6 -6
  382. package/dist/semantic-rule-verifier.d.ts +1 -1
  383. package/dist/semantic-rule-verifier.js +6 -6
  384. package/dist/{service-CaCOk0rd.d.ts → service-Echc5Xso.d.ts} +2 -2
  385. package/dist/session-observer-bands.d.ts +1 -1
  386. package/dist/session-observer-state.d.ts +1 -1
  387. package/dist/shared-context/manager.d.ts +1 -1
  388. package/dist/signal.d.ts +1 -1
  389. package/dist/source-agent-qualifier.d.ts +1 -1
  390. package/dist/source-agent-qualifier.js +9 -9
  391. package/dist/source-attribution.d.ts +7 -4
  392. package/dist/source-attribution.js +1 -1
  393. package/dist/standup/build.js +6 -6
  394. package/dist/{storage-C9nsZX5Q.d.ts → storage-ClkHCQSE.d.ts} +1 -1
  395. package/dist/storage.d.ts +2 -2
  396. package/dist/storage.js +5 -5
  397. package/dist/subject-config.d.ts +1 -1
  398. package/dist/summarizer.d.ts +1 -1
  399. package/dist/summarizer.js +3 -3
  400. package/dist/summary-snapshot.d.ts +1 -1
  401. package/dist/support-passport/index.d.ts +17 -17
  402. package/dist/support-passport/index.js +27 -27
  403. package/dist/{tagging-BA4RFdH3.d.ts → tagging-ksktJ60G.d.ts} +2 -2
  404. package/dist/temporal-supersession.d.ts +2 -2
  405. package/dist/temporal-timeline-recall.d.ts +1 -1
  406. package/dist/temporal-validity.d.ts +1 -1
  407. package/dist/threading.d.ts +1 -1
  408. package/dist/tier-migration.d.ts +2 -2
  409. package/dist/tier-routing.d.ts +1 -1
  410. package/dist/topics.d.ts +1 -1
  411. package/dist/transcript.d.ts +1 -1
  412. package/dist/transfer/export-okf.d.ts +1 -1
  413. package/dist/transfer/export-okf.js +6 -6
  414. package/dist/trust-score-stage.d.ts +1 -1
  415. package/dist/trust-score.d.ts +1 -1
  416. package/dist/{types-Sps-lg5I.d.ts → types-nmhnJpxx.d.ts} +1 -1
  417. package/dist/types.d.ts +1 -1
  418. package/dist/utility-runtime.d.ts +1 -1
  419. package/dist/verified-recall.js +6 -6
  420. package/dist/who-knows-cli.d.ts +14 -14
  421. package/dist/who-knows-cli.js +7 -7
  422. package/dist/who-knows.d.ts +14 -14
  423. package/dist/who-knows.js +6 -6
  424. package/dist/write-envelope.d.ts +1 -1
  425. package/package.json +2 -2
  426. package/src/access-category-alias.test.ts +57 -0
  427. package/src/access-observe-write-category.ts +20 -1
  428. package/src/access-schema.ts +10 -0
  429. package/src/background-generation.test.ts +77 -0
  430. package/src/extraction-span-wire.test.ts +17 -1
  431. package/src/extraction-span-wire.ts +46 -3
  432. package/src/extraction.ts +2 -11
  433. package/src/local-llm-config.test.ts +21 -0
  434. package/src/local-llm-config.ts +1 -2
  435. package/src/providers/codex-subscription.test.ts +109 -3
  436. package/src/providers/codex-subscription.ts +57 -17
  437. package/src/source-attribution.test.ts +27 -0
  438. package/src/source-attribution.ts +41 -5
  439. package/src/summarizer.ts +18 -0
  440. package/dist/chunk-CRK6F6N3.js.map +0 -1
  441. package/dist/chunk-J2MGTGKC.js.map +0 -1
  442. package/dist/chunk-RJ7Z7YXK.js.map +0 -1
  443. package/dist/chunk-UHSOPTNB.js.map +0 -1
  444. package/dist/chunk-VNQRRUNS.js.map +0 -1
  445. package/dist/chunk-YTV6J4T6.js +0 -14
  446. package/dist/chunk-YTV6J4T6.js.map +0 -1
  447. /package/dist/{auto-sync-QZD4RD6H.js.map → auto-sync-DG5KEOF5.js.map} +0 -0
  448. /package/dist/{chunk-BZDK5EOD.js.map → chunk-2LRO73MN.js.map} +0 -0
  449. /package/dist/{chunk-JDL5BYYF.js.map → chunk-46A4RGBC.js.map} +0 -0
  450. /package/dist/{chunk-6EGIQEKC.js.map → chunk-4HTQ76O4.js.map} +0 -0
  451. /package/dist/{chunk-7L54ARML.js.map → chunk-4XTSKGLX.js.map} +0 -0
  452. /package/dist/{chunk-KOM36ILJ.js.map → chunk-5TKHJ5RW.js.map} +0 -0
  453. /package/dist/{chunk-IB7FDRRC.js.map → chunk-5XTILJRI.js.map} +0 -0
  454. /package/dist/{chunk-VJXMFBVR.js.map → chunk-6II55MXS.js.map} +0 -0
  455. /package/dist/{chunk-LT4H7SL5.js.map → chunk-7LKXP4QG.js.map} +0 -0
  456. /package/dist/{chunk-PF7LQ22G.js.map → chunk-A2YN3FR4.js.map} +0 -0
  457. /package/dist/{chunk-KDLOKVX7.js.map → chunk-AOMUIF3R.js.map} +0 -0
  458. /package/dist/{chunk-2YIUUXNK.js.map → chunk-B55FYF6F.js.map} +0 -0
  459. /package/dist/{chunk-2HDLDBJW.js.map → chunk-BOWAP64Q.js.map} +0 -0
  460. /package/dist/{chunk-PPDZSJXB.js.map → chunk-C3MCMFNV.js.map} +0 -0
  461. /package/dist/{chunk-DABSYX7V.js.map → chunk-D3DJYGU2.js.map} +0 -0
  462. /package/dist/{chunk-F2FJTOV6.js.map → chunk-DO6R3LIE.js.map} +0 -0
  463. /package/dist/{chunk-LD22AAJI.js.map → chunk-DSHSQGSN.js.map} +0 -0
  464. /package/dist/{chunk-3254BYQV.js.map → chunk-E5VOKZQV.js.map} +0 -0
  465. /package/dist/{chunk-46FVFU7S.js.map → chunk-EC5SVM6H.js.map} +0 -0
  466. /package/dist/{chunk-BPXJINHW.js.map → chunk-EUP4AXIW.js.map} +0 -0
  467. /package/dist/{chunk-KY75VZKG.js.map → chunk-F6AYWLRN.js.map} +0 -0
  468. /package/dist/{chunk-4AX5OYKC.js.map → chunk-FDDCZDBI.js.map} +0 -0
  469. /package/dist/{chunk-VHANUT45.js.map → chunk-HBGSZ62Z.js.map} +0 -0
  470. /package/dist/{chunk-M7H56FOQ.js.map → chunk-HVGCQMTQ.js.map} +0 -0
  471. /package/dist/{chunk-GMU7MAHS.js.map → chunk-IAT5WFEU.js.map} +0 -0
  472. /package/dist/{chunk-R3H2AXO2.js.map → chunk-IFULZYYQ.js.map} +0 -0
  473. /package/dist/{chunk-ZYSOT6HD.js.map → chunk-J3IWHCMF.js.map} +0 -0
  474. /package/dist/{chunk-QCTXQ2HW.js.map → chunk-J6NEOCQC.js.map} +0 -0
  475. /package/dist/{chunk-H2N6SLTR.js.map → chunk-JIWZVOQM.js.map} +0 -0
  476. /package/dist/{chunk-LUAQHDUI.js.map → chunk-JMBTNVMW.js.map} +0 -0
  477. /package/dist/{chunk-HKQAI6XI.js.map → chunk-JPNUKKSL.js.map} +0 -0
  478. /package/dist/{chunk-F6PTJLEM.js.map → chunk-K4KE5MYE.js.map} +0 -0
  479. /package/dist/{chunk-5AJZ7EUW.js.map → chunk-K75H7FSO.js.map} +0 -0
  480. /package/dist/{chunk-7F47R4H4.js.map → chunk-LZAJONO5.js.map} +0 -0
  481. /package/dist/{chunk-2WFOVXVJ.js.map → chunk-M7ECD3KN.js.map} +0 -0
  482. /package/dist/{chunk-KORQWGUA.js.map → chunk-MDYZCPNQ.js.map} +0 -0
  483. /package/dist/{chunk-IWHNT35B.js.map → chunk-N6I257OM.js.map} +0 -0
  484. /package/dist/{chunk-YR5QT4SR.js.map → chunk-NAFPHFDM.js.map} +0 -0
  485. /package/dist/{chunk-D7UUB33A.js.map → chunk-NGAFYIHQ.js.map} +0 -0
  486. /package/dist/{chunk-LXMZM7LM.js.map → chunk-NKDQXDFL.js.map} +0 -0
  487. /package/dist/{chunk-ZBSP4BSN.js.map → chunk-NRFUYVW7.js.map} +0 -0
  488. /package/dist/{chunk-XOCGC3FJ.js.map → chunk-OFBJD3V5.js.map} +0 -0
  489. /package/dist/{chunk-YPB3Y57U.js.map → chunk-OOBUWMPY.js.map} +0 -0
  490. /package/dist/{chunk-324HBGS4.js.map → chunk-OREGA7GY.js.map} +0 -0
  491. /package/dist/{chunk-4WMGRLTV.js.map → chunk-Q4MI2KCG.js.map} +0 -0
  492. /package/dist/{chunk-MOL7JK4F.js.map → chunk-R4HFCATE.js.map} +0 -0
  493. /package/dist/{chunk-AKB44K3D.js.map → chunk-SPN5YFXN.js.map} +0 -0
  494. /package/dist/{chunk-2PIC6CEN.js.map → chunk-T2ZNUWUY.js.map} +0 -0
  495. /package/dist/{chunk-NHFXGNGC.js.map → chunk-TFS5FAAC.js.map} +0 -0
  496. /package/dist/{chunk-JDOBQPJY.js.map → chunk-TNQR7N52.js.map} +0 -0
  497. /package/dist/{chunk-JWBDHA4F.js.map → chunk-UJXNBZYJ.js.map} +0 -0
  498. /package/dist/{chunk-DDGQDNQW.js.map → chunk-VA5QRTZX.js.map} +0 -0
  499. /package/dist/{chunk-XIJHRQ4A.js.map → chunk-W6YDAIVB.js.map} +0 -0
  500. /package/dist/{chunk-GKKLI23D.js.map → chunk-WCQ7L54B.js.map} +0 -0
  501. /package/dist/{chunk-3YQ7VLP3.js.map → chunk-WMTYEQO5.js.map} +0 -0
  502. /package/dist/{chunk-VKDXYEA6.js.map → chunk-WNMVUWI7.js.map} +0 -0
  503. /package/dist/{chunk-OGAKUA7I.js.map → chunk-YHSEUZV5.js.map} +0 -0
  504. /package/dist/{chunk-GR76OKET.js.map → chunk-YSBYNCCN.js.map} +0 -0
  505. /package/dist/{chunk-QUBPZQED.js.map → chunk-Z5YNVWRD.js.map} +0 -0
  506. /package/dist/{chunk-UCLWIMVW.js.map → chunk-ZLVURGAJ.js.map} +0 -0
  507. /package/dist/{chunk-M6FKXOYV.js.map → chunk-ZQ533JDE.js.map} +0 -0
  508. /package/dist/{chunk-TRTLWUDD.js.map → chunk-ZTHGFTMW.js.map} +0 -0
@@ -56,8 +56,7 @@ function parseLocalLlmMaxContext(value: unknown): number | undefined {
56
56
  function copyStringRecord(value: unknown): Record<string, string> | undefined {
57
57
  if (!value || typeof value !== "object" || Array.isArray(value)) return undefined;
58
58
  const headers: Record<string, string> = {};
59
- for (const key of Object.getOwnPropertyNames(value)) {
60
- const headerValue = Reflect.get(value, key);
59
+ for (const [key, headerValue] of Object.entries(value)) {
61
60
  if (typeof headerValue === "string") headers[key] = headerValue;
62
61
  }
63
62
  return headers;
@@ -452,10 +452,10 @@ test("request deadline starts before login and login consumes the same budget",
452
452
  options: { timeoutMs },
453
453
  });
454
454
 
455
- // Login shares the 5s budget (capped at the 10s login-status ceiling) and
456
- // exec only gets what login left: 5s - 2s.
455
+ // The shared login subprocess uses the 10s ceiling; this caller still
456
+ // spends its 5s budget and exec only gets what login left: 5s - 2s.
457
457
  await call(5_000);
458
- assert.deepEqual(loginTimeouts, [5_000]);
458
+ assert.deepEqual(loginTimeouts, [10_000]);
459
459
  assert.equal(execCalls.length, 1);
460
460
  assert.equal(execCalls[0]?.timeoutMs, 3_000);
461
461
 
@@ -731,6 +731,112 @@ test("shared login check: each caller times out on its own budget, without cance
731
731
  assert.equal(loginCalls, 1);
732
732
  });
733
733
 
734
+ test("shared login check does not inherit the first waiter's shorter deadline", async () => {
735
+ __codexSubscriptionTestHooks.resetLoginStatusCache();
736
+ const loginTimeouts: number[] = [];
737
+ const loginPending = Promise.withResolvers<{ status: number | null; stdout: string; stderr: string }>();
738
+ const runner = createCodexSubscriptionRunner({
739
+ env: { HOME: "/home/alice", PATH: "/usr/bin:/bin" },
740
+ now: () => 0,
741
+ runLoginStatus: (_executable, _env, timeoutMs) => {
742
+ loginTimeouts.push(timeoutMs);
743
+ return loginPending.promise;
744
+ },
745
+ runCodexExec: async () => ({ status: 0, stdout: "", stderr: "", outputText: "ok" }),
746
+ });
747
+ const call = (timeoutMs: number) =>
748
+ runner({
749
+ config: { executable: "codex-fake" },
750
+ modelId: "gpt-5.6-luna",
751
+ messages: [{ role: "user", content: "hi" }],
752
+ options: { timeoutMs },
753
+ });
754
+
755
+ const short = call(120);
756
+ await flushLoop();
757
+ assert.deepEqual(loginTimeouts, [10_000], "shared check uses the login-status ceiling, not the first waiter's 120ms");
758
+
759
+ const long = call(10_000);
760
+ await flushLoop();
761
+ assert.equal(loginTimeouts.length, 1, "the longer waiter must reuse the in-flight check");
762
+
763
+ const startedAt = Date.now();
764
+ await assert.rejects(short, (error: unknown) => {
765
+ assert.ok(error instanceof CodexSubscriptionTimeoutError);
766
+ assert.equal(error.name, "TimeoutError");
767
+ return true;
768
+ });
769
+ assert.ok(Date.now() - startedAt < 5_000, "short waiter must not wait for the 10s ceiling");
770
+
771
+ loginPending.resolve({ status: 0, stdout: "Logged in using ChatGPT\n", stderr: "" });
772
+ assert.equal((await long).content, "ok");
773
+ });
774
+
775
+ test("in-flight login checks are scoped to the owning runner", async () => {
776
+ __codexSubscriptionTestHooks.resetLoginStatusCache();
777
+ let loginCallsA = 0;
778
+ let loginCallsB = 0;
779
+ const pendingA = Promise.withResolvers<{ status: number | null; stdout: string; stderr: string }>();
780
+ const pendingB = Promise.withResolvers<{ status: number | null; stdout: string; stderr: string }>();
781
+ const env = { HOME: "/home/alice", PATH: "/usr/bin:/bin" };
782
+ const makeRunner = (
783
+ bump: () => void,
784
+ pending: Promise<{ status: number | null; stdout: string; stderr: string }>,
785
+ ) =>
786
+ createCodexSubscriptionRunner({
787
+ env,
788
+ now: () => 0,
789
+ runLoginStatus: () => {
790
+ bump();
791
+ return pending;
792
+ },
793
+ runCodexExec: async () => ({ status: 0, stdout: "", stderr: "", outputText: "ok" }),
794
+ });
795
+ const runnerA = makeRunner(() => {
796
+ loginCallsA++;
797
+ }, pendingA.promise);
798
+ const runnerB = makeRunner(() => {
799
+ loginCallsB++;
800
+ }, pendingB.promise);
801
+ const call = (target: typeof runnerA, signal?: AbortSignal) =>
802
+ target({
803
+ config: { executable: "codex-fake" },
804
+ modelId: "gpt-5.6-luna",
805
+ messages: [{ role: "user", content: "hi" }],
806
+ options: { timeoutMs: 60_000, ...(signal ? { signal } : {}) },
807
+ });
808
+
809
+ const abortA = new AbortController();
810
+ const first = call(runnerA, abortA.signal);
811
+ await flushLoop();
812
+ assert.equal(loginCallsA, 1);
813
+
814
+ const second = call(runnerB);
815
+ await flushLoop();
816
+ assert.equal(loginCallsB, 1, "unrelated runner must not share the in-flight login");
817
+ assert.equal(loginCallsA, 1);
818
+
819
+ abortA.abort(new Error("A cancelled"));
820
+ await assert.rejects(first, (error: unknown) => error instanceof Error && error.message === "A cancelled");
821
+
822
+ pendingB.resolve({ status: 0, stdout: "Logged in using ChatGPT\n", stderr: "" });
823
+ assert.equal((await second).content, "ok");
824
+ assert.equal(loginCallsB, 1);
825
+
826
+ let loginCallsC = 0;
827
+ const runnerC = createCodexSubscriptionRunner({
828
+ env,
829
+ now: () => 0,
830
+ runLoginStatus: () => {
831
+ loginCallsC++;
832
+ return Promise.resolve({ status: 0, stdout: "Logged in using ChatGPT\n", stderr: "" });
833
+ },
834
+ runCodexExec: async () => ({ status: 0, stdout: "", stderr: "", outputText: "ok" }),
835
+ });
836
+ assert.equal((await call(runnerC)).content, "ok");
837
+ assert.equal(loginCallsC, 0, "settled login success remains reusable across runners");
838
+ });
839
+
734
840
  test("caller abort reaches the cold login check: no spawn when pre-aborted, wait aborts in flight", async () => {
735
841
  __codexSubscriptionTestHooks.resetLoginStatusCache();
736
842
  const loginSignals: (AbortSignal | undefined)[] = [];
@@ -177,7 +177,7 @@ export interface CodexSubscriptionRunnerDeps {
177
177
  /** Runs `codex exec`. Default: isolated subprocess via launchProcess. */
178
178
  runCodexExec?: (request: CodexSubscriptionExecRequest) => Promise<CodexSubscriptionExecResult>;
179
179
  /** Runs `codex login status`. Default: isolated subprocess. Receives the
180
- * login-status timeout budget (capped by the request deadline) and the
180
+ * shared login-status ceiling (not any one caller's deadline) and the
181
181
  * shared-check abort signal (fires when the last waiter leaves). */
182
182
  runLoginStatus?: (
183
183
  executable: string,
@@ -210,6 +210,7 @@ interface LoginStatusCacheEntry {
210
210
  }
211
211
 
212
212
  const loginStatusCache = new Map<string, LoginStatusCacheEntry>();
213
+ const inFlightLoginByRunner = new WeakMap<CodexCliFallbackRunner, Map<string, LoginStatusCacheEntry>>();
213
214
  const childrenByRunner = new WeakMap<CodexCliFallbackRunner, Set<number>>();
214
215
  const runnerByOwner = new WeakMap<object, CodexCliFallbackRunner>();
215
216
  const shutdownByRunner = new WeakMap<CodexCliFallbackRunner, AbortController>();
@@ -239,6 +240,7 @@ export function createCodexSubscriptionRunner(deps: CodexSubscriptionRunnerDeps
239
240
  { ...request, options: { ...request.options, signal } },
240
241
  runnerDeps,
241
242
  envSource,
243
+ runner,
242
244
  );
243
245
  };
244
246
  childrenByRunner.set(runner, children);
@@ -320,7 +322,8 @@ export function beginCodexSubscriptionShutdown(
320
322
  async function runCodexSubscriptionRequest(
321
323
  request: CodexCliFallbackRequest,
322
324
  deps: CodexSubscriptionRunnerDeps,
323
- envSource: NodeJS.ProcessEnv
325
+ envSource: NodeJS.ProcessEnv,
326
+ runner: CodexCliFallbackRunner,
324
327
  ): Promise<CodexCliFallbackResult> {
325
328
  const { config } = request;
326
329
  assertNoApiKeyConfig(config);
@@ -339,7 +342,7 @@ async function runCodexSubscriptionRequest(
339
342
  throw abortErrorOf(request.options.signal);
340
343
  }
341
344
  await assertSubscriptionLogin(executable, env, deps, {
342
- loginStatusTimeoutMs: Math.min(LOGIN_STATUS_TIMEOUT_MS, timeoutMs),
345
+ runner,
343
346
  callerTimeoutMs: timeoutMs,
344
347
  deadlineStartedAt,
345
348
  signal: request.options.signal,
@@ -460,8 +463,7 @@ function isAllowedEnvKey(key: string): boolean {
460
463
  }
461
464
 
462
465
  interface LoginCheckContext {
463
- /** Budget for the login-status subprocess itself. */
464
- loginStatusTimeoutMs: number;
466
+ runner: CodexCliFallbackRunner;
465
467
  /** The caller's overall effective deadline (login + exec). */
466
468
  callerTimeoutMs: number;
467
469
  deadlineStartedAt: number;
@@ -483,16 +485,32 @@ async function assertSubscriptionLogin(
483
485
  ctx: LoginCheckContext
484
486
  ): Promise<void> {
485
487
  const now = deps.now ?? Date.now;
486
- const cacheKey = `${executable}\0${resolveCodexAuthHome(env) ?? ""}`;
488
+ const cacheKey = loginCacheKey(executable, env);
489
+ const inflight = inFlightLoginsFor(ctx.runner).get(cacheKey);
490
+ if (inflight && now() - inflight.at < LOGIN_STATUS_CACHE_TTL_MS) {
491
+ await waitForLoginEntry(inflight, cacheKey, ctx, now);
492
+ return;
493
+ }
487
494
  const cached = loginStatusCache.get(cacheKey);
488
495
  if (cached && now() - cached.at < LOGIN_STATUS_CACHE_TTL_MS) {
489
496
  if (!cached.settled || (await authStoreFingerprint(env)) === cached.fingerprint) {
490
497
  await waitForLoginEntry(cached, cacheKey, ctx, now);
491
498
  return;
492
499
  }
493
-
500
+ if (loginStatusCache.get(cacheKey) === cached) {
501
+ loginStatusCache.delete(cacheKey);
502
+ }
503
+ }
504
+ const raced = inFlightLoginsFor(ctx.runner).get(cacheKey);
505
+ if (raced && now() - raced.at < LOGIN_STATUS_CACHE_TTL_MS) {
506
+ await waitForLoginEntry(raced, cacheKey, ctx, now);
507
+ return;
508
+ }
509
+ const published = loginStatusCache.get(cacheKey);
510
+ if (published && now() - published.at < LOGIN_STATUS_CACHE_TTL_MS) {
511
+ await waitForLoginEntry(published, cacheKey, ctx, now);
512
+ return;
494
513
  }
495
- loginStatusCache.delete(cacheKey);
496
514
  if (ctx.signal?.aborted) {
497
515
  throw abortErrorOf(ctx.signal);
498
516
  }
@@ -504,19 +522,19 @@ async function assertSubscriptionLogin(
504
522
  controller: new AbortController(),
505
523
  promise: Promise.resolve(undefined),
506
524
  };
507
- entry.promise = runLoginStatusCheck(executable, env, deps, ctx, entry);
525
+ entry.promise = runLoginStatusCheck(executable, env, deps, entry);
508
526
  entry.promise.then(
509
527
  () => {
510
528
  entry.settled = true;
529
+ loginStatusCache.set(cacheKey, entry);
530
+ dropInFlightLogin(ctx.runner, cacheKey, entry);
511
531
  },
512
532
  () => {
513
533
  entry.settled = true;
514
- if (loginStatusCache.get(cacheKey) === entry) {
515
- loginStatusCache.delete(cacheKey);
516
- }
534
+ dropInFlightLogin(ctx.runner, cacheKey, entry);
517
535
  }
518
536
  );
519
- loginStatusCache.set(cacheKey, entry);
537
+ inFlightLoginsFor(ctx.runner).set(cacheKey, entry);
520
538
  await waitForLoginEntry(entry, cacheKey, ctx, now);
521
539
  }
522
540
 
@@ -524,16 +542,15 @@ async function runLoginStatusCheck(
524
542
  executable: string,
525
543
  env: NodeJS.ProcessEnv,
526
544
  deps: CodexSubscriptionRunnerDeps,
527
- ctx: LoginCheckContext,
528
545
  entry: LoginStatusCacheEntry
529
546
  ): Promise<void> {
530
547
  const runLoginStatus = deps.runLoginStatus!;
531
- const result = await runLoginStatus(executable, env, ctx.loginStatusTimeoutMs, entry.controller.signal);
548
+ const result = await runLoginStatus(executable, env, LOGIN_STATUS_TIMEOUT_MS, entry.controller.signal);
532
549
  const output = `${result.stdout}\n${result.stderr}`.trim();
533
550
  if (TIMEOUT_PATTERN.test(output)) {
534
551
  // A login-status subprocess timeout is a deadline expiry, not an auth
535
552
  // failure — never report it as "unauthenticated".
536
- throw new CodexSubscriptionTimeoutError(ctx.loginStatusTimeoutMs);
553
+ throw new CodexSubscriptionTimeoutError(LOGIN_STATUS_TIMEOUT_MS);
537
554
  }
538
555
  if (result.status === 0 && LOGIN_OK_PATTERN.test(output)) {
539
556
  entry.fingerprint = await authStoreFingerprint(env);
@@ -602,6 +619,7 @@ async function waitForLoginEntry(
602
619
  entry.waiters--;
603
620
  if (entry.waiters <= 0 && !entry.settled) {
604
621
  entry.controller.abort();
622
+ dropInFlightLogin(ctx.runner, cacheKey, entry);
605
623
  if (loginStatusCache.get(cacheKey) === entry) {
606
624
  loginStatusCache.delete(cacheKey);
607
625
  }
@@ -633,6 +651,28 @@ function resolveCodexAuthHome(env: NodeJS.ProcessEnv): string | undefined {
633
651
  return profile ? path.join(profile, ".codex") : undefined;
634
652
  }
635
653
 
654
+ function loginCacheKey(executable: string, env: NodeJS.ProcessEnv): string {
655
+ return `${executable}\0${resolveCodexAuthHome(env) ?? ""}`;
656
+ }
657
+
658
+ function inFlightLoginsFor(runner: CodexCliFallbackRunner): Map<string, LoginStatusCacheEntry> {
659
+ let map = inFlightLoginByRunner.get(runner);
660
+ if (!map) {
661
+ map = new Map();
662
+ inFlightLoginByRunner.set(runner, map);
663
+ }
664
+ return map;
665
+ }
666
+
667
+ function dropInFlightLogin(
668
+ runner: CodexCliFallbackRunner,
669
+ cacheKey: string,
670
+ entry: LoginStatusCacheEntry,
671
+ ): void {
672
+ const map = inFlightLoginByRunner.get(runner);
673
+ if (map?.get(cacheKey) === entry) map.delete(cacheKey);
674
+ }
675
+
636
676
  /**
637
677
  * Args mirror the bench provider: fully sandboxed, ephemeral, no tools/hooks/
638
678
  * plugins/memories — extraction must behave as a plain completion endpoint.
@@ -755,7 +795,7 @@ function execFailureError(
755
795
  }
756
796
  if (AUTH_FAILURE_PATTERN.test(combined)) {
757
797
  // Re-check login on the next request; the cached status is now stale.
758
- loginStatusCache.delete(`${executable}\0${env.CODEX_HOME ?? env.HOME ?? ""}`);
798
+ loginStatusCache.delete(loginCacheKey(executable, env));
759
799
  return new CodexSubscriptionAuthError(
760
800
  "expired_or_revoked",
761
801
  "codex-subscription: the Codex CLI rejected the request as unauthenticated " +
@@ -16,6 +16,7 @@ import {
16
16
  formatCitation,
17
17
  hasCitation,
18
18
  hasCitationForTemplate,
19
+ lastRecognizedCitationMarker,
19
20
  parseAllCitations,
20
21
  parseCitation,
21
22
  stripCitation,
@@ -578,6 +579,32 @@ test("citationTemplatesToRecognize drops undetectable shapes and keeps prior his
578
579
  ]);
579
580
  });
580
581
 
582
+ test("stripCitationForTemplate: literal template strips the exact marker (#2951)", () => {
583
+ const template = "[cited-fixed]";
584
+ const body = "Fact body. [cited-fixed]";
585
+ assert.equal(citationTemplateIsDetectable(template), true);
586
+ assert.equal(hasCitationForTemplate(body, template), true);
587
+ assert.equal(stripCitationForTemplate(body, template), "Fact body.");
588
+ });
589
+
590
+ test("citationTemplatesToRecognize: overlapping custom marker wins over inner default (#2951)", () => {
591
+ const custom = "[Source: agent={agent}, session={sessionId}, ts={ts}; via={agent}]";
592
+ const ctx = {
593
+ agent: "planner",
594
+ session: "agent:planner:main",
595
+ ts: "2026-04-10T14:25:07Z",
596
+ };
597
+ const marker = formatCitation(ctx, custom);
598
+ const body = `The cadence is weekly. ${marker}`;
599
+ const recognized = citationTemplatesToRecognize(custom);
600
+ assert.ok(
601
+ recognized.indexOf(custom) < recognized.indexOf(DEFAULT_CITATION_FORMAT),
602
+ "current overlapping template must be recognized before the inner default",
603
+ );
604
+ assert.equal(lastRecognizedCitationMarker(body, recognized), marker);
605
+ assert.equal(stripRecognizedCitations(body, recognized), "The cadence is weekly.");
606
+ });
607
+
581
608
  test("formatCitation: substituted values containing placeholder syntax are not re-interpreted", () => {
582
609
  // Regression for PR #401 (low-severity): the previous implementation chained
583
610
  // `.replace(/\{agent\}/g, ...)`, `.replace(/\{ts\}/g, ...)` etc. If the agent
@@ -499,10 +499,10 @@ export function citationTemplateIsDetectable(template: string): boolean {
499
499
  }
500
500
 
501
501
  /**
502
- * Templates the merge path may lift, preserve, or strip: the default
503
- * format, the current format when it is detectable, then any prior
504
- * configured formats the caller still holds. Undetectable shapes are
505
- * dropped so we never hash or attach a marker we cannot re-match.
502
+ * Templates the merge path may lift, preserve, or strip. Longest
503
+ * templates first so an overlapping custom marker beats an inner default
504
+ * match; the current template wins equal-length ties. Undetectable
505
+ * shapes are dropped so we never hash or attach a marker we cannot re-match.
506
506
  */
507
507
  export function citationTemplatesToRecognize(
508
508
  primary: string | undefined,
@@ -514,9 +514,15 @@ export function citationTemplatesToRecognize(
514
514
  if (!citationTemplateIsDetectable(template)) return;
515
515
  if (!out.includes(template)) out.push(template);
516
516
  };
517
- add(DEFAULT_CITATION_FORMAT);
518
517
  add(primary);
519
518
  for (const template of extra) add(template);
519
+ add(DEFAULT_CITATION_FORMAT);
520
+ out.sort((a, b) => {
521
+ if (b.length !== a.length) return b.length - a.length;
522
+ if (a === primary && b !== primary) return -1;
523
+ if (b === primary && a !== primary) return 1;
524
+ return 0;
525
+ });
520
526
  return out;
521
527
  }
522
528
 
@@ -708,6 +714,9 @@ export function stripCitation(text: string): string {
708
714
  * written under the default format can carry the default marker plus a
709
715
  * custom marker appended after a config change; returning after the
710
716
  * default pass alone left the custom marker inside hash inputs (#2330).
717
+ * - Fully-literal templates (no placeholders) are stripped by exact match
718
+ * of the template text, the same inclusion check `hasCitationForTemplate`
719
+ * uses.
711
720
  * - All-placeholder templates (no literal prefix/suffix/separator) cannot
712
721
  * produce a reliable matcher. `hasCitationForTemplate` already returns
713
722
  * `false` for such templates, so this function never attempts to strip an
@@ -731,6 +740,13 @@ export function stripCitationForTemplate(
731
740
 
732
741
  if (!hasCitationForTemplate(afterDefault, template)) return afterDefault;
733
742
 
743
+ PLACEHOLDER_REGEX.lastIndex = 0;
744
+ if (!PLACEHOLDER_REGEX.test(template)) {
745
+ PLACEHOLDER_REGEX.lastIndex = 0;
746
+ return stripExactLiteralCitation(afterDefault, template);
747
+ }
748
+ PLACEHOLDER_REGEX.lastIndex = 0;
749
+
734
750
  // Build the template matcher. hasCitationForTemplate already returned true,
735
751
  // which means templateMatcher produced a non-null result. The null branch
736
752
  // here is a defensive fallback only — the default pass already ran.
@@ -769,6 +785,26 @@ export function stripCitationForTemplate(
769
785
  return result.trimEnd();
770
786
  }
771
787
 
788
+ function stripExactLiteralCitation(text: string, marker: string): string {
789
+ if (marker.length === 0) return text;
790
+ let result = "";
791
+ let lastIndex = 0;
792
+ let idx = text.indexOf(marker);
793
+ if (idx === -1) return text;
794
+ while (idx !== -1) {
795
+ const before = text.slice(lastIndex, idx).replace(/[ \t]+$/, "");
796
+ result += before;
797
+ lastIndex = idx + marker.length;
798
+ idx = text.indexOf(marker, lastIndex);
799
+ }
800
+ const after = text.slice(lastIndex).replace(/^[ \t]+/, "");
801
+ if (after.length > 0) {
802
+ if (result.length > 0) result += " ";
803
+ result += after;
804
+ }
805
+ return result.trimEnd();
806
+ }
807
+
772
808
  function enclosingDelimiterRange(
773
809
  text: string,
774
810
  start: number,
package/src/summarizer.ts CHANGED
@@ -360,6 +360,24 @@ Respond with valid JSON matching this schema:
360
360
 
361
361
  const user = `Hour: ${hourIso}\nSession: ${sessionKey}\n\n${statsLine}${toolStatsLine}Conversation:\n${conversation}\n`;
362
362
 
363
+ if (this.config.backgroundGeneration) {
364
+ try {
365
+ const text = await completeBackgroundGeneration(this.config, [
366
+ { role: "system", content: sys },
367
+ { role: "user", content: user },
368
+ ]);
369
+ const parsed = parseBackgroundGenerationJson(text, (value) => HourlySummaryExtendedSchema.parse(value));
370
+ if (parsed) {
371
+ log.debug(
372
+ `generated extended hourly summary for ${sessionKey} at ${hourIso} in ${Date.now() - startTime}ms (background)`
373
+ );
374
+ return { ...parsed, _meta: { userTurns, assistantTurns, toolCalls, toolCounts } };
375
+ }
376
+ } catch {
377
+ log.info("extended summary: background generation unavailable, continuing");
378
+ }
379
+ }
380
+
363
381
  // Try local LLM first if enabled
364
382
  if (this.shouldUseLocalLlm) {
365
383
  try {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/access-schema.ts"],"sourcesContent":["// Request/response schema validation for the Remnic HTTP API.\n// Uses zod for runtime validation — returns structured 400 errors with\n// field-level detail so consumers get clear feedback on malformed requests.\n\nimport { z } from \"zod\";\n\nimport type { MemoryCategory } from \"./types.js\";\nimport {\n ACTION_CONFIDENCE_CONTEXT_READINESS,\n ACTION_CONFIDENCE_RISK_CATEGORIES,\n ACTION_CONFIDENCE_RULE_KINDS,\n} from \"./action-confidence.js\";\nimport { isValidCapsuleSince } from \"./transfer/capsule-export.js\";\nimport { validateArchiveRelativePath } from \"./transfer/fs-utils.js\";\nimport { CAPSULE_ID_PATTERN } from \"./transfer/types.js\";\nimport {\n OFFLINE_SYNC_FILE_CONTENT_MAX_CHUNK_BYTES,\n OFFLINE_SYNC_MAX_MTIME_MS,\n} from \"./offline-sync.js\";\n\n// ---------------------------------------------------------------------------\n// Error formatting\n// ---------------------------------------------------------------------------\n\nexport interface SchemaValidationError {\n error: string;\n code: \"validation_error\";\n details: Array<{ field: string; message: string }>;\n}\n\nexport function formatZodError(error: z.ZodError): SchemaValidationError {\n return {\n error: \"request validation failed\",\n code: \"validation_error\",\n details: error.issues.map((issue) => ({\n field: issue.path.join(\".\") || \"(root)\",\n message: issue.message,\n })),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Shared fields\n// ---------------------------------------------------------------------------\n\nconst namespaceSchema = z.string().trim().max(256).optional();\nconst sessionKeySchema = z.string().trim().min(1).max(512).optional();\nconst idempotencyKeySchema = z.string().trim().min(1).max(256).optional();\nconst cwdSchema = z.string().trim().min(1, \"cwd must be non-empty when provided\").max(2048).optional();\nconst projectTagSchema = z\n .string()\n .trim()\n .min(1, \"projectTag must be non-empty when provided\")\n .max(256)\n .optional();\nconst deadlineMsSchema = z.number().finite().min(0).max(Number.MAX_SAFE_INTEGER).optional();\nconst dryRunSchema = z.boolean().optional();\nconst schemaVersionSchema = z.number().int().optional();\nconst timeZoneSchema = z\n .string()\n .trim()\n .min(1)\n .max(128)\n .refine((value) => {\n try {\n Intl.DateTimeFormat(undefined, { timeZone: value });\n return true;\n } catch {\n return false;\n }\n }, \"must be a valid IANA timezone\");\n\n// ---------------------------------------------------------------------------\n// Recall\n// ---------------------------------------------------------------------------\n\n/**\n * Coding-agent context (issue #569). Optional payload that connectors may\n * ship with a recall request so the project/branch namespace overlay\n * applies to that recall. All fields are validated per CLAUDE.md #51 —\n * empty-string projectId / rootPath is rejected, not silently accepted.\n */\nexport const codingContextSchema = z\n .object({\n projectId: z.string().trim().min(1, \"codingContext.projectId is required\").max(128),\n branch: z.string().trim().max(256).nullable(),\n rootPath: z.string().trim().min(1, \"codingContext.rootPath is required\").max(1024),\n defaultBranch: z.string().trim().max(256).nullable(),\n })\n .nullable();\n\n/**\n * Recall disclosure depth (issue #677). Mirrors the `RecallDisclosure`\n * type in `types.ts` — keep these in sync. Default-application happens\n * inside `EngramAccessService.recall()`; the schema only accepts/rejects.\n * Invalid values throw a structured 400 instead of silently defaulting,\n * per CLAUDE.md rule 51.\n */\nexport const recallDisclosureSchema = z.enum([\"chunk\", \"section\", \"raw\"]);\n\n/**\n * Tag-match semantics (issue #689). `any` (default when `tags` is provided\n * and `tagMatch` is omitted) admits a result when it carries at least one\n * of the filter tags. `all` requires every filter tag to be present.\n * Schema rejects unknown values up front — never silently defaults\n * (CLAUDE.md rule 51).\n */\nexport const tagMatchSchema = z.enum([\"any\", \"all\"]);\n\nexport const recallRequestSchema = z.object({\n query: z.string().min(1, \"query is required\"),\n sessionKey: sessionKeySchema,\n namespace: namespaceSchema,\n topK: z.number().int().min(0).max(200).optional(),\n mode: z.enum([\"auto\", \"no_recall\", \"minimal\", \"full\", \"graph_mode\"]).optional(),\n includeDebug: z.boolean().optional(),\n idempotencyKey: idempotencyKeySchema,\n disclosure: recallDisclosureSchema.optional(),\n codingContext: codingContextSchema.optional(),\n /** Working directory for auto git-context resolution (issue #569). */\n cwd: cwdSchema,\n /**\n * Arbitrary project tag for non-git-based project scoping (issue #569).\n * Creates a coding context with `projectId: \"tag:<projectTag>\"`.\n */\n projectTag: projectTagSchema,\n /**\n * Historical recall pin (issue #680). ISO 8601 timestamp. The\n * schema only enforces the basic shape; the access service runs\n * `Date.parse` and emits a structured 400 on malformed input\n * (CLAUDE.md rule 51).\n */\n asOf: z.string().trim().min(1, \"asOf must be a non-empty ISO 8601 timestamp\").max(64).optional(),\n /**\n * Free-form recall tag filter (issue #689). When provided, recall results\n * whose frontmatter `tags` do not match the filter are removed before the\n * response is returned. Comparison is case-sensitive exact match.\n */\n tags: z.array(z.string().trim().min(1).max(256)).max(50).optional(),\n /**\n * Match mode for `tags` (issue #689). Defaults to `\"any\"` when `tags` is\n * provided and `tagMatch` is omitted. Ignored when `tags` is absent.\n */\n tagMatch: tagMatchSchema.optional(),\n /**\n * Include graph edges below `graphTraversalConfidenceFloor` for diagnostic\n * recall traversal (issue #681). Defaults to false.\n */\n includeLowConfidence: z.boolean().optional(),\n /**\n * #1952 — per-call opt-in to state-aware recall views for this recall.\n * ORs with the `recallStateViews` config flag; a change-intent query\n * (e.g. \"when did\", \"used to\", \"switched\") is still required for any\n * effect, so this can never perturb ordinary recalls.\n */\n stateView: z.boolean().optional(),\n});\n\nexport const recallExplainRequestSchema = z.object({\n sessionKey: sessionKeySchema,\n namespace: namespaceSchema,\n});\n\n/**\n * Standalone \"set coding context\" request. Used by the HTTP endpoint\n * `POST /engram/v1/coding-context` and the MCP `remnic.set_coding_context`\n * tool (PR 7). `codingContext: null` clears the attached context.\n */\nexport const setCodingContextRequestSchema = z\n .object({\n sessionKey: z.string().trim().min(1, \"sessionKey is required\").max(512),\n codingContext: codingContextSchema.optional(),\n /**\n * Project tag shorthand for non-git-based project scoping. When\n * `codingContext` is omitted, this becomes\n * `{ projectId: \"tag:<projectTag>\", branch: null, rootPath: \"tag:<projectTag>\", defaultBranch: null }`.\n */\n projectTag: z.string().trim().min(1, \"projectTag must be non-empty when provided\").max(256).optional(),\n })\n .superRefine((value, ctx) => {\n if (value.codingContext === undefined && value.projectTag === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"codingContext or projectTag is required\",\n path: [\"codingContext\"],\n });\n }\n });\n\n// ---------------------------------------------------------------------------\n// Observe\n// ---------------------------------------------------------------------------\n\nconst messageSchema = z.object({\n role: z.enum([\"user\", \"assistant\"]),\n content: z.string().min(1, \"message content must be non-empty\"),\n sourceFormat: z\n .enum([\"openai\", \"anthropic\", \"openclaw\", \"pi\", \"lossless-claw\", \"remnic\"])\n .nullable()\n .optional(),\n rawContent: z.unknown().nullable().optional(),\n parts: z\n .array(\n z.object({\n ordinal: z.number().int().min(0).nullable().optional(),\n kind: z.enum([\n \"text\",\n \"tool_call\",\n \"tool_result\",\n \"patch\",\n \"file_read\",\n \"file_write\",\n \"step_start\",\n \"step_finish\",\n \"snapshot\",\n \"retry\",\n ]),\n payload: z.record(z.string(), z.unknown()),\n toolName: z.string().nullable().optional(),\n tool_name: z.string().nullable().optional(),\n filePath: z.string().nullable().optional(),\n file_path: z.string().nullable().optional(),\n createdAt: z.string().nullable().optional(),\n created_at: z.string().nullable().optional(),\n }),\n )\n .nullable()\n .optional(),\n});\n\nexport const observeRequestSchema = z.object({\n sessionKey: z.string().trim().min(1, \"sessionKey is required\").max(512),\n messages: z.array(messageSchema).min(1, \"messages must be a non-empty array\"),\n namespace: namespaceSchema,\n skipExtraction: z.boolean().optional(),\n /**\n * Optional idempotency key for server-side dedup of retried observe POSTs\n * (issue #1649). A retry that reaches the daemon after the first attempt\n * already processed is replayed from cache instead of re-ingested. When the\n * key is reused with a DIFFERENT payload the request is rejected as a\n * conflict (same contract as memory_store/suggestion_submit).\n */\n idempotencyKey: idempotencyKeySchema,\n /** Working directory for auto git-context resolution (issue #569). */\n cwd: cwdSchema,\n /**\n * Arbitrary project tag for non-git-based project scoping (issue #569).\n * Creates a coding context with `projectId: \"tag:<projectTag>\"`.\n */\n projectTag: projectTagSchema,\n});\n\n// ---------------------------------------------------------------------------\n// Deep recall (issue #2332)\n// ---------------------------------------------------------------------------\n\nexport const deepRecallRequestSchema = z.object({\n query: z.string().trim().min(1, \"query is required\").max(2000),\n /** Optional policy-step ceiling; validated against the configured maximum in the service. */\n maxSteps: z.union([z.number().int().min(0), z.string()]).optional(),\n namespace: namespaceSchema,\n sessionKey: z.string().optional(),\n});\n\n// ---------------------------------------------------------------------------\n// Memory store / suggestion submit\n// ---------------------------------------------------------------------------\n\nconst writeContentSchema = z.string().min(1, \"content is required\").max(50000);\n// ---------------------------------------------------------------------------\n// Category wire contract (issue #2829): truthful input/output modeling.\n// ---------------------------------------------------------------------------\n\n/** Canonical input spellings — exactly the `MemoryCategory` union. */\nconst MEMORY_CATEGORY_CANONICAL_INPUT = [\n \"fact\", \"preference\", \"correction\", \"entity\", \"decision\",\n \"relationship\", \"principle\", \"commitment\", \"moment\", \"skill\", \"rule\", \"procedure\",\n \"reasoning_trace\",\n] as const satisfies readonly MemoryCategory[];\n\n/**\n * Compatibility alias spellings admitted on input. The four project-shaped\n * categories fleet telemetry actually shows do not exist in the taxonomy;\n * they parse to the canonical \"fact\". Exact match only — no trimming, no\n * case folding, so near-misses like `projection` or `Project_State` reject\n * like any other invalid category, with the full valid list in the error.\n */\nconst MEMORY_CATEGORY_ALIAS_INPUT = [\n \"project\",\n \"project_state\",\n \"project-state\",\n \"project_update\",\n] as const;\n\nexport type MemoryCategoryAlias = (typeof MEMORY_CATEGORY_ALIAS_INPUT)[number];\n\nconst MEMORY_CATEGORY_ALIAS_TO_CANONICAL: Readonly<\n Record<MemoryCategoryAlias, Extract<MemoryCategory, \"fact\">>\n> = {\n project: \"fact\",\n project_state: \"fact\",\n \"project-state\": \"fact\",\n project_update: \"fact\",\n};\n\nexport function isMemoryCategoryAlias(value: string): value is MemoryCategoryAlias {\n return Object.prototype.hasOwnProperty.call(MEMORY_CATEGORY_ALIAS_TO_CANONICAL, value);\n}\n\n/** Coercion diagnostic for a write whose input category was a compat alias. */\nexport interface CategoryAliasCoercion {\n from: MemoryCategoryAlias;\n to: \"fact\";\n}\n\n/** Boundary-derived coercion note for a retained raw spelling. */\nexport function categoryAliasCoercion(rawCategory: string | undefined): CategoryAliasCoercion | undefined {\n return rawCategory !== undefined && isMemoryCategoryAlias(rawCategory)\n ? { from: rawCategory, to: \"fact\" }\n : undefined;\n}\n\n/**\n * Recover the retained alias spelling from a pre-parse raw envelope: the\n * `rawCategory` minted by a previous parse of the same schema (the HTTP/MCP\n * validate-then-dispatch double pass), or — for single-parse callers like the\n * CLI store command — the as-yet-untransformed alias still sitting on\n * `category` (issue #2889). A minted `rawCategory` always wins: it names the\n * spelling the transform actually canonicalized.\n */\nexport function retainedCategoryAlias(rawInput: unknown): MemoryCategoryAlias | undefined {\n if (!rawInput || typeof rawInput !== \"object\") return undefined;\n const envelope = rawInput as Record<string, unknown>;\n const minted = envelope.rawCategory;\n if (typeof minted === \"string\" && isMemoryCategoryAlias(minted)) return minted;\n const category = envelope.category;\n return typeof category === \"string\" && isMemoryCategoryAlias(category) ? category : undefined;\n}\n\n/**\n * An idempotent replay returns the FIRST request's stored response, whose\n * coercion note names that request's spelling. Rewrite the note from the\n * CURRENT request's retained spelling so every response identifies what its\n * caller actually sent; the stored idempotent result is reused untouched.\n */\nexport function reapplyCategoryCoercion<T extends object>(\n response: T,\n categoryCoercion: CategoryAliasCoercion | undefined,\n): T & { categoryCoercion?: CategoryAliasCoercion } {\n const restamped: T & { categoryCoercion?: CategoryAliasCoercion } = { ...response };\n if (categoryCoercion !== undefined) {\n restamped.categoryCoercion = categoryCoercion;\n } else {\n delete restamped.categoryCoercion;\n }\n return restamped;\n}\n\nconst categoryWireSchema = z.enum(\n [...MEMORY_CATEGORY_CANONICAL_INPUT, ...MEMORY_CATEGORY_ALIAS_INPUT],\n {\n errorMap: () => ({\n message:\n `category must be one of: ${[...MEMORY_CATEGORY_CANONICAL_INPUT, ...MEMORY_CATEGORY_ALIAS_INPUT].join(\", \")}; ` +\n 'for project state/facts use \"fact\"',\n }),\n },\n);\n\nconst confidenceSchema = z.number().min(0).max(1).optional();\nconst tagsSchema = z.array(z.string().max(256)).max(50).optional();\nconst entityRefSchema = z.string().trim().max(512).optional();\nconst ttlSchema = z.string().trim().max(128).optional();\nconst sourceReasonSchema = z.string().trim().max(2000).optional();\n\nconst memoryStoreRequestShape = z.object({\n schemaVersion: schemaVersionSchema,\n idempotencyKey: idempotencyKeySchema,\n dryRun: dryRunSchema,\n sessionKey: sessionKeySchema,\n content: writeContentSchema,\n category: categoryWireSchema.optional(),\n confidence: confidenceSchema,\n namespace: namespaceSchema,\n tags: tagsSchema,\n entityRef: entityRefSchema,\n ttl: ttlSchema,\n sourceReason: sourceReasonSchema,\n // Git/project context for project-scoped writes (#1434). When no explicit\n // `namespace` is given, these route the write to the same project namespace\n // recall/observe resolve from `cwd`/`projectTag` (issue #569, rule 42). Also\n // lets MCP clients that auto-inject `cwd` (e.g. Pi MCPorter) call write tools.\n cwd: cwdSchema,\n projectTag: projectTagSchema,\n});\n\n/**\n * Parsed memory-store request (issue #2829): the category transform maps\n * compat aliases to the canonical \"fact\" DURING parsing, so the output type\n * stays the finite `MemoryCategory` union — never an alias spelling. The raw\n * spelling travels separately on `rawCategory`, minted only by the transform\n * (zod strips it from client bodies), for the write surface's coercion note\n * and idempotent-replay rebuild.\n */\nexport type MemoryStoreParsedRequest = Omit<z.infer<typeof memoryStoreRequestShape>, \"category\"> & {\n category?: MemoryCategory;\n rawCategory?: MemoryCategoryAlias;\n};\n\nexport const memoryStoreRequestSchema = memoryStoreRequestShape.transform(\n (request): MemoryStoreParsedRequest => {\n if (request.category === undefined || !isMemoryCategoryAlias(request.category)) {\n // Spread so the narrowed canonical category, not the wide wire union,\n // becomes the output type.\n return { ...request, category: request.category };\n }\n return {\n ...request,\n category: MEMORY_CATEGORY_ALIAS_TO_CANONICAL[request.category],\n rawCategory: request.category,\n };\n },\n);\n\nexport const suggestionSubmitRequestSchema = memoryStoreRequestSchema;\n\n// ---------------------------------------------------------------------------\n// Review disposition\n// ---------------------------------------------------------------------------\n\nexport const reviewDispositionRequestSchema = z.object({\n memoryId: z.string().trim().min(1, \"memoryId is required\"),\n status: z.enum([\n \"active\", \"pending_review\", \"quarantined\", \"rejected\", \"superseded\", \"archived\",\n ]),\n reasonCode: z.string().trim().min(1, \"reasonCode is required\"),\n namespace: namespaceSchema,\n});\n\n// ---------------------------------------------------------------------------\n// Trust-zone promote\n// ---------------------------------------------------------------------------\n\nexport const trustZonePromoteRequestSchema = z.object({\n recordId: z.string().trim().min(1, \"recordId is required\"),\n targetZone: z.enum([\"working\", \"trusted\"], {\n errorMap: () => ({ message: \"targetZone must be 'working' or 'trusted'\" }),\n }),\n promotionReason: z.string().trim().min(1, \"promotionReason is required\"),\n recordedAt: z.string().trim().optional(),\n summary: z.string().trim().max(5000).optional(),\n dryRun: dryRunSchema,\n namespace: namespaceSchema,\n});\n\n// ---------------------------------------------------------------------------\n// Trust-zone demo-seed\n// ---------------------------------------------------------------------------\n\nexport const trustZoneDemoSeedRequestSchema = z.object({\n scenario: z.string().trim().max(256).optional(),\n recordedAt: z.string().trim().optional(),\n dryRun: dryRunSchema,\n namespace: namespaceSchema,\n});\n\n// ---------------------------------------------------------------------------\n// LCM search\n// ---------------------------------------------------------------------------\n\nexport const lcmSearchRequestSchema = z.object({\n query: z.string().min(1, \"query is required\"),\n sessionKey: sessionKeySchema,\n sessionPrefix: z.string().trim().min(1).max(512).optional(),\n namespace: namespaceSchema,\n limit: z.number().int().min(1).max(100).optional(),\n});\n\nexport const lcmCompactionFlushRequestSchema = z\n .object({\n sessionKey: z.string().trim().min(1, \"sessionKey is required\").max(512),\n namespace: namespaceSchema,\n cwd: cwdSchema,\n projectTag: projectTagSchema,\n /**\n * Optional multi-namespace flush used by delegate lifecycle replay. The\n * server handles the whole list as one quota-counted write.\n */\n namespaces: z.array(z.string().trim().max(256)).min(1).max(64).optional(),\n })\n .superRefine((value, ctx) => {\n if (value.namespace !== undefined && value.namespaces !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"namespace and namespaces are mutually exclusive\",\n path: [\"namespaces\"],\n });\n }\n if (\n value.namespaces !== undefined &&\n new Set(value.namespaces).size !== value.namespaces.length\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"namespaces must not contain duplicates\",\n path: [\"namespaces\"],\n });\n }\n });\n\nexport const extractionForceFlushRequestSchema = z.object({\n sessionKey: z.string().trim().min(1, \"sessionKey is required\").max(512),\n namespace: namespaceSchema,\n cwd: cwdSchema,\n projectTag: projectTagSchema,\n deadlineMs: deadlineMsSchema,\n});\n\nexport const lcmCompactionRecordRequestSchema = z.object({\n sessionKey: z.string().trim().min(1, \"sessionKey is required\").max(512),\n namespace: namespaceSchema,\n tokensBefore: z.number().int().min(0, \"tokensBefore must be a non-negative integer\"),\n tokensAfter: z.number().int().min(0, \"tokensAfter must be a non-negative integer\"),\n});\n\n// ---------------------------------------------------------------------------\n// Day summary\n// ---------------------------------------------------------------------------\n\nexport const daySummaryRequestSchema = z.object({\n memories: z.string().max(100000).optional(),\n includeLocation: z.boolean().optional(),\n sessionKey: sessionKeySchema,\n namespace: namespaceSchema,\n timeZone: timeZoneSchema.optional(),\n});\n\n// ---------------------------------------------------------------------------\n// Capsule export\n// ---------------------------------------------------------------------------\n\nconst capsuleTopLevelSegmentSchema = z\n .string()\n .trim()\n .min(1)\n .max(128)\n .refine(\n (value) => !value.includes(\"/\") && !value.includes(\"\\\\\"),\n \"must be a top-level directory name without path separators\",\n );\n\nconst capsulePeerIdSchema = z\n .string()\n .trim()\n .min(1)\n .max(256)\n .refine(\n (value) => value !== \".\" && value !== \"..\" && !value.includes(\"/\") && !value.includes(\"\\\\\"),\n \"must be a plain peer id without path separators\",\n );\n\nconst capsuleIsoSinceSchema = z\n .string()\n .trim()\n .min(1, \"since must be a non-empty ISO 8601 timestamp\")\n .max(128)\n .refine(\n isValidCapsuleSince,\n \"since must be a valid ISO 8601 timestamp with no calendar overflow\",\n );\n\nexport const capsuleExportRequestSchema = z\n .object({\n name: z\n .string()\n .trim()\n .min(1, \"name is required\")\n .max(64, \"name must be 64 characters or fewer\")\n .regex(\n CAPSULE_ID_PATTERN,\n \"name must be alphanumeric with single dashes (no spaces, no leading/trailing dashes)\",\n ),\n namespace: namespaceSchema,\n since: capsuleIsoSinceSchema.optional(),\n includeKinds: z.array(capsuleTopLevelSegmentSchema).max(50).optional(),\n peerIds: z.array(capsulePeerIdSchema).max(100).optional(),\n includeTranscripts: z.boolean().optional(),\n encrypt: z.boolean().optional(),\n });\n\nexport const capsuleImportRequestSchema = z\n .object({\n archivePath: z.string().trim().min(1, \"archivePath is required\").max(4096),\n namespace: namespaceSchema,\n mode: z.enum([\"skip\", \"overwrite\", \"fork\"]).optional(),\n passphrase: z.string().min(1, \"passphrase must not be empty\").max(4096).optional(),\n });\n\nexport const capsuleListRequestSchema = z\n .object({\n namespace: namespaceSchema,\n sessionKey: sessionKeySchema,\n });\n\n// ---------------------------------------------------------------------------\n// Offline sync\n// ---------------------------------------------------------------------------\n\nfunction isValidOfflineSyncPath(value: string): boolean {\n try {\n validateArchiveRelativePath(value, \"path\");\n return true;\n } catch {\n return false;\n }\n}\n\nconst offlineSyncPathSchema = z\n .string()\n .trim()\n .min(1, \"path must be non-empty\")\n .max(4096)\n .refine(\n isValidOfflineSyncPath,\n \"path must be a POSIX relative path without unsafe segments\",\n );\n\nconst offlineSyncFileStateSchema = z.object({\n path: offlineSyncPathSchema,\n sha256: z.string().regex(/^[a-f0-9]{64}$/i, \"sha256 must be a 64-character hex digest\"),\n bytes: z.number().int().min(0),\n mtimeMs: z.number().finite().min(0).max(OFFLINE_SYNC_MAX_MTIME_MS),\n});\n\nconst offlineSyncBaseCapturedAtSchema = z\n .string()\n .trim()\n .min(1, \"baseCapturedAt must be non-empty when provided\")\n .max(64)\n .refine((value) => Number.isFinite(Date.parse(value)), {\n message: \"baseCapturedAt must be a valid ISO 8601 timestamp\",\n });\n\nexport const offlineSyncSnapshotRequestSchema = z.object({\n namespace: namespaceSchema,\n includeTranscripts: z.boolean().optional(),\n includeContent: z.boolean().optional(),\n baseCapturedAt: offlineSyncBaseCapturedAtSchema.optional(),\n baseFiles: z\n .array(offlineSyncFileStateSchema)\n .max(300_000, \"baseFiles must contain 300000 or fewer entries\")\n .optional(),\n});\n\nexport const offlineSyncApplyRequestSchema = z\n .object({\n namespace: namespaceSchema,\n changeset: z.unknown(),\n returnCurrentFiles: z.boolean().optional(),\n })\n .refine((value) => value.changeset !== undefined && value.changeset !== null, {\n message: \"changeset is required\",\n path: [\"changeset\"],\n });\n\nexport const offlineSyncFilesRequestSchema = z.object({\n namespace: namespaceSchema,\n includeTranscripts: z.boolean().optional(),\n paths: z\n .array(offlineSyncPathSchema)\n .max(5000, \"paths must contain 5000 or fewer entries\"),\n});\n\nexport const offlineSyncFileContentRequestSchema = z.object({\n namespace: namespaceSchema,\n includeTranscripts: z.boolean().optional(),\n path: offlineSyncPathSchema,\n offset: z.number().int().min(0).optional(),\n length: z.number().int().min(1).max(OFFLINE_SYNC_FILE_CONTENT_MAX_CHUNK_BYTES).optional(),\n});\n\n// ---------------------------------------------------------------------------\n// Action confidence\n// ---------------------------------------------------------------------------\n\nconst nullableOptional = <T extends z.ZodTypeAny>(schema: T) =>\n schema.optional().nullable().transform((value) => value ?? undefined);\n\nconst actionConfidenceRuleSchema = z\n .object({\n kind: z.enum(ACTION_CONFIDENCE_RULE_KINDS),\n description: nullableOptional(z.string().trim().min(1).max(2000)),\n matched: nullableOptional(z.boolean()),\n })\n .strict();\n\nconst actionConfidenceMemorySchema = z\n .object({\n source: nullableOptional(z.string().trim().min(1).max(256)),\n created: nullableOptional(z.string().trim().min(1).max(128)),\n updated: nullableOptional(z.string().trim().min(1).max(128)),\n scope: nullableOptional(z.string().trim().min(1).max(512)),\n userContextScopes: nullableOptional(z.array(z.string().trim().min(1).max(128)).max(50)),\n retrievalReason: nullableOptional(z.string().trim().min(1).max(2000)),\n confidence: nullableOptional(z.number().min(0).max(1)),\n stale: nullableOptional(z.boolean()),\n corrected: nullableOptional(z.boolean()),\n correctionState: nullableOptional(z.enum([\"none\", \"correction\", \"superseded\", \"disputed\", \"forgotten\"])),\n safeToUse: nullableOptional(z.boolean()),\n safety: nullableOptional(z.enum([\"safe\", \"requires-review\", \"blocked\"])),\n safetyReasons: nullableOptional(z.array(z.string().trim().min(1).max(1000)).max(50)),\n })\n .strict();\n\nexport const actionConfidenceRequestSchema = z\n .object({\n intendedAction: nullableOptional(z.string().trim().min(1).max(1000)),\n confidence: nullableOptional(z.number().min(0).max(1)),\n risk: nullableOptional(z.enum(ACTION_CONFIDENCE_RISK_CATEGORIES)),\n contextReadiness: nullableOptional(z.enum(ACTION_CONFIDENCE_CONTEXT_READINESS)),\n currentContextScopes: nullableOptional(z.array(z.string().trim().min(1).max(128)).max(50)),\n userRules: nullableOptional(z.array(actionConfidenceRuleSchema).max(100)),\n retrievedMemories: nullableOptional(z.array(actionConfidenceMemorySchema).max(200)),\n })\n .strict();\n\n// ---------------------------------------------------------------------------\n// Inferred types\n// ---------------------------------------------------------------------------\n\nexport type RecallRequest = z.infer<typeof recallRequestSchema>;\nexport type RecallExplainRequest = z.infer<typeof recallExplainRequestSchema>;\nexport type SetCodingContextRequest = z.infer<typeof setCodingContextRequestSchema>;\nexport type ObserveRequest = z.infer<typeof observeRequestSchema>;\nexport type MemoryStoreRequest = z.infer<typeof memoryStoreRequestSchema>;\nexport type SuggestionSubmitRequest = z.infer<typeof suggestionSubmitRequestSchema>;\nexport type ReviewDispositionRequest = z.infer<typeof reviewDispositionRequestSchema>;\nexport type TrustZonePromoteRequest = z.infer<typeof trustZonePromoteRequestSchema>;\nexport type TrustZoneDemoSeedRequest = z.infer<typeof trustZoneDemoSeedRequestSchema>;\nexport type LcmSearchRequest = z.infer<typeof lcmSearchRequestSchema>;\nexport type LcmCompactionFlushRequest = z.infer<typeof lcmCompactionFlushRequestSchema>;\nexport type ExtractionForceFlushRequest = z.infer<typeof extractionForceFlushRequestSchema>;\nexport type LcmCompactionRecordRequest = z.infer<typeof lcmCompactionRecordRequestSchema>;\nexport type DaySummaryRequest = z.infer<typeof daySummaryRequestSchema>;\nexport type CapsuleExportRequest = z.infer<typeof capsuleExportRequestSchema>;\nexport type CapsuleImportRequest = z.infer<typeof capsuleImportRequestSchema>;\nexport type CapsuleListRequest = z.infer<typeof capsuleListRequestSchema>;\nexport type OfflineSyncApplyRequest = z.infer<typeof offlineSyncApplyRequestSchema>;\nexport type OfflineSyncSnapshotRequest = z.infer<typeof offlineSyncSnapshotRequestSchema>;\nexport type OfflineSyncFilesRequest = z.infer<typeof offlineSyncFilesRequestSchema>;\nexport type OfflineSyncFileContentRequest = z.infer<typeof offlineSyncFileContentRequestSchema>;\nexport type ActionConfidenceRequest = z.infer<typeof actionConfidenceRequestSchema>;\n\n// ---------------------------------------------------------------------------\n// Validation helper\n// ---------------------------------------------------------------------------\n\nexport type SchemaName =\n | \"recall\"\n | \"recallExplain\"\n | \"setCodingContext\"\n | \"observe\"\n | \"memoryStore\"\n | \"suggestionSubmit\"\n | \"reviewDisposition\"\n | \"trustZonePromote\"\n | \"trustZoneDemoSeed\"\n | \"lcmSearch\"\n | \"lcmCompactionFlush\"\n | \"extractionForceFlush\"\n | \"lcmCompactionRecord\"\n | \"daySummary\"\n | \"capsuleExport\"\n | \"capsuleImport\"\n | \"capsuleList\"\n | \"offlineSyncSnapshot\"\n | \"offlineSyncFiles\"\n | \"offlineSyncFileContent\"\n | \"offlineSyncApply\"\n | \"actionConfidence\";\n\nexport type SchemaTypeFor<N extends SchemaName> =\n N extends \"recall\" ? RecallRequest\n : N extends \"recallExplain\" ? RecallExplainRequest\n : N extends \"setCodingContext\" ? SetCodingContextRequest\n : N extends \"observe\" ? ObserveRequest\n : N extends \"memoryStore\" ? MemoryStoreRequest\n : N extends \"suggestionSubmit\" ? SuggestionSubmitRequest\n : N extends \"reviewDisposition\" ? ReviewDispositionRequest\n : N extends \"trustZonePromote\" ? TrustZonePromoteRequest\n : N extends \"trustZoneDemoSeed\" ? TrustZoneDemoSeedRequest\n : N extends \"lcmSearch\" ? LcmSearchRequest\n : N extends \"lcmCompactionFlush\" ? LcmCompactionFlushRequest\n : N extends \"extractionForceFlush\" ? ExtractionForceFlushRequest\n : N extends \"lcmCompactionRecord\" ? LcmCompactionRecordRequest\n : N extends \"daySummary\" ? DaySummaryRequest\n : N extends \"capsuleExport\" ? CapsuleExportRequest\n : N extends \"capsuleImport\" ? CapsuleImportRequest\n : N extends \"capsuleList\" ? CapsuleListRequest\n : N extends \"offlineSyncSnapshot\" ? OfflineSyncSnapshotRequest\n : N extends \"offlineSyncFiles\" ? OfflineSyncFilesRequest\n : N extends \"offlineSyncFileContent\" ? OfflineSyncFileContentRequest\n : N extends \"offlineSyncApply\" ? OfflineSyncApplyRequest\n : N extends \"actionConfidence\" ? ActionConfidenceRequest\n : never;\n\nconst schemas: Record<SchemaName, z.ZodTypeAny> = {\n recall: recallRequestSchema,\n recallExplain: recallExplainRequestSchema,\n setCodingContext: setCodingContextRequestSchema,\n observe: observeRequestSchema,\n memoryStore: memoryStoreRequestSchema,\n suggestionSubmit: suggestionSubmitRequestSchema,\n reviewDisposition: reviewDispositionRequestSchema,\n trustZonePromote: trustZonePromoteRequestSchema,\n trustZoneDemoSeed: trustZoneDemoSeedRequestSchema,\n lcmSearch: lcmSearchRequestSchema,\n lcmCompactionFlush: lcmCompactionFlushRequestSchema,\n extractionForceFlush: extractionForceFlushRequestSchema,\n lcmCompactionRecord: lcmCompactionRecordRequestSchema,\n daySummary: daySummaryRequestSchema,\n capsuleExport: capsuleExportRequestSchema,\n capsuleImport: capsuleImportRequestSchema,\n capsuleList: capsuleListRequestSchema,\n offlineSyncSnapshot: offlineSyncSnapshotRequestSchema,\n offlineSyncFiles: offlineSyncFilesRequestSchema,\n offlineSyncFileContent: offlineSyncFileContentRequestSchema,\n offlineSyncApply: offlineSyncApplyRequestSchema,\n actionConfidence: actionConfidenceRequestSchema,\n};\n\n/**\n * Validate a request body against the named schema.\n * Returns `{ success: true, data }` on pass or\n * `{ success: false, error }` on failure with field-level detail.\n */\nexport function validateRequest<T = unknown>(\n schemaName: SchemaName,\n body: unknown,\n): { success: true; data: T } | { success: false; error: SchemaValidationError } {\n const schema = schemas[schemaName];\n if (!schema) {\n return {\n success: false,\n error: {\n error: `unknown schema: ${schemaName}`,\n code: \"validation_error\",\n details: [],\n },\n };\n }\n const result = schema.safeParse(stripNullsExceptCodingContext(body));\n if (result.success) {\n return { success: true, data: result.data as T };\n }\n return { success: false, error: formatZodError(result.error) };\n}\n\nfunction stripNullsExceptCodingContext(data: unknown): unknown {\n if (!data || typeof data !== \"object\" || Array.isArray(data)) return data;\n const cleaned: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data as Record<string, unknown>)) {\n if (value === null && key !== \"codingContext\") continue;\n cleaned[key] = value;\n }\n return cleaned;\n}\n\n"],"mappings":"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","names":[]}