@remnic/core 1.1.2 → 1.1.3

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 (485) hide show
  1. package/dist/abort-error.js +1 -0
  2. package/dist/abstraction-nodes.js +1 -0
  3. package/dist/access-audit.js +1 -0
  4. package/dist/access-cli.js +70 -45
  5. package/dist/access-cli.js.map +1 -1
  6. package/dist/access-http.d.ts +50 -5
  7. package/dist/access-http.js +37 -15
  8. package/dist/access-idempotency.js +1 -0
  9. package/dist/access-mcp.d.ts +10 -5
  10. package/dist/access-mcp.js +36 -13
  11. package/dist/access-schema.d.ts +133 -13
  12. package/dist/access-schema.js +20 -1
  13. package/dist/access-service-_AEUMVyX.d.ts +1981 -0
  14. package/dist/access-service.d.ts +11 -6
  15. package/dist/access-service.js +38 -14
  16. package/dist/active-memory-bridge.js +1 -0
  17. package/dist/active-recall.js +1 -0
  18. package/dist/active-recall.js.map +1 -1
  19. package/dist/behavior-learner.js +1 -0
  20. package/dist/behavior-learner.js.map +1 -1
  21. package/dist/behavior-signals.js +1 -0
  22. package/dist/bootstrap.d.ts +6 -4
  23. package/dist/bootstrap.js +1 -0
  24. package/dist/boxes.js +1 -0
  25. package/dist/briefing.d.ts +9 -5
  26. package/dist/briefing.js +9 -6
  27. package/dist/buffer-surprise-report.js +1 -0
  28. package/dist/buffer-surprise.js +1 -0
  29. package/dist/buffer.d.ts +1 -1
  30. package/dist/buffer.js +1 -0
  31. package/dist/calibration.d.ts +8 -1
  32. package/dist/calibration.js +10 -2
  33. package/dist/calibration.js.map +1 -1
  34. package/dist/capsule-cli.d.ts +137 -0
  35. package/dist/capsule-cli.js +34 -0
  36. package/dist/capsule-crypto-5CYAGVC5.js +18 -0
  37. package/dist/capsule-export-NZQPOTQ4.js +17 -0
  38. package/dist/capsule-export-NZQPOTQ4.js.map +1 -0
  39. package/dist/capsule-import-SDCUXLEV.js +16 -0
  40. package/dist/capsule-import-SDCUXLEV.js.map +1 -0
  41. package/dist/capsule-merge-DI7PNQ2H.js +189 -0
  42. package/dist/capsule-merge-DI7PNQ2H.js.map +1 -0
  43. package/dist/causal-behavior.js +1 -0
  44. package/dist/causal-behavior.js.map +1 -1
  45. package/dist/causal-chain.js +1 -0
  46. package/dist/causal-consolidation.js +11 -8
  47. package/dist/causal-consolidation.js.map +1 -1
  48. package/dist/causal-retrieval.js +2 -1
  49. package/dist/causal-retrieval.js.map +1 -1
  50. package/dist/causal-trajectory-graph.js +4 -1
  51. package/dist/causal-trajectory-graph.js.map +1 -1
  52. package/dist/causal-trajectory.js +2 -1
  53. package/dist/chunk-2LSZVONP.js +67 -0
  54. package/dist/chunk-2LSZVONP.js.map +1 -0
  55. package/dist/chunk-32KD5IHZ.js +245 -0
  56. package/dist/chunk-32KD5IHZ.js.map +1 -0
  57. package/dist/{chunk-VDX363PS.js → chunk-34F3PLWZ.js} +10 -3
  58. package/dist/chunk-34F3PLWZ.js.map +1 -0
  59. package/dist/chunk-3KIS4VGT.js +228 -0
  60. package/dist/chunk-3KIS4VGT.js.map +1 -0
  61. package/dist/chunk-3LCWFNVS.js +350 -0
  62. package/dist/chunk-3LCWFNVS.js.map +1 -0
  63. package/dist/chunk-43EKP2UK.js +26 -0
  64. package/dist/chunk-43EKP2UK.js.map +1 -0
  65. package/dist/chunk-457A4P3L.js +119 -0
  66. package/dist/chunk-457A4P3L.js.map +1 -0
  67. package/dist/{chunk-TMYO7B5P.js → chunk-47WOM4YW.js} +2 -2
  68. package/dist/{chunk-OC5OXUQ4.js → chunk-4PLGJRBV.js} +653 -17
  69. package/dist/chunk-4PLGJRBV.js.map +1 -0
  70. package/dist/{chunk-PVICZTKG.js → chunk-55FXRRSJ.js} +5 -5
  71. package/dist/{chunk-PVICZTKG.js.map → chunk-55FXRRSJ.js.map} +1 -1
  72. package/dist/{chunk-ULYOGL6R.js → chunk-5HRY2WRF.js} +7 -3
  73. package/dist/chunk-5HRY2WRF.js.map +1 -0
  74. package/dist/chunk-6TBWYBJ3.js +236 -0
  75. package/dist/chunk-6TBWYBJ3.js.map +1 -0
  76. package/dist/chunk-74EMIVE4.js +329 -0
  77. package/dist/chunk-74EMIVE4.js.map +1 -0
  78. package/dist/chunk-74WWN7ZW.js +82 -0
  79. package/dist/chunk-74WWN7ZW.js.map +1 -0
  80. package/dist/{chunk-6YJHX2DL.js → chunk-7GCMLT7J.js} +242 -22
  81. package/dist/chunk-7GCMLT7J.js.map +1 -0
  82. package/dist/chunk-A6XUJE5D.js +126 -0
  83. package/dist/chunk-A6XUJE5D.js.map +1 -0
  84. package/dist/chunk-AJA46VX5.js +393 -0
  85. package/dist/chunk-AJA46VX5.js.map +1 -0
  86. package/dist/{chunk-UWB5LMWY.js → chunk-AKUCB2OG.js} +525 -24
  87. package/dist/chunk-AKUCB2OG.js.map +1 -0
  88. package/dist/chunk-ASIQZXYO.js +277 -0
  89. package/dist/chunk-ASIQZXYO.js.map +1 -0
  90. package/dist/{chunk-DG6YMRDC.js → chunk-B2TL6GA2.js} +2 -2
  91. package/dist/chunk-BJMBJZ2Y.js +290 -0
  92. package/dist/chunk-BJMBJZ2Y.js.map +1 -0
  93. package/dist/chunk-BT7NVCML.js +79 -0
  94. package/dist/chunk-BT7NVCML.js.map +1 -0
  95. package/dist/chunk-CK5NTM2S.js +454 -0
  96. package/dist/chunk-CK5NTM2S.js.map +1 -0
  97. package/dist/{chunk-AYXIPSZO.js → chunk-CRU27Q4J.js} +2 -2
  98. package/dist/{chunk-F5VP6YCB.js → chunk-DCE6SQLA.js} +572 -155
  99. package/dist/chunk-DCE6SQLA.js.map +1 -0
  100. package/dist/{chunk-CUPFXL3J.js → chunk-DHRQHX36.js} +4 -4
  101. package/dist/chunk-DHRQHX36.js.map +1 -0
  102. package/dist/{chunk-STGWEHYR.js → chunk-DR7MCMPS.js} +981 -61
  103. package/dist/chunk-DR7MCMPS.js.map +1 -0
  104. package/dist/chunk-FP2373TW.js +149 -0
  105. package/dist/chunk-FP2373TW.js.map +1 -0
  106. package/dist/{chunk-RBBWYEFJ.js → chunk-G2WADRQ3.js} +1 -1
  107. package/dist/chunk-G7D6GZ5J.js +48 -0
  108. package/dist/chunk-G7D6GZ5J.js.map +1 -0
  109. package/dist/chunk-H7XKCNR6.js +60 -0
  110. package/dist/chunk-H7XKCNR6.js.map +1 -0
  111. package/dist/{chunk-3YGHKTBF.js → chunk-IM3JSE73.js} +953 -322
  112. package/dist/chunk-IM3JSE73.js.map +1 -0
  113. package/dist/chunk-IXEJRKCZ.js +18 -0
  114. package/dist/chunk-IXEJRKCZ.js.map +1 -0
  115. package/dist/chunk-IYY4MCPG.js +275 -0
  116. package/dist/chunk-IYY4MCPG.js.map +1 -0
  117. package/dist/{chunk-BECYBZLX.js → chunk-JWSENLQI.js} +502 -22
  118. package/dist/chunk-JWSENLQI.js.map +1 -0
  119. package/dist/chunk-KNKUID7G.js +183 -0
  120. package/dist/chunk-KNKUID7G.js.map +1 -0
  121. package/dist/chunk-L2IO2QPY.js +2036 -0
  122. package/dist/chunk-L2IO2QPY.js.map +1 -0
  123. package/dist/{chunk-SPI27QT6.js → chunk-L5IIGA5V.js} +9 -4
  124. package/dist/chunk-L5IIGA5V.js.map +1 -0
  125. package/dist/{chunk-XXVWLXSG.js → chunk-LVYGDT5V.js} +56 -82
  126. package/dist/chunk-LVYGDT5V.js.map +1 -0
  127. package/dist/{chunk-ZAIM4TUE.js → chunk-LW2NMHDW.js} +46 -1
  128. package/dist/chunk-LW2NMHDW.js.map +1 -0
  129. package/dist/{chunk-3OGMS3PE.js → chunk-LZRYQK6L.js} +3 -2
  130. package/dist/chunk-LZRYQK6L.js.map +1 -0
  131. package/dist/chunk-MDYG7VI7.js +48 -0
  132. package/dist/chunk-MDYG7VI7.js.map +1 -0
  133. package/dist/chunk-MXC3AP5I.js +74 -0
  134. package/dist/chunk-MXC3AP5I.js.map +1 -0
  135. package/dist/{chunk-DIXB44VE.js → chunk-N7X62G74.js} +25 -10
  136. package/dist/chunk-N7X62G74.js.map +1 -0
  137. package/dist/chunk-NN3TS5BM.js +147 -0
  138. package/dist/chunk-NN3TS5BM.js.map +1 -0
  139. package/dist/chunk-OA3L7BFR.js +183 -0
  140. package/dist/chunk-OA3L7BFR.js.map +1 -0
  141. package/dist/chunk-OZHRDTDX.js +240 -0
  142. package/dist/chunk-OZHRDTDX.js.map +1 -0
  143. package/dist/chunk-PCUKNJAZ.js +165 -0
  144. package/dist/chunk-PCUKNJAZ.js.map +1 -0
  145. package/dist/{chunk-6PFRXT4K.js → chunk-PFV5C235.js} +11 -6
  146. package/dist/chunk-PFV5C235.js.map +1 -0
  147. package/dist/chunk-PZ5AY32C.js +10 -0
  148. package/dist/chunk-PZ5AY32C.js.map +1 -0
  149. package/dist/{chunk-Y7R2XJ5Q.js → chunk-Q7FJ5ZHM.js} +6 -2
  150. package/dist/chunk-Q7FJ5ZHM.js.map +1 -0
  151. package/dist/{chunk-NBVAS5MT.js → chunk-R2L7SUX2.js} +6 -6
  152. package/dist/{chunk-WCLICCGB.js → chunk-RILIVK4O.js} +91 -4
  153. package/dist/chunk-RILIVK4O.js.map +1 -0
  154. package/dist/{chunk-C2EFFULQ.js → chunk-RK2Y4XOM.js} +163 -20
  155. package/dist/chunk-RK2Y4XOM.js.map +1 -0
  156. package/dist/{chunk-TP4FZJIZ.js → chunk-RULE4VG5.js} +5 -1
  157. package/dist/chunk-RULE4VG5.js.map +1 -0
  158. package/dist/{chunk-PVPWZSSI.js → chunk-SMA4IMHV.js} +19 -3
  159. package/dist/chunk-SMA4IMHV.js.map +1 -0
  160. package/dist/{chunk-L7IXWRYE.js → chunk-SS253RXF.js} +22 -13
  161. package/dist/chunk-SS253RXF.js.map +1 -0
  162. package/dist/chunk-TUFG6VXY.js +875 -0
  163. package/dist/chunk-TUFG6VXY.js.map +1 -0
  164. package/dist/chunk-TYEOAFH3.js +251 -0
  165. package/dist/chunk-TYEOAFH3.js.map +1 -0
  166. package/dist/chunk-UKJAGEXH.js +260 -0
  167. package/dist/chunk-UKJAGEXH.js.map +1 -0
  168. package/dist/{chunk-KVBLZUKV.js → chunk-USFPPRAF.js} +93 -3
  169. package/dist/chunk-USFPPRAF.js.map +1 -0
  170. package/dist/{chunk-GA5P7RST.js → chunk-VTJVUHRK.js} +22 -36
  171. package/dist/chunk-VTJVUHRK.js.map +1 -0
  172. package/dist/chunk-WIICJPET.js +45 -0
  173. package/dist/chunk-WIICJPET.js.map +1 -0
  174. package/dist/{chunk-VBVG2M5G.js → chunk-WPGJYVUH.js} +6 -2
  175. package/dist/chunk-WPGJYVUH.js.map +1 -0
  176. package/dist/{chunk-4HQS2HPX.js → chunk-WSZIHQBK.js} +29 -9
  177. package/dist/{chunk-4HQS2HPX.js.map → chunk-WSZIHQBK.js.map} +1 -1
  178. package/dist/{chunk-NZLQTHS5.js → chunk-WW3QQF4H.js} +4 -1
  179. package/dist/chunk-WW3QQF4H.js.map +1 -0
  180. package/dist/{chunk-FVA6TGI3.js → chunk-Y3WQ4ZWK.js} +42 -2
  181. package/dist/chunk-Y3WQ4ZWK.js.map +1 -0
  182. package/dist/chunk-YNJHCGDT.js +309 -0
  183. package/dist/chunk-YNJHCGDT.js.map +1 -0
  184. package/dist/{chunk-LOIMBRDE.js → chunk-ZGXSCMQN.js} +1993 -411
  185. package/dist/chunk-ZGXSCMQN.js.map +1 -0
  186. package/dist/{chunk-W6SL7OFG.js → chunk-ZTSE2ZJ6.js} +12 -2
  187. package/dist/{chunk-W6SL7OFG.js.map → chunk-ZTSE2ZJ6.js.map} +1 -1
  188. package/dist/chunking.js +1 -0
  189. package/dist/cipher-GVE2GQ5H.js +28 -0
  190. package/dist/cipher-GVE2GQ5H.js.map +1 -0
  191. package/dist/citations.js +1 -0
  192. package/dist/{cli-BkeRaYfk.d.ts → cli-x2APT9a6.d.ts} +26 -7
  193. package/dist/cli.d.ts +11 -6
  194. package/dist/cli.js +67 -33
  195. package/dist/codex-thread-key.js +1 -0
  196. package/dist/commitment-ledger.js +1 -0
  197. package/dist/compression-optimizer.js +1 -0
  198. package/dist/config.d.ts +2 -1
  199. package/dist/config.js +4 -1
  200. package/dist/connectors-cli-DFGtY2DB.d.ts +257 -0
  201. package/dist/connectors-cli.d.ts +2 -0
  202. package/dist/connectors-cli.js +22 -0
  203. package/dist/connectors-cli.js.map +1 -0
  204. package/dist/consolidation-operator.d.ts +65 -5
  205. package/dist/consolidation-operator.js +6 -1
  206. package/dist/consolidation-provenance-check.d.ts +1 -1
  207. package/dist/consolidation-provenance-check.js +3 -2
  208. package/dist/consolidation-undo.d.ts +1 -1
  209. package/dist/consolidation-undo.js +1 -0
  210. package/dist/consolidation-undo.js.map +1 -1
  211. package/dist/{contradiction-review-WIUBAR52.js → contradiction-review-5LTTVDQV.js} +2 -1
  212. package/dist/contradiction-review-5LTTVDQV.js.map +1 -0
  213. package/dist/{contradiction-scan-E3GJTI4F.js → contradiction-scan-3Z6YW7YA.js} +2 -1
  214. package/dist/{contradiction-scan-E3GJTI4F.js.map → contradiction-scan-3Z6YW7YA.js.map} +1 -1
  215. package/dist/cross-namespace-budget.js +1 -0
  216. package/dist/cue-anchors.js +1 -0
  217. package/dist/dashboard-runtime.js +1 -0
  218. package/dist/day-summary.js +1 -0
  219. package/dist/delinearize.js +1 -0
  220. package/dist/direct-answer-wiring.js +1 -0
  221. package/dist/direct-answer.js +1 -0
  222. package/dist/dreams-ledger-LR2NBAZE.js +286 -0
  223. package/dist/dreams-ledger-LR2NBAZE.js.map +1 -0
  224. package/dist/embedding-fallback.js +1 -0
  225. package/dist/{engine-72LSIWQP.js → engine-ICC2DSQF.js} +10 -7
  226. package/dist/engine-ICC2DSQF.js.map +1 -0
  227. package/dist/entity-retrieval.d.ts +1 -1
  228. package/dist/entity-retrieval.js +9 -6
  229. package/dist/entity-schema.js +1 -0
  230. package/dist/evals.js +1 -0
  231. package/dist/evidence-pack.d.ts +16 -0
  232. package/dist/evidence-pack.js +8 -0
  233. package/dist/evidence-pack.js.map +1 -0
  234. package/dist/explicit-capture.d.ts +6 -4
  235. package/dist/explicit-capture.js +1 -0
  236. package/dist/extraction-judge-telemetry.js +1 -0
  237. package/dist/extraction-judge-training.js +1 -0
  238. package/dist/extraction-judge.js +1 -0
  239. package/dist/extraction.js +7 -6
  240. package/dist/fallback-llm.js +3 -2
  241. package/dist/first-start-migration-4MHQEOSD.js +263 -0
  242. package/dist/first-start-migration-4MHQEOSD.js.map +1 -0
  243. package/dist/forget-PLR6J5DN.js +69 -0
  244. package/dist/forget-PLR6J5DN.js.map +1 -0
  245. package/dist/framework-CyHYDcri.d.ts +153 -0
  246. package/dist/fs-utils-IRVUFB6G.js +30 -0
  247. package/dist/fs-utils-IRVUFB6G.js.map +1 -0
  248. package/dist/graph-dashboard-diff.js +1 -0
  249. package/dist/graph-dashboard-key.js +1 -0
  250. package/dist/graph-dashboard-parser.js +1 -0
  251. package/dist/graph-edge-decay-PWB63GRE.js +207 -0
  252. package/dist/graph-edge-decay-PWB63GRE.js.map +1 -0
  253. package/dist/graph-edge-reinforcement.d.ts +81 -0
  254. package/dist/graph-edge-reinforcement.js +24 -0
  255. package/dist/graph-edge-reinforcement.js.map +1 -0
  256. package/dist/graph-events.d.ts +87 -0
  257. package/dist/graph-events.js +14 -0
  258. package/dist/graph-events.js.map +1 -0
  259. package/dist/graph-recall.js +1 -0
  260. package/dist/graph-retrieval.js +1 -0
  261. package/dist/graph-snapshot.d.ts +112 -0
  262. package/dist/graph-snapshot.js +19 -0
  263. package/dist/graph-snapshot.js.map +1 -0
  264. package/dist/graph.d.ts +105 -7
  265. package/dist/graph.js +20 -3
  266. package/dist/harmonic-retrieval.js +1 -0
  267. package/dist/himem.js +1 -0
  268. package/dist/hygiene.js +1 -0
  269. package/dist/identity-continuity.js +1 -0
  270. package/dist/importance.js +1 -0
  271. package/dist/index.d.ts +562 -13
  272. package/dist/index.js +329 -67
  273. package/dist/index.js.map +1 -1
  274. package/dist/intent.js +1 -0
  275. package/dist/json-extract.js +1 -0
  276. package/dist/json-store.js +1 -0
  277. package/dist/kdf-7S6RWKLZ.js +26 -0
  278. package/dist/kdf-7S6RWKLZ.js.map +1 -0
  279. package/dist/legacy-hook-compat.js +1 -0
  280. package/dist/legacy-hook-compat.js.map +1 -1
  281. package/dist/lifecycle.js +1 -0
  282. package/dist/live-connectors-runner.d.ts +48 -0
  283. package/dist/live-connectors-runner.js +17 -0
  284. package/dist/live-connectors-runner.js.map +1 -0
  285. package/dist/local-llm.js +1 -0
  286. package/dist/logger.js +1 -0
  287. package/dist/memory-action-policy.js +1 -0
  288. package/dist/memory-cache.d.ts +2 -1
  289. package/dist/memory-cache.js +4 -1
  290. package/dist/memory-governance-KG52RITE.js +37 -0
  291. package/dist/memory-governance-KG52RITE.js.map +1 -0
  292. package/dist/memory-lifecycle-ledger-utils.d.ts +2 -1
  293. package/dist/memory-lifecycle-ledger-utils.js +4 -1
  294. package/dist/memory-projection-format.js +1 -0
  295. package/dist/{memory-projection-store-DeSXPh1j.d.ts → memory-projection-store-D3vBHS4J.d.ts} +1 -0
  296. package/dist/memory-projection-store.d.ts +1 -1
  297. package/dist/memory-projection-store.js +1 -0
  298. package/dist/memory-worth-bench.js +1 -0
  299. package/dist/memory-worth-bench.js.map +1 -1
  300. package/dist/memory-worth-filter.js +1 -0
  301. package/dist/memory-worth-outcomes.d.ts +1 -1
  302. package/dist/memory-worth-outcomes.js +1 -0
  303. package/dist/memory-worth.js +1 -0
  304. package/dist/metadata-FC3XPDRQ.js +21 -0
  305. package/dist/metadata-FC3XPDRQ.js.map +1 -0
  306. package/dist/migrate-from-identity-anchor-TTEDEJGX.js +8 -0
  307. package/dist/migrate-from-identity-anchor-TTEDEJGX.js.map +1 -0
  308. package/dist/model-registry.js +1 -0
  309. package/dist/models-json.js +1 -0
  310. package/dist/native-knowledge.js +1 -0
  311. package/dist/negative.js +1 -0
  312. package/dist/objective-state-writers.js +1 -0
  313. package/dist/objective-state-writers.js.map +1 -1
  314. package/dist/objective-state.js +1 -0
  315. package/dist/openai-chat-compat.js +1 -0
  316. package/dist/operator-toolkit.d.ts +46 -2
  317. package/dist/operator-toolkit.js +28 -16
  318. package/dist/opik-exporter.js +1 -0
  319. package/dist/opik-exporter.js.map +1 -1
  320. package/dist/{orchestrator-CmJ-NTdJ.d.ts → orchestrator-ChkesB8U.d.ts} +177 -13
  321. package/dist/orchestrator.d.ts +6 -4
  322. package/dist/orchestrator.js +55 -39
  323. package/dist/page-versioning.js +1 -0
  324. package/dist/path-RMTY5Y5A.js +9 -0
  325. package/dist/path-RMTY5Y5A.js.map +1 -0
  326. package/dist/patterns-cli.d.ts +160 -0
  327. package/dist/patterns-cli.js +29 -0
  328. package/dist/patterns-cli.js.map +1 -0
  329. package/dist/peers-6OSQ3NK6.js +44 -0
  330. package/dist/peers-6OSQ3NK6.js.map +1 -0
  331. package/dist/plugin-id.js +1 -0
  332. package/dist/policy-runtime.js +1 -0
  333. package/dist/{port-BADbLZU5.d.ts → port-hqGnoStS.d.ts} +6 -0
  334. package/dist/profiling.js +1 -0
  335. package/dist/purge-6ATBGT77.js +205 -0
  336. package/dist/purge-6ATBGT77.js.map +1 -0
  337. package/dist/qmd-recall-cache.d.ts +1 -1
  338. package/dist/qmd-recall-cache.js +1 -0
  339. package/dist/qmd.d.ts +2 -1
  340. package/dist/qmd.js +4 -3
  341. package/dist/reasoning-trace-recall.js +1 -0
  342. package/dist/reasoning-trace-types.js +1 -0
  343. package/dist/recall-audit-anomaly.js +1 -0
  344. package/dist/recall-audit.js +1 -0
  345. package/dist/recall-disclosure-escalation.d.ts +84 -0
  346. package/dist/recall-disclosure-escalation.js +14 -0
  347. package/dist/recall-disclosure-escalation.js.map +1 -0
  348. package/dist/recall-explain-renderer.js +4 -1
  349. package/dist/recall-mmr.js +1 -0
  350. package/dist/recall-qos.js +1 -0
  351. package/dist/recall-query-policy.js +1 -0
  352. package/dist/recall-state.d.ts +7 -0
  353. package/dist/recall-state.js +2 -1
  354. package/dist/recall-tag-filter.d.ts +56 -0
  355. package/dist/recall-tag-filter.js +14 -0
  356. package/dist/recall-tag-filter.js.map +1 -0
  357. package/dist/recall-tokenization.js +1 -0
  358. package/dist/recall-xray-cli.d.ts +9 -2
  359. package/dist/recall-xray-cli.js +9 -4
  360. package/dist/recall-xray-renderer.js +4 -1
  361. package/dist/recall-xray.d.ts +116 -2
  362. package/dist/recall-xray.js +9 -3
  363. package/dist/reconstruct.js +1 -0
  364. package/dist/release-changelog.js +2 -0
  365. package/dist/release-changelog.js.map +1 -1
  366. package/dist/relevance.js +1 -0
  367. package/dist/rerank.js +1 -0
  368. package/dist/{resolution-QBTDHTG7.js → resolution-YGIBORXI.js} +2 -1
  369. package/dist/{resolution-QBTDHTG7.js.map → resolution-YGIBORXI.js.map} +1 -1
  370. package/dist/resolve-auth-token.d.ts +51 -0
  371. package/dist/resolve-auth-token.js +12 -0
  372. package/dist/resolve-auth-token.js.map +1 -0
  373. package/dist/resolve-provider-secret.d.ts +9 -1
  374. package/dist/resolve-provider-secret.js +4 -1
  375. package/dist/resume-bundles.js +4 -3
  376. package/dist/retrieval-agents.d.ts +1 -1
  377. package/dist/retrieval-agents.js +1 -0
  378. package/dist/retrieval-tiers.js +1 -0
  379. package/dist/retrieval.js +1 -0
  380. package/dist/sanitize.js +1 -0
  381. package/dist/schemas.d.ts +37 -24
  382. package/dist/schemas.js +2 -1
  383. package/dist/sdk-compat.js +1 -0
  384. package/dist/sdk-compat.js.map +1 -1
  385. package/dist/secure-store-4R2GSO7S.js +156 -0
  386. package/dist/secure-store-4R2GSO7S.js.map +1 -0
  387. package/dist/semantic-chunking.js +1 -0
  388. package/dist/{semantic-consolidation-CxJU6MJk.d.ts → semantic-consolidation-ByBXb-sf.d.ts} +3 -3
  389. package/dist/semantic-consolidation.d.ts +2 -2
  390. package/dist/semantic-consolidation.js +11 -6
  391. package/dist/semantic-rule-promotion.d.ts +1 -1
  392. package/dist/semantic-rule-promotion.js +9 -6
  393. package/dist/semantic-rule-verifier.d.ts +1 -1
  394. package/dist/semantic-rule-verifier.js +9 -6
  395. package/dist/session-integrity.js +1 -0
  396. package/dist/session-observer-bands.js +1 -0
  397. package/dist/session-observer-state.js +1 -0
  398. package/dist/session-toggles.js +2 -0
  399. package/dist/session-toggles.js.map +1 -1
  400. package/dist/signal.js +1 -0
  401. package/dist/skills-registry.js +2 -0
  402. package/dist/skills-registry.js.map +1 -1
  403. package/dist/source-attribution.js +1 -0
  404. package/dist/state-NCHQ4TRG.js +8 -0
  405. package/dist/state-NCHQ4TRG.js.map +1 -0
  406. package/dist/state-store-3EH7HYIN.js +16 -0
  407. package/dist/state-store-3EH7HYIN.js.map +1 -0
  408. package/dist/storage.d.ts +76 -2
  409. package/dist/storage.js +8 -5
  410. package/dist/store-contract.js +1 -0
  411. package/dist/summarizer.js +5 -4
  412. package/dist/summary-snapshot.js +1 -0
  413. package/dist/temporal-index.js +1 -0
  414. package/dist/temporal-supersession.d.ts +1 -1
  415. package/dist/temporal-supersession.js +2 -1
  416. package/dist/temporal-validity.d.ts +52 -0
  417. package/dist/temporal-validity.js +14 -0
  418. package/dist/temporal-validity.js.map +1 -0
  419. package/dist/threading.js +1 -0
  420. package/dist/tier-migration.d.ts +2 -2
  421. package/dist/tier-migration.js +1 -0
  422. package/dist/tier-routing.js +1 -0
  423. package/dist/tier-stats-62ZVDFKS.js +152 -0
  424. package/dist/tier-stats-62ZVDFKS.js.map +1 -0
  425. package/dist/tmt.js +1 -0
  426. package/dist/tokens.js +1 -0
  427. package/dist/topics.js +1 -0
  428. package/dist/trace-C5ETWBEF.js +290 -0
  429. package/dist/trace-C5ETWBEF.js.map +1 -0
  430. package/dist/transcript.js +1 -0
  431. package/dist/trust-zones.js +1 -0
  432. package/dist/tui-RI7P6PBS.js +13 -0
  433. package/dist/tui-RI7P6PBS.js.map +1 -0
  434. package/dist/types-V3FJ26TF.js +30 -0
  435. package/dist/types-V3FJ26TF.js.map +1 -0
  436. package/dist/types.d.ts +634 -9
  437. package/dist/types.js +10 -3
  438. package/dist/utility-learner.js +1 -0
  439. package/dist/utility-runtime.js +1 -0
  440. package/dist/utility-telemetry.js +1 -0
  441. package/dist/verified-recall.js +9 -6
  442. package/dist/version-utils.js +1 -0
  443. package/dist/whitespace.js +1 -0
  444. package/dist/work-product-ledger.js +1 -0
  445. package/package.json +2 -1
  446. package/dist/access-service-Br8ZydTK.d.ts +0 -827
  447. package/dist/chunk-3OGMS3PE.js.map +0 -1
  448. package/dist/chunk-3YGHKTBF.js.map +0 -1
  449. package/dist/chunk-6PFRXT4K.js.map +0 -1
  450. package/dist/chunk-6YJHX2DL.js.map +0 -1
  451. package/dist/chunk-BECYBZLX.js.map +0 -1
  452. package/dist/chunk-C2EFFULQ.js.map +0 -1
  453. package/dist/chunk-CUPFXL3J.js.map +0 -1
  454. package/dist/chunk-DIXB44VE.js.map +0 -1
  455. package/dist/chunk-F5VP6YCB.js.map +0 -1
  456. package/dist/chunk-FVA6TGI3.js.map +0 -1
  457. package/dist/chunk-GA5P7RST.js.map +0 -1
  458. package/dist/chunk-KVBLZUKV.js.map +0 -1
  459. package/dist/chunk-L7IXWRYE.js.map +0 -1
  460. package/dist/chunk-LOIMBRDE.js.map +0 -1
  461. package/dist/chunk-LTCGGW2D.js +0 -14
  462. package/dist/chunk-LTCGGW2D.js.map +0 -1
  463. package/dist/chunk-NZLQTHS5.js.map +0 -1
  464. package/dist/chunk-OC5OXUQ4.js.map +0 -1
  465. package/dist/chunk-PVPWZSSI.js.map +0 -1
  466. package/dist/chunk-SPI27QT6.js.map +0 -1
  467. package/dist/chunk-STGWEHYR.js.map +0 -1
  468. package/dist/chunk-TP4FZJIZ.js.map +0 -1
  469. package/dist/chunk-ULYOGL6R.js.map +0 -1
  470. package/dist/chunk-UWB5LMWY.js.map +0 -1
  471. package/dist/chunk-VBVG2M5G.js.map +0 -1
  472. package/dist/chunk-VDX363PS.js.map +0 -1
  473. package/dist/chunk-WCLICCGB.js.map +0 -1
  474. package/dist/chunk-X6GF3FX2.js +0 -26
  475. package/dist/chunk-X6GF3FX2.js.map +0 -1
  476. package/dist/chunk-XXVWLXSG.js.map +0 -1
  477. package/dist/chunk-Y7R2XJ5Q.js.map +0 -1
  478. package/dist/chunk-ZAIM4TUE.js.map +0 -1
  479. /package/dist/{contradiction-review-WIUBAR52.js.map → capsule-cli.js.map} +0 -0
  480. /package/dist/{engine-72LSIWQP.js.map → capsule-crypto-5CYAGVC5.js.map} +0 -0
  481. /package/dist/{chunk-TMYO7B5P.js.map → chunk-47WOM4YW.js.map} +0 -0
  482. /package/dist/{chunk-DG6YMRDC.js.map → chunk-B2TL6GA2.js.map} +0 -0
  483. /package/dist/{chunk-AYXIPSZO.js.map → chunk-CRU27Q4J.js.map} +0 -0
  484. /package/dist/{chunk-RBBWYEFJ.js.map → chunk-G2WADRQ3.js.map} +0 -0
  485. /package/dist/{chunk-NBVAS5MT.js.map → chunk-R2L7SUX2.js.map} +0 -0
@@ -0,0 +1,393 @@
1
+ import {
2
+ DERIVED_FROM_MEMORY_ID_RE
3
+ } from "./chunk-G7D6GZ5J.js";
4
+
5
+ // src/training-export/date-parse.ts
6
+ var DAYS_IN_MONTH = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
7
+ function isLeapYear(year) {
8
+ return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0;
9
+ }
10
+ function isCalendarDateValid(year, month, day) {
11
+ if (!Number.isInteger(year) || !Number.isInteger(month) || !Number.isInteger(day)) {
12
+ return false;
13
+ }
14
+ if (month < 1 || month > 12) return false;
15
+ if (day < 1) return false;
16
+ const maxDay = month === 2 && isLeapYear(year) ? 29 : DAYS_IN_MONTH[month];
17
+ return day <= maxDay;
18
+ }
19
+ function parseStrictCliDate(value, flagName) {
20
+ const shape = /^(\d{4})-(\d{2})-(\d{2})(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{1,9}))?)?(Z|[+-]\d{2}:\d{2})?)?$/;
21
+ const match = value.match(shape);
22
+ if (!match) {
23
+ throw new Error(
24
+ `Invalid ${flagName} value "${value}": expected ISO 8601 format (YYYY-MM-DD or YYYY-MM-DDTHH:mm:ss[.sss][Z|\xB1HH:MM]).`
25
+ );
26
+ }
27
+ const year = Number(match[1]);
28
+ const month = Number(match[2]);
29
+ const day = Number(match[3]);
30
+ if (!isCalendarDateValid(year, month, day)) {
31
+ throw new Error(
32
+ `Invalid ${flagName} value "${value}": date components overflow (e.g. month has fewer days). Provide a valid calendar date.`
33
+ );
34
+ }
35
+ if (match[4] !== void 0) {
36
+ const hour = Number(match[4]);
37
+ const minute = Number(match[5]);
38
+ const second = match[6] !== void 0 ? Number(match[6]) : 0;
39
+ if (hour > 23 || minute > 59 || second > 59) {
40
+ throw new Error(
41
+ `Invalid ${flagName} value "${value}": time components out of range.`
42
+ );
43
+ }
44
+ }
45
+ const d = new Date(value);
46
+ if (!Number.isFinite(d.getTime())) {
47
+ throw new Error(
48
+ `Invalid ${flagName} value "${value}". Provide an ISO 8601 date string (YYYY-MM-DD or YYYY-MM-DDTHH:mm:ss).`
49
+ );
50
+ }
51
+ return d;
52
+ }
53
+
54
+ // src/patterns-cli.ts
55
+ var PATTERNS_OUTPUT_FORMATS = ["text", "markdown", "json"];
56
+ function parsePatternsFormat(value) {
57
+ if (value === void 0 || value === null) return "text";
58
+ if (typeof value !== "string" || !PATTERNS_OUTPUT_FORMATS.includes(value)) {
59
+ throw new Error(
60
+ `--format expects one of ${PATTERNS_OUTPUT_FORMATS.join(", ")}; got ${JSON.stringify(value)}`
61
+ );
62
+ }
63
+ return value;
64
+ }
65
+ function parsePatternsLimit(value) {
66
+ if (value === void 0 || value === null) return void 0;
67
+ const parsed = typeof value === "number" ? value : Number(value);
68
+ if (!Number.isFinite(parsed) || !Number.isInteger(parsed) || parsed <= 0) {
69
+ throw new Error(
70
+ `--limit expects a positive integer; got ${JSON.stringify(value)}`
71
+ );
72
+ }
73
+ return parsed;
74
+ }
75
+ function parsePatternsCategory(value) {
76
+ if (value === void 0 || value === null) return void 0;
77
+ if (typeof value !== "string") {
78
+ throw new Error(
79
+ `--category expects a comma-separated list of category names; got ${JSON.stringify(value)}`
80
+ );
81
+ }
82
+ const parts = value.split(",").map((part) => part.trim()).filter((part) => part.length > 0);
83
+ if (parts.length === 0) {
84
+ throw new Error(
85
+ `--category expects at least one non-empty category name; got ${JSON.stringify(value)}`
86
+ );
87
+ }
88
+ const seen = /* @__PURE__ */ new Set();
89
+ const unique = [];
90
+ for (const part of parts) {
91
+ if (!seen.has(part)) {
92
+ seen.add(part);
93
+ unique.push(part);
94
+ }
95
+ }
96
+ return unique;
97
+ }
98
+ function parsePatternsSince(value) {
99
+ if (value === void 0 || value === null) return void 0;
100
+ if (typeof value !== "string" || value.trim().length === 0) {
101
+ throw new Error(
102
+ `--since expects an ISO 8601 timestamp (e.g. 2026-04-01T00:00:00Z); got ${JSON.stringify(value)}`
103
+ );
104
+ }
105
+ return parseStrictCliDate(value.trim(), "--since").toISOString();
106
+ }
107
+ function parsePatternsListOptions(options) {
108
+ const format = parsePatternsFormat(options.format);
109
+ const limit = parsePatternsLimit(options.limit);
110
+ const categories = parsePatternsCategory(options.category);
111
+ const sinceIso = parsePatternsSince(options.since);
112
+ return {
113
+ format,
114
+ ...limit !== void 0 ? { limit } : {},
115
+ ...categories !== void 0 ? { categories } : {},
116
+ ...sinceIso !== void 0 ? { sinceIso } : {}
117
+ };
118
+ }
119
+ function parsePatternsExplainOptions(rawId, options) {
120
+ if (typeof rawId !== "string" || rawId.trim().length === 0) {
121
+ throw new Error("patterns explain: <memoryId> is required and must be non-empty");
122
+ }
123
+ const format = parsePatternsFormat(options.format);
124
+ return { id: rawId.trim(), format };
125
+ }
126
+ var DEFAULT_LIST_LIMIT = 50;
127
+ function collectPatternMemories(memories, opts) {
128
+ const sinceMs = opts.sinceIso !== void 0 ? Date.parse(opts.sinceIso) : void 0;
129
+ const categorySet = opts.categories !== void 0 ? new Set(opts.categories) : void 0;
130
+ const rows = [];
131
+ for (const memory of memories) {
132
+ const fm = memory.frontmatter;
133
+ const count = fm.reinforcement_count;
134
+ if (typeof count !== "number" || !Number.isInteger(count) || count <= 0) {
135
+ continue;
136
+ }
137
+ if (categorySet !== void 0 && !categorySet.has(fm.category)) {
138
+ continue;
139
+ }
140
+ if (sinceMs !== void 0) {
141
+ if (typeof fm.last_reinforced_at !== "string") continue;
142
+ const ts = Date.parse(fm.last_reinforced_at);
143
+ if (!Number.isFinite(ts) || ts < sinceMs) continue;
144
+ }
145
+ rows.push({
146
+ id: fm.id,
147
+ category: fm.category,
148
+ reinforcementCount: count,
149
+ ...fm.last_reinforced_at !== void 0 ? { lastReinforcedAt: fm.last_reinforced_at } : {},
150
+ status: fm.status ?? "active",
151
+ preview: extractPreview(memory.content),
152
+ path: memory.path
153
+ });
154
+ }
155
+ rows.sort((a, b) => {
156
+ if (b.reinforcementCount !== a.reinforcementCount) {
157
+ return b.reinforcementCount - a.reinforcementCount;
158
+ }
159
+ const aRaw = a.lastReinforcedAt ? Date.parse(a.lastReinforcedAt) : NaN;
160
+ const bRaw = b.lastReinforcedAt ? Date.parse(b.lastReinforcedAt) : NaN;
161
+ const aTs = Number.isFinite(aRaw) ? aRaw : 0;
162
+ const bTs = Number.isFinite(bRaw) ? bRaw : 0;
163
+ if (bTs !== aTs) return bTs - aTs;
164
+ if (a.id < b.id) return -1;
165
+ if (a.id > b.id) return 1;
166
+ return 0;
167
+ });
168
+ const limit = opts.limit ?? DEFAULT_LIST_LIMIT;
169
+ return rows.slice(0, limit);
170
+ }
171
+ function explainPatternMemory(memories, id) {
172
+ const canonical = memories.find((m) => m.frontmatter.id === id);
173
+ if (!canonical) return null;
174
+ const fm = canonical.frontmatter;
175
+ const count = fm.reinforcement_count;
176
+ if (typeof count !== "number" || !Number.isInteger(count) || count <= 0) {
177
+ return null;
178
+ }
179
+ const derivedFrom = (fm.derived_from ?? []).map(
180
+ (ref) => {
181
+ const lastColon = ref.lastIndexOf(":");
182
+ const pathLikeRef = looksLikeDerivedFromPath(ref);
183
+ if (lastColon >= 0) {
184
+ const path = ref.slice(0, lastColon);
185
+ const versionStr = ref.slice(lastColon + 1);
186
+ if (looksLikeDerivedFromPath(path) && /^\d+$/.test(versionStr)) {
187
+ return { ref, path, version: Number(versionStr) };
188
+ }
189
+ if (!pathLikeRef && DERIVED_FROM_MEMORY_ID_RE.test(ref)) {
190
+ return { ref, path: ref, version: null };
191
+ }
192
+ return { ref, path: ref, version: null, malformed: true };
193
+ }
194
+ if (DERIVED_FROM_MEMORY_ID_RE.test(ref)) {
195
+ return {
196
+ ref,
197
+ path: ref,
198
+ version: null
199
+ };
200
+ }
201
+ return { ref, path: ref, version: null, malformed: true };
202
+ }
203
+ );
204
+ const members = [];
205
+ for (const m of memories) {
206
+ if (m.frontmatter.supersededBy === id) {
207
+ members.push({
208
+ id: m.frontmatter.id,
209
+ status: m.frontmatter.status ?? "active",
210
+ ...m.frontmatter.supersededAt !== void 0 ? { supersededAt: m.frontmatter.supersededAt } : {},
211
+ path: m.path,
212
+ preview: extractPreview(m.content)
213
+ });
214
+ }
215
+ }
216
+ members.sort((a, b) => {
217
+ const aRaw = a.supersededAt ? Date.parse(a.supersededAt) : NaN;
218
+ const bRaw = b.supersededAt ? Date.parse(b.supersededAt) : NaN;
219
+ const aTs = Number.isFinite(aRaw) ? aRaw : 0;
220
+ const bTs = Number.isFinite(bRaw) ? bRaw : 0;
221
+ if (bTs !== aTs) return bTs - aTs;
222
+ if (a.id < b.id) return -1;
223
+ if (a.id > b.id) return 1;
224
+ return 0;
225
+ });
226
+ return {
227
+ id: fm.id,
228
+ category: fm.category,
229
+ reinforcementCount: count,
230
+ ...fm.last_reinforced_at !== void 0 ? { lastReinforcedAt: fm.last_reinforced_at } : {},
231
+ status: fm.status ?? "active",
232
+ ...fm.derived_via !== void 0 ? { derivedVia: fm.derived_via } : {},
233
+ canonicalContent: canonical.content.trim(),
234
+ canonicalPath: canonical.path,
235
+ derivedFrom,
236
+ clusterMembers: members
237
+ };
238
+ }
239
+ function renderPatternsList(rows, format) {
240
+ if (format === "json") {
241
+ return JSON.stringify({ rows }, null, 2);
242
+ }
243
+ if (rows.length === 0) {
244
+ if (format === "markdown") {
245
+ return "# Pattern memories\n\n_No reinforced patterns found._\n";
246
+ }
247
+ return "No reinforced patterns found.";
248
+ }
249
+ if (format === "markdown") {
250
+ const lines2 = ["# Pattern memories", ""];
251
+ lines2.push("| Count | ID | Category | Last reinforced | Preview |");
252
+ lines2.push("| --- | --- | --- | --- | --- |");
253
+ for (const row of rows) {
254
+ const last = row.lastReinforcedAt ?? "\u2014";
255
+ const preview = escapePipes(row.preview);
256
+ lines2.push(
257
+ `| ${row.reinforcementCount} | \`${row.id}\` | ${row.category} | ${last} | ${preview} |`
258
+ );
259
+ }
260
+ return lines2.join("\n") + "\n";
261
+ }
262
+ const lines = [];
263
+ lines.push(`Pattern memories (${rows.length}):`);
264
+ lines.push("");
265
+ for (const row of rows) {
266
+ const last = row.lastReinforcedAt ?? "\u2014";
267
+ lines.push(
268
+ ` [${row.reinforcementCount}x] ${row.id} (${row.category}, last_reinforced=${last}, status=${row.status})`
269
+ );
270
+ if (row.preview.length > 0) {
271
+ lines.push(` ${row.preview}`);
272
+ }
273
+ lines.push(` path: ${row.path}`);
274
+ }
275
+ return lines.join("\n");
276
+ }
277
+ function renderPatternExplain(detail, format) {
278
+ if (format === "json") {
279
+ return JSON.stringify(detail, null, 2);
280
+ }
281
+ const last = detail.lastReinforcedAt ?? "\u2014";
282
+ const derivedVia = detail.derivedVia ?? "\u2014";
283
+ if (format === "markdown") {
284
+ const lines2 = [];
285
+ lines2.push(`# Pattern: \`${detail.id}\``);
286
+ lines2.push("");
287
+ lines2.push(`- **Reinforcement count:** ${detail.reinforcementCount}`);
288
+ lines2.push(`- **Last reinforced:** ${last}`);
289
+ lines2.push(`- **Category:** ${detail.category}`);
290
+ lines2.push(`- **Status:** ${detail.status}`);
291
+ lines2.push(`- **Derived via:** ${derivedVia}`);
292
+ lines2.push(`- **Path:** \`${detail.canonicalPath}\``);
293
+ lines2.push("");
294
+ lines2.push("## Canonical content");
295
+ lines2.push("");
296
+ lines2.push("```");
297
+ lines2.push(detail.canonicalContent);
298
+ lines2.push("```");
299
+ lines2.push("");
300
+ lines2.push(`## Derived from (${detail.derivedFrom.length})`);
301
+ lines2.push("");
302
+ if (detail.derivedFrom.length === 0) {
303
+ lines2.push("_No derived_from entries recorded._");
304
+ } else {
305
+ for (const entry of detail.derivedFrom) {
306
+ const versionStr = entry.version !== null ? ` v${entry.version}` : entry.malformed ? " (malformed)" : "";
307
+ lines2.push(`- \`${entry.path}\`${versionStr}`);
308
+ }
309
+ }
310
+ lines2.push("");
311
+ lines2.push(`## Cluster members (${detail.clusterMembers.length})`);
312
+ lines2.push("");
313
+ if (detail.clusterMembers.length === 0) {
314
+ lines2.push("_No superseded members reference this canonical._");
315
+ } else {
316
+ for (const member of detail.clusterMembers) {
317
+ const ts = member.supersededAt ?? "\u2014";
318
+ lines2.push(`- \`${member.id}\` (status=${member.status}, supersededAt=${ts})`);
319
+ if (member.preview.length > 0) {
320
+ lines2.push(` - ${escapePipes(member.preview)}`);
321
+ }
322
+ }
323
+ }
324
+ return lines2.join("\n") + "\n";
325
+ }
326
+ const lines = [];
327
+ lines.push(`Pattern: ${detail.id}`);
328
+ lines.push(` reinforcement_count: ${detail.reinforcementCount}`);
329
+ lines.push(` last_reinforced_at: ${last}`);
330
+ lines.push(` category: ${detail.category}`);
331
+ lines.push(` status: ${detail.status}`);
332
+ lines.push(` derived_via: ${derivedVia}`);
333
+ lines.push(` path: ${detail.canonicalPath}`);
334
+ lines.push("");
335
+ lines.push("Canonical content:");
336
+ for (const line of detail.canonicalContent.split("\n")) {
337
+ lines.push(` ${line}`);
338
+ }
339
+ lines.push("");
340
+ lines.push(`Derived from (${detail.derivedFrom.length}):`);
341
+ if (detail.derivedFrom.length === 0) {
342
+ lines.push(" (none)");
343
+ } else {
344
+ for (const entry of detail.derivedFrom) {
345
+ const versionStr = entry.version !== null ? ` v${entry.version}` : entry.malformed ? " (malformed)" : "";
346
+ lines.push(` - ${entry.path}${versionStr}`);
347
+ }
348
+ }
349
+ lines.push("");
350
+ lines.push(`Cluster members (${detail.clusterMembers.length}):`);
351
+ if (detail.clusterMembers.length === 0) {
352
+ lines.push(" (none)");
353
+ } else {
354
+ for (const member of detail.clusterMembers) {
355
+ const ts = member.supersededAt ?? "\u2014";
356
+ lines.push(` - ${member.id} (status=${member.status}, supersededAt=${ts})`);
357
+ if (member.preview.length > 0) {
358
+ lines.push(` ${member.preview}`);
359
+ }
360
+ }
361
+ }
362
+ return lines.join("\n");
363
+ }
364
+ function extractPreview(content) {
365
+ const trimmed = content.trim();
366
+ if (trimmed.length === 0) return "";
367
+ const firstLine = trimmed.split("\n").find((line) => line.trim().length > 0) ?? "";
368
+ const collapsed = firstLine.trim().replace(/\s+/g, " ");
369
+ if (collapsed.length <= 120) return collapsed;
370
+ return collapsed.slice(0, 117) + "...";
371
+ }
372
+ function looksLikeDerivedFromPath(value) {
373
+ return value.includes("/") || value.includes(".");
374
+ }
375
+ function escapePipes(value) {
376
+ return value.replace(/\\/g, "\\\\").replace(/\|/g, "\\|");
377
+ }
378
+
379
+ export {
380
+ parseStrictCliDate,
381
+ PATTERNS_OUTPUT_FORMATS,
382
+ parsePatternsFormat,
383
+ parsePatternsLimit,
384
+ parsePatternsCategory,
385
+ parsePatternsSince,
386
+ parsePatternsListOptions,
387
+ parsePatternsExplainOptions,
388
+ collectPatternMemories,
389
+ explainPatternMemory,
390
+ renderPatternsList,
391
+ renderPatternExplain
392
+ };
393
+ //# sourceMappingURL=chunk-AJA46VX5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/training-export/date-parse.ts","../src/patterns-cli.ts"],"sourcesContent":["/**\n * Strict ISO 8601 date parsing for training-export CLI flags.\n *\n * Extracted from `cli.ts` so that both the canonical CLI (in\n * `@remnic/core`) and the thin front-end CLI (in `@remnic/cli`) can share\n * the same validator without duplicating the overflow/timezone rules.\n *\n * The parser rejects:\n * - Non-ISO strings (e.g. \"12/25/2026\", \"Dec 25 2026\")\n * - Calendar overflows (Feb 30, Feb 29 in non-leap years, Apr 31, etc.)\n * regardless of timezone suffix\n * - Out-of-range time components (hour >= 24, minute >= 60, second >= 60)\n *\n * Calendar overflow is validated structurally on the Y-M-D components, so\n * results are independent of the host's local timezone.\n */\n\n/**\n * Days in each month (1-indexed). February is 28 here; leap-year handling\n * is applied by `isCalendarDateValid` below.\n */\nconst DAYS_IN_MONTH = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\nfunction isLeapYear(year: number): boolean {\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n}\n\n/**\n * True iff `year-month-day` is a valid Gregorian calendar date. Input\n * numbers must be integer-valued; month is 1-12, day is 1-31 nominally.\n */\nexport function isCalendarDateValid(\n year: number,\n month: number,\n day: number,\n): boolean {\n if (\n !Number.isInteger(year) ||\n !Number.isInteger(month) ||\n !Number.isInteger(day)\n ) {\n return false;\n }\n if (month < 1 || month > 12) return false;\n if (day < 1) return false;\n const maxDay = month === 2 && isLeapYear(year) ? 29 : DAYS_IN_MONTH[month];\n return day <= maxDay;\n}\n\n/**\n * Parse a strict ISO 8601 date string, rejecting malformed inputs, calendar\n * overflows, and out-of-range time components with a descriptive error.\n *\n * Accepted forms:\n * YYYY-MM-DD\n * YYYY-MM-DDTHH:mm:ss (naive / local time)\n * YYYY-MM-DDTHH:mm:ss.sssZ (UTC)\n * YYYY-MM-DDTHH:mm:ss+HH:MM (with timezone offset)\n * YYYY-MM-DDTHH:mm:ss.sss-HH:MM (with timezone offset)\n *\n * `flagName` is included in the error message so users can identify which\n * input failed (e.g. `--since` vs. `--until`).\n */\nexport function parseStrictCliDate(value: string, flagName: string): Date {\n // 1. Shape check: must begin YYYY-MM-DD and use ISO 8601 structure.\n // This rejects \"12/25/2026\", \"December 25, 2026\", RFC 2822, etc.\n const shape =\n /^(\\d{4})-(\\d{2})-(\\d{2})(?:T(\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d{1,9}))?)?(Z|[+-]\\d{2}:\\d{2})?)?$/;\n const match = value.match(shape);\n if (!match) {\n throw new Error(\n `Invalid ${flagName} value \"${value}\": expected ISO 8601 format (YYYY-MM-DD or YYYY-MM-DDTHH:mm:ss[.sss][Z|±HH:MM]).`,\n );\n }\n\n const year = Number(match[1]);\n const month = Number(match[2]);\n const day = Number(match[3]);\n\n // 2. Structural calendar validation. This rejects Feb 31, Feb 29 in\n // non-leap years, Apr 31, etc. regardless of the timezone suffix, so\n // \"2026-02-31T00:00:00+05:30\" is rejected the same way as \"2026-02-31Z\".\n if (!isCalendarDateValid(year, month, day)) {\n throw new Error(\n `Invalid ${flagName} value \"${value}\": date components overflow (e.g. month has fewer days). Provide a valid calendar date.`,\n );\n }\n\n // 3. Optional time-component validation.\n // JavaScript's Date cannot represent a leap second: `:60` is silently\n // normalised to `:00` of the following minute, which would make a\n // \"strict\" validator return a different timestamp than the user\n // requested. Reject second == 60 outright so a strict parse cannot\n // round-trip to a different clock value.\n if (match[4] !== undefined) {\n const hour = Number(match[4]);\n const minute = Number(match[5]);\n const second = match[6] !== undefined ? Number(match[6]) : 0;\n if (hour > 23 || minute > 59 || second > 59) {\n throw new Error(\n `Invalid ${flagName} value \"${value}\": time components out of range.`,\n );\n }\n }\n\n // 4. Finally parse via Date for the actual timestamp value. At this point\n // we've already validated structure and calendar correctness, so any\n // remaining NaN (extremely unlikely) still fails closed.\n const d = new Date(value);\n if (!Number.isFinite(d.getTime())) {\n throw new Error(\n `Invalid ${flagName} value \"${value}\". Provide an ISO 8601 date string (YYYY-MM-DD or YYYY-MM-DDTHH:mm:ss).`,\n );\n }\n\n return d;\n}\n","/**\n * `remnic patterns` CLI helpers (issue #687 PR 4/4).\n *\n * Pure functions that:\n *\n * 1. Validate `--limit`, `--category`, `--since`, `--format` for\n * `remnic patterns list` and `--format` for\n * `remnic patterns explain <id>` (CLAUDE.md rules 14 + 51 — flags\n * throw listed-options errors instead of silently defaulting).\n *\n * 2. Filter the memory corpus to canonical memories produced by the\n * pattern-reinforcement maintenance job from issue #687 PR 2/4\n * (`reinforcement_count > 0`) and sort them by reinforcement\n * count, with `last_reinforced_at` (then `id`) as stable\n * tiebreakers (CLAUDE.md rule 19).\n *\n * 3. Reconstruct a single canonical's full picture: its\n * `derived_from` provenance chain (PR 2/4 stamps these), the\n * cluster members it absorbed (memories pointing at it via\n * `supersededBy`), and the canonical body so operators can read\n * it inline.\n *\n * 4. Render `text` (default) / `markdown` / `json` output for both\n * commands. The CLI handler in `cli.ts` stays thin and delegates\n * formatting here so HTTP / MCP surfaces (if added later) can\n * reuse the same renderers (CLAUDE.md rule 22 — never fork\n * formatting).\n */\n\nimport type { MemoryCategory, MemoryFile } from \"./types.js\";\nimport { DERIVED_FROM_MEMORY_ID_RE } from \"./consolidation-operator.js\";\nimport { parseStrictCliDate } from \"./training-export/date-parse.js\";\n\nexport const PATTERNS_OUTPUT_FORMATS = [\"text\", \"markdown\", \"json\"] as const;\nexport type PatternsOutputFormat = (typeof PATTERNS_OUTPUT_FORMATS)[number];\n\n// ───────────────────────────────────────────────────────────────────────────\n// Flag validation\n// ───────────────────────────────────────────────────────────────────────────\n\n/**\n * Validate `--format <fmt>`. Throws a listed-options error for any\n * value not in `PATTERNS_OUTPUT_FORMATS`. Returns `\"text\"` when the\n * value is `undefined` (no flag supplied).\n */\nexport function parsePatternsFormat(value: unknown): PatternsOutputFormat {\n if (value === undefined || value === null) return \"text\";\n if (\n typeof value !== \"string\" ||\n !(PATTERNS_OUTPUT_FORMATS as readonly string[]).includes(value)\n ) {\n throw new Error(\n `--format expects one of ${PATTERNS_OUTPUT_FORMATS.join(\", \")}; got ${JSON.stringify(value)}`,\n );\n }\n return value as PatternsOutputFormat;\n}\n\n/**\n * Validate `--limit <N>`. Must be a positive integer. Returns\n * `undefined` when the flag is absent (the caller falls back to a\n * default).\n */\nexport function parsePatternsLimit(value: unknown): number | undefined {\n if (value === undefined || value === null) return undefined;\n const parsed = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(parsed) || !Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(\n `--limit expects a positive integer; got ${JSON.stringify(value)}`,\n );\n }\n return parsed;\n}\n\n/**\n * Validate `--category <list>`. Accepts a comma-separated list of\n * non-empty trimmed tokens. Returns the deduplicated list, or\n * `undefined` when no flag was supplied. CLAUDE.md rules 14 + 51:\n * `--category` with no value or with a value that resolves to zero\n * tokens is rejected.\n */\nexport function parsePatternsCategory(value: unknown): string[] | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value !== \"string\") {\n throw new Error(\n `--category expects a comma-separated list of category names; got ${JSON.stringify(value)}`,\n );\n }\n const parts = value\n .split(\",\")\n .map((part) => part.trim())\n .filter((part) => part.length > 0);\n if (parts.length === 0) {\n throw new Error(\n `--category expects at least one non-empty category name; got ${JSON.stringify(value)}`,\n );\n }\n // Deduplicate while preserving first-seen order.\n const seen = new Set<string>();\n const unique: string[] = [];\n for (const part of parts) {\n if (!seen.has(part)) {\n seen.add(part);\n unique.push(part);\n }\n }\n return unique;\n}\n\n/**\n * Validate `--since <ISO>`. Delegates to `parseStrictCliDate` which\n * enforces a strict ISO 8601 shape and rejects calendar overflows and\n * non-ISO formats (e.g. \"12/25/2026\", \"Dec 25 2026\") that bare\n * `Date.parse()` would silently accept. Returns the canonical ISO\n * string (round-trip through `toISOString`) so downstream comparisons\n * use a consistent form.\n */\nexport function parsePatternsSince(value: unknown): string | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(\n `--since expects an ISO 8601 timestamp (e.g. 2026-04-01T00:00:00Z); got ${JSON.stringify(value)}`,\n );\n }\n // parseStrictCliDate throws with a descriptive message on invalid input.\n return parseStrictCliDate(value.trim(), \"--since\").toISOString();\n}\n\nexport interface ParsedPatternsListOptions {\n format: PatternsOutputFormat;\n limit?: number;\n categories?: string[];\n sinceIso?: string;\n}\n\nexport interface ParsedPatternsExplainOptions {\n format: PatternsOutputFormat;\n}\n\n/**\n * Validate the full option bag for `remnic patterns list`. Extracted\n * from the CLI handler so validation can be unit-tested without\n * booting an orchestrator (CLAUDE.md rules 14 + 51).\n */\nexport function parsePatternsListOptions(\n options: Record<string, unknown>,\n): ParsedPatternsListOptions {\n const format = parsePatternsFormat(options.format);\n const limit = parsePatternsLimit(options.limit);\n const categories = parsePatternsCategory(options.category);\n const sinceIso = parsePatternsSince(options.since);\n return {\n format,\n ...(limit !== undefined ? { limit } : {}),\n ...(categories !== undefined ? { categories } : {}),\n ...(sinceIso !== undefined ? { sinceIso } : {}),\n };\n}\n\n/**\n * Validate `remnic patterns explain` options + positional id. Throws\n * when `<memoryId>` is missing or empty.\n */\nexport function parsePatternsExplainOptions(\n rawId: unknown,\n options: Record<string, unknown>,\n): { id: string } & ParsedPatternsExplainOptions {\n if (typeof rawId !== \"string\" || rawId.trim().length === 0) {\n throw new Error(\"patterns explain: <memoryId> is required and must be non-empty\");\n }\n const format = parsePatternsFormat(options.format);\n return { id: rawId.trim(), format };\n}\n\n// ───────────────────────────────────────────────────────────────────────────\n// Core list / explain behavior\n// ───────────────────────────────────────────────────────────────────────────\n\nexport interface PatternListRow {\n id: string;\n category: MemoryCategory;\n reinforcementCount: number;\n lastReinforcedAt?: string;\n status: string;\n /** First non-empty content line, trimmed to ~120 chars for the table. */\n preview: string;\n /** Full path on disk (relative to memoryDir) for operators who want to inspect the file. */\n path: string;\n}\n\nconst DEFAULT_LIST_LIMIT = 50;\n\n/**\n * Filter, sort, and slice the memory corpus down to the rows the\n * `remnic patterns list` command should print.\n *\n * Rules (each one is exercised by `tests/cli/patterns.test.ts`):\n *\n * - Memories without `reinforcement_count` (or with a count <= 0) are\n * dropped — these are not pattern canonicals.\n * - When `categories` is supplied, only memories whose\n * `frontmatter.category` is in the list survive.\n * - When `sinceIso` is supplied, only memories whose\n * `last_reinforced_at` is `>= sinceIso` survive. Memories without\n * `last_reinforced_at` are dropped under `--since` (PR 2/4 always\n * stamps the timestamp alongside the count, so a missing timestamp\n * means a malformed file the operator should not see in this view).\n * - Sort by `reinforcement_count DESC`, then `last_reinforced_at\n * DESC`, then `id ASC` for a stable, deterministic order\n * (CLAUDE.md rule 19).\n * - Apply `limit` (default 50).\n */\nexport function collectPatternMemories(\n memories: readonly MemoryFile[],\n opts: ParsedPatternsListOptions,\n): PatternListRow[] {\n const sinceMs =\n opts.sinceIso !== undefined ? Date.parse(opts.sinceIso) : undefined;\n const categorySet =\n opts.categories !== undefined ? new Set(opts.categories) : undefined;\n\n const rows: PatternListRow[] = [];\n for (const memory of memories) {\n const fm = memory.frontmatter;\n const count = fm.reinforcement_count;\n if (typeof count !== \"number\" || !Number.isInteger(count) || count <= 0) {\n continue;\n }\n if (categorySet !== undefined && !categorySet.has(fm.category)) {\n continue;\n }\n if (sinceMs !== undefined) {\n if (typeof fm.last_reinforced_at !== \"string\") continue;\n const ts = Date.parse(fm.last_reinforced_at);\n if (!Number.isFinite(ts) || ts < sinceMs) continue;\n }\n rows.push({\n id: fm.id,\n category: fm.category,\n reinforcementCount: count,\n ...(fm.last_reinforced_at !== undefined\n ? { lastReinforcedAt: fm.last_reinforced_at }\n : {}),\n status: fm.status ?? \"active\",\n preview: extractPreview(memory.content),\n path: memory.path,\n });\n }\n\n rows.sort((a, b) => {\n if (b.reinforcementCount !== a.reinforcementCount) {\n return b.reinforcementCount - a.reinforcementCount;\n }\n // Guard NaN: malformed date strings make Date.parse return NaN, which\n // breaks the sort contract (NaN comparator return == non-deterministic\n // ordering). Treat invalid/missing timestamps as 0 (oldest possible).\n const aRaw = a.lastReinforcedAt ? Date.parse(a.lastReinforcedAt) : NaN;\n const bRaw = b.lastReinforcedAt ? Date.parse(b.lastReinforcedAt) : NaN;\n const aTs = Number.isFinite(aRaw) ? aRaw : 0;\n const bTs = Number.isFinite(bRaw) ? bRaw : 0;\n if (bTs !== aTs) return bTs - aTs;\n if (a.id < b.id) return -1;\n if (a.id > b.id) return 1;\n return 0;\n });\n\n const limit = opts.limit ?? DEFAULT_LIST_LIMIT;\n return rows.slice(0, limit);\n}\n\nexport interface PatternDerivedFromEntry {\n /** Raw `\"<path>:<version>\"` reference exactly as stored in `derived_from`. */\n ref: string;\n /** Source memory id, or the path component for older `path:version` references. */\n path: string;\n /** Page-version number component for older `path:version` references. */\n version: number | null;\n /** True when an older path-version reference had an invalid version component. */\n malformed?: boolean;\n}\n\nexport interface PatternClusterMember {\n id: string;\n status: string;\n supersededAt?: string;\n path: string;\n preview: string;\n}\n\nexport interface PatternExplainDetail {\n id: string;\n category: MemoryCategory;\n reinforcementCount: number;\n lastReinforcedAt?: string;\n status: string;\n derivedVia?: string;\n /** Full canonical body (frontmatter stripped). */\n canonicalContent: string;\n canonicalPath: string;\n /** Parsed `derived_from` chain — empty when PR 2/4 did not stamp it. */\n derivedFrom: PatternDerivedFromEntry[];\n /** Memories whose `supersededBy === <id>`, sorted by `supersededAt DESC` then `id ASC`. */\n clusterMembers: PatternClusterMember[];\n}\n\n/**\n * Build the structured detail object for a single canonical. Returns\n * `null` when the memory is not found or has never been touched by\n * pattern reinforcement (i.e., no `reinforcement_count`). The CLI\n * handler then prints a clean \"not a pattern\" error rather than\n * leaking an empty document.\n */\nexport function explainPatternMemory(\n memories: readonly MemoryFile[],\n id: string,\n): PatternExplainDetail | null {\n const canonical = memories.find((m) => m.frontmatter.id === id);\n if (!canonical) return null;\n const fm = canonical.frontmatter;\n const count = fm.reinforcement_count;\n if (typeof count !== \"number\" || !Number.isInteger(count) || count <= 0) {\n return null;\n }\n\n const derivedFrom: PatternDerivedFromEntry[] = (fm.derived_from ?? []).map(\n (ref) => {\n const lastColon = ref.lastIndexOf(\":\");\n const pathLikeRef = looksLikeDerivedFromPath(ref);\n if (lastColon >= 0) {\n const path = ref.slice(0, lastColon);\n const versionStr = ref.slice(lastColon + 1);\n if (\n looksLikeDerivedFromPath(path) &&\n /^\\d+$/.test(versionStr)\n ) {\n return { ref, path, version: Number(versionStr) };\n }\n if (!pathLikeRef && DERIVED_FROM_MEMORY_ID_RE.test(ref)) {\n return { ref, path: ref, version: null };\n }\n return { ref, path: ref, version: null, malformed: true };\n }\n if (DERIVED_FROM_MEMORY_ID_RE.test(ref)) {\n return {\n ref,\n path: ref,\n version: null,\n };\n }\n return { ref, path: ref, version: null, malformed: true };\n },\n );\n\n const members: PatternClusterMember[] = [];\n for (const m of memories) {\n if (m.frontmatter.supersededBy === id) {\n members.push({\n id: m.frontmatter.id,\n status: m.frontmatter.status ?? \"active\",\n ...(m.frontmatter.supersededAt !== undefined\n ? { supersededAt: m.frontmatter.supersededAt }\n : {}),\n path: m.path,\n preview: extractPreview(m.content),\n });\n }\n }\n members.sort((a, b) => {\n // Guard NaN: same rationale as collectPatternMemories sort — malformed\n // supersededAt strings must not produce a NaN return from the comparator.\n const aRaw = a.supersededAt ? Date.parse(a.supersededAt) : NaN;\n const bRaw = b.supersededAt ? Date.parse(b.supersededAt) : NaN;\n const aTs = Number.isFinite(aRaw) ? aRaw : 0;\n const bTs = Number.isFinite(bRaw) ? bRaw : 0;\n if (bTs !== aTs) return bTs - aTs;\n if (a.id < b.id) return -1;\n if (a.id > b.id) return 1;\n return 0;\n });\n\n return {\n id: fm.id,\n category: fm.category,\n reinforcementCount: count,\n ...(fm.last_reinforced_at !== undefined\n ? { lastReinforcedAt: fm.last_reinforced_at }\n : {}),\n status: fm.status ?? \"active\",\n ...(fm.derived_via !== undefined ? { derivedVia: fm.derived_via } : {}),\n canonicalContent: canonical.content.trim(),\n canonicalPath: canonical.path,\n derivedFrom,\n clusterMembers: members,\n };\n}\n\n// ───────────────────────────────────────────────────────────────────────────\n// Renderers\n// ───────────────────────────────────────────────────────────────────────────\n\nexport function renderPatternsList(\n rows: readonly PatternListRow[],\n format: PatternsOutputFormat,\n): string {\n if (format === \"json\") {\n return JSON.stringify({ rows }, null, 2);\n }\n if (rows.length === 0) {\n if (format === \"markdown\") {\n return \"# Pattern memories\\n\\n_No reinforced patterns found._\\n\";\n }\n return \"No reinforced patterns found.\";\n }\n if (format === \"markdown\") {\n const lines: string[] = [\"# Pattern memories\", \"\"];\n lines.push(\"| Count | ID | Category | Last reinforced | Preview |\");\n lines.push(\"| --- | --- | --- | --- | --- |\");\n for (const row of rows) {\n const last = row.lastReinforcedAt ?? \"—\";\n const preview = escapePipes(row.preview);\n lines.push(\n `| ${row.reinforcementCount} | \\`${row.id}\\` | ${row.category} | ${last} | ${preview} |`,\n );\n }\n return lines.join(\"\\n\") + \"\\n\";\n }\n // text\n const lines: string[] = [];\n lines.push(`Pattern memories (${rows.length}):`);\n lines.push(\"\");\n for (const row of rows) {\n const last = row.lastReinforcedAt ?? \"—\";\n lines.push(\n ` [${row.reinforcementCount}x] ${row.id} (${row.category}, last_reinforced=${last}, status=${row.status})`,\n );\n if (row.preview.length > 0) {\n lines.push(` ${row.preview}`);\n }\n lines.push(` path: ${row.path}`);\n }\n return lines.join(\"\\n\");\n}\n\nexport function renderPatternExplain(\n detail: PatternExplainDetail,\n format: PatternsOutputFormat,\n): string {\n if (format === \"json\") {\n return JSON.stringify(detail, null, 2);\n }\n const last = detail.lastReinforcedAt ?? \"—\";\n const derivedVia = detail.derivedVia ?? \"—\";\n if (format === \"markdown\") {\n const lines: string[] = [];\n lines.push(`# Pattern: \\`${detail.id}\\``);\n lines.push(\"\");\n lines.push(`- **Reinforcement count:** ${detail.reinforcementCount}`);\n lines.push(`- **Last reinforced:** ${last}`);\n lines.push(`- **Category:** ${detail.category}`);\n lines.push(`- **Status:** ${detail.status}`);\n lines.push(`- **Derived via:** ${derivedVia}`);\n lines.push(`- **Path:** \\`${detail.canonicalPath}\\``);\n lines.push(\"\");\n lines.push(\"## Canonical content\");\n lines.push(\"\");\n lines.push(\"```\");\n lines.push(detail.canonicalContent);\n lines.push(\"```\");\n lines.push(\"\");\n lines.push(`## Derived from (${detail.derivedFrom.length})`);\n lines.push(\"\");\n if (detail.derivedFrom.length === 0) {\n lines.push(\"_No derived_from entries recorded._\");\n } else {\n for (const entry of detail.derivedFrom) {\n const versionStr =\n entry.version !== null\n ? ` v${entry.version}`\n : entry.malformed\n ? \" (malformed)\"\n : \"\";\n lines.push(`- \\`${entry.path}\\`${versionStr}`);\n }\n }\n lines.push(\"\");\n lines.push(`## Cluster members (${detail.clusterMembers.length})`);\n lines.push(\"\");\n if (detail.clusterMembers.length === 0) {\n lines.push(\"_No superseded members reference this canonical._\");\n } else {\n for (const member of detail.clusterMembers) {\n const ts = member.supersededAt ?? \"—\";\n lines.push(`- \\`${member.id}\\` (status=${member.status}, supersededAt=${ts})`);\n if (member.preview.length > 0) {\n lines.push(` - ${escapePipes(member.preview)}`);\n }\n }\n }\n return lines.join(\"\\n\") + \"\\n\";\n }\n // text\n const lines: string[] = [];\n lines.push(`Pattern: ${detail.id}`);\n lines.push(` reinforcement_count: ${detail.reinforcementCount}`);\n lines.push(` last_reinforced_at: ${last}`);\n lines.push(` category: ${detail.category}`);\n lines.push(` status: ${detail.status}`);\n lines.push(` derived_via: ${derivedVia}`);\n lines.push(` path: ${detail.canonicalPath}`);\n lines.push(\"\");\n lines.push(\"Canonical content:\");\n for (const line of detail.canonicalContent.split(\"\\n\")) {\n lines.push(` ${line}`);\n }\n lines.push(\"\");\n lines.push(`Derived from (${detail.derivedFrom.length}):`);\n if (detail.derivedFrom.length === 0) {\n lines.push(\" (none)\");\n } else {\n for (const entry of detail.derivedFrom) {\n const versionStr =\n entry.version !== null\n ? ` v${entry.version}`\n : entry.malformed\n ? \" (malformed)\"\n : \"\";\n lines.push(` - ${entry.path}${versionStr}`);\n }\n }\n lines.push(\"\");\n lines.push(`Cluster members (${detail.clusterMembers.length}):`);\n if (detail.clusterMembers.length === 0) {\n lines.push(\" (none)\");\n } else {\n for (const member of detail.clusterMembers) {\n const ts = member.supersededAt ?? \"—\";\n lines.push(` - ${member.id} (status=${member.status}, supersededAt=${ts})`);\n if (member.preview.length > 0) {\n lines.push(` ${member.preview}`);\n }\n }\n }\n return lines.join(\"\\n\");\n}\n\n// ───────────────────────────────────────────────────────────────────────────\n// Internal helpers\n// ───────────────────────────────────────────────────────────────────────────\n\nfunction extractPreview(content: string): string {\n const trimmed = content.trim();\n if (trimmed.length === 0) return \"\";\n const firstLine = trimmed.split(\"\\n\").find((line) => line.trim().length > 0) ?? \"\";\n const collapsed = firstLine.trim().replace(/\\s+/g, \" \");\n if (collapsed.length <= 120) return collapsed;\n return collapsed.slice(0, 117) + \"...\";\n}\n\nfunction looksLikeDerivedFromPath(value: string): boolean {\n return value.includes(\"/\") || value.includes(\".\");\n}\n\n/**\n * Escape characters that would break a Markdown table cell:\n * - backslashes first (so the `\\|` escape below isn't double-escaped)\n * - then pipe characters\n *\n * CodeQL \"Incomplete string escaping or encoding\": backslash must be\n * escaped before pipe so that a literal `\\` in content isn't\n * misinterpreted as part of a `\\|` escape sequence.\n */\nfunction escapePipes(value: string): string {\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\\|/g, \"\\\\|\");\n}\n"],"mappings":"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","names":["lines"]}