@remnic/core 1.1.2 → 1.1.4

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 (489) 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 +72 -47
  5. package/dist/access-cli.js.map +1 -1
  6. package/dist/access-http.d.ts +50 -5
  7. package/dist/access-http.js +39 -16
  8. package/dist/access-idempotency.js +1 -0
  9. package/dist/access-mcp.d.ts +10 -5
  10. package/dist/access-mcp.js +38 -14
  11. package/dist/access-schema.d.ts +133 -13
  12. package/dist/access-schema.js +20 -1
  13. package/dist/access-service-CtXFnprR.d.ts +2033 -0
  14. package/dist/access-service.d.ts +11 -6
  15. package/dist/access-service.js +40 -15
  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 +10 -7
  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 +12 -9
  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-3KIS4VGT.js +228 -0
  58. package/dist/chunk-3KIS4VGT.js.map +1 -0
  59. package/dist/chunk-3LCWFNVS.js +350 -0
  60. package/dist/chunk-3LCWFNVS.js.map +1 -0
  61. package/dist/chunk-43EKP2UK.js +26 -0
  62. package/dist/chunk-43EKP2UK.js.map +1 -0
  63. package/dist/chunk-457A4P3L.js +119 -0
  64. package/dist/chunk-457A4P3L.js.map +1 -0
  65. package/dist/{chunk-TMYO7B5P.js → chunk-47WOM4YW.js} +2 -2
  66. package/dist/{chunk-FVA6TGI3.js → chunk-52PDY6GD.js} +42 -2
  67. package/dist/chunk-52PDY6GD.js.map +1 -0
  68. package/dist/{chunk-ULYOGL6R.js → chunk-5HRY2WRF.js} +7 -3
  69. package/dist/chunk-5HRY2WRF.js.map +1 -0
  70. package/dist/{chunk-BOUYNNYD.js → chunk-67YLUWLG.js} +32 -13
  71. package/dist/{chunk-BOUYNNYD.js.map → chunk-67YLUWLG.js.map} +1 -1
  72. package/dist/chunk-6TBWYBJ3.js +236 -0
  73. package/dist/chunk-6TBWYBJ3.js.map +1 -0
  74. package/dist/chunk-74EMIVE4.js +329 -0
  75. package/dist/chunk-74EMIVE4.js.map +1 -0
  76. package/dist/chunk-74WWN7ZW.js +82 -0
  77. package/dist/chunk-74WWN7ZW.js.map +1 -0
  78. package/dist/chunk-A6XUJE5D.js +126 -0
  79. package/dist/chunk-A6XUJE5D.js.map +1 -0
  80. package/dist/{chunk-STGWEHYR.js → chunk-AEMBDV7M.js} +1187 -62
  81. package/dist/chunk-AEMBDV7M.js.map +1 -0
  82. package/dist/{chunk-PVICZTKG.js → chunk-AGZHRWPT.js} +5 -5
  83. package/dist/{chunk-PVICZTKG.js.map → chunk-AGZHRWPT.js.map} +1 -1
  84. package/dist/chunk-AJA46VX5.js +393 -0
  85. package/dist/chunk-AJA46VX5.js.map +1 -0
  86. package/dist/chunk-ASIQZXYO.js +277 -0
  87. package/dist/chunk-ASIQZXYO.js.map +1 -0
  88. package/dist/{chunk-DG6YMRDC.js → chunk-B2TL6GA2.js} +2 -2
  89. package/dist/chunk-BJMBJZ2Y.js +290 -0
  90. package/dist/chunk-BJMBJZ2Y.js.map +1 -0
  91. package/dist/chunk-BT7NVCML.js +79 -0
  92. package/dist/chunk-BT7NVCML.js.map +1 -0
  93. package/dist/chunk-CK5NTM2S.js +454 -0
  94. package/dist/chunk-CK5NTM2S.js.map +1 -0
  95. package/dist/{chunk-AYXIPSZO.js → chunk-CRU27Q4J.js} +2 -2
  96. package/dist/{chunk-UWB5LMWY.js → chunk-CUI2STX6.js} +526 -24
  97. package/dist/chunk-CUI2STX6.js.map +1 -0
  98. package/dist/{chunk-CUPFXL3J.js → chunk-EGEPUGN4.js} +4 -4
  99. package/dist/chunk-EGEPUGN4.js.map +1 -0
  100. package/dist/{chunk-3OGMS3PE.js → chunk-F5VQOQ2E.js} +3 -2
  101. package/dist/chunk-F5VQOQ2E.js.map +1 -0
  102. package/dist/chunk-FP2373TW.js +149 -0
  103. package/dist/chunk-FP2373TW.js.map +1 -0
  104. package/dist/{chunk-RBBWYEFJ.js → chunk-G2WADRQ3.js} +1 -1
  105. package/dist/chunk-G7D6GZ5J.js +48 -0
  106. package/dist/chunk-G7D6GZ5J.js.map +1 -0
  107. package/dist/chunk-H7XKCNR6.js +60 -0
  108. package/dist/chunk-H7XKCNR6.js.map +1 -0
  109. package/dist/{chunk-LOIMBRDE.js → chunk-HIRKCQGF.js} +1994 -412
  110. package/dist/chunk-HIRKCQGF.js.map +1 -0
  111. package/dist/chunk-IXEJRKCZ.js +18 -0
  112. package/dist/chunk-IXEJRKCZ.js.map +1 -0
  113. package/dist/chunk-IYY4MCPG.js +275 -0
  114. package/dist/chunk-IYY4MCPG.js.map +1 -0
  115. package/dist/{chunk-BECYBZLX.js → chunk-JWSENLQI.js} +502 -22
  116. package/dist/chunk-JWSENLQI.js.map +1 -0
  117. package/dist/chunk-KNKUID7G.js +183 -0
  118. package/dist/chunk-KNKUID7G.js.map +1 -0
  119. package/dist/chunk-L2IO2QPY.js +2036 -0
  120. package/dist/chunk-L2IO2QPY.js.map +1 -0
  121. package/dist/{chunk-ZAIM4TUE.js → chunk-LW2NMHDW.js} +46 -1
  122. package/dist/chunk-LW2NMHDW.js.map +1 -0
  123. package/dist/chunk-MDYG7VI7.js +48 -0
  124. package/dist/chunk-MDYG7VI7.js.map +1 -0
  125. package/dist/{chunk-VDX363PS.js → chunk-MUELDH4F.js} +10 -3
  126. package/dist/chunk-MUELDH4F.js.map +1 -0
  127. package/dist/chunk-MXC3AP5I.js +74 -0
  128. package/dist/chunk-MXC3AP5I.js.map +1 -0
  129. package/dist/chunk-NN3TS5BM.js +147 -0
  130. package/dist/chunk-NN3TS5BM.js.map +1 -0
  131. package/dist/{chunk-3YGHKTBF.js → chunk-NZS2BLTP.js} +963 -326
  132. package/dist/chunk-NZS2BLTP.js.map +1 -0
  133. package/dist/chunk-OA3L7BFR.js +183 -0
  134. package/dist/chunk-OA3L7BFR.js.map +1 -0
  135. package/dist/chunk-OZHRDTDX.js +240 -0
  136. package/dist/chunk-OZHRDTDX.js.map +1 -0
  137. package/dist/chunk-PCUKNJAZ.js +165 -0
  138. package/dist/chunk-PCUKNJAZ.js.map +1 -0
  139. package/dist/{chunk-6PFRXT4K.js → chunk-PFV5C235.js} +11 -6
  140. package/dist/chunk-PFV5C235.js.map +1 -0
  141. package/dist/chunk-PZ5AY32C.js +10 -0
  142. package/dist/chunk-PZ5AY32C.js.map +1 -0
  143. package/dist/{chunk-Y7R2XJ5Q.js → chunk-Q7FJ5ZHM.js} +6 -2
  144. package/dist/chunk-Q7FJ5ZHM.js.map +1 -0
  145. package/dist/{chunk-WCLICCGB.js → chunk-RILIVK4O.js} +91 -4
  146. package/dist/chunk-RILIVK4O.js.map +1 -0
  147. package/dist/{chunk-C2EFFULQ.js → chunk-RK2Y4XOM.js} +163 -20
  148. package/dist/chunk-RK2Y4XOM.js.map +1 -0
  149. package/dist/{chunk-TP4FZJIZ.js → chunk-RULE4VG5.js} +5 -1
  150. package/dist/chunk-RULE4VG5.js.map +1 -0
  151. package/dist/{chunk-PVPWZSSI.js → chunk-SMA4IMHV.js} +19 -3
  152. package/dist/chunk-SMA4IMHV.js.map +1 -0
  153. package/dist/{chunk-6YJHX2DL.js → chunk-TIFRGAKO.js} +242 -22
  154. package/dist/chunk-TIFRGAKO.js.map +1 -0
  155. package/dist/chunk-TUFG6VXY.js +875 -0
  156. package/dist/chunk-TUFG6VXY.js.map +1 -0
  157. package/dist/chunk-TYEOAFH3.js +251 -0
  158. package/dist/chunk-TYEOAFH3.js.map +1 -0
  159. package/dist/chunk-UKJAGEXH.js +260 -0
  160. package/dist/chunk-UKJAGEXH.js.map +1 -0
  161. package/dist/{chunk-KVBLZUKV.js → chunk-USFPPRAF.js} +93 -3
  162. package/dist/chunk-USFPPRAF.js.map +1 -0
  163. package/dist/{chunk-NBVAS5MT.js → chunk-V7TEH5I2.js} +6 -6
  164. package/dist/{chunk-GA5P7RST.js → chunk-VTJVUHRK.js} +22 -36
  165. package/dist/chunk-VTJVUHRK.js.map +1 -0
  166. package/dist/{chunk-SPI27QT6.js → chunk-W7WWT4FJ.js} +9 -4
  167. package/dist/chunk-W7WWT4FJ.js.map +1 -0
  168. package/dist/chunk-WIICJPET.js +45 -0
  169. package/dist/chunk-WIICJPET.js.map +1 -0
  170. package/dist/{chunk-VBVG2M5G.js → chunk-WPGJYVUH.js} +6 -2
  171. package/dist/chunk-WPGJYVUH.js.map +1 -0
  172. package/dist/{chunk-4HQS2HPX.js → chunk-WSZIHQBK.js} +29 -9
  173. package/dist/{chunk-4HQS2HPX.js.map → chunk-WSZIHQBK.js.map} +1 -1
  174. package/dist/{chunk-NZLQTHS5.js → chunk-WW3QQF4H.js} +4 -1
  175. package/dist/chunk-WW3QQF4H.js.map +1 -0
  176. package/dist/{chunk-DIXB44VE.js → chunk-X6VBWOVZ.js} +28 -13
  177. package/dist/chunk-X6VBWOVZ.js.map +1 -0
  178. package/dist/{chunk-XXVWLXSG.js → chunk-XQ4EJLUD.js} +64 -92
  179. package/dist/chunk-XQ4EJLUD.js.map +1 -0
  180. package/dist/{chunk-OC5OXUQ4.js → chunk-XRCYKJ3V.js} +780 -17
  181. package/dist/chunk-XRCYKJ3V.js.map +1 -0
  182. package/dist/{chunk-F5VP6YCB.js → chunk-Y4A6M3B6.js} +573 -156
  183. package/dist/chunk-Y4A6M3B6.js.map +1 -0
  184. package/dist/chunk-YNJHCGDT.js +309 -0
  185. package/dist/chunk-YNJHCGDT.js.map +1 -0
  186. package/dist/{chunk-L7IXWRYE.js → chunk-ZIBOQULP.js} +22 -13
  187. package/dist/chunk-ZIBOQULP.js.map +1 -0
  188. package/dist/{chunk-W6SL7OFG.js → chunk-ZTSE2ZJ6.js} +12 -2
  189. package/dist/{chunk-W6SL7OFG.js.map → chunk-ZTSE2ZJ6.js.map} +1 -1
  190. package/dist/chunking.js +1 -0
  191. package/dist/cipher-GVE2GQ5H.js +28 -0
  192. package/dist/cipher-GVE2GQ5H.js.map +1 -0
  193. package/dist/citations.js +1 -0
  194. package/dist/{cli-BkeRaYfk.d.ts → cli-lMql2FCr.d.ts} +26 -7
  195. package/dist/cli.d.ts +11 -6
  196. package/dist/cli.js +69 -34
  197. package/dist/codex-thread-key.js +1 -0
  198. package/dist/commitment-ledger.js +1 -0
  199. package/dist/compression-optimizer.js +1 -0
  200. package/dist/config.d.ts +2 -1
  201. package/dist/config.js +4 -1
  202. package/dist/connectors-cli-DFGtY2DB.d.ts +257 -0
  203. package/dist/connectors-cli.d.ts +2 -0
  204. package/dist/connectors-cli.js +22 -0
  205. package/dist/connectors-cli.js.map +1 -0
  206. package/dist/consolidation-operator.d.ts +65 -5
  207. package/dist/consolidation-operator.js +6 -1
  208. package/dist/consolidation-provenance-check.d.ts +1 -1
  209. package/dist/consolidation-provenance-check.js +3 -2
  210. package/dist/consolidation-undo.d.ts +1 -1
  211. package/dist/consolidation-undo.js +1 -0
  212. package/dist/consolidation-undo.js.map +1 -1
  213. package/dist/{contradiction-review-WIUBAR52.js → contradiction-review-5LTTVDQV.js} +2 -1
  214. package/dist/contradiction-review-5LTTVDQV.js.map +1 -0
  215. package/dist/{contradiction-scan-E3GJTI4F.js → contradiction-scan-3Z6YW7YA.js} +2 -1
  216. package/dist/{contradiction-scan-E3GJTI4F.js.map → contradiction-scan-3Z6YW7YA.js.map} +1 -1
  217. package/dist/cross-namespace-budget.js +1 -0
  218. package/dist/cue-anchors.js +1 -0
  219. package/dist/dashboard-runtime.js +1 -0
  220. package/dist/day-summary.js +1 -0
  221. package/dist/delinearize.js +1 -0
  222. package/dist/direct-answer-wiring.js +1 -0
  223. package/dist/direct-answer.js +1 -0
  224. package/dist/dreams-ledger-LR2NBAZE.js +286 -0
  225. package/dist/dreams-ledger-LR2NBAZE.js.map +1 -0
  226. package/dist/embedding-fallback.js +1 -0
  227. package/dist/engine-O6YWKQM3.js +28 -0
  228. package/dist/engine-O6YWKQM3.js.map +1 -0
  229. package/dist/entity-retrieval.d.ts +1 -1
  230. package/dist/entity-retrieval.js +10 -7
  231. package/dist/entity-schema.js +1 -0
  232. package/dist/evals.js +1 -0
  233. package/dist/evidence-pack.d.ts +16 -0
  234. package/dist/evidence-pack.js +8 -0
  235. package/dist/evidence-pack.js.map +1 -0
  236. package/dist/explicit-capture.d.ts +6 -4
  237. package/dist/explicit-capture.js +1 -0
  238. package/dist/extraction-judge-telemetry.js +1 -0
  239. package/dist/extraction-judge-training.js +1 -0
  240. package/dist/extraction-judge.js +1 -0
  241. package/dist/extraction.js +8 -7
  242. package/dist/fallback-llm.js +3 -2
  243. package/dist/first-start-migration-4MHQEOSD.js +263 -0
  244. package/dist/first-start-migration-4MHQEOSD.js.map +1 -0
  245. package/dist/forget-PLR6J5DN.js +69 -0
  246. package/dist/forget-PLR6J5DN.js.map +1 -0
  247. package/dist/framework-CyHYDcri.d.ts +153 -0
  248. package/dist/fs-utils-IRVUFB6G.js +30 -0
  249. package/dist/fs-utils-IRVUFB6G.js.map +1 -0
  250. package/dist/graph-dashboard-diff.js +1 -0
  251. package/dist/graph-dashboard-key.js +1 -0
  252. package/dist/graph-dashboard-parser.js +1 -0
  253. package/dist/graph-edge-decay-PWB63GRE.js +207 -0
  254. package/dist/graph-edge-decay-PWB63GRE.js.map +1 -0
  255. package/dist/graph-edge-reinforcement.d.ts +81 -0
  256. package/dist/graph-edge-reinforcement.js +24 -0
  257. package/dist/graph-edge-reinforcement.js.map +1 -0
  258. package/dist/graph-events.d.ts +87 -0
  259. package/dist/graph-events.js +14 -0
  260. package/dist/graph-events.js.map +1 -0
  261. package/dist/graph-recall.js +1 -0
  262. package/dist/graph-retrieval.js +1 -0
  263. package/dist/graph-snapshot.d.ts +112 -0
  264. package/dist/graph-snapshot.js +19 -0
  265. package/dist/graph-snapshot.js.map +1 -0
  266. package/dist/graph.d.ts +105 -7
  267. package/dist/graph.js +20 -3
  268. package/dist/harmonic-retrieval.js +1 -0
  269. package/dist/himem.js +1 -0
  270. package/dist/hygiene.js +1 -0
  271. package/dist/identity-continuity.js +1 -0
  272. package/dist/importance.js +1 -0
  273. package/dist/index.d.ts +574 -13
  274. package/dist/index.js +337 -69
  275. package/dist/index.js.map +1 -1
  276. package/dist/intent.js +1 -0
  277. package/dist/json-extract.js +1 -0
  278. package/dist/json-store.js +1 -0
  279. package/dist/kdf-7S6RWKLZ.js +26 -0
  280. package/dist/kdf-7S6RWKLZ.js.map +1 -0
  281. package/dist/legacy-hook-compat.js +1 -0
  282. package/dist/legacy-hook-compat.js.map +1 -1
  283. package/dist/lifecycle.js +1 -0
  284. package/dist/live-connectors-runner.d.ts +48 -0
  285. package/dist/live-connectors-runner.js +17 -0
  286. package/dist/live-connectors-runner.js.map +1 -0
  287. package/dist/local-llm.js +1 -0
  288. package/dist/logger.js +1 -0
  289. package/dist/memory-action-policy.js +1 -0
  290. package/dist/memory-cache.d.ts +2 -1
  291. package/dist/memory-cache.js +4 -1
  292. package/dist/memory-governance-JZHZDOLN.js +37 -0
  293. package/dist/memory-governance-JZHZDOLN.js.map +1 -0
  294. package/dist/memory-lifecycle-ledger-utils.d.ts +2 -1
  295. package/dist/memory-lifecycle-ledger-utils.js +4 -1
  296. package/dist/memory-projection-format.js +1 -0
  297. package/dist/{memory-projection-store-DeSXPh1j.d.ts → memory-projection-store-CY8TU40w.d.ts} +2 -1
  298. package/dist/memory-projection-store.d.ts +1 -1
  299. package/dist/memory-projection-store.js +2 -1
  300. package/dist/memory-worth-bench.js +1 -0
  301. package/dist/memory-worth-bench.js.map +1 -1
  302. package/dist/memory-worth-filter.js +1 -0
  303. package/dist/memory-worth-outcomes.d.ts +1 -1
  304. package/dist/memory-worth-outcomes.js +1 -0
  305. package/dist/memory-worth.js +1 -0
  306. package/dist/metadata-FC3XPDRQ.js +21 -0
  307. package/dist/metadata-FC3XPDRQ.js.map +1 -0
  308. package/dist/migrate-from-identity-anchor-TTEDEJGX.js +8 -0
  309. package/dist/migrate-from-identity-anchor-TTEDEJGX.js.map +1 -0
  310. package/dist/model-registry.js +1 -0
  311. package/dist/models-json.js +1 -0
  312. package/dist/native-knowledge.js +1 -0
  313. package/dist/negative.js +1 -0
  314. package/dist/objective-state-writers.js +1 -0
  315. package/dist/objective-state-writers.js.map +1 -1
  316. package/dist/objective-state.js +1 -0
  317. package/dist/openai-chat-compat.js +1 -0
  318. package/dist/operator-toolkit.d.ts +46 -2
  319. package/dist/operator-toolkit.js +29 -17
  320. package/dist/opik-exporter.js +1 -0
  321. package/dist/opik-exporter.js.map +1 -1
  322. package/dist/{orchestrator-CmJ-NTdJ.d.ts → orchestrator-ChkesB8U.d.ts} +177 -13
  323. package/dist/orchestrator.d.ts +6 -4
  324. package/dist/orchestrator.js +57 -41
  325. package/dist/page-versioning.js +1 -0
  326. package/dist/path-RMTY5Y5A.js +9 -0
  327. package/dist/path-RMTY5Y5A.js.map +1 -0
  328. package/dist/patterns-cli.d.ts +160 -0
  329. package/dist/patterns-cli.js +29 -0
  330. package/dist/patterns-cli.js.map +1 -0
  331. package/dist/peers-6OSQ3NK6.js +44 -0
  332. package/dist/peers-6OSQ3NK6.js.map +1 -0
  333. package/dist/plugin-id.js +1 -0
  334. package/dist/policy-runtime.js +1 -0
  335. package/dist/{port-BADbLZU5.d.ts → port-hqGnoStS.d.ts} +6 -0
  336. package/dist/profiling.js +1 -0
  337. package/dist/purge-6ATBGT77.js +205 -0
  338. package/dist/purge-6ATBGT77.js.map +1 -0
  339. package/dist/qmd-recall-cache.d.ts +1 -1
  340. package/dist/qmd-recall-cache.js +1 -0
  341. package/dist/qmd.d.ts +2 -1
  342. package/dist/qmd.js +4 -3
  343. package/dist/reasoning-trace-recall.js +1 -0
  344. package/dist/reasoning-trace-types.js +1 -0
  345. package/dist/recall-audit-anomaly.js +1 -0
  346. package/dist/recall-audit.js +1 -0
  347. package/dist/recall-disclosure-escalation.d.ts +84 -0
  348. package/dist/recall-disclosure-escalation.js +14 -0
  349. package/dist/recall-disclosure-escalation.js.map +1 -0
  350. package/dist/recall-explain-renderer.js +4 -1
  351. package/dist/recall-mmr.js +1 -0
  352. package/dist/recall-qos.js +1 -0
  353. package/dist/recall-query-policy.js +1 -0
  354. package/dist/recall-state.d.ts +7 -0
  355. package/dist/recall-state.js +2 -1
  356. package/dist/recall-tag-filter.d.ts +56 -0
  357. package/dist/recall-tag-filter.js +14 -0
  358. package/dist/recall-tag-filter.js.map +1 -0
  359. package/dist/recall-tokenization.js +1 -0
  360. package/dist/recall-xray-cli.d.ts +9 -2
  361. package/dist/recall-xray-cli.js +9 -4
  362. package/dist/recall-xray-renderer.js +4 -1
  363. package/dist/recall-xray.d.ts +116 -2
  364. package/dist/recall-xray.js +9 -3
  365. package/dist/reconstruct.js +1 -0
  366. package/dist/release-changelog.js +2 -0
  367. package/dist/release-changelog.js.map +1 -1
  368. package/dist/relevance.js +1 -0
  369. package/dist/rerank.js +1 -0
  370. package/dist/{resolution-QBTDHTG7.js → resolution-YGIBORXI.js} +2 -1
  371. package/dist/{resolution-QBTDHTG7.js.map → resolution-YGIBORXI.js.map} +1 -1
  372. package/dist/resolve-auth-token.d.ts +51 -0
  373. package/dist/resolve-auth-token.js +12 -0
  374. package/dist/resolve-auth-token.js.map +1 -0
  375. package/dist/resolve-provider-secret.d.ts +9 -1
  376. package/dist/resolve-provider-secret.js +4 -1
  377. package/dist/resume-bundles.js +4 -3
  378. package/dist/retrieval-agents.d.ts +1 -1
  379. package/dist/retrieval-agents.js +1 -0
  380. package/dist/retrieval-tiers.js +1 -0
  381. package/dist/retrieval.js +1 -0
  382. package/dist/sanitize.js +1 -0
  383. package/dist/schemas.d.ts +15 -2
  384. package/dist/schemas.js +2 -1
  385. package/dist/sdk-compat.js +1 -0
  386. package/dist/sdk-compat.js.map +1 -1
  387. package/dist/secure-store-4R2GSO7S.js +156 -0
  388. package/dist/secure-store-4R2GSO7S.js.map +1 -0
  389. package/dist/semantic-chunking.js +1 -0
  390. package/dist/{semantic-consolidation-CxJU6MJk.d.ts → semantic-consolidation-ByBXb-sf.d.ts} +3 -3
  391. package/dist/semantic-consolidation.d.ts +2 -2
  392. package/dist/semantic-consolidation.js +12 -7
  393. package/dist/semantic-rule-promotion.d.ts +1 -1
  394. package/dist/semantic-rule-promotion.js +10 -7
  395. package/dist/semantic-rule-verifier.d.ts +1 -1
  396. package/dist/semantic-rule-verifier.js +10 -7
  397. package/dist/session-integrity.js +1 -0
  398. package/dist/session-observer-bands.js +1 -0
  399. package/dist/session-observer-state.js +1 -0
  400. package/dist/session-toggles.js +2 -0
  401. package/dist/session-toggles.js.map +1 -1
  402. package/dist/signal.js +1 -0
  403. package/dist/skills-registry.js +2 -0
  404. package/dist/skills-registry.js.map +1 -1
  405. package/dist/source-attribution.js +1 -0
  406. package/dist/state-NCHQ4TRG.js +8 -0
  407. package/dist/state-NCHQ4TRG.js.map +1 -0
  408. package/dist/state-store-3EH7HYIN.js +16 -0
  409. package/dist/state-store-3EH7HYIN.js.map +1 -0
  410. package/dist/storage.d.ts +76 -2
  411. package/dist/storage.js +9 -6
  412. package/dist/store-contract.js +1 -0
  413. package/dist/summarizer.js +5 -4
  414. package/dist/summary-snapshot.js +1 -0
  415. package/dist/temporal-index.js +1 -0
  416. package/dist/temporal-supersession.d.ts +1 -1
  417. package/dist/temporal-supersession.js +2 -1
  418. package/dist/temporal-validity.d.ts +52 -0
  419. package/dist/temporal-validity.js +14 -0
  420. package/dist/temporal-validity.js.map +1 -0
  421. package/dist/threading.js +1 -0
  422. package/dist/tier-migration.d.ts +2 -2
  423. package/dist/tier-migration.js +1 -0
  424. package/dist/tier-routing.js +1 -0
  425. package/dist/tier-stats-62ZVDFKS.js +152 -0
  426. package/dist/tier-stats-62ZVDFKS.js.map +1 -0
  427. package/dist/tmt.js +1 -0
  428. package/dist/tokens.js +1 -0
  429. package/dist/topics.js +1 -0
  430. package/dist/trace-C5ETWBEF.js +290 -0
  431. package/dist/trace-C5ETWBEF.js.map +1 -0
  432. package/dist/transcript.js +1 -0
  433. package/dist/trust-zones.js +1 -0
  434. package/dist/tui-RI7P6PBS.js +13 -0
  435. package/dist/tui-RI7P6PBS.js.map +1 -0
  436. package/dist/types-V3FJ26TF.js +30 -0
  437. package/dist/types-V3FJ26TF.js.map +1 -0
  438. package/dist/types.d.ts +634 -9
  439. package/dist/types.js +10 -3
  440. package/dist/utility-learner.js +1 -0
  441. package/dist/utility-runtime.js +1 -0
  442. package/dist/utility-telemetry.js +1 -0
  443. package/dist/verified-recall.js +10 -7
  444. package/dist/version-utils.js +1 -0
  445. package/dist/whitespace.js +1 -0
  446. package/dist/work-product-ledger.js +1 -0
  447. package/package.json +7 -3
  448. package/scripts/ensure-better-sqlite3.mjs +124 -0
  449. package/dist/access-service-Br8ZydTK.d.ts +0 -827
  450. package/dist/chunk-3OGMS3PE.js.map +0 -1
  451. package/dist/chunk-3YGHKTBF.js.map +0 -1
  452. package/dist/chunk-6PFRXT4K.js.map +0 -1
  453. package/dist/chunk-6YJHX2DL.js.map +0 -1
  454. package/dist/chunk-BECYBZLX.js.map +0 -1
  455. package/dist/chunk-C2EFFULQ.js.map +0 -1
  456. package/dist/chunk-CUPFXL3J.js.map +0 -1
  457. package/dist/chunk-DIXB44VE.js.map +0 -1
  458. package/dist/chunk-F5VP6YCB.js.map +0 -1
  459. package/dist/chunk-FVA6TGI3.js.map +0 -1
  460. package/dist/chunk-GA5P7RST.js.map +0 -1
  461. package/dist/chunk-KVBLZUKV.js.map +0 -1
  462. package/dist/chunk-L7IXWRYE.js.map +0 -1
  463. package/dist/chunk-LOIMBRDE.js.map +0 -1
  464. package/dist/chunk-LTCGGW2D.js +0 -14
  465. package/dist/chunk-LTCGGW2D.js.map +0 -1
  466. package/dist/chunk-NZLQTHS5.js.map +0 -1
  467. package/dist/chunk-OC5OXUQ4.js.map +0 -1
  468. package/dist/chunk-PVPWZSSI.js.map +0 -1
  469. package/dist/chunk-SPI27QT6.js.map +0 -1
  470. package/dist/chunk-STGWEHYR.js.map +0 -1
  471. package/dist/chunk-TP4FZJIZ.js.map +0 -1
  472. package/dist/chunk-ULYOGL6R.js.map +0 -1
  473. package/dist/chunk-UWB5LMWY.js.map +0 -1
  474. package/dist/chunk-VBVG2M5G.js.map +0 -1
  475. package/dist/chunk-VDX363PS.js.map +0 -1
  476. package/dist/chunk-WCLICCGB.js.map +0 -1
  477. package/dist/chunk-X6GF3FX2.js +0 -26
  478. package/dist/chunk-X6GF3FX2.js.map +0 -1
  479. package/dist/chunk-XXVWLXSG.js.map +0 -1
  480. package/dist/chunk-Y7R2XJ5Q.js.map +0 -1
  481. package/dist/chunk-ZAIM4TUE.js.map +0 -1
  482. package/dist/engine-72LSIWQP.js +0 -23
  483. /package/dist/{contradiction-review-WIUBAR52.js.map → capsule-cli.js.map} +0 -0
  484. /package/dist/{engine-72LSIWQP.js.map → capsule-crypto-5CYAGVC5.js.map} +0 -0
  485. /package/dist/{chunk-TMYO7B5P.js.map → chunk-47WOM4YW.js.map} +0 -0
  486. /package/dist/{chunk-DG6YMRDC.js.map → chunk-B2TL6GA2.js.map} +0 -0
  487. /package/dist/{chunk-AYXIPSZO.js.map → chunk-CRU27Q4J.js.map} +0 -0
  488. /package/dist/{chunk-RBBWYEFJ.js.map → chunk-G2WADRQ3.js.map} +0 -0
  489. /package/dist/{chunk-NBVAS5MT.js.map → chunk-V7TEH5I2.js.map} +0 -0
@@ -0,0 +1,277 @@
1
+ import {
2
+ DEFAULT_POLL_INTERVAL_MS,
3
+ GITHUB_CONNECTOR_ID,
4
+ GITHUB_DEFAULT_POLL_INTERVAL_MS,
5
+ GMAIL_CONNECTOR_ID,
6
+ GMAIL_DEFAULT_POLL_INTERVAL_MS,
7
+ GOOGLE_DRIVE_CONNECTOR_ID,
8
+ NOTION_CONNECTOR_ID,
9
+ NOTION_DEFAULT_POLL_INTERVAL_MS,
10
+ createGitHubConnector,
11
+ createGmailConnector,
12
+ createGoogleDriveConnector,
13
+ createNotionConnector,
14
+ validateGitHubConfig,
15
+ validateGmailConfig,
16
+ validateGoogleDriveConfig,
17
+ validateNotionConfig
18
+ } from "./chunk-L2IO2QPY.js";
19
+ import {
20
+ readConnectorState,
21
+ writeConnectorState
22
+ } from "./chunk-6TBWYBJ3.js";
23
+ import {
24
+ runConnectorPollOnce
25
+ } from "./chunk-OZHRDTDX.js";
26
+
27
+ // src/live-connectors-runner.ts
28
+ function builtInLiveConnectorDefinitions(config) {
29
+ return [
30
+ {
31
+ id: GOOGLE_DRIVE_CONNECTOR_ID,
32
+ displayName: "Google Drive",
33
+ enabled: config.googleDrive.enabled,
34
+ pollIntervalMs: config.googleDrive.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS,
35
+ rawConfig: config.googleDrive,
36
+ createConnector: createGoogleDriveConnector,
37
+ validateConfig: (raw) => validateGoogleDriveConfig(raw)
38
+ },
39
+ {
40
+ id: NOTION_CONNECTOR_ID,
41
+ displayName: "Notion",
42
+ enabled: config.notion.enabled,
43
+ pollIntervalMs: config.notion.pollIntervalMs ?? NOTION_DEFAULT_POLL_INTERVAL_MS,
44
+ rawConfig: config.notion,
45
+ createConnector: createNotionConnector,
46
+ validateConfig: (raw) => validateNotionConfig(raw)
47
+ },
48
+ {
49
+ id: GMAIL_CONNECTOR_ID,
50
+ displayName: "Gmail",
51
+ enabled: config.gmail.enabled,
52
+ pollIntervalMs: config.gmail.pollIntervalMs ?? GMAIL_DEFAULT_POLL_INTERVAL_MS,
53
+ rawConfig: config.gmail,
54
+ createConnector: createGmailConnector,
55
+ validateConfig: (raw) => validateGmailConfig(raw)
56
+ },
57
+ {
58
+ id: GITHUB_CONNECTOR_ID,
59
+ displayName: "GitHub",
60
+ enabled: config.github.enabled,
61
+ pollIntervalMs: config.github.pollIntervalMs ?? GITHUB_DEFAULT_POLL_INTERVAL_MS,
62
+ rawConfig: config.github,
63
+ createConnector: createGitHubConnector,
64
+ validateConfig: (raw) => validateGitHubConfig(raw)
65
+ }
66
+ ];
67
+ }
68
+ function hasEnabledLiveConnector(config) {
69
+ return config.googleDrive.enabled || config.notion.enabled || config.gmail.enabled || config.github.enabled;
70
+ }
71
+ async function runLiveConnectorsOnce(options) {
72
+ const ranAt = resolveNow(options.now);
73
+ const force = options.force === true;
74
+ const definitions = options.definitions ?? builtInLiveConnectorDefinitions(options.connectors);
75
+ const results = [];
76
+ for (const definition of definitions) {
77
+ const checkAt = resolveNow(options.now);
78
+ if (!definition.enabled) {
79
+ results.push(skipResult(definition, null, "disabled"));
80
+ continue;
81
+ }
82
+ let state;
83
+ try {
84
+ state = await readConnectorState(options.memoryDir, definition.id);
85
+ } catch (err) {
86
+ results.push({
87
+ id: definition.id,
88
+ displayName: definition.displayName,
89
+ enabled: true,
90
+ ran: false,
91
+ skippedReason: "state_read_error",
92
+ docsImported: 0,
93
+ error: err instanceof Error ? err.message : String(err),
94
+ lastSyncAt: null,
95
+ nextDueAt: null
96
+ });
97
+ continue;
98
+ }
99
+ if (!force && !isConnectorDue(state, definition.pollIntervalMs, checkAt)) {
100
+ results.push(skipResult(definition, state, "not_due"));
101
+ continue;
102
+ }
103
+ let validatedConfig;
104
+ try {
105
+ validatedConfig = definition.validateConfig(definition.rawConfig);
106
+ } catch (err) {
107
+ const message = err instanceof Error ? err.message : String(err);
108
+ let stateWriteError;
109
+ let writtenErrorState;
110
+ const errorAt = resolveNow(options.now);
111
+ try {
112
+ writtenErrorState = await writeConnectorErrorState({
113
+ memoryDir: options.memoryDir,
114
+ connectorId: definition.id,
115
+ state,
116
+ error: message,
117
+ now: errorAt
118
+ });
119
+ } catch (writeErr) {
120
+ stateWriteError = writeErr instanceof Error ? writeErr.message : String(writeErr);
121
+ }
122
+ const reportedState = writtenErrorState ?? state;
123
+ results.push({
124
+ id: definition.id,
125
+ displayName: definition.displayName,
126
+ enabled: true,
127
+ ran: false,
128
+ skippedReason: "invalid_config",
129
+ docsImported: 0,
130
+ error: message,
131
+ ...stateWriteError !== void 0 ? { stateWriteError } : {},
132
+ lastSyncAt: reportedState?.lastSyncAt ?? null,
133
+ nextDueAt: nextDueAt(reportedState, definition.pollIntervalMs)
134
+ });
135
+ continue;
136
+ }
137
+ let runResult;
138
+ let lastStateWrittenAt;
139
+ try {
140
+ const connector = definition.createConnector();
141
+ runResult = await runConnectorPollOnce({
142
+ connectorId: definition.id,
143
+ priorState: state,
144
+ syncFn: (cursor) => connector.syncIncremental({
145
+ cursor,
146
+ config: validatedConfig,
147
+ abortSignal: options.abortSignal
148
+ }),
149
+ ingestFn: options.ingestDocuments,
150
+ writeCursorFn: (writeState) => {
151
+ const writeAt = resolveNow(options.now);
152
+ return writeConnectorState(options.memoryDir, definition.id, {
153
+ id: definition.id,
154
+ cursor: writeState.cursor,
155
+ lastSyncAt: writeAt.toISOString(),
156
+ lastSyncStatus: writeState.lastSyncStatus,
157
+ ...writeState.lastSyncError !== void 0 ? { lastSyncError: writeState.lastSyncError } : {},
158
+ totalDocsImported: writeState.totalDocsImported
159
+ }).then(() => {
160
+ lastStateWrittenAt = writeAt;
161
+ });
162
+ }
163
+ });
164
+ } catch (err) {
165
+ const message = err instanceof Error ? err.message : String(err);
166
+ let stateWriteError;
167
+ let writtenErrorState;
168
+ const errorAt = resolveNow(options.now);
169
+ try {
170
+ writtenErrorState = await writeConnectorErrorState({
171
+ memoryDir: options.memoryDir,
172
+ connectorId: definition.id,
173
+ state,
174
+ error: message,
175
+ now: errorAt
176
+ });
177
+ } catch (writeErr) {
178
+ stateWriteError = writeErr instanceof Error ? writeErr.message : String(writeErr);
179
+ }
180
+ const reportedState = writtenErrorState ?? state;
181
+ results.push({
182
+ id: definition.id,
183
+ displayName: definition.displayName,
184
+ enabled: true,
185
+ ran: false,
186
+ skippedReason: "connector_error",
187
+ docsImported: 0,
188
+ error: message,
189
+ ...stateWriteError !== void 0 ? { stateWriteError } : {},
190
+ lastSyncAt: reportedState?.lastSyncAt ?? null,
191
+ nextDueAt: nextDueAt(reportedState, definition.pollIntervalMs)
192
+ });
193
+ continue;
194
+ }
195
+ results.push(
196
+ runItemFromResult(
197
+ definition,
198
+ runResult,
199
+ state,
200
+ lastStateWrittenAt ?? resolveNow(options.now)
201
+ )
202
+ );
203
+ }
204
+ return {
205
+ ranAt: ranAt.toISOString(),
206
+ force,
207
+ totalDocsImported: results.reduce((sum, item) => sum + item.docsImported, 0),
208
+ ranCount: results.filter((item) => item.ran).length,
209
+ skippedCount: results.filter((item) => !item.ran).length,
210
+ errorCount: results.filter(
211
+ (item) => item.error !== void 0 || item.stateWriteError !== void 0
212
+ ).length,
213
+ results
214
+ };
215
+ }
216
+ function resolveNow(now) {
217
+ return typeof now === "function" ? now() : now ?? /* @__PURE__ */ new Date();
218
+ }
219
+ function isConnectorDue(state, pollIntervalMs, now) {
220
+ if (state?.lastSyncAt === null || state?.lastSyncAt === void 0) return true;
221
+ const lastMs = Date.parse(state.lastSyncAt);
222
+ if (!Number.isFinite(lastMs)) return true;
223
+ return now.getTime() - lastMs >= Math.max(1, Math.floor(pollIntervalMs));
224
+ }
225
+ function nextDueAt(state, pollIntervalMs) {
226
+ if (state?.lastSyncAt === null || state?.lastSyncAt === void 0) return null;
227
+ const lastMs = Date.parse(state.lastSyncAt);
228
+ if (!Number.isFinite(lastMs)) return null;
229
+ return new Date(lastMs + Math.max(1, Math.floor(pollIntervalMs))).toISOString();
230
+ }
231
+ function skipResult(definition, state, skippedReason) {
232
+ return {
233
+ id: definition.id,
234
+ displayName: definition.displayName,
235
+ enabled: definition.enabled,
236
+ ran: false,
237
+ skippedReason,
238
+ docsImported: 0,
239
+ lastSyncAt: state?.lastSyncAt ?? null,
240
+ nextDueAt: skippedReason === "not_due" ? nextDueAt(state, definition.pollIntervalMs) : null
241
+ };
242
+ }
243
+ function runItemFromResult(definition, result, priorState, now) {
244
+ const stateWriteFailed = result.stateWriteError !== void 0;
245
+ const reportedLastSyncAt = stateWriteFailed ? priorState?.lastSyncAt ?? null : now.toISOString();
246
+ const reportedNextDueAt = stateWriteFailed ? nextDueAt(priorState, definition.pollIntervalMs) : new Date(
247
+ now.getTime() + Math.max(1, Math.floor(definition.pollIntervalMs))
248
+ ).toISOString();
249
+ return {
250
+ id: definition.id,
251
+ displayName: definition.displayName,
252
+ enabled: definition.enabled,
253
+ ran: true,
254
+ docsImported: result.docsImported,
255
+ ...result.error !== void 0 ? { error: result.error } : {},
256
+ ...result.stateWriteError !== void 0 ? { stateWriteError: result.stateWriteError } : {},
257
+ lastSyncAt: reportedLastSyncAt,
258
+ nextDueAt: reportedNextDueAt
259
+ };
260
+ }
261
+ async function writeConnectorErrorState(options) {
262
+ return writeConnectorState(options.memoryDir, options.connectorId, {
263
+ id: options.connectorId,
264
+ cursor: options.state?.cursor ?? null,
265
+ lastSyncAt: options.now.toISOString(),
266
+ lastSyncStatus: "error",
267
+ lastSyncError: options.error,
268
+ totalDocsImported: options.state?.totalDocsImported ?? 0
269
+ });
270
+ }
271
+
272
+ export {
273
+ builtInLiveConnectorDefinitions,
274
+ hasEnabledLiveConnector,
275
+ runLiveConnectorsOnce
276
+ };
277
+ //# sourceMappingURL=chunk-ASIQZXYO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/live-connectors-runner.ts"],"sourcesContent":["import {\n runConnectorPollOnce,\n type ConnectorRunResult,\n} from \"./connectors-cli.js\";\nimport {\n createGitHubConnector,\n createGmailConnector,\n createGoogleDriveConnector,\n createNotionConnector,\n GITHUB_CONNECTOR_ID,\n GITHUB_DEFAULT_POLL_INTERVAL_MS,\n GMAIL_CONNECTOR_ID,\n GMAIL_DEFAULT_POLL_INTERVAL_MS,\n GOOGLE_DRIVE_CONNECTOR_ID,\n GOOGLE_DRIVE_DEFAULT_POLL_INTERVAL_MS,\n NOTION_CONNECTOR_ID,\n NOTION_DEFAULT_POLL_INTERVAL_MS,\n readConnectorState,\n writeConnectorState,\n validateGitHubConfig,\n validateGmailConfig,\n validateGoogleDriveConfig,\n validateNotionConfig,\n type ConnectorConfig,\n type ConnectorCursor,\n type ConnectorDocument,\n type ConnectorState,\n type LiveConnector,\n} from \"./connectors/live/index.js\";\nimport type { LiveConnectorsConfig } from \"./types.js\";\n\nexport type LiveConnectorSkipReason =\n | \"disabled\"\n | \"not_due\"\n | \"invalid_config\"\n | \"state_read_error\"\n | \"connector_error\";\n\nexport interface LiveConnectorRunItem {\n id: string;\n displayName: string;\n enabled: boolean;\n ran: boolean;\n skippedReason?: LiveConnectorSkipReason;\n docsImported: number;\n error?: string;\n stateWriteError?: string;\n lastSyncAt: string | null;\n nextDueAt: string | null;\n}\n\nexport interface LiveConnectorsRunSummary {\n ranAt: string;\n force: boolean;\n totalDocsImported: number;\n ranCount: number;\n skippedCount: number;\n errorCount: number;\n results: LiveConnectorRunItem[];\n}\n\nexport interface LiveConnectorDefinition {\n id: string;\n displayName: string;\n enabled: boolean;\n pollIntervalMs: number;\n rawConfig: unknown;\n createConnector: () => LiveConnector;\n validateConfig: (raw: unknown) => ConnectorConfig;\n}\n\ntype LiveConnectorsNow = Date | (() => Date);\n\nexport function builtInLiveConnectorDefinitions(\n config: LiveConnectorsConfig,\n): LiveConnectorDefinition[] {\n return [\n {\n id: GOOGLE_DRIVE_CONNECTOR_ID,\n displayName: \"Google Drive\",\n enabled: config.googleDrive.enabled,\n pollIntervalMs:\n config.googleDrive.pollIntervalMs ?? GOOGLE_DRIVE_DEFAULT_POLL_INTERVAL_MS,\n rawConfig: config.googleDrive,\n createConnector: createGoogleDriveConnector,\n validateConfig: (raw) =>\n validateGoogleDriveConfig(raw) as unknown as ConnectorConfig,\n },\n {\n id: NOTION_CONNECTOR_ID,\n displayName: \"Notion\",\n enabled: config.notion.enabled,\n pollIntervalMs: config.notion.pollIntervalMs ?? NOTION_DEFAULT_POLL_INTERVAL_MS,\n rawConfig: config.notion,\n createConnector: createNotionConnector,\n validateConfig: (raw) =>\n validateNotionConfig(raw) as unknown as ConnectorConfig,\n },\n {\n id: GMAIL_CONNECTOR_ID,\n displayName: \"Gmail\",\n enabled: config.gmail.enabled,\n pollIntervalMs: config.gmail.pollIntervalMs ?? GMAIL_DEFAULT_POLL_INTERVAL_MS,\n rawConfig: config.gmail,\n createConnector: createGmailConnector,\n validateConfig: (raw) => validateGmailConfig(raw) as unknown as ConnectorConfig,\n },\n {\n id: GITHUB_CONNECTOR_ID,\n displayName: \"GitHub\",\n enabled: config.github.enabled,\n pollIntervalMs:\n config.github.pollIntervalMs ?? GITHUB_DEFAULT_POLL_INTERVAL_MS,\n rawConfig: config.github,\n createConnector: createGitHubConnector,\n validateConfig: (raw) => validateGitHubConfig(raw) as unknown as ConnectorConfig,\n },\n ];\n}\n\nexport function hasEnabledLiveConnector(config: LiveConnectorsConfig): boolean {\n return (\n config.googleDrive.enabled ||\n config.notion.enabled ||\n config.gmail.enabled ||\n config.github.enabled\n );\n}\n\nexport async function runLiveConnectorsOnce(options: {\n memoryDir: string;\n connectors: LiveConnectorsConfig;\n ingestDocuments: (docs: ConnectorDocument[]) => Promise<void>;\n force?: boolean;\n now?: LiveConnectorsNow;\n abortSignal?: AbortSignal;\n definitions?: LiveConnectorDefinition[];\n}): Promise<LiveConnectorsRunSummary> {\n const ranAt = resolveNow(options.now);\n const force = options.force === true;\n const definitions =\n options.definitions ?? builtInLiveConnectorDefinitions(options.connectors);\n const results: LiveConnectorRunItem[] = [];\n\n for (const definition of definitions) {\n const checkAt = resolveNow(options.now);\n if (!definition.enabled) {\n results.push(skipResult(definition, null, \"disabled\"));\n continue;\n }\n let state: ConnectorState | null;\n try {\n state = await readConnectorState(options.memoryDir, definition.id);\n } catch (err) {\n results.push({\n id: definition.id,\n displayName: definition.displayName,\n enabled: true,\n ran: false,\n skippedReason: \"state_read_error\",\n docsImported: 0,\n error: err instanceof Error ? err.message : String(err),\n lastSyncAt: null,\n nextDueAt: null,\n });\n continue;\n }\n if (!force && !isConnectorDue(state, definition.pollIntervalMs, checkAt)) {\n results.push(skipResult(definition, state, \"not_due\"));\n continue;\n }\n\n let validatedConfig: ConnectorConfig;\n try {\n validatedConfig = definition.validateConfig(definition.rawConfig);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n let stateWriteError: string | undefined;\n let writtenErrorState: ConnectorState | undefined;\n const errorAt = resolveNow(options.now);\n try {\n writtenErrorState = await writeConnectorErrorState({\n memoryDir: options.memoryDir,\n connectorId: definition.id,\n state,\n error: message,\n now: errorAt,\n });\n } catch (writeErr) {\n stateWriteError =\n writeErr instanceof Error ? writeErr.message : String(writeErr);\n }\n const reportedState = writtenErrorState ?? state;\n results.push({\n id: definition.id,\n displayName: definition.displayName,\n enabled: true,\n ran: false,\n skippedReason: \"invalid_config\",\n docsImported: 0,\n error: message,\n ...(stateWriteError !== undefined ? { stateWriteError } : {}),\n lastSyncAt: reportedState?.lastSyncAt ?? null,\n nextDueAt: nextDueAt(reportedState, definition.pollIntervalMs),\n });\n continue;\n }\n\n let runResult: ConnectorRunResult;\n let lastStateWrittenAt: Date | undefined;\n try {\n const connector = definition.createConnector();\n runResult = await runConnectorPollOnce({\n connectorId: definition.id,\n priorState: state,\n syncFn: (cursor: ConnectorCursor | null) =>\n connector.syncIncremental({\n cursor,\n config: validatedConfig,\n abortSignal: options.abortSignal,\n }),\n ingestFn: options.ingestDocuments,\n writeCursorFn: (writeState) => {\n const writeAt = resolveNow(options.now);\n return writeConnectorState(options.memoryDir, definition.id, {\n id: definition.id,\n cursor: writeState.cursor,\n lastSyncAt: writeAt.toISOString(),\n lastSyncStatus: writeState.lastSyncStatus,\n ...(writeState.lastSyncError !== undefined\n ? { lastSyncError: writeState.lastSyncError }\n : {}),\n totalDocsImported: writeState.totalDocsImported,\n }).then(() => {\n lastStateWrittenAt = writeAt;\n });\n },\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n let stateWriteError: string | undefined;\n let writtenErrorState: ConnectorState | undefined;\n const errorAt = resolveNow(options.now);\n try {\n writtenErrorState = await writeConnectorErrorState({\n memoryDir: options.memoryDir,\n connectorId: definition.id,\n state,\n error: message,\n now: errorAt,\n });\n } catch (writeErr) {\n stateWriteError =\n writeErr instanceof Error ? writeErr.message : String(writeErr);\n }\n const reportedState = writtenErrorState ?? state;\n results.push({\n id: definition.id,\n displayName: definition.displayName,\n enabled: true,\n ran: false,\n skippedReason: \"connector_error\",\n docsImported: 0,\n error: message,\n ...(stateWriteError !== undefined ? { stateWriteError } : {}),\n lastSyncAt: reportedState?.lastSyncAt ?? null,\n nextDueAt: nextDueAt(reportedState, definition.pollIntervalMs),\n });\n continue;\n }\n results.push(\n runItemFromResult(\n definition,\n runResult,\n state,\n lastStateWrittenAt ?? resolveNow(options.now),\n ),\n );\n }\n\n return {\n ranAt: ranAt.toISOString(),\n force,\n totalDocsImported: results.reduce((sum, item) => sum + item.docsImported, 0),\n ranCount: results.filter((item) => item.ran).length,\n skippedCount: results.filter((item) => !item.ran).length,\n errorCount: results.filter(\n (item) => item.error !== undefined || item.stateWriteError !== undefined,\n ).length,\n results,\n };\n}\n\nfunction resolveNow(now: LiveConnectorsNow | undefined): Date {\n return typeof now === \"function\" ? now() : now ?? new Date();\n}\n\nfunction isConnectorDue(\n state: ConnectorState | null,\n pollIntervalMs: number,\n now: Date,\n): boolean {\n if (state?.lastSyncAt === null || state?.lastSyncAt === undefined) return true;\n const lastMs = Date.parse(state.lastSyncAt);\n if (!Number.isFinite(lastMs)) return true;\n return now.getTime() - lastMs >= Math.max(1, Math.floor(pollIntervalMs));\n}\n\nfunction nextDueAt(\n state: ConnectorState | null,\n pollIntervalMs: number,\n): string | null {\n if (state?.lastSyncAt === null || state?.lastSyncAt === undefined) return null;\n const lastMs = Date.parse(state.lastSyncAt);\n if (!Number.isFinite(lastMs)) return null;\n return new Date(lastMs + Math.max(1, Math.floor(pollIntervalMs))).toISOString();\n}\n\nfunction skipResult(\n definition: LiveConnectorDefinition,\n state: ConnectorState | null,\n skippedReason: LiveConnectorSkipReason,\n): LiveConnectorRunItem {\n return {\n id: definition.id,\n displayName: definition.displayName,\n enabled: definition.enabled,\n ran: false,\n skippedReason,\n docsImported: 0,\n lastSyncAt: state?.lastSyncAt ?? null,\n nextDueAt:\n skippedReason === \"not_due\"\n ? nextDueAt(state, definition.pollIntervalMs)\n : null,\n };\n}\n\nfunction runItemFromResult(\n definition: LiveConnectorDefinition,\n result: ConnectorRunResult,\n priorState: ConnectorState | null,\n now: Date,\n): LiveConnectorRunItem {\n const stateWriteFailed = result.stateWriteError !== undefined;\n const reportedLastSyncAt = stateWriteFailed\n ? priorState?.lastSyncAt ?? null\n : now.toISOString();\n const reportedNextDueAt = stateWriteFailed\n ? nextDueAt(priorState, definition.pollIntervalMs)\n : new Date(\n now.getTime() + Math.max(1, Math.floor(definition.pollIntervalMs)),\n ).toISOString();\n\n return {\n id: definition.id,\n displayName: definition.displayName,\n enabled: definition.enabled,\n ran: true,\n docsImported: result.docsImported,\n ...(result.error !== undefined ? { error: result.error } : {}),\n ...(result.stateWriteError !== undefined\n ? { stateWriteError: result.stateWriteError }\n : {}),\n lastSyncAt: reportedLastSyncAt,\n nextDueAt: reportedNextDueAt,\n };\n}\n\nasync function writeConnectorErrorState(options: {\n memoryDir: string;\n connectorId: string;\n state: ConnectorState | null;\n error: string;\n now: Date;\n}): Promise<ConnectorState> {\n return writeConnectorState(options.memoryDir, options.connectorId, {\n id: options.connectorId,\n cursor: options.state?.cursor ?? null,\n lastSyncAt: options.now.toISOString(),\n lastSyncStatus: \"error\",\n lastSyncError: options.error,\n totalDocsImported: options.state?.totalDocsImported ?? 0,\n });\n}\n"],"mappings":"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","names":[]}
@@ -11,7 +11,7 @@ import {
11
11
  } from "./chunk-R2XRID2N.js";
12
12
  import {
13
13
  FallbackLlmClient
14
- } from "./chunk-AYXIPSZO.js";
14
+ } from "./chunk-CRU27Q4J.js";
15
15
  import {
16
16
  extractJsonCandidates
17
17
  } from "./chunk-UZB5KHKX.js";
@@ -618,4 +618,4 @@ ${truncatedConversation}`;
618
618
  export {
619
619
  HourlySummarizer
620
620
  };
621
- //# sourceMappingURL=chunk-DG6YMRDC.js.map
621
+ //# sourceMappingURL=chunk-B2TL6GA2.js.map
@@ -0,0 +1,290 @@
1
+ import {
2
+ buildMetadata,
3
+ decodeMetadataSalt,
4
+ parseMetadata,
5
+ serializeMetadata
6
+ } from "./chunk-UKJAGEXH.js";
7
+ import {
8
+ KDF_KEY_LENGTH,
9
+ KDF_SALT_LENGTH,
10
+ deriveKey
11
+ } from "./chunk-FP2373TW.js";
12
+ import {
13
+ open,
14
+ seal
15
+ } from "./chunk-A6XUJE5D.js";
16
+ import {
17
+ __export
18
+ } from "./chunk-PZ5AY32C.js";
19
+
20
+ // src/secure-store/header.ts
21
+ import { mkdir, readFile, writeFile } from "fs/promises";
22
+ import path from "path";
23
+ var SECURE_STORE_DIR_NAME = ".secure-store";
24
+ var HEADER_FILENAME = "header.json";
25
+ var HEADER_FORMAT = "remnic.secure-store.header";
26
+ var HEADER_FORMAT_VERSION = 1;
27
+ var VERIFIER_PLAINTEXT = Buffer.from("remnic-secure-store-v1", "utf8");
28
+ var VERIFIER_AAD = Buffer.from("remnic-secure-store/verifier", "utf8");
29
+ function secureStoreDir(memoryDir) {
30
+ return path.join(memoryDir, SECURE_STORE_DIR_NAME);
31
+ }
32
+ function headerPath(memoryDir) {
33
+ return path.join(secureStoreDir(memoryDir), HEADER_FILENAME);
34
+ }
35
+ function buildHeader(options) {
36
+ const { metadata, derivedKey } = options;
37
+ if (!Buffer.isBuffer(derivedKey) || derivedKey.length !== KDF_KEY_LENGTH) {
38
+ throw new Error(
39
+ `derivedKey must be a ${KDF_KEY_LENGTH}-byte Buffer, got length=${derivedKey?.length ?? "non-buffer"}`
40
+ );
41
+ }
42
+ const salt = decodeMetadataSalt(metadata);
43
+ if (salt.length !== KDF_SALT_LENGTH) {
44
+ throw new Error(`metadata salt is ${salt.length} bytes, expected ${KDF_SALT_LENGTH}`);
45
+ }
46
+ const envelope = seal(derivedKey, salt, VERIFIER_PLAINTEXT, { aad: VERIFIER_AAD });
47
+ return {
48
+ format: HEADER_FORMAT,
49
+ formatVersion: HEADER_FORMAT_VERSION,
50
+ metadata,
51
+ verifier: envelope.toString("hex"),
52
+ createdAt: options.createdAt ?? (/* @__PURE__ */ new Date()).toISOString()
53
+ };
54
+ }
55
+ function serializeHeader(header) {
56
+ validateHeader(header);
57
+ const metadataString = serializeMetadata(header.metadata);
58
+ const metadataObject = JSON.parse(metadataString);
59
+ const ordered = {
60
+ format: header.format,
61
+ formatVersion: header.formatVersion,
62
+ metadata: metadataObject,
63
+ verifier: header.verifier,
64
+ createdAt: header.createdAt
65
+ };
66
+ return JSON.stringify(ordered, null, 2);
67
+ }
68
+ function parseHeader(json) {
69
+ if (typeof json !== "string") {
70
+ throw new Error("header input must be a string");
71
+ }
72
+ let parsed;
73
+ try {
74
+ parsed = JSON.parse(json);
75
+ } catch (e) {
76
+ const msg = e instanceof Error ? e.message : String(e);
77
+ throw new Error(`header is not valid JSON: ${msg}`);
78
+ }
79
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
80
+ throw new Error("header must be a JSON object");
81
+ }
82
+ const obj = parsed;
83
+ if (obj.format !== HEADER_FORMAT) {
84
+ throw new Error(
85
+ `unexpected header format: ${String(obj.format)} (expected ${HEADER_FORMAT})`
86
+ );
87
+ }
88
+ if (obj.formatVersion !== HEADER_FORMAT_VERSION) {
89
+ throw new Error(
90
+ `unsupported header formatVersion: ${String(obj.formatVersion)} (this build supports ${HEADER_FORMAT_VERSION})`
91
+ );
92
+ }
93
+ if (typeof obj.verifier !== "string" || obj.verifier.length === 0) {
94
+ throw new Error("header.verifier must be a non-empty hex string");
95
+ }
96
+ if (!/^[0-9a-fA-F]+$/.test(obj.verifier)) {
97
+ throw new Error("header.verifier must be a hex-encoded string");
98
+ }
99
+ if (obj.verifier.length % 2 !== 0) {
100
+ throw new Error(
101
+ "header.verifier hex string must have even length (each byte encodes as two hex digits)"
102
+ );
103
+ }
104
+ if (typeof obj.createdAt !== "string" || obj.createdAt.length === 0) {
105
+ throw new Error("header.createdAt must be a non-empty string");
106
+ }
107
+ if (typeof obj.metadata !== "object" || obj.metadata === null) {
108
+ throw new Error("header.metadata must be an object");
109
+ }
110
+ const metadata = parseMetadata(JSON.stringify(obj.metadata));
111
+ const header = {
112
+ format: HEADER_FORMAT,
113
+ formatVersion: HEADER_FORMAT_VERSION,
114
+ metadata,
115
+ verifier: obj.verifier,
116
+ createdAt: obj.createdAt
117
+ };
118
+ validateHeader(header);
119
+ return header;
120
+ }
121
+ function validateHeader(header) {
122
+ if (header.format !== HEADER_FORMAT) {
123
+ throw new Error(`header.format must be ${HEADER_FORMAT}`);
124
+ }
125
+ if (header.formatVersion !== HEADER_FORMAT_VERSION) {
126
+ throw new Error(`header.formatVersion must be ${HEADER_FORMAT_VERSION}`);
127
+ }
128
+ if (typeof header.createdAt !== "string" || header.createdAt.length === 0) {
129
+ throw new Error("header.createdAt must be a non-empty ISO-8601 string");
130
+ }
131
+ if (typeof header.verifier !== "string" || header.verifier.length === 0) {
132
+ throw new Error("header.verifier must be a non-empty hex string");
133
+ }
134
+ if (!/^[0-9a-fA-F]+$/.test(header.verifier)) {
135
+ throw new Error("header.verifier must be a hex-encoded string");
136
+ }
137
+ if (header.verifier.length % 2 !== 0) {
138
+ throw new Error(
139
+ "header.verifier hex string must have even length (each byte encodes as two hex digits)"
140
+ );
141
+ }
142
+ if (header.metadata.format !== "remnic.secure-store.metadata") {
143
+ throw new Error("header.metadata.format must be remnic.secure-store.metadata");
144
+ }
145
+ }
146
+ function verifyKey(header, candidateKey) {
147
+ if (!Buffer.isBuffer(candidateKey) || candidateKey.length !== KDF_KEY_LENGTH) {
148
+ return false;
149
+ }
150
+ const envelope = Buffer.from(header.verifier, "hex");
151
+ try {
152
+ const plaintext = open(candidateKey, envelope, { aad: VERIFIER_AAD });
153
+ return plaintext.equals(VERIFIER_PLAINTEXT);
154
+ } catch {
155
+ return false;
156
+ }
157
+ }
158
+ function deriveKeyFromHeader(header, passphrase) {
159
+ const salt = decodeMetadataSalt(header.metadata);
160
+ const params = header.metadata.kdf.params;
161
+ return deriveKey(header.metadata.kdf.algorithm, passphrase, salt, params);
162
+ }
163
+ async function readHeader(memoryDir) {
164
+ const target = headerPath(memoryDir);
165
+ let raw;
166
+ try {
167
+ raw = await readFile(target, "utf8");
168
+ } catch (e) {
169
+ if (e.code === "ENOENT") {
170
+ return null;
171
+ }
172
+ throw e;
173
+ }
174
+ return parseHeader(raw);
175
+ }
176
+ async function writeHeader(memoryDir, header) {
177
+ validateHeader(header);
178
+ const dir = secureStoreDir(memoryDir);
179
+ await mkdir(dir, { recursive: true });
180
+ const target = headerPath(memoryDir);
181
+ try {
182
+ await writeFile(target, serializeHeader(header), {
183
+ encoding: "utf8",
184
+ mode: 384,
185
+ flag: "wx"
186
+ });
187
+ } catch (e) {
188
+ if (e.code === "EEXIST") {
189
+ throw new Error(
190
+ `secure-store header already exists at ${target}. Refusing to overwrite \u2014 initialize a fresh store or remove the existing header explicitly.`
191
+ );
192
+ }
193
+ throw e;
194
+ }
195
+ return target;
196
+ }
197
+ function buildHeaderFromPassphrase(options) {
198
+ const { passphrase, salt } = options;
199
+ const algorithm = options.algorithm ?? "argon2id";
200
+ const metadataOpts = { algorithm, salt };
201
+ if (options.params !== void 0) metadataOpts.params = options.params;
202
+ if (options.createdAt !== void 0) metadataOpts.createdAt = options.createdAt;
203
+ if (options.note !== void 0) metadataOpts.note = options.note;
204
+ const metadata = buildMetadata(metadataOpts);
205
+ const params = metadata.kdf.params;
206
+ const derivedKey = deriveKey(algorithm, passphrase, salt, params);
207
+ const headerOpts = {
208
+ metadata,
209
+ derivedKey
210
+ };
211
+ if (options.createdAt !== void 0) headerOpts.createdAt = options.createdAt;
212
+ const header = buildHeader(headerOpts);
213
+ return { header, derivedKey };
214
+ }
215
+
216
+ // src/secure-store/keyring.ts
217
+ var keyring_exports = {};
218
+ __export(keyring_exports, {
219
+ getKey: () => getKey,
220
+ lock: () => lock,
221
+ lockAll: () => lockAll,
222
+ size: () => size,
223
+ status: () => status,
224
+ unlock: () => unlock
225
+ });
226
+ var ENTRIES = /* @__PURE__ */ new Map();
227
+ function unlock(id, key, now = () => /* @__PURE__ */ new Date()) {
228
+ if (typeof id !== "string" || id.length === 0) {
229
+ throw new Error("keyring id must be a non-empty string");
230
+ }
231
+ if (!Buffer.isBuffer(key) || key.length !== 32) {
232
+ throw new Error(`keyring key must be a 32-byte Buffer, got length=${key?.length ?? "non-buffer"}`);
233
+ }
234
+ const existing = ENTRIES.get(id);
235
+ if (existing) {
236
+ existing.key.fill(0);
237
+ }
238
+ ENTRIES.set(id, { key, unlockedAt: now().toISOString() });
239
+ }
240
+ function getKey(id) {
241
+ const entry = ENTRIES.get(id);
242
+ return entry ? entry.key : null;
243
+ }
244
+ function lock(id) {
245
+ const entry = ENTRIES.get(id);
246
+ if (!entry) return false;
247
+ entry.key.fill(0);
248
+ ENTRIES.delete(id);
249
+ return true;
250
+ }
251
+ function lockAll() {
252
+ for (const entry of ENTRIES.values()) {
253
+ entry.key.fill(0);
254
+ }
255
+ ENTRIES.clear();
256
+ }
257
+ function status(id) {
258
+ const entry = ENTRIES.get(id);
259
+ if (!entry) {
260
+ return { unlocked: false, unlockedAt: null };
261
+ }
262
+ return { unlocked: true, unlockedAt: entry.unlockedAt };
263
+ }
264
+ function size() {
265
+ return ENTRIES.size;
266
+ }
267
+
268
+ export {
269
+ SECURE_STORE_DIR_NAME,
270
+ HEADER_FILENAME,
271
+ HEADER_FORMAT,
272
+ HEADER_FORMAT_VERSION,
273
+ secureStoreDir,
274
+ headerPath,
275
+ buildHeader,
276
+ serializeHeader,
277
+ parseHeader,
278
+ validateHeader,
279
+ verifyKey,
280
+ deriveKeyFromHeader,
281
+ readHeader,
282
+ writeHeader,
283
+ buildHeaderFromPassphrase,
284
+ unlock,
285
+ getKey,
286
+ lock,
287
+ status,
288
+ keyring_exports
289
+ };
290
+ //# sourceMappingURL=chunk-BJMBJZ2Y.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/secure-store/header.ts","../src/secure-store/keyring.ts"],"sourcesContent":["/**\n * On-disk header for an initialized secure-store (issue #690 PR 2/4).\n *\n * The header file is the persistent record that a memory directory\n * has had `remnic secure-store init` run against it. It is a JSON\n * file at `<memoryDir>/.secure-store/header.json` with two parts:\n *\n * 1. The KDF metadata from PR 1/4 (`SecureStoreMetadata`) —\n * algorithm, params, and salt. Public; safe to read/copy.\n * 2. A \"verifier\" — a tiny AES-GCM-encrypted envelope sealed under\n * the derived key at init time. Unlock re-derives the key from\n * the entered passphrase and tries to `open()` the verifier; if\n * the auth tag validates, the passphrase is correct.\n *\n * Why a verifier?\n * ---------------\n * Without one, \"wrong passphrase\" can only be detected when the\n * daemon tries to decrypt actual memory data — too late for a\n * useful CLI error. The verifier gives the unlock command a fast,\n * data-independent passphrase check.\n *\n * The verifier plaintext is a fixed magic string (no secret content).\n * Its only role is to be sealable + openable; the auth-tag check is\n * what proves the key.\n *\n * Naming\n * ------\n * Directory: `.secure-store/` (leading dot — hidden, hints at\n * sensitivity). File: `header.json`. Avoids collision with\n * `.secure-store-metadata.json` from PR 1/4 docs since the header\n * is a strict superset.\n */\n\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { open, seal } from \"./cipher.js\";\nimport {\n KDF_KEY_LENGTH,\n KDF_SALT_LENGTH,\n deriveKey,\n type Argon2idParams,\n type ScryptParams,\n} from \"./kdf.js\";\nimport {\n buildMetadata,\n decodeMetadataSalt,\n parseMetadata,\n serializeMetadata,\n type SecureStoreMetadata,\n} from \"./metadata.js\";\n\n/** Subdirectory under `memoryDir` that holds the header + future state. */\nexport const SECURE_STORE_DIR_NAME = \".secure-store\";\n\n/** Header filename. Stable name so operators can locate it. */\nexport const HEADER_FILENAME = \"header.json\";\n\n/** Stable identifier so the file shape is sniffable without parsing JSON. */\nexport const HEADER_FORMAT = \"remnic.secure-store.header\" as const;\n\n/** Current header format version. Bump on breaking schema changes. */\nexport const HEADER_FORMAT_VERSION = 1 as const;\n\n/**\n * Magic bytes sealed under the master key at init time. Constant\n * across stores — there's no value in randomizing it because the\n * salt + IV + auth tag already make every verifier envelope unique.\n *\n * The string never appears in plaintext on disk; it only exists\n * inside an AES-GCM-sealed envelope. Its job is purely to give the\n * cipher something to authenticate.\n */\nexport const VERIFIER_PLAINTEXT = Buffer.from(\"remnic-secure-store-v1\", \"utf8\");\n\n/** AAD bound into the verifier envelope. */\nconst VERIFIER_AAD = Buffer.from(\"remnic-secure-store/verifier\", \"utf8\");\n\nexport interface SecureStoreHeader {\n format: typeof HEADER_FORMAT;\n formatVersion: number;\n /** KDF metadata (algorithm + params + salt). */\n metadata: SecureStoreMetadata;\n /** Hex-encoded sealed envelope. */\n verifier: string;\n /** ISO-8601 timestamp recorded at init time. */\n createdAt: string;\n}\n\n/** Resolve the canonical secure-store directory for a memory root. */\nexport function secureStoreDir(memoryDir: string): string {\n return path.join(memoryDir, SECURE_STORE_DIR_NAME);\n}\n\n/** Resolve the canonical header path for a memory root. */\nexport function headerPath(memoryDir: string): string {\n return path.join(secureStoreDir(memoryDir), HEADER_FILENAME);\n}\n\n/**\n * Build a `SecureStoreHeader` in memory from an already-derived key\n * and metadata. Pure: does not touch the filesystem. The clock is\n * read once if `createdAt` is omitted.\n */\nexport function buildHeader(options: {\n metadata: SecureStoreMetadata;\n derivedKey: Buffer;\n createdAt?: string;\n}): SecureStoreHeader {\n const { metadata, derivedKey } = options;\n if (!Buffer.isBuffer(derivedKey) || derivedKey.length !== KDF_KEY_LENGTH) {\n throw new Error(\n `derivedKey must be a ${KDF_KEY_LENGTH}-byte Buffer, got length=${derivedKey?.length ?? \"non-buffer\"}`,\n );\n }\n const salt = decodeMetadataSalt(metadata);\n if (salt.length !== KDF_SALT_LENGTH) {\n throw new Error(`metadata salt is ${salt.length} bytes, expected ${KDF_SALT_LENGTH}`);\n }\n const envelope = seal(derivedKey, salt, VERIFIER_PLAINTEXT, { aad: VERIFIER_AAD });\n return {\n format: HEADER_FORMAT,\n formatVersion: HEADER_FORMAT_VERSION,\n metadata,\n verifier: envelope.toString(\"hex\"),\n createdAt: options.createdAt ?? new Date().toISOString(),\n };\n}\n\n/** Stable JSON serialization with locked top-level key order. */\nexport function serializeHeader(header: SecureStoreHeader): string {\n validateHeader(header);\n // Inline metadata as a parsed object so it shares the same\n // canonical key ordering as the standalone metadata file.\n const metadataString = serializeMetadata(header.metadata);\n const metadataObject = JSON.parse(metadataString) as Record<string, unknown>;\n const ordered = {\n format: header.format,\n formatVersion: header.formatVersion,\n metadata: metadataObject,\n verifier: header.verifier,\n createdAt: header.createdAt,\n };\n return JSON.stringify(ordered, null, 2);\n}\n\n/** Parse a header JSON string. Throws on any structural problem. */\nexport function parseHeader(json: string): SecureStoreHeader {\n if (typeof json !== \"string\") {\n throw new Error(\"header input must be a string\");\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(json);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`header is not valid JSON: ${msg}`);\n }\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new Error(\"header must be a JSON object\");\n }\n const obj = parsed as Record<string, unknown>;\n if (obj.format !== HEADER_FORMAT) {\n throw new Error(\n `unexpected header format: ${String(obj.format)} (expected ${HEADER_FORMAT})`,\n );\n }\n if (obj.formatVersion !== HEADER_FORMAT_VERSION) {\n throw new Error(\n `unsupported header formatVersion: ${String(obj.formatVersion)} (this build supports ${HEADER_FORMAT_VERSION})`,\n );\n }\n if (typeof obj.verifier !== \"string\" || obj.verifier.length === 0) {\n throw new Error(\"header.verifier must be a non-empty hex string\");\n }\n if (!/^[0-9a-fA-F]+$/.test(obj.verifier)) {\n throw new Error(\"header.verifier must be a hex-encoded string\");\n }\n // Codex P2 on PR #737: odd-length hex strings produce a malformed\n // Buffer via `Buffer.from(hex, \"hex\")` — Node silently truncates the\n // trailing nibble, yielding a buffer that is one byte shorter than\n // expected. Reject odd-length strings before they reach the cipher.\n if (obj.verifier.length % 2 !== 0) {\n throw new Error(\n \"header.verifier hex string must have even length (each byte encodes as two hex digits)\",\n );\n }\n if (typeof obj.createdAt !== \"string\" || obj.createdAt.length === 0) {\n throw new Error(\"header.createdAt must be a non-empty string\");\n }\n if (typeof obj.metadata !== \"object\" || obj.metadata === null) {\n throw new Error(\"header.metadata must be an object\");\n }\n // Reuse the metadata parser for nested validation. We re-stringify\n // the nested object and feed it through `parseMetadata` so any\n // schema drift is caught in one place.\n const metadata = parseMetadata(JSON.stringify(obj.metadata));\n const header: SecureStoreHeader = {\n format: HEADER_FORMAT,\n formatVersion: HEADER_FORMAT_VERSION,\n metadata,\n verifier: obj.verifier,\n createdAt: obj.createdAt,\n };\n validateHeader(header);\n return header;\n}\n\n/** Validate a header object's invariants. Throws on the first problem. */\nexport function validateHeader(header: SecureStoreHeader): void {\n if (header.format !== HEADER_FORMAT) {\n throw new Error(`header.format must be ${HEADER_FORMAT}`);\n }\n if (header.formatVersion !== HEADER_FORMAT_VERSION) {\n throw new Error(`header.formatVersion must be ${HEADER_FORMAT_VERSION}`);\n }\n if (typeof header.createdAt !== \"string\" || header.createdAt.length === 0) {\n throw new Error(\"header.createdAt must be a non-empty ISO-8601 string\");\n }\n if (typeof header.verifier !== \"string\" || header.verifier.length === 0) {\n throw new Error(\"header.verifier must be a non-empty hex string\");\n }\n if (!/^[0-9a-fA-F]+$/.test(header.verifier)) {\n throw new Error(\"header.verifier must be a hex-encoded string\");\n }\n // Enforce even length: odd-length hex is silently truncated by\n // `Buffer.from(hex, \"hex\")` which yields a malformed envelope.\n if (header.verifier.length % 2 !== 0) {\n throw new Error(\n \"header.verifier hex string must have even length (each byte encodes as two hex digits)\",\n );\n }\n // The nested metadata object is already validated by `parseMetadata`\n // when read from disk; on the build path, `buildHeader` constructs\n // it via `buildMetadata`. We still re-run shape validation here as\n // a belt-and-braces guard for callers that hand-construct headers.\n if (header.metadata.format !== \"remnic.secure-store.metadata\") {\n throw new Error(\"header.metadata.format must be remnic.secure-store.metadata\");\n }\n}\n\n/**\n * Verify a candidate key against the header's verifier envelope.\n *\n * Returns true iff the AES-GCM auth tag validates. Wrong passphrase,\n * tampered envelope, and tampered AAD all return false.\n */\nexport function verifyKey(header: SecureStoreHeader, candidateKey: Buffer): boolean {\n if (!Buffer.isBuffer(candidateKey) || candidateKey.length !== KDF_KEY_LENGTH) {\n return false;\n }\n const envelope = Buffer.from(header.verifier, \"hex\");\n try {\n const plaintext = open(candidateKey, envelope, { aad: VERIFIER_AAD });\n return plaintext.equals(VERIFIER_PLAINTEXT);\n } catch {\n return false;\n }\n}\n\n/**\n * Derive a key from the passphrase using the algorithm + params +\n * salt recorded in the header. Pure: no I/O.\n */\nexport function deriveKeyFromHeader(header: SecureStoreHeader, passphrase: string): Buffer {\n const salt = decodeMetadataSalt(header.metadata);\n // Cursor low on PR #737: a previous version branched on the\n // algorithm and returned `header.metadata.kdf.params` from both\n // arms — a no-op conditional. Pass the discriminated union member\n // through directly; `deriveKey` performs the algorithm dispatch.\n const params: ScryptParams | Argon2idParams = header.metadata.kdf.params;\n return deriveKey(header.metadata.kdf.algorithm, passphrase, salt, params);\n}\n\n/**\n * Read and parse the header at `<memoryDir>/.secure-store/header.json`.\n * Returns `null` if the file does not exist; throws on malformed\n * content.\n */\nexport async function readHeader(memoryDir: string): Promise<SecureStoreHeader | null> {\n const target = headerPath(memoryDir);\n let raw: string;\n try {\n raw = await readFile(target, \"utf8\");\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw e;\n }\n return parseHeader(raw);\n}\n\n/**\n * Write the header with atomic exclusive-create semantics.\n *\n * Uses the `wx` flag (`O_CREAT | O_EXCL`) so the OS rejects the call\n * atomically when the file already exists. Two concurrent\n * `secure-store init` invocations cannot both observe \"missing\" and\n * race to overwrite each other — the second writer reliably gets\n * `EEXIST` and surfaces \"Refusing to overwrite\".\n *\n * Codex P1 on PR #737: a previous version pre-checked existence with\n * `readFile` then `writeFile`+`rename`, which is a check-then-act\n * race. The `wx` flag closes that window at the kernel layer.\n *\n * Crash safety: if the write is interrupted mid-flight, a partial\n * `header.json` may remain on disk. `parseHeader` rejects partial\n * files cleanly and the operator can delete the stub and retry. We\n * don't use temp+rename here because (a) headers are tiny (≤ 1 KiB),\n * (b) there is no prior valid file to destroy, and (c) `wx` already\n * gives us atomic exclusivity — the rename trick (CLAUDE.md gotcha\n * #54) is for replacing an existing valid file, which is exactly the\n * scenario this function refuses.\n */\nexport async function writeHeader(memoryDir: string, header: SecureStoreHeader): Promise<string> {\n validateHeader(header);\n const dir = secureStoreDir(memoryDir);\n await mkdir(dir, { recursive: true });\n const target = headerPath(memoryDir);\n try {\n await writeFile(target, serializeHeader(header), {\n encoding: \"utf8\",\n mode: 0o600,\n flag: \"wx\",\n });\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === \"EEXIST\") {\n throw new Error(\n `secure-store header already exists at ${target}. Refusing to overwrite — initialize a fresh store or remove the existing header explicitly.`,\n );\n }\n throw e;\n }\n return target;\n}\n\n/** Convenience: build metadata + header in one call from a passphrase. */\nexport function buildHeaderFromPassphrase(options: {\n passphrase: string;\n salt: Buffer;\n /** Optional override; defaults to Argon2id with `DEFAULT_ARGON2ID_PARAMS`. */\n algorithm?: \"scrypt\" | \"argon2id\";\n params?: ScryptParams | Argon2idParams;\n createdAt?: string;\n note?: string;\n}): { header: SecureStoreHeader; derivedKey: Buffer } {\n const { passphrase, salt } = options;\n const algorithm = options.algorithm ?? \"argon2id\";\n const metadataOpts: {\n algorithm: \"scrypt\" | \"argon2id\";\n salt: Buffer;\n params?: ScryptParams | Argon2idParams;\n createdAt?: string;\n note?: string;\n } = { algorithm, salt };\n if (options.params !== undefined) metadataOpts.params = options.params;\n if (options.createdAt !== undefined) metadataOpts.createdAt = options.createdAt;\n if (options.note !== undefined) metadataOpts.note = options.note;\n const metadata = buildMetadata(metadataOpts);\n // Cursor low on PR #737: same identical-branches ternary as in\n // `deriveKeyFromHeader`. The discriminated union already carries\n // the right shape; `deriveKey` dispatches on `algorithm`.\n const params: ScryptParams | Argon2idParams = metadata.kdf.params;\n const derivedKey = deriveKey(algorithm, passphrase, salt, params);\n const headerOpts: { metadata: SecureStoreMetadata; derivedKey: Buffer; createdAt?: string } = {\n metadata,\n derivedKey,\n };\n if (options.createdAt !== undefined) headerOpts.createdAt = options.createdAt;\n const header = buildHeader(headerOpts);\n return { header, derivedKey };\n}\n","/**\n * In-memory keyring for the secure-store module (issue #690 PR 2/4).\n *\n * Holds derived AES-256-GCM master keys for unlocked stores. The\n * keyring is process-local: keys are NEVER persisted to disk, never\n * logged, and never serialized. A daemon restart re-locks every\n * registered store.\n *\n * Scoping\n * -------\n * Entries are keyed by a stable string id (typically the absolute\n * path to the secure-store directory, after `~` expansion). This\n * lets multiple memory roots share a single daemon process without\n * one store's key bleeding into another (matches the per-`serviceId`\n * scoping discipline called out in CLAUDE.md gotcha #11).\n *\n * Lifecycle\n * ---------\n * - `unlock(id, key)` — register a derived key.\n * - `getKey(id)` — read a registered key (or `null`).\n * - `lock(id)` — clear a single entry, zeroing the key bytes.\n * - `lockAll()` — clear every entry, zeroing every key.\n * - `status(id)` — non-secret status snapshot for `secure-store\n * status`.\n *\n * Zeroization\n * -----------\n * `lock` and `lockAll` overwrite the key buffer with zeros before\n * dropping the reference. The JS engine may keep additional copies\n * outside our control; this is best-effort hygiene, not a defense\n * against memory-dump attacks.\n */\n\nconst ENTRIES = new Map<string, KeyringEntry>();\n\n/** A single unlocked store. The key buffer is never copied out. */\ninterface KeyringEntry {\n key: Buffer;\n unlockedAt: string;\n}\n\n/** Status snapshot — no secret material. */\nexport interface KeyringStatus {\n /** True iff a key is currently registered for this id. */\n unlocked: boolean;\n /** ISO-8601 timestamp the key was registered, or null when locked. */\n unlockedAt: string | null;\n}\n\n/**\n * Register a derived key for the given id. If an entry already\n * exists, its old key is zeroed before being replaced.\n *\n * The caller MUST pass an exclusive 32-byte buffer; the keyring\n * takes ownership and will zero it on lock.\n */\nexport function unlock(id: string, key: Buffer, now: () => Date = () => new Date()): void {\n if (typeof id !== \"string\" || id.length === 0) {\n throw new Error(\"keyring id must be a non-empty string\");\n }\n if (!Buffer.isBuffer(key) || key.length !== 32) {\n throw new Error(`keyring key must be a 32-byte Buffer, got length=${key?.length ?? \"non-buffer\"}`);\n }\n const existing = ENTRIES.get(id);\n if (existing) {\n existing.key.fill(0);\n }\n ENTRIES.set(id, { key, unlockedAt: now().toISOString() });\n}\n\n/** Read the registered key for `id`, or `null` if locked. */\nexport function getKey(id: string): Buffer | null {\n const entry = ENTRIES.get(id);\n return entry ? entry.key : null;\n}\n\n/** Clear a single entry. Zeros the underlying buffer. Returns true if cleared. */\nexport function lock(id: string): boolean {\n const entry = ENTRIES.get(id);\n if (!entry) return false;\n entry.key.fill(0);\n ENTRIES.delete(id);\n return true;\n}\n\n/** Clear every registered key. Used on shutdown or for tests. */\nexport function lockAll(): void {\n for (const entry of ENTRIES.values()) {\n entry.key.fill(0);\n }\n ENTRIES.clear();\n}\n\n/** Non-secret status snapshot. */\nexport function status(id: string): KeyringStatus {\n const entry = ENTRIES.get(id);\n if (!entry) {\n return { unlocked: false, unlockedAt: null };\n }\n return { unlocked: true, unlockedAt: entry.unlockedAt };\n}\n\n/** Test-only helper: how many entries are currently registered. */\nexport function size(): number {\n return ENTRIES.size;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAiCA,SAAS,OAAO,UAAU,iBAAiB;AAC3C,OAAO,UAAU;AAmBV,IAAM,wBAAwB;AAG9B,IAAM,kBAAkB;AAGxB,IAAM,gBAAgB;AAGtB,IAAM,wBAAwB;AAW9B,IAAM,qBAAqB,OAAO,KAAK,0BAA0B,MAAM;AAG9E,IAAM,eAAe,OAAO,KAAK,gCAAgC,MAAM;AAchE,SAAS,eAAe,WAA2B;AACxD,SAAO,KAAK,KAAK,WAAW,qBAAqB;AACnD;AAGO,SAAS,WAAW,WAA2B;AACpD,SAAO,KAAK,KAAK,eAAe,SAAS,GAAG,eAAe;AAC7D;AAOO,SAAS,YAAY,SAIN;AACpB,QAAM,EAAE,UAAU,WAAW,IAAI;AACjC,MAAI,CAAC,OAAO,SAAS,UAAU,KAAK,WAAW,WAAW,gBAAgB;AACxE,UAAM,IAAI;AAAA,MACR,wBAAwB,cAAc,4BAA4B,YAAY,UAAU,YAAY;AAAA,IACtG;AAAA,EACF;AACA,QAAM,OAAO,mBAAmB,QAAQ;AACxC,MAAI,KAAK,WAAW,iBAAiB;AACnC,UAAM,IAAI,MAAM,oBAAoB,KAAK,MAAM,oBAAoB,eAAe,EAAE;AAAA,EACtF;AACA,QAAM,WAAW,KAAK,YAAY,MAAM,oBAAoB,EAAE,KAAK,aAAa,CAAC;AACjF,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,eAAe;AAAA,IACf;AAAA,IACA,UAAU,SAAS,SAAS,KAAK;AAAA,IACjC,WAAW,QAAQ,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,EACzD;AACF;AAGO,SAAS,gBAAgB,QAAmC;AACjE,iBAAe,MAAM;AAGrB,QAAM,iBAAiB,kBAAkB,OAAO,QAAQ;AACxD,QAAM,iBAAiB,KAAK,MAAM,cAAc;AAChD,QAAM,UAAU;AAAA,IACd,QAAQ,OAAO;AAAA,IACf,eAAe,OAAO;AAAA,IACtB,UAAU;AAAA,IACV,UAAU,OAAO;AAAA,IACjB,WAAW,OAAO;AAAA,EACpB;AACA,SAAO,KAAK,UAAU,SAAS,MAAM,CAAC;AACxC;AAGO,SAAS,YAAY,MAAiC;AAC3D,MAAI,OAAO,SAAS,UAAU;AAC5B,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACjD;AACA,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,IAAI;AAAA,EAC1B,SAAS,GAAG;AACV,UAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACrD,UAAM,IAAI,MAAM,6BAA6B,GAAG,EAAE;AAAA,EACpD;AACA,MAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,MAAM,QAAQ,MAAM,GAAG;AAC1E,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAChD;AACA,QAAM,MAAM;AACZ,MAAI,IAAI,WAAW,eAAe;AAChC,UAAM,IAAI;AAAA,MACR,6BAA6B,OAAO,IAAI,MAAM,CAAC,cAAc,aAAa;AAAA,IAC5E;AAAA,EACF;AACA,MAAI,IAAI,kBAAkB,uBAAuB;AAC/C,UAAM,IAAI;AAAA,MACR,qCAAqC,OAAO,IAAI,aAAa,CAAC,yBAAyB,qBAAqB;AAAA,IAC9G;AAAA,EACF;AACA,MAAI,OAAO,IAAI,aAAa,YAAY,IAAI,SAAS,WAAW,GAAG;AACjE,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AACA,MAAI,CAAC,iBAAiB,KAAK,IAAI,QAAQ,GAAG;AACxC,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AAKA,MAAI,IAAI,SAAS,SAAS,MAAM,GAAG;AACjC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,MAAI,OAAO,IAAI,cAAc,YAAY,IAAI,UAAU,WAAW,GAAG;AACnE,UAAM,IAAI,MAAM,6CAA6C;AAAA,EAC/D;AACA,MAAI,OAAO,IAAI,aAAa,YAAY,IAAI,aAAa,MAAM;AAC7D,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACrD;AAIA,QAAM,WAAW,cAAc,KAAK,UAAU,IAAI,QAAQ,CAAC;AAC3D,QAAM,SAA4B;AAAA,IAChC,QAAQ;AAAA,IACR,eAAe;AAAA,IACf;AAAA,IACA,UAAU,IAAI;AAAA,IACd,WAAW,IAAI;AAAA,EACjB;AACA,iBAAe,MAAM;AACrB,SAAO;AACT;AAGO,SAAS,eAAe,QAAiC;AAC9D,MAAI,OAAO,WAAW,eAAe;AACnC,UAAM,IAAI,MAAM,yBAAyB,aAAa,EAAE;AAAA,EAC1D;AACA,MAAI,OAAO,kBAAkB,uBAAuB;AAClD,UAAM,IAAI,MAAM,gCAAgC,qBAAqB,EAAE;AAAA,EACzE;AACA,MAAI,OAAO,OAAO,cAAc,YAAY,OAAO,UAAU,WAAW,GAAG;AACzE,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACxE;AACA,MAAI,OAAO,OAAO,aAAa,YAAY,OAAO,SAAS,WAAW,GAAG;AACvE,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AACA,MAAI,CAAC,iBAAiB,KAAK,OAAO,QAAQ,GAAG;AAC3C,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AAGA,MAAI,OAAO,SAAS,SAAS,MAAM,GAAG;AACpC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAKA,MAAI,OAAO,SAAS,WAAW,gCAAgC;AAC7D,UAAM,IAAI,MAAM,6DAA6D;AAAA,EAC/E;AACF;AAQO,SAAS,UAAU,QAA2B,cAA+B;AAClF,MAAI,CAAC,OAAO,SAAS,YAAY,KAAK,aAAa,WAAW,gBAAgB;AAC5E,WAAO;AAAA,EACT;AACA,QAAM,WAAW,OAAO,KAAK,OAAO,UAAU,KAAK;AACnD,MAAI;AACF,UAAM,YAAY,KAAK,cAAc,UAAU,EAAE,KAAK,aAAa,CAAC;AACpE,WAAO,UAAU,OAAO,kBAAkB;AAAA,EAC5C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMO,SAAS,oBAAoB,QAA2B,YAA4B;AACzF,QAAM,OAAO,mBAAmB,OAAO,QAAQ;AAK/C,QAAM,SAAwC,OAAO,SAAS,IAAI;AAClE,SAAO,UAAU,OAAO,SAAS,IAAI,WAAW,YAAY,MAAM,MAAM;AAC1E;AAOA,eAAsB,WAAW,WAAsD;AACrF,QAAM,SAAS,WAAW,SAAS;AACnC,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,SAAS,QAAQ,MAAM;AAAA,EACrC,SAAS,GAAG;AACV,QAAK,EAA4B,SAAS,UAAU;AAClD,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACA,SAAO,YAAY,GAAG;AACxB;AAwBA,eAAsB,YAAY,WAAmB,QAA4C;AAC/F,iBAAe,MAAM;AACrB,QAAM,MAAM,eAAe,SAAS;AACpC,QAAM,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACpC,QAAM,SAAS,WAAW,SAAS;AACnC,MAAI;AACF,UAAM,UAAU,QAAQ,gBAAgB,MAAM,GAAG;AAAA,MAC/C,UAAU;AAAA,MACV,MAAM;AAAA,MACN,MAAM;AAAA,IACR,CAAC;AAAA,EACH,SAAS,GAAG;AACV,QAAK,EAA4B,SAAS,UAAU;AAClD,YAAM,IAAI;AAAA,QACR,yCAAyC,MAAM;AAAA,MACjD;AAAA,IACF;AACA,UAAM;AAAA,EACR;AACA,SAAO;AACT;AAGO,SAAS,0BAA0B,SAQY;AACpD,QAAM,EAAE,YAAY,KAAK,IAAI;AAC7B,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,eAMF,EAAE,WAAW,KAAK;AACtB,MAAI,QAAQ,WAAW,OAAW,cAAa,SAAS,QAAQ;AAChE,MAAI,QAAQ,cAAc,OAAW,cAAa,YAAY,QAAQ;AACtE,MAAI,QAAQ,SAAS,OAAW,cAAa,OAAO,QAAQ;AAC5D,QAAM,WAAW,cAAc,YAAY;AAI3C,QAAM,SAAwC,SAAS,IAAI;AAC3D,QAAM,aAAa,UAAU,WAAW,YAAY,MAAM,MAAM;AAChE,QAAM,aAAwF;AAAA,IAC5F;AAAA,IACA;AAAA,EACF;AACA,MAAI,QAAQ,cAAc,OAAW,YAAW,YAAY,QAAQ;AACpE,QAAM,SAAS,YAAY,UAAU;AACrC,SAAO,EAAE,QAAQ,WAAW;AAC9B;;;ACpXA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiCA,IAAM,UAAU,oBAAI,IAA0B;AAuBvC,SAAS,OAAO,IAAY,KAAa,MAAkB,MAAM,oBAAI,KAAK,GAAS;AACxF,MAAI,OAAO,OAAO,YAAY,GAAG,WAAW,GAAG;AAC7C,UAAM,IAAI,MAAM,uCAAuC;AAAA,EACzD;AACA,MAAI,CAAC,OAAO,SAAS,GAAG,KAAK,IAAI,WAAW,IAAI;AAC9C,UAAM,IAAI,MAAM,oDAAoD,KAAK,UAAU,YAAY,EAAE;AAAA,EACnG;AACA,QAAM,WAAW,QAAQ,IAAI,EAAE;AAC/B,MAAI,UAAU;AACZ,aAAS,IAAI,KAAK,CAAC;AAAA,EACrB;AACA,UAAQ,IAAI,IAAI,EAAE,KAAK,YAAY,IAAI,EAAE,YAAY,EAAE,CAAC;AAC1D;AAGO,SAAS,OAAO,IAA2B;AAChD,QAAM,QAAQ,QAAQ,IAAI,EAAE;AAC5B,SAAO,QAAQ,MAAM,MAAM;AAC7B;AAGO,SAAS,KAAK,IAAqB;AACxC,QAAM,QAAQ,QAAQ,IAAI,EAAE;AAC5B,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,IAAI,KAAK,CAAC;AAChB,UAAQ,OAAO,EAAE;AACjB,SAAO;AACT;AAGO,SAAS,UAAgB;AAC9B,aAAW,SAAS,QAAQ,OAAO,GAAG;AACpC,UAAM,IAAI,KAAK,CAAC;AAAA,EAClB;AACA,UAAQ,MAAM;AAChB;AAGO,SAAS,OAAO,IAA2B;AAChD,QAAM,QAAQ,QAAQ,IAAI,EAAE;AAC5B,MAAI,CAAC,OAAO;AACV,WAAO,EAAE,UAAU,OAAO,YAAY,KAAK;AAAA,EAC7C;AACA,SAAO,EAAE,UAAU,MAAM,YAAY,MAAM,WAAW;AACxD;AAGO,SAAS,OAAe;AAC7B,SAAO,QAAQ;AACjB;","names":[]}