@graphrefly/ts 0.0.0 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (405) hide show
  1. package/README.md +135 -0
  2. package/dist/actions-types-CSC3NMDl.d.ts +657 -0
  3. package/dist/actions-types-wl9Mgkmr.d.cts +657 -0
  4. package/dist/adapters/index.cjs +5219 -2974
  5. package/dist/adapters/index.cjs.map +1 -1
  6. package/dist/adapters/index.d.cts +204 -192
  7. package/dist/adapters/index.d.ts +204 -192
  8. package/dist/adapters/index.js +3685 -1833
  9. package/dist/adapters/index.js.map +1 -1
  10. package/dist/adapters/nestjs/microservices.cjs +841 -0
  11. package/dist/adapters/nestjs/microservices.cjs.map +1 -0
  12. package/dist/adapters/nestjs/microservices.d.cts +45 -0
  13. package/dist/adapters/nestjs/microservices.d.ts +45 -0
  14. package/dist/adapters/nestjs/microservices.js +206 -0
  15. package/dist/adapters/nestjs/microservices.js.map +1 -0
  16. package/dist/adapters/nestjs/native.cjs +1391 -0
  17. package/dist/adapters/nestjs/native.cjs.map +1 -0
  18. package/dist/adapters/nestjs/native.d.cts +111 -0
  19. package/dist/adapters/nestjs/native.d.ts +111 -0
  20. package/dist/adapters/nestjs/native.js +577 -0
  21. package/dist/adapters/nestjs/native.js.map +1 -0
  22. package/dist/adapters/nestjs/websockets.cjs +924 -0
  23. package/dist/adapters/nestjs/websockets.cjs.map +1 -0
  24. package/dist/adapters/nestjs/websockets.d.cts +47 -0
  25. package/dist/adapters/nestjs/websockets.d.ts +47 -0
  26. package/dist/adapters/nestjs/websockets.js +286 -0
  27. package/dist/adapters/nestjs/websockets.js.map +1 -0
  28. package/dist/adapters/nestjs.cjs +1085 -0
  29. package/dist/adapters/nestjs.cjs.map +1 -0
  30. package/dist/adapters/nestjs.d.cts +385 -0
  31. package/dist/adapters/nestjs.d.ts +385 -0
  32. package/dist/adapters/nestjs.js +112 -0
  33. package/dist/adapters/nestjs.js.map +1 -0
  34. package/dist/adapters/observe-storage.d.cts +4 -4
  35. package/dist/adapters/observe-storage.d.ts +4 -4
  36. package/dist/adapters/observe-storage.js +5 -4
  37. package/dist/adapters/observe-storage.js.map +1 -1
  38. package/dist/adapters/react.cjs +166 -0
  39. package/dist/adapters/react.cjs.map +1 -0
  40. package/dist/adapters/react.d.cts +31 -0
  41. package/dist/adapters/react.d.ts +31 -0
  42. package/dist/adapters/react.js +51 -0
  43. package/dist/adapters/react.js.map +1 -0
  44. package/dist/adapters/solid.cjs +157 -0
  45. package/dist/adapters/solid.cjs.map +1 -0
  46. package/dist/adapters/solid.d.cts +26 -0
  47. package/dist/adapters/solid.d.ts +26 -0
  48. package/dist/adapters/solid.js +48 -0
  49. package/dist/adapters/solid.js.map +1 -0
  50. package/dist/adapters/svelte.cjs +148 -0
  51. package/dist/adapters/svelte.cjs.map +1 -0
  52. package/dist/adapters/svelte.d.cts +31 -0
  53. package/dist/adapters/svelte.d.ts +31 -0
  54. package/dist/adapters/svelte.js +46 -0
  55. package/dist/adapters/svelte.js.map +1 -0
  56. package/dist/adapters/vue.cjs +155 -0
  57. package/dist/adapters/vue.cjs.map +1 -0
  58. package/dist/adapters/vue.d.cts +26 -0
  59. package/dist/adapters/vue.d.ts +26 -0
  60. package/dist/adapters/vue.js +46 -0
  61. package/dist/adapters/vue.js.map +1 -0
  62. package/dist/agent-runtime-types-core-CaXfKNtY.d.cts +406 -0
  63. package/dist/agent-runtime-types-core-hU299uIC.d.ts +406 -0
  64. package/dist/agent-runtime-types-tool-BEpSINol.d.ts +695 -0
  65. package/dist/agent-runtime-types-tool-DninPEzk.d.cts +695 -0
  66. package/dist/agentic-memory-retention-BmGX368S.d.ts +14 -0
  67. package/dist/agentic-memory-retention-Ih1qhX9Z.d.cts +14 -0
  68. package/dist/agentic-memory-types-CVSUS6XR.d.ts +473 -0
  69. package/dist/agentic-memory-types-FnnYlVUs.d.cts +473 -0
  70. package/dist/capability-admission-BW2CziT6.d.ts +102 -0
  71. package/dist/capability-admission-lwSecxXs.d.cts +102 -0
  72. package/dist/chunk-2KUAG2GZ.js +9693 -0
  73. package/dist/chunk-2KUAG2GZ.js.map +1 -0
  74. package/dist/chunk-2NJP6GO4.js +1320 -0
  75. package/dist/chunk-2NJP6GO4.js.map +1 -0
  76. package/dist/{chunk-GDL26N2T.js → chunk-3KN7NJDR.js} +2 -2
  77. package/dist/{chunk-COHO25CZ.js → chunk-4NWSNI4K.js} +2232 -1672
  78. package/dist/chunk-4NWSNI4K.js.map +1 -0
  79. package/dist/{chunk-Z2ANQ6JW.js → chunk-4Q77MMJY.js} +2 -2
  80. package/dist/chunk-6E76H4OU.js +132 -0
  81. package/dist/chunk-6E76H4OU.js.map +1 -0
  82. package/dist/chunk-7GOTIIQ7.js +819 -0
  83. package/dist/chunk-7GOTIIQ7.js.map +1 -0
  84. package/dist/{chunk-D6BG7U6A.js → chunk-7HZRJMN6.js} +3 -3
  85. package/dist/{chunk-SCRFRCGR.js → chunk-BSQGE5PS.js} +1 -1
  86. package/dist/{chunk-PKVBHGBM.js → chunk-CJIFGJQG.js} +7 -7
  87. package/dist/{chunk-G4M3NHRJ.js → chunk-CX6B6PO2.js} +93 -10
  88. package/dist/chunk-CX6B6PO2.js.map +1 -0
  89. package/dist/chunk-DGUM43GV.js +11 -0
  90. package/dist/chunk-DGUM43GV.js.map +1 -0
  91. package/dist/{chunk-JIMUDQN3.js → chunk-E4QCH32M.js} +449 -447
  92. package/dist/chunk-E4QCH32M.js.map +1 -0
  93. package/dist/{chunk-RIIOUTGM.js → chunk-ECURQ3HD.js} +19 -129
  94. package/dist/chunk-ECURQ3HD.js.map +1 -0
  95. package/dist/{chunk-2ILL7HQI.js → chunk-EOKT4QFF.js} +134 -128
  96. package/dist/chunk-EOKT4QFF.js.map +1 -0
  97. package/dist/{chunk-K3FXTC3I.js → chunk-HJACH5PU.js} +3 -3
  98. package/dist/{chunk-GTPCOEOZ.js → chunk-IDMLXLLG.js} +3 -3
  99. package/dist/{chunk-DKP56CSW.js → chunk-JKAYLDQV.js} +2 -2
  100. package/dist/{chunk-4VLAQHZI.js → chunk-K7FB3JTD.js} +17 -1
  101. package/dist/chunk-K7FB3JTD.js.map +1 -0
  102. package/dist/chunk-L6LDXRWE.js +219 -0
  103. package/dist/chunk-L6LDXRWE.js.map +1 -0
  104. package/dist/chunk-M7J6Z4IJ.js +1930 -0
  105. package/dist/chunk-M7J6Z4IJ.js.map +1 -0
  106. package/dist/chunk-MQEQMS7B.js +1009 -0
  107. package/dist/chunk-MQEQMS7B.js.map +1 -0
  108. package/dist/chunk-MTELVIYR.js +1421 -0
  109. package/dist/chunk-MTELVIYR.js.map +1 -0
  110. package/dist/chunk-PVC7WDKI.js +885 -0
  111. package/dist/chunk-PVC7WDKI.js.map +1 -0
  112. package/dist/chunk-RAHNUYA5.js +368 -0
  113. package/dist/chunk-RAHNUYA5.js.map +1 -0
  114. package/dist/{chunk-DK554R7P.js → chunk-S6HXABGL.js} +2 -1
  115. package/dist/chunk-S6HXABGL.js.map +1 -0
  116. package/dist/{chunk-I3IHOHCJ.js → chunk-SHZDP2MQ.js} +1181 -1001
  117. package/dist/chunk-SHZDP2MQ.js.map +1 -0
  118. package/dist/{chunk-Y3ZLRGHC.js → chunk-SIDJO2T4.js} +16 -16
  119. package/dist/chunk-STXRMPW4.js +4131 -0
  120. package/dist/chunk-STXRMPW4.js.map +1 -0
  121. package/dist/{chunk-JR4IKCR2.js → chunk-TPND5MJS.js} +5 -5
  122. package/dist/chunk-TQPCAIQI.js +612 -0
  123. package/dist/chunk-TQPCAIQI.js.map +1 -0
  124. package/dist/chunk-UT3MHJCW.js +49 -0
  125. package/dist/chunk-UT3MHJCW.js.map +1 -0
  126. package/dist/{chunk-TEW47IVR.js → chunk-VPEFSDME.js} +2 -2
  127. package/dist/{chunk-SWTLEQL6.js → chunk-WQIA3GFB.js} +2 -2
  128. package/dist/chunk-WQIA3GFB.js.map +1 -0
  129. package/dist/{chunk-DJC4CHLQ.js → chunk-YDWBXXQZ.js} +5 -5
  130. package/dist/{chunk-6PHB5CJS.js → chunk-ZLFRB6FI.js} +2 -2
  131. package/dist/composition/index.cjs +1256 -1059
  132. package/dist/composition/index.cjs.map +1 -1
  133. package/dist/composition/index.d.cts +4 -4
  134. package/dist/composition/index.d.ts +4 -4
  135. package/dist/composition/index.js +7 -6
  136. package/dist/core/index.cjs +1218 -1021
  137. package/dist/core/index.cjs.map +1 -1
  138. package/dist/core/index.d.cts +2 -2
  139. package/dist/core/index.d.ts +2 -2
  140. package/dist/core/index.js +5 -4
  141. package/dist/cqrs/index.cjs.map +1 -1
  142. package/dist/cqrs/index.d.cts +4 -4
  143. package/dist/cqrs/index.d.ts +4 -4
  144. package/dist/cqrs/index.js +3 -2
  145. package/dist/cqrs/index.js.map +1 -1
  146. package/dist/cqrs/messaging.cjs +312 -0
  147. package/dist/cqrs/messaging.cjs.map +1 -0
  148. package/dist/cqrs/messaging.d.cts +57 -0
  149. package/dist/cqrs/messaging.d.ts +57 -0
  150. package/dist/cqrs/messaging.js +274 -0
  151. package/dist/cqrs/messaging.js.map +1 -0
  152. package/dist/cqrs/work-queue.cjs +329 -0
  153. package/dist/cqrs/work-queue.cjs.map +1 -0
  154. package/dist/cqrs/work-queue.d.cts +90 -0
  155. package/dist/cqrs/work-queue.d.ts +90 -0
  156. package/dist/cqrs/work-queue.js +292 -0
  157. package/dist/cqrs/work-queue.js.map +1 -0
  158. package/dist/data/index.cjs +19 -0
  159. package/dist/data/index.cjs.map +1 -0
  160. package/dist/data/index.d.cts +36 -0
  161. package/dist/data/index.d.ts +36 -0
  162. package/dist/data/index.js +1 -0
  163. package/dist/data/index.js.map +1 -0
  164. package/dist/data-structures/index.cjs +1252 -1052
  165. package/dist/data-structures/index.cjs.map +1 -1
  166. package/dist/data-structures/index.d.cts +9 -8
  167. package/dist/data-structures/index.d.ts +9 -8
  168. package/dist/data-structures/index.js +9 -7
  169. package/dist/{describe-BZb7AS2y.d.ts → describe-B_A5fbXH.d.ts} +1 -1
  170. package/dist/{describe-Ciu8SUnN.d.cts → describe-CQRrkv-Q.d.cts} +1 -1
  171. package/dist/executors/tool-provider-adapters.cjs +3091 -0
  172. package/dist/executors/tool-provider-adapters.cjs.map +1 -0
  173. package/dist/executors/tool-provider-adapters.d.cts +174 -0
  174. package/dist/executors/tool-provider-adapters.d.ts +174 -0
  175. package/dist/executors/tool-provider-adapters.js +1336 -0
  176. package/dist/executors/tool-provider-adapters.js.map +1 -0
  177. package/dist/executors/tool-provider-runtime.cjs +5178 -0
  178. package/dist/executors/tool-provider-runtime.cjs.map +1 -0
  179. package/dist/executors/tool-provider-runtime.d.cts +17 -0
  180. package/dist/executors/tool-provider-runtime.d.ts +17 -0
  181. package/dist/executors/tool-provider-runtime.js +15 -0
  182. package/dist/executors/tool-provider-runtime.js.map +1 -0
  183. package/dist/executors/tool-provider.cjs +6392 -0
  184. package/dist/executors/tool-provider.cjs.map +1 -0
  185. package/dist/executors/tool-provider.d.cts +60 -0
  186. package/dist/executors/tool-provider.d.ts +60 -0
  187. package/dist/executors/tool-provider.js +89 -0
  188. package/dist/executors/tool-provider.js.map +1 -0
  189. package/dist/executors/work-queue.cjs +342 -0
  190. package/dist/executors/work-queue.cjs.map +1 -0
  191. package/dist/executors/work-queue.d.cts +90 -0
  192. package/dist/executors/work-queue.d.ts +90 -0
  193. package/dist/executors/work-queue.js +306 -0
  194. package/dist/executors/work-queue.js.map +1 -0
  195. package/dist/graph/index.cjs +1536 -1324
  196. package/dist/graph/index.cjs.map +1 -1
  197. package/dist/graph/index.d.cts +10 -9
  198. package/dist/graph/index.d.ts +10 -9
  199. package/dist/graph/index.js +22 -20
  200. package/dist/{graph-s23RbbFO.d.cts → graph-CWK3HLPB.d.cts} +134 -132
  201. package/dist/{graph-DfdF9zy4.d.ts → graph-ho5sotHP.d.ts} +134 -132
  202. package/dist/{index-SnzZu3x7.d.ts → index-CQWcE0Dw.d.ts} +18 -4
  203. package/dist/{index-CAEmLCYF.d.cts → index-DHA1i67c.d.cts} +18 -4
  204. package/dist/index.cjs +3331 -3020
  205. package/dist/index.cjs.map +1 -1
  206. package/dist/index.d.cts +14 -10
  207. package/dist/index.d.ts +14 -10
  208. package/dist/index.js +114 -108
  209. package/dist/inspection/boundary.cjs +98 -0
  210. package/dist/inspection/boundary.cjs.map +1 -0
  211. package/dist/inspection/boundary.d.cts +61 -0
  212. package/dist/inspection/boundary.d.ts +61 -0
  213. package/dist/inspection/boundary.js +75 -0
  214. package/dist/inspection/boundary.js.map +1 -0
  215. package/dist/measurements-C0mAvWU1.d.cts +164 -0
  216. package/dist/measurements-OMpCeBwh.d.ts +164 -0
  217. package/dist/{messages-BZqrGGm1.d.ts → messages-CAzUPPJM.d.cts} +10 -5
  218. package/dist/{messages-BZqrGGm1.d.cts → messages-CAzUPPJM.d.ts} +10 -5
  219. package/dist/messaging/index.cjs +756 -619
  220. package/dist/messaging/index.cjs.map +1 -1
  221. package/dist/messaging/index.d.cts +17 -226
  222. package/dist/messaging/index.d.ts +17 -226
  223. package/dist/messaging/index.js +19 -749
  224. package/dist/messaging/index.js.map +1 -1
  225. package/dist/operators/index.cjs +1256 -1059
  226. package/dist/operators/index.cjs.map +1 -1
  227. package/dist/operators/index.d.cts +6 -6
  228. package/dist/operators/index.d.ts +6 -6
  229. package/dist/operators/index.js +9 -8
  230. package/dist/orchestration/index.cjs +8664 -2617
  231. package/dist/orchestration/index.cjs.map +1 -1
  232. package/dist/orchestration/index.d.cts +171 -221
  233. package/dist/orchestration/index.d.ts +171 -221
  234. package/dist/orchestration/index.js +74 -982
  235. package/dist/orchestration/index.js.map +1 -1
  236. package/dist/orchestration/messaging.cjs +314 -0
  237. package/dist/orchestration/messaging.cjs.map +1 -0
  238. package/dist/orchestration/messaging.d.cts +56 -0
  239. package/dist/orchestration/messaging.d.ts +56 -0
  240. package/dist/orchestration/messaging.js +276 -0
  241. package/dist/orchestration/messaging.js.map +1 -0
  242. package/dist/orchestration/work-queue.cjs +1500 -0
  243. package/dist/orchestration/work-queue.cjs.map +1 -0
  244. package/dist/orchestration/work-queue.d.cts +196 -0
  245. package/dist/orchestration/work-queue.d.ts +196 -0
  246. package/dist/orchestration/work-queue.js +1289 -0
  247. package/dist/orchestration/work-queue.js.map +1 -0
  248. package/dist/patterns/event-flow.cjs +433 -0
  249. package/dist/patterns/event-flow.cjs.map +1 -0
  250. package/dist/patterns/event-flow.d.cts +115 -0
  251. package/dist/patterns/event-flow.d.ts +115 -0
  252. package/dist/patterns/event-flow.js +14 -0
  253. package/dist/patterns/event-flow.js.map +1 -0
  254. package/dist/patterns/index.cjs +748 -355
  255. package/dist/patterns/index.cjs.map +1 -1
  256. package/dist/patterns/index.d.cts +9 -5
  257. package/dist/patterns/index.d.ts +9 -5
  258. package/dist/patterns/index.js +13 -4
  259. package/dist/process-types-C9uMYz3i.d.ts +200 -0
  260. package/dist/process-types-h3uRlzDc.d.cts +200 -0
  261. package/dist/{reactive-collection-BxBqtIOE.d.cts → reactive-collection-B9R0Bl1P.d.cts} +11 -41
  262. package/dist/{reactive-collection-Cb1II1Fi.d.ts → reactive-collection-BXFrH0U2.d.ts} +11 -41
  263. package/dist/{reactive-collection-storage-D-KmjE0J.d.cts → reactive-collection-storage-BLGv8Xp8.d.cts} +5 -5
  264. package/dist/{reactive-collection-storage-BNiEc-Gd.d.ts → reactive-collection-storage-a4zD3665.d.ts} +5 -5
  265. package/dist/{reactive-map-BcB4KsQR.d.ts → reactive-map-C_8sOfdS.d.cts} +7 -6
  266. package/dist/{reactive-map-D-g3dv8I.d.cts → reactive-map-jle5dnok.d.ts} +7 -6
  267. package/dist/render/index.d.cts +3 -3
  268. package/dist/render/index.d.ts +3 -3
  269. package/dist/render/index.js +1 -0
  270. package/dist/scheduled-readiness-5rwQlyjV.d.ts +91 -0
  271. package/dist/scheduled-readiness-DpRY8jI0.d.cts +91 -0
  272. package/dist/semantic-memory-graph-C2ZUwIlq.d.ts +30 -0
  273. package/dist/semantic-memory-graph-DlZBD_Eu.d.cts +30 -0
  274. package/dist/{semantic-memory-graph-BYoIlP35.d.cts → semantic-memory-graph-types-BvzdqmkY.d.cts} +2 -28
  275. package/dist/{semantic-memory-graph-CxyXLms3.d.ts → semantic-memory-graph-types-Ci-OtahO.d.ts} +2 -28
  276. package/dist/solutions/index.cjs +6788 -2128
  277. package/dist/solutions/index.cjs.map +1 -1
  278. package/dist/solutions/index.d.cts +15 -519
  279. package/dist/solutions/index.d.ts +15 -519
  280. package/dist/solutions/index.js +91 -7
  281. package/dist/solutions/reactive-layout/browser/index.cjs +457 -0
  282. package/dist/solutions/reactive-layout/browser/index.cjs.map +1 -0
  283. package/dist/solutions/reactive-layout/browser/index.d.cts +44 -0
  284. package/dist/solutions/reactive-layout/browser/index.d.ts +44 -0
  285. package/dist/solutions/reactive-layout/browser/index.js +69 -0
  286. package/dist/solutions/reactive-layout/browser/index.js.map +1 -0
  287. package/dist/solutions/reactive-layout/index.cjs +4494 -0
  288. package/dist/solutions/reactive-layout/index.cjs.map +1 -0
  289. package/dist/solutions/reactive-layout/index.d.cts +37 -0
  290. package/dist/solutions/reactive-layout/index.d.ts +37 -0
  291. package/dist/solutions/reactive-layout/index.js +146 -0
  292. package/dist/solutions/reactive-layout/index.js.map +1 -0
  293. package/dist/solutions/reactive-layout/node-canvas/index.cjs +555 -0
  294. package/dist/solutions/reactive-layout/node-canvas/index.cjs.map +1 -0
  295. package/dist/solutions/reactive-layout/node-canvas/index.d.cts +54 -0
  296. package/dist/solutions/reactive-layout/node-canvas/index.d.ts +54 -0
  297. package/dist/solutions/reactive-layout/node-canvas/index.js +131 -0
  298. package/dist/solutions/reactive-layout/node-canvas/index.js.map +1 -0
  299. package/dist/solutions/reactive-layout/react-native/index.cjs +504 -0
  300. package/dist/solutions/reactive-layout/react-native/index.cjs.map +1 -0
  301. package/dist/solutions/reactive-layout/react-native/index.d.cts +51 -0
  302. package/dist/solutions/reactive-layout/react-native/index.d.ts +51 -0
  303. package/dist/solutions/reactive-layout/react-native/index.js +77 -0
  304. package/dist/solutions/reactive-layout/react-native/index.js.map +1 -0
  305. package/dist/solutions/reactive-layout/skia/index.cjs +557 -0
  306. package/dist/solutions/reactive-layout/skia/index.cjs.map +1 -0
  307. package/dist/solutions/reactive-layout/skia/index.d.cts +64 -0
  308. package/dist/solutions/reactive-layout/skia/index.d.ts +64 -0
  309. package/dist/solutions/reactive-layout/skia/index.js +70 -0
  310. package/dist/solutions/reactive-layout/skia/index.js.map +1 -0
  311. package/dist/solutions/work-item/actions.cjs +2345 -0
  312. package/dist/solutions/work-item/actions.cjs.map +1 -0
  313. package/dist/solutions/work-item/actions.d.cts +40 -0
  314. package/dist/solutions/work-item/actions.d.ts +40 -0
  315. package/dist/solutions/work-item/actions.js +2078 -0
  316. package/dist/solutions/work-item/actions.js.map +1 -0
  317. package/dist/solutions/work-item/scheduling.cjs +9797 -0
  318. package/dist/solutions/work-item/scheduling.cjs.map +1 -0
  319. package/dist/solutions/work-item/scheduling.d.cts +1868 -0
  320. package/dist/solutions/work-item/scheduling.d.ts +1868 -0
  321. package/dist/solutions/work-item/scheduling.js +146 -0
  322. package/dist/solutions/work-item/scheduling.js.map +1 -0
  323. package/dist/solutions/work-item/work-queue.cjs +306 -0
  324. package/dist/solutions/work-item/work-queue.cjs.map +1 -0
  325. package/dist/solutions/work-item/work-queue.d.cts +71 -0
  326. package/dist/solutions/work-item/work-queue.d.ts +71 -0
  327. package/dist/solutions/work-item/work-queue.js +270 -0
  328. package/dist/solutions/work-item/work-queue.js.map +1 -0
  329. package/dist/sources/browser.cjs +1399 -1052
  330. package/dist/sources/browser.cjs.map +1 -1
  331. package/dist/sources/browser.d.cts +33 -6
  332. package/dist/sources/browser.d.ts +33 -6
  333. package/dist/sources/browser.js +73 -6
  334. package/dist/sources/browser.js.map +1 -1
  335. package/dist/sources/index.cjs +1345 -1065
  336. package/dist/sources/index.cjs.map +1 -1
  337. package/dist/sources/index.d.cts +5 -5
  338. package/dist/sources/index.d.ts +5 -5
  339. package/dist/sources/index.js +7 -6
  340. package/dist/sources/node.cjs.map +1 -1
  341. package/dist/sources/node.d.cts +4 -4
  342. package/dist/sources/node.d.ts +4 -4
  343. package/dist/sources/node.js +2 -1
  344. package/dist/sources/node.js.map +1 -1
  345. package/dist/storage/browser.cjs +16 -0
  346. package/dist/storage/browser.cjs.map +1 -1
  347. package/dist/storage/browser.js +4 -3
  348. package/dist/storage/browser.js.map +1 -1
  349. package/dist/storage/index.cjs +16 -0
  350. package/dist/storage/index.cjs.map +1 -1
  351. package/dist/storage/index.d.cts +6 -5
  352. package/dist/storage/index.d.ts +6 -5
  353. package/dist/storage/index.js +10 -9
  354. package/dist/storage/node.cjs +16 -0
  355. package/dist/storage/node.cjs.map +1 -1
  356. package/dist/storage/node.js +4 -3
  357. package/dist/storage/node.js.map +1 -1
  358. package/dist/store-BmtEs9mG.d.ts +123 -0
  359. package/dist/store-PAAsYvML.d.cts +123 -0
  360. package/dist/testing/index.cjs +1 -0
  361. package/dist/testing/index.cjs.map +1 -1
  362. package/dist/testing/index.d.cts +1 -1
  363. package/dist/testing/index.d.ts +1 -1
  364. package/dist/testing/index.js +3 -2
  365. package/dist/types-BRNKoFHj.d.ts +357 -0
  366. package/dist/{types-h12mNYbq.d.ts → types-BS6CyR-x.d.cts} +49 -130
  367. package/dist/types-BWK2ay3e.d.cts +457 -0
  368. package/dist/types-BXKSAoE1.d.cts +357 -0
  369. package/dist/types-BaPpZItj.d.ts +457 -0
  370. package/dist/types-BhveCMg5.d.cts +274 -0
  371. package/dist/{types-bNMSWKqF.d.cts → types-C9NOgNJw.d.ts} +49 -130
  372. package/dist/types-CTsQ8Ww4.d.ts +274 -0
  373. package/dist/types-DL_05n2M.d.ts +34 -0
  374. package/dist/types-XDoqxYO9.d.cts +34 -0
  375. package/dist/work-item-runtime-types-BqtWnSCS.d.ts +138 -0
  376. package/dist/work-item-runtime-types-CHO03AKh.d.cts +138 -0
  377. package/dist/work-queue/index.cjs +1136 -0
  378. package/dist/work-queue/index.cjs.map +1 -0
  379. package/dist/work-queue/index.d.cts +21 -0
  380. package/dist/work-queue/index.d.ts +21 -0
  381. package/dist/work-queue/index.js +1082 -0
  382. package/dist/work-queue/index.js.map +1 -0
  383. package/package.json +603 -249
  384. package/dist/chunk-2ILL7HQI.js.map +0 -1
  385. package/dist/chunk-4VLAQHZI.js.map +0 -1
  386. package/dist/chunk-COHO25CZ.js.map +0 -1
  387. package/dist/chunk-DK554R7P.js.map +0 -1
  388. package/dist/chunk-G4M3NHRJ.js.map +0 -1
  389. package/dist/chunk-I3IHOHCJ.js.map +0 -1
  390. package/dist/chunk-JIMUDQN3.js.map +0 -1
  391. package/dist/chunk-RIIOUTGM.js.map +0 -1
  392. package/dist/chunk-SWTLEQL6.js.map +0 -1
  393. /package/dist/{chunk-GDL26N2T.js.map → chunk-3KN7NJDR.js.map} +0 -0
  394. /package/dist/{chunk-Z2ANQ6JW.js.map → chunk-4Q77MMJY.js.map} +0 -0
  395. /package/dist/{chunk-D6BG7U6A.js.map → chunk-7HZRJMN6.js.map} +0 -0
  396. /package/dist/{chunk-SCRFRCGR.js.map → chunk-BSQGE5PS.js.map} +0 -0
  397. /package/dist/{chunk-PKVBHGBM.js.map → chunk-CJIFGJQG.js.map} +0 -0
  398. /package/dist/{chunk-K3FXTC3I.js.map → chunk-HJACH5PU.js.map} +0 -0
  399. /package/dist/{chunk-GTPCOEOZ.js.map → chunk-IDMLXLLG.js.map} +0 -0
  400. /package/dist/{chunk-DKP56CSW.js.map → chunk-JKAYLDQV.js.map} +0 -0
  401. /package/dist/{chunk-Y3ZLRGHC.js.map → chunk-SIDJO2T4.js.map} +0 -0
  402. /package/dist/{chunk-JR4IKCR2.js.map → chunk-TPND5MJS.js.map} +0 -0
  403. /package/dist/{chunk-TEW47IVR.js.map → chunk-VPEFSDME.js.map} +0 -0
  404. /package/dist/{chunk-DJC4CHLQ.js.map → chunk-YDWBXXQZ.js.map} +0 -0
  405. /package/dist/{chunk-6PHB5CJS.js.map → chunk-ZLFRB6FI.js.map} +0 -0
@@ -1,7 +1,7 @@
1
- export { c as DriverResult, g as HttpRequest, h as HttpResponse, y as SseDriverEvent, z as SseEvent, A as SseRequest, I as WebSocketDriverEvent, J as WebSocketEvent, M as WebSocketRequest, V as WebhookDriverEvent, X as WebhookEvent, Y as WebhookRegistration } from '../types-bNMSWKqF.cjs';
2
- export { A as AsyncSourceOpts, C as CronSchedule, E as EventListenerOptionsLike, a as EventTargetLike, F as FromCronOptions, b as FromEventOptions, N as NodeInput, P as PushRegister, c as PushUnsubscribe, S as SingleFromAnyOptions, T as TimerSourceOpts, e as empty, f as firstValueFrom, d as fromAny, g as fromAsyncIter, h as fromCron, i as fromEvent, j as fromHttp, k as fromHttpWithOptions, l as fromIter, n as fromPromise, o as fromPushNotification, p as fromSSE, q as fromSSEWithOptions, r as fromTimer, s as fromWebSocket, t as fromWebSocketWithOptions, u as fromWebhook, v as fromWebhookWithOptions, w as interval, x as matchesCron, y as never, z as of, B as parseCron, H as singleFromAny, I as throwError, J as timer } from '../index-CAEmLCYF.cjs';
3
- import '../messages-BZqrGGm1.cjs';
4
- import '../graph-s23RbbFO.cjs';
1
+ export { c as DriverResult, g as HttpRequest, h as HttpResponse, y as SseDriverEvent, z as SseEvent, A as SseRequest, I as WebSocketDriverEvent, J as WebSocketEvent, M as WebSocketRequest, V as WebhookDriverEvent, X as WebhookEvent, Y as WebhookRegistration } from '../types-BS6CyR-x.cjs';
2
+ export { A as AsyncSourceOpts, C as CronSchedule, E as EventListenerOptionsLike, a as EventTargetLike, F as FromCronOptions, b as FromEventOptions, N as NodeInput, P as PushRegister, c as PushUnsubscribe, S as SingleFromAnyOptions, T as TimerSourceOpts, e as empty, f as firstValueFrom, d as fromAny, g as fromAsyncIter, h as fromCron, i as fromEvent, j as fromHttp, k as fromHttpWithOptions, l as fromIter, n as fromPromise, o as fromPushNotification, p as fromSSE, q as fromSSEWithOptions, r as fromTimer, s as fromWebSocket, t as fromWebSocketWithOptions, u as fromWebhook, v as fromWebhookWithOptions, w as interval, x as matchesCron, y as never, z as of, B as parseCron, H as singleFromAny, I as throwError, J as timer } from '../index-DHA1i67c.cjs';
3
+ import '../messages-CAzUPPJM.cjs';
4
+ import '../graph-CWK3HLPB.cjs';
5
5
  import '../core/index.cjs';
6
6
  import '../codec-BB7p8fJc.cjs';
7
- import '../describe-Ciu8SUnN.cjs';
7
+ import '../describe-CQRrkv-Q.cjs';
@@ -1,7 +1,7 @@
1
- export { c as DriverResult, g as HttpRequest, h as HttpResponse, y as SseDriverEvent, z as SseEvent, A as SseRequest, I as WebSocketDriverEvent, J as WebSocketEvent, M as WebSocketRequest, V as WebhookDriverEvent, X as WebhookEvent, Y as WebhookRegistration } from '../types-h12mNYbq.js';
2
- export { A as AsyncSourceOpts, C as CronSchedule, E as EventListenerOptionsLike, a as EventTargetLike, F as FromCronOptions, b as FromEventOptions, N as NodeInput, P as PushRegister, c as PushUnsubscribe, S as SingleFromAnyOptions, T as TimerSourceOpts, e as empty, f as firstValueFrom, d as fromAny, g as fromAsyncIter, h as fromCron, i as fromEvent, j as fromHttp, k as fromHttpWithOptions, l as fromIter, n as fromPromise, o as fromPushNotification, p as fromSSE, q as fromSSEWithOptions, r as fromTimer, s as fromWebSocket, t as fromWebSocketWithOptions, u as fromWebhook, v as fromWebhookWithOptions, w as interval, x as matchesCron, y as never, z as of, B as parseCron, H as singleFromAny, I as throwError, J as timer } from '../index-SnzZu3x7.js';
3
- import '../messages-BZqrGGm1.js';
4
- import '../graph-DfdF9zy4.js';
1
+ export { c as DriverResult, g as HttpRequest, h as HttpResponse, y as SseDriverEvent, z as SseEvent, A as SseRequest, I as WebSocketDriverEvent, J as WebSocketEvent, M as WebSocketRequest, V as WebhookDriverEvent, X as WebhookEvent, Y as WebhookRegistration } from '../types-C9NOgNJw.js';
2
+ export { A as AsyncSourceOpts, C as CronSchedule, E as EventListenerOptionsLike, a as EventTargetLike, F as FromCronOptions, b as FromEventOptions, N as NodeInput, P as PushRegister, c as PushUnsubscribe, S as SingleFromAnyOptions, T as TimerSourceOpts, e as empty, f as firstValueFrom, d as fromAny, g as fromAsyncIter, h as fromCron, i as fromEvent, j as fromHttp, k as fromHttpWithOptions, l as fromIter, n as fromPromise, o as fromPushNotification, p as fromSSE, q as fromSSEWithOptions, r as fromTimer, s as fromWebSocket, t as fromWebSocketWithOptions, u as fromWebhook, v as fromWebhookWithOptions, w as interval, x as matchesCron, y as never, z as of, B as parseCron, H as singleFromAny, I as throwError, J as timer } from '../index-CQWcE0Dw.js';
3
+ import '../messages-CAzUPPJM.js';
4
+ import '../graph-ho5sotHP.js';
5
5
  import '../core/index.js';
6
6
  import '../codec-BB7p8fJc.js';
7
- import '../describe-BZb7AS2y.js';
7
+ import '../describe-B_A5fbXH.js';
@@ -26,12 +26,13 @@ import {
26
26
  singleFromAny,
27
27
  throwError,
28
28
  timer
29
- } from "../chunk-G4M3NHRJ.js";
30
- import "../chunk-PKVBHGBM.js";
31
- import "../chunk-I3IHOHCJ.js";
32
- import "../chunk-4VLAQHZI.js";
33
- import "../chunk-SWTLEQL6.js";
34
- import "../chunk-DK554R7P.js";
29
+ } from "../chunk-CX6B6PO2.js";
30
+ import "../chunk-CJIFGJQG.js";
31
+ import "../chunk-SHZDP2MQ.js";
32
+ import "../chunk-WQIA3GFB.js";
33
+ import "../chunk-S6HXABGL.js";
34
+ import "../chunk-K7FB3JTD.js";
35
+ import "../chunk-DGUM43GV.js";
35
36
  export {
36
37
  empty,
37
38
  firstValueFrom,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/sources/node.ts","../../src/protocol/messages.ts"],"sourcesContent":["/**\n * Node-only source factories. Import from `@graphrefly/ts/sources/node`; the universal\n * `@graphrefly/ts/sources` barrel stays browser-safe.\n */\n\nimport { execFileSync, type SpawnOptions, spawn } from \"node:child_process\";\nimport { type Dirent, existsSync, type FSWatcher, readdirSync, statSync, watch } from \"node:fs\";\nimport { dirname, join, relative, resolve as resolvePath } from \"node:path\";\nimport type { Ctx } from \"../ctx/types.js\";\nimport type {\n\tDriverResult,\n\tProcessResult as EnvironmentProcessResult,\n\tLocalProcessDriver,\n\tProcessCommand,\n} from \"../graph/environment.js\";\nimport type { Operator } from \"../graph/operators.js\";\nimport { errorPayload } from \"../protocol/messages.js\";\n\nexport type FSEventType = \"change\" | \"rename\" | \"create\" | \"delete\";\n\nexport interface FSEvent {\n\treadonly type: FSEventType;\n\treadonly path: string;\n\treadonly root: string;\n\treadonly relativePath: string;\n}\n\nexport interface FromFSWatchOptions {\n\t/** Use Node's recursive fs.watch mode where the host platform supports it. Default: false. */\n\treadonly recursive?: boolean;\n\t/** Coalesce events per path for this many milliseconds. Default: 100. */\n\treadonly debounceMs?: number;\n\t/** Emit create events for existing files after watcher registration. Default: false. */\n\treadonly initialScan?: boolean | \"files\";\n\t/** Include glob patterns matched against absolute and relative slash-normalized paths. */\n\treadonly include?: readonly string[];\n\t/** Exclude glob patterns matched against absolute and relative slash-normalized paths. */\n\treadonly exclude?: readonly string[];\n\t/** AbortSignal aborts the source to ERROR and closes all watchers. */\n\treadonly signal?: AbortSignal;\n}\n\nexport type SpawnEvent =\n\t| { readonly kind: \"stdout\"; readonly chunk: Buffer }\n\t| { readonly kind: \"stderr\"; readonly chunk: Buffer }\n\t| { readonly kind: \"exit\"; readonly code: number | null; readonly signal: NodeJS.Signals | null };\n\nexport interface FromSpawnOptions {\n\treadonly cwd?: string;\n\treadonly env?: NodeJS.ProcessEnv;\n\treadonly shell?: boolean | string;\n\treadonly signal?: AbortSignal;\n\treadonly stdio?: \"pipe\" | readonly (\"pipe\" | \"ignore\" | \"inherit\")[];\n\t/** Milliseconds after teardown SIGTERM before sending SIGKILL. Default: 1000. */\n\treadonly killGraceMs?: number;\n}\n\n/**\n * Node-only process driver options for D130/D131 EnvironmentDrivers.\n *\n * These knobs configure host child-process behavior at the driver boundary only; they do not\n * change graph wave, tier, or message semantics.\n */\nexport interface NodeProcessDriverOptions {\n\t/** Milliseconds after cancellation SIGTERM before sending SIGKILL. Default: 1000. */\n\treadonly killGraceMs?: number;\n\t/** Maximum captured stdout + stderr bytes before terminating with ERROR. Default: 16 MiB. */\n\treadonly maxBufferBytes?: number;\n\t/** Optional shell mode passed to Node's child_process.spawn. Default: false. */\n\treadonly shell?: boolean | string;\n}\n\nexport interface ProcessResult {\n\treadonly stdout: string;\n\treadonly stderr: string;\n\treadonly exitCode: number | null;\n\treadonly signal: NodeJS.Signals | null;\n}\n\nexport type GitHookType = \"post-commit\" | \"post-merge\" | \"post-checkout\" | \"post-rewrite\";\n\nexport interface GitEvent {\n\treadonly hook: GitHookType;\n\treadonly commit: string;\n\treadonly files: readonly string[];\n\treadonly message: string;\n\treadonly author: string;\n\treadonly timestamp_ns: string;\n}\n\nexport interface FromGitHookOptions {\n\treadonly pollMs?: number;\n\treadonly include?: readonly string[];\n\treadonly exclude?: readonly string[];\n\treadonly maxConsecutiveErrors?: number;\n\treadonly signal?: AbortSignal;\n}\n\nfunction source<T>(\n\tfactory: string,\n\tsetup: (ctx: Ctx) => undefined | (() => void),\n): Operator<never, T> {\n\treturn {\n\t\tfactory,\n\t\tbody: (ctx) => {\n\t\t\tconst cleanup = setup(ctx);\n\t\t\tif (typeof cleanup === \"function\") ctx.onDeactivation(cleanup);\n\t\t},\n\t};\n}\n\nfunction normalizePath(path: string): string {\n\treturn path.replaceAll(\"\\\\\", \"/\");\n}\n\nfunction escapeRegExp(value: string): string {\n\treturn value.replace(/[|\\\\{}()[\\]^$+?.]/g, \"\\\\$&\");\n}\n\nfunction globToRegExp(pattern: string): RegExp {\n\tlet out = \"^\";\n\tfor (let i = 0; i < pattern.length; i += 1) {\n\t\tconst ch = pattern[i];\n\t\tif (ch === \"*\") {\n\t\t\tif (pattern[i + 1] === \"*\") {\n\t\t\t\tout += \".*\";\n\t\t\t\ti += 1;\n\t\t\t} else {\n\t\t\t\tout += \"[^/]*\";\n\t\t\t}\n\t\t} else {\n\t\t\tout += escapeRegExp(ch);\n\t\t}\n\t}\n\treturn new RegExp(`${out}$`);\n}\n\nfunction matchesAny(value: string, patterns: readonly RegExp[]): boolean {\n\treturn patterns.some((pattern) => pattern.test(value));\n}\n\nfunction timestampNsNow(): string {\n\treturn (BigInt(Date.now()) * 1_000_000n).toString();\n}\n\nfunction validatePositiveFinite(name: string, value: number): void {\n\tif (!Number.isFinite(value) || value <= 0) {\n\t\tthrow new RangeError(`${name} must be a positive finite number`);\n\t}\n}\n\nfunction validateNonNegativeFinite(name: string, value: number): void {\n\tif (!Number.isFinite(value) || value < 0) {\n\t\tthrow new RangeError(`${name} must be a non-negative finite number`);\n\t}\n}\n\nfunction eventTypeFor(eventType: \"rename\" | \"change\", path: string): FSEventType {\n\tif (eventType === \"change\") return \"change\";\n\ttry {\n\t\treturn existsSync(path) ? \"create\" : \"delete\";\n\t} catch {\n\t\treturn \"rename\";\n\t}\n}\n\nfunction scanFiles(\n\troot: string,\n\trecursive: boolean,\n\tisExcluded: (abs: string, rel: string) => boolean,\n): readonly string[] {\n\tconst resolved = resolvePath(root);\n\ttry {\n\t\tconst st = statSync(resolved);\n\t\tif (st.isFile()) return [resolved];\n\t\tif (!st.isDirectory()) return [];\n\t} catch {\n\t\treturn [];\n\t}\n\n\tconst out: string[] = [];\n\tfunction walk(dir: string): void {\n\t\tlet entries: Dirent[];\n\t\ttry {\n\t\t\tentries = readdirSync(dir, { withFileTypes: true });\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t\tfor (const entry of entries) {\n\t\t\tconst abs = join(dir, entry.name);\n\t\t\tconst rel = relative(resolved, abs);\n\t\t\tif (entry.isFile()) {\n\t\t\t\tout.push(abs);\n\t\t\t} else if (recursive && entry.isDirectory() && !isExcluded(abs, rel)) {\n\t\t\t\twalk(abs);\n\t\t\t}\n\t\t}\n\t}\n\twalk(resolved);\n\treturn out;\n}\n\n/**\n * fromFSWatch: Node.js filesystem watcher source.\n *\n * External fs callbacks are a source boundary (R-no-raw-async): events enter the graph only via\n * `ctx.down`, and cleanup is tied to node deactivation through `ctx.onDeactivation`.\n */\nexport function fromFSWatch(\n\tpaths: string | readonly string[],\n\topts: FromFSWatchOptions = {},\n): Operator<never, FSEvent> {\n\tconst list = (Array.isArray(paths) ? paths : [paths]).map((path) => resolvePath(path));\n\tif (list.length === 0) throw new RangeError(\"fromFSWatch: paths must not be empty\");\n\tconst {\n\t\trecursive = false,\n\t\tdebounceMs = 100,\n\t\tinitialScan = false,\n\t\tinclude,\n\t\texclude = [\"**/node_modules/**\", \"**/.git/**\", \"**/dist/**\"],\n\t\tsignal,\n\t} = opts;\n\tif (!Number.isFinite(debounceMs) || debounceMs < 0) {\n\t\tthrow new RangeError(\"fromFSWatch: debounceMs must be a non-negative finite number\");\n\t}\n\tconst includePatterns = (include ?? []).map(globToRegExp);\n\tconst excludePatterns = exclude.map(globToRegExp);\n\n\tconst accepts = (abs: string, rel: string): boolean => {\n\t\tconst normalized = normalizePath(abs);\n\t\tconst relNormalized = normalizePath(rel);\n\t\tconst included =\n\t\t\tincludePatterns.length === 0 ||\n\t\t\tmatchesAny(normalized, includePatterns) ||\n\t\t\tmatchesAny(relNormalized, includePatterns);\n\t\tif (!included) return false;\n\t\treturn !isExcluded(normalized, relNormalized);\n\t};\n\tconst isExcluded = (abs: string, rel: string): boolean => {\n\t\tconst normalized = normalizePath(abs);\n\t\tconst relNormalized = normalizePath(rel);\n\t\treturn (\n\t\t\tmatchesAny(normalized, excludePatterns) ||\n\t\t\tmatchesAny(relNormalized, excludePatterns) ||\n\t\t\tmatchesAny(`${normalized}/`, excludePatterns) ||\n\t\t\t(relNormalized !== \"\" && matchesAny(`${relNormalized}/`, excludePatterns))\n\t\t);\n\t};\n\n\treturn source<FSEvent>(\"fromFSWatch\", (ctx) => {\n\t\tlet stopped = false;\n\t\tlet terminal = false;\n\t\tlet ready = initialScan === false;\n\t\tlet generation = 0;\n\t\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\t\tconst watchers: FSWatcher[] = [];\n\t\tconst pending = new Map<string, FSEvent>();\n\t\tconst buffered = new Map<string, FSEvent>();\n\n\t\tconst close = () => {\n\t\t\tfor (const watcher of watchers.splice(0)) watcher.close();\n\t\t};\n\t\tconst cleanup = () => {\n\t\t\tstopped = true;\n\t\t\tgeneration += 1;\n\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tclose();\n\t\t\tpending.clear();\n\t\t\tbuffered.clear();\n\t\t};\n\t\tconst emitError = (err: unknown) => {\n\t\t\tif (terminal) return;\n\t\t\tterminal = true;\n\t\t\tcleanup();\n\t\t\tctx.down([[\"ERROR\", errorPayload(err)]]);\n\t\t};\n\t\tfunction onAbort() {\n\t\t\temitError(signal?.reason);\n\t\t}\n\t\tconst flush = (token: number) => {\n\t\t\ttimer = undefined;\n\t\t\tif (stopped || terminal || token !== generation || pending.size === 0) return;\n\t\t\tconst msgs = [...pending.values()].map((event): [\"DATA\", FSEvent] => [\"DATA\", event]);\n\t\t\tpending.clear();\n\t\t\tctx.down(msgs);\n\t\t};\n\t\tconst schedule = () => {\n\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t\tconst token = generation;\n\t\t\tif (debounceMs === 0) flush(token);\n\t\t\telse timer = setTimeout(() => flush(token), debounceMs);\n\t\t};\n\t\tconst enqueue = (event: FSEvent) => {\n\t\t\tif (!ready) {\n\t\t\t\tbuffered.set(event.path, event);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpending.set(event.path, event);\n\t\t\tschedule();\n\t\t};\n\t\tconst eventFor = (\n\t\t\tbasePath: string,\n\t\t\teventType: \"rename\" | \"change\",\n\t\t\tfileName: string | Buffer | null,\n\t\t): FSEvent | undefined => {\n\t\t\tconst root = normalizePath(resolvePath(basePath));\n\t\t\tconst abs = normalizePath(fileName == null ? root : resolvePath(basePath, String(fileName)));\n\t\t\tconst rel = normalizePath(fileName == null ? \"\" : relative(root, abs));\n\t\t\tif (!accepts(abs, rel)) return undefined;\n\t\t\treturn {\n\t\t\t\ttype: eventTypeFor(eventType, abs),\n\t\t\t\tpath: abs,\n\t\t\t\troot,\n\t\t\t\trelativePath: rel,\n\t\t\t};\n\t\t};\n\n\t\tif (signal?.aborted) {\n\t\t\tonAbort();\n\t\t\treturn cleanup;\n\t\t}\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\ttry {\n\t\t\tfor (const basePath of list) {\n\t\t\t\tconst watcher = watch(basePath, { recursive }, (eventType, fileName) => {\n\t\t\t\t\tif (stopped || terminal) return;\n\t\t\t\t\tconst event = eventFor(basePath, eventType, fileName);\n\t\t\t\t\tif (event !== undefined) enqueue(event);\n\t\t\t\t});\n\t\t\t\twatcher.on(\"error\", emitError);\n\t\t\t\twatchers.push(watcher);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\temitError(err);\n\t\t\treturn cleanup;\n\t\t}\n\n\t\tif (initialScan !== false) {\n\t\t\ttry {\n\t\t\t\tfor (const basePath of list) {\n\t\t\t\t\tconst root = normalizePath(resolvePath(basePath));\n\t\t\t\t\tlet relRoot = root;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (statSync(basePath).isFile()) relRoot = dirname(root);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\trelRoot = root;\n\t\t\t\t\t}\n\t\t\t\t\tfor (const absPath of scanFiles(basePath, recursive, isExcluded)) {\n\t\t\t\t\t\tif (stopped || terminal) return cleanup;\n\t\t\t\t\t\tconst abs = normalizePath(absPath);\n\t\t\t\t\t\tconst rel = normalizePath(relative(relRoot, abs));\n\t\t\t\t\t\tif (!accepts(abs, rel)) continue;\n\t\t\t\t\t\tpending.set(abs, {\n\t\t\t\t\t\t\ttype: \"create\",\n\t\t\t\t\t\t\tpath: abs,\n\t\t\t\t\t\t\troot,\n\t\t\t\t\t\t\trelativePath: rel,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tready = true;\n\t\t\t\tfor (const [key, event] of buffered) pending.set(key, event);\n\t\t\t\tbuffered.clear();\n\t\t\t\tif (pending.size > 0) schedule();\n\t\t\t} catch (err) {\n\t\t\t\temitError(err);\n\t\t\t}\n\t\t}\n\n\t\treturn cleanup;\n\t});\n}\n\nexport function fromSpawn(\n\tcmd: string,\n\targs: readonly string[] = [],\n\topts: FromSpawnOptions = {},\n): Operator<never, SpawnEvent> {\n\tif (typeof cmd !== \"string\" || cmd.length === 0) {\n\t\tthrow new TypeError(\"fromSpawn: cmd must be a non-empty string\");\n\t}\n\tconst killGraceMs = opts.killGraceMs ?? 1000;\n\tvalidateNonNegativeFinite(\"fromSpawn: killGraceMs\", killGraceMs);\n\treturn source<SpawnEvent>(\"fromSpawn\", (ctx) => {\n\t\tlet alive = true;\n\t\tlet terminal = false;\n\t\tlet exitInfo: { code: number | null; signal: NodeJS.Signals | null } | undefined;\n\t\tlet child: ReturnType<typeof spawn>;\n\t\tlet killTimer: ReturnType<typeof setTimeout> | undefined;\n\t\tconst clearKillTimer = () => {\n\t\t\tif (killTimer !== undefined) clearTimeout(killTimer);\n\t\t\tkillTimer = undefined;\n\t\t};\n\t\tconst stop = () => {\n\t\t\talive = false;\n\t\t\tchild?.stdout?.removeAllListeners(\"data\");\n\t\t\tchild?.stderr?.removeAllListeners(\"data\");\n\t\t\tif (!terminal) {\n\t\t\t\ttry {\n\t\t\t\t\tchild?.kill(\"SIGTERM\");\n\t\t\t\t} catch {\n\t\t\t\t\t// Process may already have exited.\n\t\t\t\t}\n\t\t\t\tkillTimer = setTimeout(() => {\n\t\t\t\t\tif (!terminal) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tchild?.kill(\"SIGKILL\");\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Process may already have exited.\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}, killGraceMs);\n\t\t\t\tkillTimer.unref?.();\n\t\t\t}\n\t\t};\n\t\ttry {\n\t\t\tchild = spawn(cmd, [...args], {\n\t\t\t\tcwd: opts.cwd,\n\t\t\t\tenv: opts.env,\n\t\t\t\tshell: opts.shell,\n\t\t\t\tsignal: opts.signal,\n\t\t\t\tstdio: (opts.stdio as SpawnOptions[\"stdio\"]) ?? \"pipe\",\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tterminal = true;\n\t\t\tctx.down([[\"ERROR\", errorPayload(err)]]);\n\t\t\treturn () => undefined;\n\t\t}\n\t\tchild.stdout?.on(\"data\", (chunk: Buffer) => {\n\t\t\tif (alive) ctx.down([[\"DATA\", { kind: \"stdout\", chunk }]]);\n\t\t});\n\t\tchild.stderr?.on(\"data\", (chunk: Buffer) => {\n\t\t\tif (alive) ctx.down([[\"DATA\", { kind: \"stderr\", chunk }]]);\n\t\t});\n\t\tchild.on(\"error\", (err) => {\n\t\t\tif (!alive || terminal) return;\n\t\t\tterminal = true;\n\t\t\talive = false;\n\t\t\tctx.down([[\"ERROR\", errorPayload(err)]]);\n\t\t});\n\t\tchild.on(\"exit\", (code, signal) => {\n\t\t\texitInfo = { code, signal: signal as NodeJS.Signals | null };\n\t\t});\n\t\tchild.on(\"close\", () => {\n\t\t\tclearKillTimer();\n\t\t\tif (!alive || terminal) return;\n\t\t\tterminal = true;\n\t\t\talive = false;\n\t\t\tconst info = exitInfo ?? { code: null, signal: null };\n\t\t\tctx.down([[\"DATA\", { kind: \"exit\", code: info.code, signal: info.signal }], [\"COMPLETE\"]]);\n\t\t});\n\t\treturn stop;\n\t});\n}\n\n/**\n * Node.js process EnvironmentDriver for D130/D131 adapters.\n *\n * Import this from `@graphrefly/ts/sources/node` and install it with\n * `EnvironmentDrivers.empty().withProcess(nodeProcessDriver())`. The child process is an\n * adapter-boundary side effect; graph nodes only observe ordinary ProcessResult DATA or ERROR.\n */\nexport function nodeProcessDriver(opts: NodeProcessDriverOptions = {}): LocalProcessDriver {\n\tconst killGraceMs = opts.killGraceMs ?? 1000;\n\tconst maxBufferBytes = opts.maxBufferBytes ?? 16 * 1024 * 1024;\n\tvalidateNonNegativeFinite(\"nodeProcessDriver: killGraceMs\", killGraceMs);\n\tvalidateNonNegativeFinite(\"nodeProcessDriver: maxBufferBytes\", maxBufferBytes);\n\treturn {\n\t\trun(command, callback) {\n\t\t\treturn runNodeProcessCommand(command, callback, {\n\t\t\t\tkillGraceMs,\n\t\t\t\tmaxBufferBytes,\n\t\t\t\tshell: opts.shell,\n\t\t\t});\n\t\t},\n\t};\n}\n\nexport function runProcess(\n\tcmd: string,\n\targs: readonly string[] = [],\n\topts: FromSpawnOptions = {},\n): Operator<never, ProcessResult> {\n\tif (typeof cmd !== \"string\" || cmd.length === 0) {\n\t\tthrow new TypeError(\"runProcess: cmd must be a non-empty string\");\n\t}\n\tconst killGraceMs = opts.killGraceMs ?? 1000;\n\tvalidateNonNegativeFinite(\"runProcess: killGraceMs\", killGraceMs);\n\treturn source<ProcessResult>(\"runProcess\", (ctx) => {\n\t\tlet alive = true;\n\t\tlet terminal = false;\n\t\tconst stdoutChunks: Buffer[] = [];\n\t\tconst stderrChunks: Buffer[] = [];\n\t\tlet exitInfo: { code: number | null; signal: NodeJS.Signals | null } | undefined;\n\t\tlet child: ReturnType<typeof spawn>;\n\t\tlet killTimer: ReturnType<typeof setTimeout> | undefined;\n\t\tconst clearKillTimer = () => {\n\t\t\tif (killTimer !== undefined) clearTimeout(killTimer);\n\t\t\tkillTimer = undefined;\n\t\t};\n\t\tconst stop = () => {\n\t\t\talive = false;\n\t\t\tchild?.stdout?.removeAllListeners(\"data\");\n\t\t\tchild?.stderr?.removeAllListeners(\"data\");\n\t\t\tif (!terminal) {\n\t\t\t\ttry {\n\t\t\t\t\tchild?.kill(\"SIGTERM\");\n\t\t\t\t} catch {\n\t\t\t\t\t// Process may already have exited.\n\t\t\t\t}\n\t\t\t\tkillTimer = setTimeout(() => {\n\t\t\t\t\tif (!terminal) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tchild?.kill(\"SIGKILL\");\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Process may already have exited.\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}, killGraceMs);\n\t\t\t\tkillTimer.unref?.();\n\t\t\t}\n\t\t};\n\t\ttry {\n\t\t\tchild = spawn(cmd, [...args], {\n\t\t\t\tcwd: opts.cwd,\n\t\t\t\tenv: opts.env,\n\t\t\t\tshell: opts.shell,\n\t\t\t\tsignal: opts.signal,\n\t\t\t\tstdio: (opts.stdio as SpawnOptions[\"stdio\"]) ?? \"pipe\",\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tterminal = true;\n\t\t\tctx.down([[\"ERROR\", errorPayload(err)]]);\n\t\t\treturn () => undefined;\n\t\t}\n\t\tchild.stdout?.on(\"data\", (chunk: Buffer) => {\n\t\t\tif (alive) stdoutChunks.push(chunk);\n\t\t});\n\t\tchild.stderr?.on(\"data\", (chunk: Buffer) => {\n\t\t\tif (alive) stderrChunks.push(chunk);\n\t\t});\n\t\tchild.on(\"error\", (err) => {\n\t\t\tif (!alive || terminal) return;\n\t\t\tterminal = true;\n\t\t\talive = false;\n\t\t\tctx.down([[\"ERROR\", errorPayload(err)]]);\n\t\t});\n\t\tchild.on(\"exit\", (code, signal) => {\n\t\t\texitInfo = { code, signal: signal as NodeJS.Signals | null };\n\t\t});\n\t\tchild.on(\"close\", () => {\n\t\t\tclearKillTimer();\n\t\t\tif (!alive || terminal) return;\n\t\t\tterminal = true;\n\t\t\talive = false;\n\t\t\tconst info = exitInfo ?? { code: null, signal: null };\n\t\t\tctx.down([\n\t\t\t\t[\n\t\t\t\t\t\"DATA\",\n\t\t\t\t\t{\n\t\t\t\t\t\tstdout: Buffer.concat(stdoutChunks).toString(\"utf8\"),\n\t\t\t\t\t\tstderr: Buffer.concat(stderrChunks).toString(\"utf8\"),\n\t\t\t\t\t\texitCode: info.code,\n\t\t\t\t\t\tsignal: info.signal,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t[\"COMPLETE\"],\n\t\t\t]);\n\t\t});\n\t\treturn stop;\n\t});\n}\n\nfunction runNodeProcessCommand(\n\tcommand: ProcessCommand,\n\tcallback: (result: DriverResult<EnvironmentProcessResult>) => void,\n\topts: {\n\t\treadonly killGraceMs: number;\n\t\treadonly maxBufferBytes: number;\n\t\treadonly shell?: boolean | string;\n\t},\n): () => void {\n\tif (typeof command.program !== \"string\" || command.program.length === 0) {\n\t\tcallback({\n\t\t\tok: false,\n\t\t\terror: new TypeError(\"nodeProcessDriver: program must be a non-empty string\"),\n\t\t});\n\t\treturn () => undefined;\n\t}\n\tlet alive = true;\n\tlet terminal = false;\n\tconst stdoutChunks: Buffer[] = [];\n\tconst stderrChunks: Buffer[] = [];\n\tlet bufferedBytes = 0;\n\tlet exitInfo: { code: number | null; signal: string | null } | undefined;\n\tlet child: ReturnType<typeof spawn>;\n\tlet killTimer: ReturnType<typeof setTimeout> | undefined;\n\tconst clearKillTimer = () => {\n\t\tif (killTimer !== undefined) clearTimeout(killTimer);\n\t\tkillTimer = undefined;\n\t};\n\tconst stop = () => {\n\t\tif (!alive) return;\n\t\talive = false;\n\t\tchild?.stdout?.removeAllListeners(\"data\");\n\t\tchild?.stderr?.removeAllListeners(\"data\");\n\t\tif (!terminal) {\n\t\t\ttry {\n\t\t\t\tchild?.kill(\"SIGTERM\");\n\t\t\t} catch {\n\t\t\t\t// Process may already have exited.\n\t\t\t}\n\t\t\tkillTimer = setTimeout(() => {\n\t\t\t\tif (!terminal) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tchild?.kill(\"SIGKILL\");\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Process may already have exited.\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, opts.killGraceMs);\n\t\t\tkillTimer.unref?.();\n\t\t}\n\t};\n\ttry {\n\t\tchild = spawn(command.program, [...command.args], {\n\t\t\tcwd: command.cwd,\n\t\t\tenv: command.env === undefined ? undefined : Object.fromEntries(command.env),\n\t\t\tshell: opts.shell,\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t});\n\t} catch (err) {\n\t\tterminal = true;\n\t\tcallback({ ok: false, error: err });\n\t\treturn () => undefined;\n\t}\n\tconst fail = (error: unknown) => {\n\t\tclearKillTimer();\n\t\tif (!alive || terminal) return;\n\t\tterminal = true;\n\t\talive = false;\n\t\tchild.stdout?.removeAllListeners(\"data\");\n\t\tchild.stderr?.removeAllListeners(\"data\");\n\t\ttry {\n\t\t\tchild.kill(\"SIGTERM\");\n\t\t} catch {\n\t\t\t// Process may already have exited.\n\t\t}\n\t\tkillTimer = setTimeout(() => {\n\t\t\ttry {\n\t\t\t\tchild.kill(\"SIGKILL\");\n\t\t\t} catch {\n\t\t\t\t// Process may already have exited.\n\t\t\t}\n\t\t}, opts.killGraceMs);\n\t\tkillTimer.unref?.();\n\t\tcallback({ ok: false, error });\n\t};\n\tconst pushOutput = (chunks: Buffer[], chunk: Buffer) => {\n\t\tif (!alive) return;\n\t\tbufferedBytes += chunk.byteLength;\n\t\tif (bufferedBytes > opts.maxBufferBytes) {\n\t\t\tfail(\n\t\t\t\tnew RangeError(\n\t\t\t\t\t`nodeProcessDriver: stdout/stderr exceeded maxBufferBytes (${opts.maxBufferBytes})`,\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tchunks.push(chunk);\n\t};\n\tchild.stdout?.on(\"data\", (chunk: Buffer) => {\n\t\tpushOutput(stdoutChunks, chunk);\n\t});\n\tchild.stderr?.on(\"data\", (chunk: Buffer) => {\n\t\tpushOutput(stderrChunks, chunk);\n\t});\n\tchild.on(\"error\", (err) => {\n\t\tclearKillTimer();\n\t\tif (!alive || terminal) return;\n\t\tterminal = true;\n\t\talive = false;\n\t\tcallback({ ok: false, error: err });\n\t});\n\tchild.on(\"exit\", (code, signal) => {\n\t\texitInfo = { code, signal };\n\t});\n\tchild.on(\"close\", () => {\n\t\tclearKillTimer();\n\t\tif (!alive || terminal) return;\n\t\tterminal = true;\n\t\talive = false;\n\t\tconst info = exitInfo ?? { code: null, signal: null };\n\t\tcallback({\n\t\t\tok: true,\n\t\t\tvalue: {\n\t\t\t\tstdout: Buffer.concat(stdoutChunks).toString(\"utf8\"),\n\t\t\t\tstderr: Buffer.concat(stderrChunks).toString(\"utf8\"),\n\t\t\t\texitCode: info.code,\n\t\t\t\tsignal: info.signal,\n\t\t\t},\n\t\t});\n\t});\n\treturn stop;\n}\n\ninterface GitPollResult {\n\treadonly head: string;\n\treadonly files: readonly string[];\n\treadonly message: string;\n\treadonly author: string;\n}\n\nfunction stripFinalLineBreak(value: string): string {\n\treturn value.replace(/\\r?\\n$/, \"\");\n}\n\nfunction gitText(repoPath: string, args: readonly string[]): string {\n\treturn stripFinalLineBreak(execFileSync(\"git\", [\"-C\", repoPath, ...args], { encoding: \"utf8\" }));\n}\n\nfunction gitPathList(repoPath: string, args: readonly string[]): readonly string[] {\n\tconst out = execFileSync(\"git\", [\"-C\", repoPath, ...args, \"-z\"]) as Buffer;\n\tconst text = out.toString(\"utf8\");\n\tif (text.length === 0) return [];\n\treturn text.split(\"\\0\").filter((part) => part.length > 0);\n}\n\nfunction readGitHead(\n\trepoPath: string,\n\tpreviousHead: string | undefined,\n): GitPollResult | undefined {\n\tconst head = gitText(repoPath, [\"rev-parse\", \"HEAD\"]);\n\tif (head.length === 0 || head === previousHead) return undefined;\n\tconst files =\n\t\tpreviousHead === undefined\n\t\t\t? []\n\t\t\t: gitPathList(repoPath, [\"diff\", \"--name-only\", `${previousHead}..${head}`]);\n\treturn {\n\t\thead,\n\t\tfiles,\n\t\tmessage: gitText(repoPath, [\"log\", \"-1\", \"--format=%s\", head]),\n\t\tauthor: gitText(repoPath, [\"log\", \"-1\", \"--format=%an\", head]),\n\t};\n}\n\nexport function fromGitHook(\n\trepoPath: string,\n\topts: FromGitHookOptions = {},\n): Operator<never, GitEvent> {\n\tconst { pollMs = 5000, include, exclude, maxConsecutiveErrors = 1, signal } = opts;\n\tvalidatePositiveFinite(\"fromGitHook: pollMs\", pollMs);\n\tif (!Number.isFinite(maxConsecutiveErrors) && maxConsecutiveErrors !== Infinity) {\n\t\tthrow new RangeError(\"fromGitHook: maxConsecutiveErrors must be finite or Infinity\");\n\t}\n\tif (maxConsecutiveErrors <= 0) {\n\t\tthrow new RangeError(\"fromGitHook: maxConsecutiveErrors must be positive\");\n\t}\n\tconst resolvedRepoPath = resolvePath(repoPath);\n\tconst includePatterns = (include ?? []).map(globToRegExp);\n\tconst excludePatterns = (exclude ?? []).map(globToRegExp);\n\tconst accepts = (file: string): boolean => {\n\t\tconst normalized = normalizePath(file);\n\t\tconst included = includePatterns.length === 0 || matchesAny(normalized, includePatterns);\n\t\treturn included && !matchesAny(normalized, excludePatterns);\n\t};\n\n\treturn source<GitEvent>(\"fromGitHook\", (ctx) => {\n\t\tlet done = false;\n\t\tlet lastSeen: string | undefined;\n\t\tlet consecutiveErrors = 0;\n\t\tlet intervalId: ReturnType<typeof setInterval> | undefined;\n\t\tconst cleanup = () => {\n\t\t\tdone = true;\n\t\t\tif (intervalId !== undefined) clearInterval(intervalId);\n\t\t\tintervalId = undefined;\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t};\n\t\tconst fail = (err: unknown) => {\n\t\t\tif (done) return;\n\t\t\tcleanup();\n\t\t\tctx.down([[\"ERROR\", errorPayload(err)]]);\n\t\t};\n\t\tconst onAbort = () => fail(signal?.reason);\n\t\tconst poll = () => {\n\t\t\tif (done) return;\n\t\t\ttry {\n\t\t\t\tconst result = readGitHead(resolvedRepoPath, lastSeen);\n\t\t\t\tconsecutiveErrors = 0;\n\t\t\t\tif (result === undefined) return;\n\t\t\t\tconst isBaseline = lastSeen === undefined;\n\t\t\t\tlastSeen = result.head;\n\t\t\t\tif (isBaseline) return;\n\t\t\t\tctx.down([\n\t\t\t\t\t[\n\t\t\t\t\t\t\"DATA\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thook: \"post-commit\",\n\t\t\t\t\t\t\tcommit: result.head,\n\t\t\t\t\t\t\tfiles: result.files.filter(accepts),\n\t\t\t\t\t\t\tmessage: result.message,\n\t\t\t\t\t\t\tauthor: result.author,\n\t\t\t\t\t\t\ttimestamp_ns: timestampNsNow(),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t]);\n\t\t\t} catch (err) {\n\t\t\t\tconsecutiveErrors += 1;\n\t\t\t\tif (consecutiveErrors >= maxConsecutiveErrors) fail(err);\n\t\t\t}\n\t\t};\n\t\tif (signal?.aborted) {\n\t\t\tonAbort();\n\t\t\treturn cleanup;\n\t\t}\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\tpoll();\n\t\tif (!done) intervalId = setInterval(poll, pollMs);\n\t\treturn cleanup;\n\t});\n}\n","/**\n * Wave-protocol message types and the tier const table.\n *\n * Canonical authority: ~/src/graphrefly/spec/rules.jsonl\n * R-msg-format, R-msg-closed-set, R-tier (D34), R-data-payload, R-sentinel.\n */\n\n/** Opaque pause-lock identifier (R-pause-lockset). */\nexport type LockId = string | symbol;\n\n/**\n * The CLOSED set of 10 message types (R-msg-closed-set / D9 + START handshake).\n * No open set, no user-defined custom types. Adding a type is a spec change.\n */\nexport type Message =\n\t| readonly [\"START\"]\n\t| readonly [\"DIRTY\"]\n\t| readonly [\"DATA\", unknown]\n\t| readonly [\"RESOLVED\"]\n\t| readonly [\"INVALIDATE\"]\n\t| readonly [\"COMPLETE\"]\n\t| readonly [\"ERROR\", unknown]\n\t| readonly [\"TEARDOWN\"]\n\t| readonly [\"PAUSE\", LockId]\n\t| readonly [\"RESUME\", LockId];\n\n/** One array of messages delivered in one call = one Wave (R-wave-boundary). */\nexport type Wave = readonly Message[];\n\n/** The message-type tag (the first tuple element). */\nexport type MessageType = Message[0];\n\n/**\n * SENTINEL = absence-of-DATA (R-sentinel / D16). TS representation is `undefined`.\n * Never a valid DATA payload; `null` IS a valid DATA value (domain-level absence).\n */\nexport const SENTINEL = undefined;\n\n/** R-data-payload: ERROR payloads must not collide with terminal metadata shorthand. */\nexport function isInvalidErrorPayload(v: unknown): boolean {\n\treturn v === SENTINEL || typeof v === \"boolean\";\n}\n\n/** R-data-payload / D78: host-language failures that collide with ctx.terminal shorthand become diagnostics. */\nexport function errorPayload(reason: unknown, fallback = \"error without a valid payload\"): unknown {\n\treturn isInvalidErrorPayload(reason) ? new Error(fallback) : reason;\n}\n\nexport const TIER_START = 0;\nexport const TIER_CONTROL = 1;\nexport const TIER_NOTIFICATION = 2;\nexport const TIER_VALUE = 3;\nexport const TIER_SETTLE = 4;\nexport const TIER_TERMINAL = 5;\nexport const TIER_TEARDOWN = 6;\n\n/**\n * Tier const table (R-tier / D34). Tiers below value dispatch immediately; value\n * and above are batch-deferred. This is a compile-time const table (D18), not runtime config.\n */\nconst TIER: Record<MessageType, number> = {\n\tSTART: TIER_START,\n\tPAUSE: TIER_CONTROL,\n\tRESUME: TIER_CONTROL,\n\tDIRTY: TIER_NOTIFICATION,\n\tDATA: TIER_VALUE,\n\tRESOLVED: TIER_VALUE,\n\tINVALIDATE: TIER_SETTLE,\n\tCOMPLETE: TIER_TERMINAL,\n\tERROR: TIER_TERMINAL,\n\tTEARDOWN: TIER_TEARDOWN,\n};\n\nexport function messageTier(t: MessageType): number {\n\treturn TIER[t];\n}\n\n/** Value and above are deferred inside a batch (DATA/RESOLVED/INVALIDATE/terminal/teardown). */\nexport function isDeferredTier(t: MessageType): boolean {\n\treturn TIER[t] >= TIER_VALUE;\n}\n\n/** Value-tier messages (DATA/RESOLVED) occupy the tier-3 slot. */\nexport function isValueTier(t: MessageType): boolean {\n\treturn TIER[t] === TIER_VALUE;\n}\n\n/** The pause buffer holds the settle slice only: value-tier DATA/RESOLVED plus INVALIDATE. */\nexport function isPauseBufferedTier(t: MessageType): boolean {\n\tconst tier = TIER[t];\n\treturn tier === TIER_VALUE || tier === TIER_SETTLE;\n}\n\n/**\n * A TERMINAL message = tier 5 (COMPLETE | ERROR), R-tier / D34. Detected via the CENTRAL tier\n * table, NOT a per-variant `=== \"COMPLETE\" || === \"ERROR\"` check — so terminal routing stays\n * driven by the one const table (feedback_use_tier_for_signal_routing); discriminate COMPLETE vs\n * ERROR within the tier by the message type only where the handling actually differs.\n */\nexport function isTerminal(t: MessageType): boolean {\n\treturn TIER[t] === TIER_TERMINAL;\n}\n\n/**\n * ctx.up carries control tiers only (R-ctx-up / DR-5): DIRTY, PAUSE, RESUME,\n * INVALIDATE, TEARDOWN. DATA/RESOLVED (tier 3) and COMPLETE/ERROR (tier 5) are\n * down-only.\n */\nexport function isUpAllowed(t: MessageType): boolean {\n\tconst tier = TIER[t];\n\treturn tier !== TIER_VALUE && tier !== TIER_TERMINAL;\n}\n"],"mappings":"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","names":["resolvePath"]}
1
+ {"version":3,"sources":["../../src/sources/node.ts","../../src/protocol/messages.ts"],"sourcesContent":["/**\n * Node-only source factories. Import from `@graphrefly/ts/sources/node`; the universal\n * `@graphrefly/ts/sources` barrel stays browser-safe.\n */\n\nimport { execFileSync, type SpawnOptions, spawn } from \"node:child_process\";\nimport { type Dirent, existsSync, type FSWatcher, readdirSync, statSync, watch } from \"node:fs\";\nimport { dirname, join, relative, resolve as resolvePath } from \"node:path\";\nimport type { Ctx } from \"../ctx/types.js\";\nimport type {\n\tDriverResult,\n\tProcessResult as EnvironmentProcessResult,\n\tLocalProcessDriver,\n\tProcessCommand,\n} from \"../graph/environment.js\";\nimport type { Operator } from \"../graph/operators.js\";\nimport { errorPayload } from \"../protocol/messages.js\";\n\nexport type FSEventType = \"change\" | \"rename\" | \"create\" | \"delete\";\n\nexport interface FSEvent {\n\treadonly type: FSEventType;\n\treadonly path: string;\n\treadonly root: string;\n\treadonly relativePath: string;\n}\n\nexport interface FromFSWatchOptions {\n\t/** Use Node's recursive fs.watch mode where the host platform supports it. Default: false. */\n\treadonly recursive?: boolean;\n\t/** Coalesce events per path for this many milliseconds. Default: 100. */\n\treadonly debounceMs?: number;\n\t/** Emit create events for existing files after watcher registration. Default: false. */\n\treadonly initialScan?: boolean | \"files\";\n\t/** Include glob patterns matched against absolute and relative slash-normalized paths. */\n\treadonly include?: readonly string[];\n\t/** Exclude glob patterns matched against absolute and relative slash-normalized paths. */\n\treadonly exclude?: readonly string[];\n\t/** AbortSignal aborts the source to ERROR and closes all watchers. */\n\treadonly signal?: AbortSignal;\n}\n\nexport type SpawnEvent =\n\t| { readonly kind: \"stdout\"; readonly chunk: Buffer }\n\t| { readonly kind: \"stderr\"; readonly chunk: Buffer }\n\t| { readonly kind: \"exit\"; readonly code: number | null; readonly signal: NodeJS.Signals | null };\n\nexport interface FromSpawnOptions {\n\treadonly cwd?: string;\n\treadonly env?: NodeJS.ProcessEnv;\n\treadonly shell?: boolean | string;\n\treadonly signal?: AbortSignal;\n\treadonly stdio?: \"pipe\" | readonly (\"pipe\" | \"ignore\" | \"inherit\")[];\n\t/** Milliseconds after teardown SIGTERM before sending SIGKILL. Default: 1000. */\n\treadonly killGraceMs?: number;\n}\n\n/**\n * Node-only process driver options for D130/D131 EnvironmentDrivers.\n *\n * These knobs configure host child-process behavior at the driver boundary only; they do not\n * change graph wave, tier, or message semantics.\n */\nexport interface NodeProcessDriverOptions {\n\t/** Milliseconds after cancellation SIGTERM before sending SIGKILL. Default: 1000. */\n\treadonly killGraceMs?: number;\n\t/** Maximum captured stdout + stderr bytes before terminating with ERROR. Default: 16 MiB. */\n\treadonly maxBufferBytes?: number;\n\t/** Optional shell mode passed to Node's child_process.spawn. Default: false. */\n\treadonly shell?: boolean | string;\n}\n\nexport interface ProcessResult {\n\treadonly stdout: string;\n\treadonly stderr: string;\n\treadonly exitCode: number | null;\n\treadonly signal: NodeJS.Signals | null;\n}\n\nexport type GitHookType = \"post-commit\" | \"post-merge\" | \"post-checkout\" | \"post-rewrite\";\n\nexport interface GitEvent {\n\treadonly hook: GitHookType;\n\treadonly commit: string;\n\treadonly files: readonly string[];\n\treadonly message: string;\n\treadonly author: string;\n\treadonly timestamp_ns: string;\n}\n\nexport interface FromGitHookOptions {\n\treadonly pollMs?: number;\n\treadonly include?: readonly string[];\n\treadonly exclude?: readonly string[];\n\treadonly maxConsecutiveErrors?: number;\n\treadonly signal?: AbortSignal;\n}\n\nfunction source<T>(\n\tfactory: string,\n\tsetup: (ctx: Ctx) => undefined | (() => void),\n): Operator<never, T> {\n\treturn {\n\t\tfactory,\n\t\tbody: (ctx) => {\n\t\t\tconst cleanup = setup(ctx);\n\t\t\tif (typeof cleanup === \"function\") ctx.onDeactivation(cleanup);\n\t\t},\n\t};\n}\n\nfunction normalizePath(path: string): string {\n\treturn path.replaceAll(\"\\\\\", \"/\");\n}\n\nfunction escapeRegExp(value: string): string {\n\treturn value.replace(/[|\\\\{}()[\\]^$+?.]/g, \"\\\\$&\");\n}\n\nfunction globToRegExp(pattern: string): RegExp {\n\tlet out = \"^\";\n\tfor (let i = 0; i < pattern.length; i += 1) {\n\t\tconst ch = pattern[i];\n\t\tif (ch === \"*\") {\n\t\t\tif (pattern[i + 1] === \"*\") {\n\t\t\t\tout += \".*\";\n\t\t\t\ti += 1;\n\t\t\t} else {\n\t\t\t\tout += \"[^/]*\";\n\t\t\t}\n\t\t} else {\n\t\t\tout += escapeRegExp(ch);\n\t\t}\n\t}\n\treturn new RegExp(`${out}$`);\n}\n\nfunction matchesAny(value: string, patterns: readonly RegExp[]): boolean {\n\treturn patterns.some((pattern) => pattern.test(value));\n}\n\nfunction timestampNsNow(): string {\n\treturn (BigInt(Date.now()) * 1_000_000n).toString();\n}\n\nfunction validatePositiveFinite(name: string, value: number): void {\n\tif (!Number.isFinite(value) || value <= 0) {\n\t\tthrow new RangeError(`${name} must be a positive finite number`);\n\t}\n}\n\nfunction validateNonNegativeFinite(name: string, value: number): void {\n\tif (!Number.isFinite(value) || value < 0) {\n\t\tthrow new RangeError(`${name} must be a non-negative finite number`);\n\t}\n}\n\nfunction eventTypeFor(eventType: \"rename\" | \"change\", path: string): FSEventType {\n\tif (eventType === \"change\") return \"change\";\n\ttry {\n\t\treturn existsSync(path) ? \"create\" : \"delete\";\n\t} catch {\n\t\treturn \"rename\";\n\t}\n}\n\nfunction scanFiles(\n\troot: string,\n\trecursive: boolean,\n\tisExcluded: (abs: string, rel: string) => boolean,\n): readonly string[] {\n\tconst resolved = resolvePath(root);\n\ttry {\n\t\tconst st = statSync(resolved);\n\t\tif (st.isFile()) return [resolved];\n\t\tif (!st.isDirectory()) return [];\n\t} catch {\n\t\treturn [];\n\t}\n\n\tconst out: string[] = [];\n\tfunction walk(dir: string): void {\n\t\tlet entries: Dirent[];\n\t\ttry {\n\t\t\tentries = readdirSync(dir, { withFileTypes: true });\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t\tfor (const entry of entries) {\n\t\t\tconst abs = join(dir, entry.name);\n\t\t\tconst rel = relative(resolved, abs);\n\t\t\tif (entry.isFile()) {\n\t\t\t\tout.push(abs);\n\t\t\t} else if (recursive && entry.isDirectory() && !isExcluded(abs, rel)) {\n\t\t\t\twalk(abs);\n\t\t\t}\n\t\t}\n\t}\n\twalk(resolved);\n\treturn out;\n}\n\n/**\n * fromFSWatch: Node.js filesystem watcher source.\n *\n * External fs callbacks are a source boundary (R-no-raw-async): events enter the graph only via\n * `ctx.down`, and cleanup is tied to node deactivation through `ctx.onDeactivation`.\n */\nexport function fromFSWatch(\n\tpaths: string | readonly string[],\n\topts: FromFSWatchOptions = {},\n): Operator<never, FSEvent> {\n\tconst list = (Array.isArray(paths) ? paths : [paths]).map((path) => resolvePath(path));\n\tif (list.length === 0) throw new RangeError(\"fromFSWatch: paths must not be empty\");\n\tconst {\n\t\trecursive = false,\n\t\tdebounceMs = 100,\n\t\tinitialScan = false,\n\t\tinclude,\n\t\texclude = [\"**/node_modules/**\", \"**/.git/**\", \"**/dist/**\"],\n\t\tsignal,\n\t} = opts;\n\tif (!Number.isFinite(debounceMs) || debounceMs < 0) {\n\t\tthrow new RangeError(\"fromFSWatch: debounceMs must be a non-negative finite number\");\n\t}\n\tconst includePatterns = (include ?? []).map(globToRegExp);\n\tconst excludePatterns = exclude.map(globToRegExp);\n\n\tconst accepts = (abs: string, rel: string): boolean => {\n\t\tconst normalized = normalizePath(abs);\n\t\tconst relNormalized = normalizePath(rel);\n\t\tconst included =\n\t\t\tincludePatterns.length === 0 ||\n\t\t\tmatchesAny(normalized, includePatterns) ||\n\t\t\tmatchesAny(relNormalized, includePatterns);\n\t\tif (!included) return false;\n\t\treturn !isExcluded(normalized, relNormalized);\n\t};\n\tconst isExcluded = (abs: string, rel: string): boolean => {\n\t\tconst normalized = normalizePath(abs);\n\t\tconst relNormalized = normalizePath(rel);\n\t\treturn (\n\t\t\tmatchesAny(normalized, excludePatterns) ||\n\t\t\tmatchesAny(relNormalized, excludePatterns) ||\n\t\t\tmatchesAny(`${normalized}/`, excludePatterns) ||\n\t\t\t(relNormalized !== \"\" && matchesAny(`${relNormalized}/`, excludePatterns))\n\t\t);\n\t};\n\n\treturn source<FSEvent>(\"fromFSWatch\", (ctx) => {\n\t\tlet stopped = false;\n\t\tlet terminal = false;\n\t\tlet ready = initialScan === false;\n\t\tlet generation = 0;\n\t\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\t\tconst watchers: FSWatcher[] = [];\n\t\tconst pending = new Map<string, FSEvent>();\n\t\tconst buffered = new Map<string, FSEvent>();\n\n\t\tconst close = () => {\n\t\t\tfor (const watcher of watchers.splice(0)) watcher.close();\n\t\t};\n\t\tconst cleanup = () => {\n\t\t\tstopped = true;\n\t\t\tgeneration += 1;\n\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tclose();\n\t\t\tpending.clear();\n\t\t\tbuffered.clear();\n\t\t};\n\t\tconst emitError = (err: unknown) => {\n\t\t\tif (terminal) return;\n\t\t\tterminal = true;\n\t\t\tcleanup();\n\t\t\tctx.down([[\"ERROR\", errorPayload(err)]]);\n\t\t};\n\t\tfunction onAbort() {\n\t\t\temitError(signal?.reason);\n\t\t}\n\t\tconst flush = (token: number) => {\n\t\t\ttimer = undefined;\n\t\t\tif (stopped || terminal || token !== generation || pending.size === 0) return;\n\t\t\tconst msgs = [...pending.values()].map((event): [\"DATA\", FSEvent] => [\"DATA\", event]);\n\t\t\tpending.clear();\n\t\t\tctx.down(msgs);\n\t\t};\n\t\tconst schedule = () => {\n\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t\tconst token = generation;\n\t\t\tif (debounceMs === 0) flush(token);\n\t\t\telse timer = setTimeout(() => flush(token), debounceMs);\n\t\t};\n\t\tconst enqueue = (event: FSEvent) => {\n\t\t\tif (!ready) {\n\t\t\t\tbuffered.set(event.path, event);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpending.set(event.path, event);\n\t\t\tschedule();\n\t\t};\n\t\tconst eventFor = (\n\t\t\tbasePath: string,\n\t\t\teventType: \"rename\" | \"change\",\n\t\t\tfileName: string | Buffer | null,\n\t\t): FSEvent | undefined => {\n\t\t\tconst root = normalizePath(resolvePath(basePath));\n\t\t\tconst abs = normalizePath(fileName == null ? root : resolvePath(basePath, String(fileName)));\n\t\t\tconst rel = normalizePath(fileName == null ? \"\" : relative(root, abs));\n\t\t\tif (!accepts(abs, rel)) return undefined;\n\t\t\treturn {\n\t\t\t\ttype: eventTypeFor(eventType, abs),\n\t\t\t\tpath: abs,\n\t\t\t\troot,\n\t\t\t\trelativePath: rel,\n\t\t\t};\n\t\t};\n\n\t\tif (signal?.aborted) {\n\t\t\tonAbort();\n\t\t\treturn cleanup;\n\t\t}\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\ttry {\n\t\t\tfor (const basePath of list) {\n\t\t\t\tconst watcher = watch(basePath, { recursive }, (eventType, fileName) => {\n\t\t\t\t\tif (stopped || terminal) return;\n\t\t\t\t\tconst event = eventFor(basePath, eventType, fileName);\n\t\t\t\t\tif (event !== undefined) enqueue(event);\n\t\t\t\t});\n\t\t\t\twatcher.on(\"error\", emitError);\n\t\t\t\twatchers.push(watcher);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\temitError(err);\n\t\t\treturn cleanup;\n\t\t}\n\n\t\tif (initialScan !== false) {\n\t\t\ttry {\n\t\t\t\tfor (const basePath of list) {\n\t\t\t\t\tconst root = normalizePath(resolvePath(basePath));\n\t\t\t\t\tlet relRoot = root;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (statSync(basePath).isFile()) relRoot = dirname(root);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\trelRoot = root;\n\t\t\t\t\t}\n\t\t\t\t\tfor (const absPath of scanFiles(basePath, recursive, isExcluded)) {\n\t\t\t\t\t\tif (stopped || terminal) return cleanup;\n\t\t\t\t\t\tconst abs = normalizePath(absPath);\n\t\t\t\t\t\tconst rel = normalizePath(relative(relRoot, abs));\n\t\t\t\t\t\tif (!accepts(abs, rel)) continue;\n\t\t\t\t\t\tpending.set(abs, {\n\t\t\t\t\t\t\ttype: \"create\",\n\t\t\t\t\t\t\tpath: abs,\n\t\t\t\t\t\t\troot,\n\t\t\t\t\t\t\trelativePath: rel,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tready = true;\n\t\t\t\tfor (const [key, event] of buffered) pending.set(key, event);\n\t\t\t\tbuffered.clear();\n\t\t\t\tif (pending.size > 0) schedule();\n\t\t\t} catch (err) {\n\t\t\t\temitError(err);\n\t\t\t}\n\t\t}\n\n\t\treturn cleanup;\n\t});\n}\n\nexport function fromSpawn(\n\tcmd: string,\n\targs: readonly string[] = [],\n\topts: FromSpawnOptions = {},\n): Operator<never, SpawnEvent> {\n\tif (typeof cmd !== \"string\" || cmd.length === 0) {\n\t\tthrow new TypeError(\"fromSpawn: cmd must be a non-empty string\");\n\t}\n\tconst killGraceMs = opts.killGraceMs ?? 1000;\n\tvalidateNonNegativeFinite(\"fromSpawn: killGraceMs\", killGraceMs);\n\treturn source<SpawnEvent>(\"fromSpawn\", (ctx) => {\n\t\tlet alive = true;\n\t\tlet terminal = false;\n\t\tlet exitInfo: { code: number | null; signal: NodeJS.Signals | null } | undefined;\n\t\tlet child: ReturnType<typeof spawn>;\n\t\tlet killTimer: ReturnType<typeof setTimeout> | undefined;\n\t\tconst clearKillTimer = () => {\n\t\t\tif (killTimer !== undefined) clearTimeout(killTimer);\n\t\t\tkillTimer = undefined;\n\t\t};\n\t\tconst stop = () => {\n\t\t\talive = false;\n\t\t\tchild?.stdout?.removeAllListeners(\"data\");\n\t\t\tchild?.stderr?.removeAllListeners(\"data\");\n\t\t\tif (!terminal) {\n\t\t\t\ttry {\n\t\t\t\t\tchild?.kill(\"SIGTERM\");\n\t\t\t\t} catch {\n\t\t\t\t\t// Process may already have exited.\n\t\t\t\t}\n\t\t\t\tkillTimer = setTimeout(() => {\n\t\t\t\t\tif (!terminal) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tchild?.kill(\"SIGKILL\");\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Process may already have exited.\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}, killGraceMs);\n\t\t\t\tkillTimer.unref?.();\n\t\t\t}\n\t\t};\n\t\ttry {\n\t\t\tchild = spawn(cmd, [...args], {\n\t\t\t\tcwd: opts.cwd,\n\t\t\t\tenv: opts.env,\n\t\t\t\tshell: opts.shell,\n\t\t\t\tsignal: opts.signal,\n\t\t\t\tstdio: (opts.stdio as SpawnOptions[\"stdio\"]) ?? \"pipe\",\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tterminal = true;\n\t\t\tctx.down([[\"ERROR\", errorPayload(err)]]);\n\t\t\treturn () => undefined;\n\t\t}\n\t\tchild.stdout?.on(\"data\", (chunk: Buffer) => {\n\t\t\tif (alive) ctx.down([[\"DATA\", { kind: \"stdout\", chunk }]]);\n\t\t});\n\t\tchild.stderr?.on(\"data\", (chunk: Buffer) => {\n\t\t\tif (alive) ctx.down([[\"DATA\", { kind: \"stderr\", chunk }]]);\n\t\t});\n\t\tchild.on(\"error\", (err) => {\n\t\t\tif (!alive || terminal) return;\n\t\t\tterminal = true;\n\t\t\talive = false;\n\t\t\tctx.down([[\"ERROR\", errorPayload(err)]]);\n\t\t});\n\t\tchild.on(\"exit\", (code, signal) => {\n\t\t\texitInfo = { code, signal: signal as NodeJS.Signals | null };\n\t\t});\n\t\tchild.on(\"close\", () => {\n\t\t\tclearKillTimer();\n\t\t\tif (!alive || terminal) return;\n\t\t\tterminal = true;\n\t\t\talive = false;\n\t\t\tconst info = exitInfo ?? { code: null, signal: null };\n\t\t\tctx.down([[\"DATA\", { kind: \"exit\", code: info.code, signal: info.signal }], [\"COMPLETE\"]]);\n\t\t});\n\t\treturn stop;\n\t});\n}\n\n/**\n * Node.js process EnvironmentDriver for D130/D131 adapters.\n *\n * Import this from `@graphrefly/ts/sources/node` and install it with\n * `EnvironmentDrivers.empty().withProcess(nodeProcessDriver())`. The child process is an\n * adapter-boundary side effect; graph nodes only observe ordinary ProcessResult DATA or ERROR.\n */\nexport function nodeProcessDriver(opts: NodeProcessDriverOptions = {}): LocalProcessDriver {\n\tconst killGraceMs = opts.killGraceMs ?? 1000;\n\tconst maxBufferBytes = opts.maxBufferBytes ?? 16 * 1024 * 1024;\n\tvalidateNonNegativeFinite(\"nodeProcessDriver: killGraceMs\", killGraceMs);\n\tvalidateNonNegativeFinite(\"nodeProcessDriver: maxBufferBytes\", maxBufferBytes);\n\treturn {\n\t\trun(command, callback) {\n\t\t\treturn runNodeProcessCommand(command, callback, {\n\t\t\t\tkillGraceMs,\n\t\t\t\tmaxBufferBytes,\n\t\t\t\tshell: opts.shell,\n\t\t\t});\n\t\t},\n\t};\n}\n\nexport function runProcess(\n\tcmd: string,\n\targs: readonly string[] = [],\n\topts: FromSpawnOptions = {},\n): Operator<never, ProcessResult> {\n\tif (typeof cmd !== \"string\" || cmd.length === 0) {\n\t\tthrow new TypeError(\"runProcess: cmd must be a non-empty string\");\n\t}\n\tconst killGraceMs = opts.killGraceMs ?? 1000;\n\tvalidateNonNegativeFinite(\"runProcess: killGraceMs\", killGraceMs);\n\treturn source<ProcessResult>(\"runProcess\", (ctx) => {\n\t\tlet alive = true;\n\t\tlet terminal = false;\n\t\tconst stdoutChunks: Buffer[] = [];\n\t\tconst stderrChunks: Buffer[] = [];\n\t\tlet exitInfo: { code: number | null; signal: NodeJS.Signals | null } | undefined;\n\t\tlet child: ReturnType<typeof spawn>;\n\t\tlet killTimer: ReturnType<typeof setTimeout> | undefined;\n\t\tconst clearKillTimer = () => {\n\t\t\tif (killTimer !== undefined) clearTimeout(killTimer);\n\t\t\tkillTimer = undefined;\n\t\t};\n\t\tconst stop = () => {\n\t\t\talive = false;\n\t\t\tchild?.stdout?.removeAllListeners(\"data\");\n\t\t\tchild?.stderr?.removeAllListeners(\"data\");\n\t\t\tif (!terminal) {\n\t\t\t\ttry {\n\t\t\t\t\tchild?.kill(\"SIGTERM\");\n\t\t\t\t} catch {\n\t\t\t\t\t// Process may already have exited.\n\t\t\t\t}\n\t\t\t\tkillTimer = setTimeout(() => {\n\t\t\t\t\tif (!terminal) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tchild?.kill(\"SIGKILL\");\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Process may already have exited.\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}, killGraceMs);\n\t\t\t\tkillTimer.unref?.();\n\t\t\t}\n\t\t};\n\t\ttry {\n\t\t\tchild = spawn(cmd, [...args], {\n\t\t\t\tcwd: opts.cwd,\n\t\t\t\tenv: opts.env,\n\t\t\t\tshell: opts.shell,\n\t\t\t\tsignal: opts.signal,\n\t\t\t\tstdio: (opts.stdio as SpawnOptions[\"stdio\"]) ?? \"pipe\",\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tterminal = true;\n\t\t\tctx.down([[\"ERROR\", errorPayload(err)]]);\n\t\t\treturn () => undefined;\n\t\t}\n\t\tchild.stdout?.on(\"data\", (chunk: Buffer) => {\n\t\t\tif (alive) stdoutChunks.push(chunk);\n\t\t});\n\t\tchild.stderr?.on(\"data\", (chunk: Buffer) => {\n\t\t\tif (alive) stderrChunks.push(chunk);\n\t\t});\n\t\tchild.on(\"error\", (err) => {\n\t\t\tif (!alive || terminal) return;\n\t\t\tterminal = true;\n\t\t\talive = false;\n\t\t\tctx.down([[\"ERROR\", errorPayload(err)]]);\n\t\t});\n\t\tchild.on(\"exit\", (code, signal) => {\n\t\t\texitInfo = { code, signal: signal as NodeJS.Signals | null };\n\t\t});\n\t\tchild.on(\"close\", () => {\n\t\t\tclearKillTimer();\n\t\t\tif (!alive || terminal) return;\n\t\t\tterminal = true;\n\t\t\talive = false;\n\t\t\tconst info = exitInfo ?? { code: null, signal: null };\n\t\t\tctx.down([\n\t\t\t\t[\n\t\t\t\t\t\"DATA\",\n\t\t\t\t\t{\n\t\t\t\t\t\tstdout: Buffer.concat(stdoutChunks).toString(\"utf8\"),\n\t\t\t\t\t\tstderr: Buffer.concat(stderrChunks).toString(\"utf8\"),\n\t\t\t\t\t\texitCode: info.code,\n\t\t\t\t\t\tsignal: info.signal,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t[\"COMPLETE\"],\n\t\t\t]);\n\t\t});\n\t\treturn stop;\n\t});\n}\n\nfunction runNodeProcessCommand(\n\tcommand: ProcessCommand,\n\tcallback: (result: DriverResult<EnvironmentProcessResult>) => void,\n\topts: {\n\t\treadonly killGraceMs: number;\n\t\treadonly maxBufferBytes: number;\n\t\treadonly shell?: boolean | string;\n\t},\n): () => void {\n\tif (typeof command.program !== \"string\" || command.program.length === 0) {\n\t\tcallback({\n\t\t\tok: false,\n\t\t\terror: new TypeError(\"nodeProcessDriver: program must be a non-empty string\"),\n\t\t});\n\t\treturn () => undefined;\n\t}\n\tlet alive = true;\n\tlet terminal = false;\n\tconst stdoutChunks: Buffer[] = [];\n\tconst stderrChunks: Buffer[] = [];\n\tlet bufferedBytes = 0;\n\tlet exitInfo: { code: number | null; signal: string | null } | undefined;\n\tlet child: ReturnType<typeof spawn>;\n\tlet killTimer: ReturnType<typeof setTimeout> | undefined;\n\tconst clearKillTimer = () => {\n\t\tif (killTimer !== undefined) clearTimeout(killTimer);\n\t\tkillTimer = undefined;\n\t};\n\tconst stop = () => {\n\t\tif (!alive) return;\n\t\talive = false;\n\t\tchild?.stdout?.removeAllListeners(\"data\");\n\t\tchild?.stderr?.removeAllListeners(\"data\");\n\t\tif (!terminal) {\n\t\t\ttry {\n\t\t\t\tchild?.kill(\"SIGTERM\");\n\t\t\t} catch {\n\t\t\t\t// Process may already have exited.\n\t\t\t}\n\t\t\tkillTimer = setTimeout(() => {\n\t\t\t\tif (!terminal) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tchild?.kill(\"SIGKILL\");\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Process may already have exited.\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, opts.killGraceMs);\n\t\t\tkillTimer.unref?.();\n\t\t}\n\t};\n\ttry {\n\t\tchild = spawn(command.program, [...command.args], {\n\t\t\tcwd: command.cwd,\n\t\t\tenv: command.env === undefined ? undefined : Object.fromEntries(command.env),\n\t\t\tshell: opts.shell,\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t});\n\t} catch (err) {\n\t\tterminal = true;\n\t\tcallback({ ok: false, error: err });\n\t\treturn () => undefined;\n\t}\n\tconst fail = (error: unknown) => {\n\t\tclearKillTimer();\n\t\tif (!alive || terminal) return;\n\t\tterminal = true;\n\t\talive = false;\n\t\tchild.stdout?.removeAllListeners(\"data\");\n\t\tchild.stderr?.removeAllListeners(\"data\");\n\t\ttry {\n\t\t\tchild.kill(\"SIGTERM\");\n\t\t} catch {\n\t\t\t// Process may already have exited.\n\t\t}\n\t\tkillTimer = setTimeout(() => {\n\t\t\ttry {\n\t\t\t\tchild.kill(\"SIGKILL\");\n\t\t\t} catch {\n\t\t\t\t// Process may already have exited.\n\t\t\t}\n\t\t}, opts.killGraceMs);\n\t\tkillTimer.unref?.();\n\t\tcallback({ ok: false, error });\n\t};\n\tconst pushOutput = (chunks: Buffer[], chunk: Buffer) => {\n\t\tif (!alive) return;\n\t\tbufferedBytes += chunk.byteLength;\n\t\tif (bufferedBytes > opts.maxBufferBytes) {\n\t\t\tfail(\n\t\t\t\tnew RangeError(\n\t\t\t\t\t`nodeProcessDriver: stdout/stderr exceeded maxBufferBytes (${opts.maxBufferBytes})`,\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tchunks.push(chunk);\n\t};\n\tchild.stdout?.on(\"data\", (chunk: Buffer) => {\n\t\tpushOutput(stdoutChunks, chunk);\n\t});\n\tchild.stderr?.on(\"data\", (chunk: Buffer) => {\n\t\tpushOutput(stderrChunks, chunk);\n\t});\n\tchild.on(\"error\", (err) => {\n\t\tclearKillTimer();\n\t\tif (!alive || terminal) return;\n\t\tterminal = true;\n\t\talive = false;\n\t\tcallback({ ok: false, error: err });\n\t});\n\tchild.on(\"exit\", (code, signal) => {\n\t\texitInfo = { code, signal };\n\t});\n\tchild.on(\"close\", () => {\n\t\tclearKillTimer();\n\t\tif (!alive || terminal) return;\n\t\tterminal = true;\n\t\talive = false;\n\t\tconst info = exitInfo ?? { code: null, signal: null };\n\t\tcallback({\n\t\t\tok: true,\n\t\t\tvalue: {\n\t\t\t\tstdout: Buffer.concat(stdoutChunks).toString(\"utf8\"),\n\t\t\t\tstderr: Buffer.concat(stderrChunks).toString(\"utf8\"),\n\t\t\t\texitCode: info.code,\n\t\t\t\tsignal: info.signal,\n\t\t\t},\n\t\t});\n\t});\n\treturn stop;\n}\n\ninterface GitPollResult {\n\treadonly head: string;\n\treadonly files: readonly string[];\n\treadonly message: string;\n\treadonly author: string;\n}\n\nfunction stripFinalLineBreak(value: string): string {\n\treturn value.replace(/\\r?\\n$/, \"\");\n}\n\nfunction gitText(repoPath: string, args: readonly string[]): string {\n\treturn stripFinalLineBreak(execFileSync(\"git\", [\"-C\", repoPath, ...args], { encoding: \"utf8\" }));\n}\n\nfunction gitPathList(repoPath: string, args: readonly string[]): readonly string[] {\n\tconst out = execFileSync(\"git\", [\"-C\", repoPath, ...args, \"-z\"]) as Buffer;\n\tconst text = out.toString(\"utf8\");\n\tif (text.length === 0) return [];\n\treturn text.split(\"\\0\").filter((part) => part.length > 0);\n}\n\nfunction readGitHead(\n\trepoPath: string,\n\tpreviousHead: string | undefined,\n): GitPollResult | undefined {\n\tconst head = gitText(repoPath, [\"rev-parse\", \"HEAD\"]);\n\tif (head.length === 0 || head === previousHead) return undefined;\n\tconst files =\n\t\tpreviousHead === undefined\n\t\t\t? []\n\t\t\t: gitPathList(repoPath, [\"diff\", \"--name-only\", `${previousHead}..${head}`]);\n\treturn {\n\t\thead,\n\t\tfiles,\n\t\tmessage: gitText(repoPath, [\"log\", \"-1\", \"--format=%s\", head]),\n\t\tauthor: gitText(repoPath, [\"log\", \"-1\", \"--format=%an\", head]),\n\t};\n}\n\nexport function fromGitHook(\n\trepoPath: string,\n\topts: FromGitHookOptions = {},\n): Operator<never, GitEvent> {\n\tconst { pollMs = 5000, include, exclude, maxConsecutiveErrors = 1, signal } = opts;\n\tvalidatePositiveFinite(\"fromGitHook: pollMs\", pollMs);\n\tif (!Number.isFinite(maxConsecutiveErrors) && maxConsecutiveErrors !== Infinity) {\n\t\tthrow new RangeError(\"fromGitHook: maxConsecutiveErrors must be finite or Infinity\");\n\t}\n\tif (maxConsecutiveErrors <= 0) {\n\t\tthrow new RangeError(\"fromGitHook: maxConsecutiveErrors must be positive\");\n\t}\n\tconst resolvedRepoPath = resolvePath(repoPath);\n\tconst includePatterns = (include ?? []).map(globToRegExp);\n\tconst excludePatterns = (exclude ?? []).map(globToRegExp);\n\tconst accepts = (file: string): boolean => {\n\t\tconst normalized = normalizePath(file);\n\t\tconst included = includePatterns.length === 0 || matchesAny(normalized, includePatterns);\n\t\treturn included && !matchesAny(normalized, excludePatterns);\n\t};\n\n\treturn source<GitEvent>(\"fromGitHook\", (ctx) => {\n\t\tlet done = false;\n\t\tlet lastSeen: string | undefined;\n\t\tlet consecutiveErrors = 0;\n\t\tlet intervalId: ReturnType<typeof setInterval> | undefined;\n\t\tconst cleanup = () => {\n\t\t\tdone = true;\n\t\t\tif (intervalId !== undefined) clearInterval(intervalId);\n\t\t\tintervalId = undefined;\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t};\n\t\tconst fail = (err: unknown) => {\n\t\t\tif (done) return;\n\t\t\tcleanup();\n\t\t\tctx.down([[\"ERROR\", errorPayload(err)]]);\n\t\t};\n\t\tconst onAbort = () => fail(signal?.reason);\n\t\tconst poll = () => {\n\t\t\tif (done) return;\n\t\t\ttry {\n\t\t\t\tconst result = readGitHead(resolvedRepoPath, lastSeen);\n\t\t\t\tconsecutiveErrors = 0;\n\t\t\t\tif (result === undefined) return;\n\t\t\t\tconst isBaseline = lastSeen === undefined;\n\t\t\t\tlastSeen = result.head;\n\t\t\t\tif (isBaseline) return;\n\t\t\t\tctx.down([\n\t\t\t\t\t[\n\t\t\t\t\t\t\"DATA\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thook: \"post-commit\",\n\t\t\t\t\t\t\tcommit: result.head,\n\t\t\t\t\t\t\tfiles: result.files.filter(accepts),\n\t\t\t\t\t\t\tmessage: result.message,\n\t\t\t\t\t\t\tauthor: result.author,\n\t\t\t\t\t\t\ttimestamp_ns: timestampNsNow(),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t]);\n\t\t\t} catch (err) {\n\t\t\t\tconsecutiveErrors += 1;\n\t\t\t\tif (consecutiveErrors >= maxConsecutiveErrors) fail(err);\n\t\t\t}\n\t\t};\n\t\tif (signal?.aborted) {\n\t\t\tonAbort();\n\t\t\treturn cleanup;\n\t\t}\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\tpoll();\n\t\tif (!done) intervalId = setInterval(poll, pollMs);\n\t\treturn cleanup;\n\t});\n}\n","/**\n * Wave-protocol message types and the tier const table.\n *\n * Canonical authority: ~/src/graphrefly/spec/rules.jsonl\n * R-msg-format, R-msg-closed-set, R-tier (D34), R-data-payload, R-sentinel.\n */\n\n/** Opaque pause-lock / pull identifier (R-pause-lockset, R-pull). */\nexport type LockId = string | symbol;\n\n/** Explicit pull demand payload (D269/D272). Params are holder-visible context, never DATA-up. */\nexport interface PullDemand {\n\treadonly pullId: LockId;\n\treadonly params?: unknown;\n}\n\n/**\n * The CLOSED set of 11 message types (R-msg-closed-set / D9 + D269 + START handshake).\n * No open set, no user-defined custom types. Adding a type is a spec change.\n */\nexport type Message =\n\t| readonly [\"START\"]\n\t| readonly [\"DIRTY\"]\n\t| readonly [\"DATA\", unknown]\n\t| readonly [\"RESOLVED\"]\n\t| readonly [\"INVALIDATE\"]\n\t| readonly [\"COMPLETE\"]\n\t| readonly [\"ERROR\", unknown]\n\t| readonly [\"TEARDOWN\"]\n\t| readonly [\"PAUSE\", LockId]\n\t| readonly [\"RESUME\", LockId]\n\t| readonly [\"PULL\", PullDemand];\n\n/** One array of messages delivered in one call = one Wave (R-wave-boundary). */\nexport type Wave = readonly Message[];\n\n/** The message-type tag (the first tuple element). */\nexport type MessageType = Message[0];\n\n/**\n * SENTINEL = absence-of-DATA (R-sentinel / D16). TS representation is `undefined`.\n * Never a valid DATA payload; `null` IS a valid DATA value (domain-level absence).\n */\nexport const SENTINEL = undefined;\n\n/** R-data-payload: ERROR payloads must not collide with terminal metadata shorthand. */\nexport function isInvalidErrorPayload(v: unknown): boolean {\n\treturn v === SENTINEL || typeof v === \"boolean\";\n}\n\n/** R-data-payload / D78: host-language failures that collide with ctx.terminal shorthand become diagnostics. */\nexport function errorPayload(reason: unknown, fallback = \"error without a valid payload\"): unknown {\n\treturn isInvalidErrorPayload(reason) ? new Error(fallback) : reason;\n}\n\nexport const TIER_START = 0;\nexport const TIER_CONTROL = 1;\nexport const TIER_NOTIFICATION = 2;\nexport const TIER_VALUE = 3;\nexport const TIER_SETTLE = 4;\nexport const TIER_TERMINAL = 5;\nexport const TIER_TEARDOWN = 6;\n\n/**\n * Tier const table (R-tier / D34). Tiers below value dispatch immediately; value\n * and above are batch-deferred. This is a compile-time const table (D18), not runtime config.\n */\nconst TIER: Record<MessageType, number> = {\n\tSTART: TIER_START,\n\tPAUSE: TIER_CONTROL,\n\tRESUME: TIER_CONTROL,\n\tPULL: TIER_CONTROL,\n\tDIRTY: TIER_NOTIFICATION,\n\tDATA: TIER_VALUE,\n\tRESOLVED: TIER_VALUE,\n\tINVALIDATE: TIER_SETTLE,\n\tCOMPLETE: TIER_TERMINAL,\n\tERROR: TIER_TERMINAL,\n\tTEARDOWN: TIER_TEARDOWN,\n};\n\nexport function messageTier(t: MessageType): number {\n\treturn TIER[t];\n}\n\n/** Value and above are deferred inside a batch (DATA/RESOLVED/INVALIDATE/terminal/teardown). */\nexport function isDeferredTier(t: MessageType): boolean {\n\treturn TIER[t] >= TIER_VALUE;\n}\n\n/** Value-tier messages (DATA/RESOLVED) occupy the tier-3 slot. */\nexport function isValueTier(t: MessageType): boolean {\n\treturn TIER[t] === TIER_VALUE;\n}\n\n/** The pause buffer holds the settle slice only: value-tier DATA/RESOLVED plus INVALIDATE. */\nexport function isPauseBufferedTier(t: MessageType): boolean {\n\tconst tier = TIER[t];\n\treturn tier === TIER_VALUE || tier === TIER_SETTLE;\n}\n\n/**\n * A TERMINAL message = tier 5 (COMPLETE | ERROR), R-tier / D34. Detected via the CENTRAL tier\n * table, NOT a per-variant `=== \"COMPLETE\" || === \"ERROR\"` check — so terminal routing stays\n * driven by the one const table (feedback_use_tier_for_signal_routing); discriminate COMPLETE vs\n * ERROR within the tier by the message type only where the handling actually differs.\n */\nexport function isTerminal(t: MessageType): boolean {\n\treturn TIER[t] === TIER_TERMINAL;\n}\n\n/**\n * ctx.up carries control/demand tiers only (R-ctx-up / D269): DIRTY, PAUSE, RESUME, PULL,\n * INVALIDATE, TEARDOWN. DATA/RESOLVED (tier 3) and COMPLETE/ERROR (tier 5) are\n * down-only.\n */\nexport function isUpAllowed(t: MessageType): boolean {\n\tconst tier = TIER[t];\n\treturn tier !== TIER_VALUE && tier !== TIER_TERMINAL;\n}\n"],"mappings":"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","names":["resolvePath"]}
@@ -1,9 +1,9 @@
1
- import { i as LocalProcessDriver } from '../types-bNMSWKqF.cjs';
2
- import { L as Operator } from '../graph-s23RbbFO.cjs';
3
- import '../messages-BZqrGGm1.cjs';
1
+ import { i as LocalProcessDriver } from '../types-BS6CyR-x.cjs';
2
+ import { L as Operator } from '../graph-CWK3HLPB.cjs';
3
+ import '../messages-CAzUPPJM.cjs';
4
4
  import '../core/index.cjs';
5
5
  import '../codec-BB7p8fJc.cjs';
6
- import '../describe-Ciu8SUnN.cjs';
6
+ import '../describe-CQRrkv-Q.cjs';
7
7
 
8
8
  /**
9
9
  * Node-only source factories. Import from `@graphrefly/ts/sources/node`; the universal
@@ -1,9 +1,9 @@
1
- import { i as LocalProcessDriver } from '../types-h12mNYbq.js';
2
- import { L as Operator } from '../graph-DfdF9zy4.js';
3
- import '../messages-BZqrGGm1.js';
1
+ import { i as LocalProcessDriver } from '../types-C9NOgNJw.js';
2
+ import { L as Operator } from '../graph-ho5sotHP.js';
3
+ import '../messages-CAzUPPJM.js';
4
4
  import '../core/index.js';
5
5
  import '../codec-BB7p8fJc.js';
6
- import '../describe-BZb7AS2y.js';
6
+ import '../describe-B_A5fbXH.js';
7
7
 
8
8
  /**
9
9
  * Node-only source factories. Import from `@graphrefly/ts/sources/node`; the universal
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  errorPayload
3
- } from "../chunk-DK554R7P.js";
3
+ } from "../chunk-S6HXABGL.js";
4
+ import "../chunk-DGUM43GV.js";
4
5
 
5
6
  // src/sources/node.ts
6
7
  import { execFileSync, spawn } from "child_process";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/sources/node.ts"],"sourcesContent":["/**\n * Node-only source factories. Import from `@graphrefly/ts/sources/node`; the universal\n * `@graphrefly/ts/sources` barrel stays browser-safe.\n */\n\nimport { execFileSync, type SpawnOptions, spawn } from \"node:child_process\";\nimport { type Dirent, existsSync, type FSWatcher, readdirSync, statSync, watch } from \"node:fs\";\nimport { dirname, join, relative, resolve as resolvePath } from \"node:path\";\nimport type { Ctx } from \"../ctx/types.js\";\nimport type {\n\tDriverResult,\n\tProcessResult as EnvironmentProcessResult,\n\tLocalProcessDriver,\n\tProcessCommand,\n} from \"../graph/environment.js\";\nimport type { Operator } from \"../graph/operators.js\";\nimport { errorPayload } from \"../protocol/messages.js\";\n\nexport type FSEventType = \"change\" | \"rename\" | \"create\" | \"delete\";\n\nexport interface FSEvent {\n\treadonly type: FSEventType;\n\treadonly path: string;\n\treadonly root: string;\n\treadonly relativePath: string;\n}\n\nexport interface FromFSWatchOptions {\n\t/** Use Node's recursive fs.watch mode where the host platform supports it. Default: false. */\n\treadonly recursive?: boolean;\n\t/** Coalesce events per path for this many milliseconds. Default: 100. */\n\treadonly debounceMs?: number;\n\t/** Emit create events for existing files after watcher registration. Default: false. */\n\treadonly initialScan?: boolean | \"files\";\n\t/** Include glob patterns matched against absolute and relative slash-normalized paths. */\n\treadonly include?: readonly string[];\n\t/** Exclude glob patterns matched against absolute and relative slash-normalized paths. */\n\treadonly exclude?: readonly string[];\n\t/** AbortSignal aborts the source to ERROR and closes all watchers. */\n\treadonly signal?: AbortSignal;\n}\n\nexport type SpawnEvent =\n\t| { readonly kind: \"stdout\"; readonly chunk: Buffer }\n\t| { readonly kind: \"stderr\"; readonly chunk: Buffer }\n\t| { readonly kind: \"exit\"; readonly code: number | null; readonly signal: NodeJS.Signals | null };\n\nexport interface FromSpawnOptions {\n\treadonly cwd?: string;\n\treadonly env?: NodeJS.ProcessEnv;\n\treadonly shell?: boolean | string;\n\treadonly signal?: AbortSignal;\n\treadonly stdio?: \"pipe\" | readonly (\"pipe\" | \"ignore\" | \"inherit\")[];\n\t/** Milliseconds after teardown SIGTERM before sending SIGKILL. Default: 1000. */\n\treadonly killGraceMs?: number;\n}\n\n/**\n * Node-only process driver options for D130/D131 EnvironmentDrivers.\n *\n * These knobs configure host child-process behavior at the driver boundary only; they do not\n * change graph wave, tier, or message semantics.\n */\nexport interface NodeProcessDriverOptions {\n\t/** Milliseconds after cancellation SIGTERM before sending SIGKILL. Default: 1000. */\n\treadonly killGraceMs?: number;\n\t/** Maximum captured stdout + stderr bytes before terminating with ERROR. Default: 16 MiB. */\n\treadonly maxBufferBytes?: number;\n\t/** Optional shell mode passed to Node's child_process.spawn. Default: false. */\n\treadonly shell?: boolean | string;\n}\n\nexport interface ProcessResult {\n\treadonly stdout: string;\n\treadonly stderr: string;\n\treadonly exitCode: number | null;\n\treadonly signal: NodeJS.Signals | null;\n}\n\nexport type GitHookType = \"post-commit\" | \"post-merge\" | \"post-checkout\" | \"post-rewrite\";\n\nexport interface GitEvent {\n\treadonly hook: GitHookType;\n\treadonly commit: string;\n\treadonly files: readonly string[];\n\treadonly message: string;\n\treadonly author: string;\n\treadonly timestamp_ns: string;\n}\n\nexport interface FromGitHookOptions {\n\treadonly pollMs?: number;\n\treadonly include?: readonly string[];\n\treadonly exclude?: readonly string[];\n\treadonly maxConsecutiveErrors?: number;\n\treadonly signal?: AbortSignal;\n}\n\nfunction source<T>(\n\tfactory: string,\n\tsetup: (ctx: Ctx) => undefined | (() => void),\n): Operator<never, T> {\n\treturn {\n\t\tfactory,\n\t\tbody: (ctx) => {\n\t\t\tconst cleanup = setup(ctx);\n\t\t\tif (typeof cleanup === \"function\") ctx.onDeactivation(cleanup);\n\t\t},\n\t};\n}\n\nfunction normalizePath(path: string): string {\n\treturn path.replaceAll(\"\\\\\", \"/\");\n}\n\nfunction escapeRegExp(value: string): string {\n\treturn value.replace(/[|\\\\{}()[\\]^$+?.]/g, \"\\\\$&\");\n}\n\nfunction globToRegExp(pattern: string): RegExp {\n\tlet out = \"^\";\n\tfor (let i = 0; i < pattern.length; i += 1) {\n\t\tconst ch = pattern[i];\n\t\tif (ch === \"*\") {\n\t\t\tif (pattern[i + 1] === \"*\") {\n\t\t\t\tout += \".*\";\n\t\t\t\ti += 1;\n\t\t\t} else {\n\t\t\t\tout += \"[^/]*\";\n\t\t\t}\n\t\t} else {\n\t\t\tout += escapeRegExp(ch);\n\t\t}\n\t}\n\treturn new RegExp(`${out}$`);\n}\n\nfunction matchesAny(value: string, patterns: readonly RegExp[]): boolean {\n\treturn patterns.some((pattern) => pattern.test(value));\n}\n\nfunction timestampNsNow(): string {\n\treturn (BigInt(Date.now()) * 1_000_000n).toString();\n}\n\nfunction validatePositiveFinite(name: string, value: number): void {\n\tif (!Number.isFinite(value) || value <= 0) {\n\t\tthrow new RangeError(`${name} must be a positive finite number`);\n\t}\n}\n\nfunction validateNonNegativeFinite(name: string, value: number): void {\n\tif (!Number.isFinite(value) || value < 0) {\n\t\tthrow new RangeError(`${name} must be a non-negative finite number`);\n\t}\n}\n\nfunction eventTypeFor(eventType: \"rename\" | \"change\", path: string): FSEventType {\n\tif (eventType === \"change\") return \"change\";\n\ttry {\n\t\treturn existsSync(path) ? \"create\" : \"delete\";\n\t} catch {\n\t\treturn \"rename\";\n\t}\n}\n\nfunction scanFiles(\n\troot: string,\n\trecursive: boolean,\n\tisExcluded: (abs: string, rel: string) => boolean,\n): readonly string[] {\n\tconst resolved = resolvePath(root);\n\ttry {\n\t\tconst st = statSync(resolved);\n\t\tif (st.isFile()) return [resolved];\n\t\tif (!st.isDirectory()) return [];\n\t} catch {\n\t\treturn [];\n\t}\n\n\tconst out: string[] = [];\n\tfunction walk(dir: string): void {\n\t\tlet entries: Dirent[];\n\t\ttry {\n\t\t\tentries = readdirSync(dir, { withFileTypes: true });\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t\tfor (const entry of entries) {\n\t\t\tconst abs = join(dir, entry.name);\n\t\t\tconst rel = relative(resolved, abs);\n\t\t\tif (entry.isFile()) {\n\t\t\t\tout.push(abs);\n\t\t\t} else if (recursive && entry.isDirectory() && !isExcluded(abs, rel)) {\n\t\t\t\twalk(abs);\n\t\t\t}\n\t\t}\n\t}\n\twalk(resolved);\n\treturn out;\n}\n\n/**\n * fromFSWatch: Node.js filesystem watcher source.\n *\n * External fs callbacks are a source boundary (R-no-raw-async): events enter the graph only via\n * `ctx.down`, and cleanup is tied to node deactivation through `ctx.onDeactivation`.\n */\nexport function fromFSWatch(\n\tpaths: string | readonly string[],\n\topts: FromFSWatchOptions = {},\n): Operator<never, FSEvent> {\n\tconst list = (Array.isArray(paths) ? paths : [paths]).map((path) => resolvePath(path));\n\tif (list.length === 0) throw new RangeError(\"fromFSWatch: paths must not be empty\");\n\tconst {\n\t\trecursive = false,\n\t\tdebounceMs = 100,\n\t\tinitialScan = false,\n\t\tinclude,\n\t\texclude = [\"**/node_modules/**\", \"**/.git/**\", \"**/dist/**\"],\n\t\tsignal,\n\t} = opts;\n\tif (!Number.isFinite(debounceMs) || debounceMs < 0) {\n\t\tthrow new RangeError(\"fromFSWatch: debounceMs must be a non-negative finite number\");\n\t}\n\tconst includePatterns = (include ?? []).map(globToRegExp);\n\tconst excludePatterns = exclude.map(globToRegExp);\n\n\tconst accepts = (abs: string, rel: string): boolean => {\n\t\tconst normalized = normalizePath(abs);\n\t\tconst relNormalized = normalizePath(rel);\n\t\tconst included =\n\t\t\tincludePatterns.length === 0 ||\n\t\t\tmatchesAny(normalized, includePatterns) ||\n\t\t\tmatchesAny(relNormalized, includePatterns);\n\t\tif (!included) return false;\n\t\treturn !isExcluded(normalized, relNormalized);\n\t};\n\tconst isExcluded = (abs: string, rel: string): boolean => {\n\t\tconst normalized = normalizePath(abs);\n\t\tconst relNormalized = normalizePath(rel);\n\t\treturn (\n\t\t\tmatchesAny(normalized, excludePatterns) ||\n\t\t\tmatchesAny(relNormalized, excludePatterns) ||\n\t\t\tmatchesAny(`${normalized}/`, excludePatterns) ||\n\t\t\t(relNormalized !== \"\" && matchesAny(`${relNormalized}/`, excludePatterns))\n\t\t);\n\t};\n\n\treturn source<FSEvent>(\"fromFSWatch\", (ctx) => {\n\t\tlet stopped = false;\n\t\tlet terminal = false;\n\t\tlet ready = initialScan === false;\n\t\tlet generation = 0;\n\t\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\t\tconst watchers: FSWatcher[] = [];\n\t\tconst pending = new Map<string, FSEvent>();\n\t\tconst buffered = new Map<string, FSEvent>();\n\n\t\tconst close = () => {\n\t\t\tfor (const watcher of watchers.splice(0)) watcher.close();\n\t\t};\n\t\tconst cleanup = () => {\n\t\t\tstopped = true;\n\t\t\tgeneration += 1;\n\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tclose();\n\t\t\tpending.clear();\n\t\t\tbuffered.clear();\n\t\t};\n\t\tconst emitError = (err: unknown) => {\n\t\t\tif (terminal) return;\n\t\t\tterminal = true;\n\t\t\tcleanup();\n\t\t\tctx.down([[\"ERROR\", errorPayload(err)]]);\n\t\t};\n\t\tfunction onAbort() {\n\t\t\temitError(signal?.reason);\n\t\t}\n\t\tconst flush = (token: number) => {\n\t\t\ttimer = undefined;\n\t\t\tif (stopped || terminal || token !== generation || pending.size === 0) return;\n\t\t\tconst msgs = [...pending.values()].map((event): [\"DATA\", FSEvent] => [\"DATA\", event]);\n\t\t\tpending.clear();\n\t\t\tctx.down(msgs);\n\t\t};\n\t\tconst schedule = () => {\n\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t\tconst token = generation;\n\t\t\tif (debounceMs === 0) flush(token);\n\t\t\telse timer = setTimeout(() => flush(token), debounceMs);\n\t\t};\n\t\tconst enqueue = (event: FSEvent) => {\n\t\t\tif (!ready) {\n\t\t\t\tbuffered.set(event.path, event);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpending.set(event.path, event);\n\t\t\tschedule();\n\t\t};\n\t\tconst eventFor = (\n\t\t\tbasePath: string,\n\t\t\teventType: \"rename\" | \"change\",\n\t\t\tfileName: string | Buffer | null,\n\t\t): FSEvent | undefined => {\n\t\t\tconst root = normalizePath(resolvePath(basePath));\n\t\t\tconst abs = normalizePath(fileName == null ? root : resolvePath(basePath, String(fileName)));\n\t\t\tconst rel = normalizePath(fileName == null ? \"\" : relative(root, abs));\n\t\t\tif (!accepts(abs, rel)) return undefined;\n\t\t\treturn {\n\t\t\t\ttype: eventTypeFor(eventType, abs),\n\t\t\t\tpath: abs,\n\t\t\t\troot,\n\t\t\t\trelativePath: rel,\n\t\t\t};\n\t\t};\n\n\t\tif (signal?.aborted) {\n\t\t\tonAbort();\n\t\t\treturn cleanup;\n\t\t}\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\ttry {\n\t\t\tfor (const basePath of list) {\n\t\t\t\tconst watcher = watch(basePath, { recursive }, (eventType, fileName) => {\n\t\t\t\t\tif (stopped || terminal) return;\n\t\t\t\t\tconst event = eventFor(basePath, eventType, fileName);\n\t\t\t\t\tif (event !== undefined) enqueue(event);\n\t\t\t\t});\n\t\t\t\twatcher.on(\"error\", emitError);\n\t\t\t\twatchers.push(watcher);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\temitError(err);\n\t\t\treturn cleanup;\n\t\t}\n\n\t\tif (initialScan !== false) {\n\t\t\ttry {\n\t\t\t\tfor (const basePath of list) {\n\t\t\t\t\tconst root = normalizePath(resolvePath(basePath));\n\t\t\t\t\tlet relRoot = root;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (statSync(basePath).isFile()) relRoot = dirname(root);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\trelRoot = root;\n\t\t\t\t\t}\n\t\t\t\t\tfor (const absPath of scanFiles(basePath, recursive, isExcluded)) {\n\t\t\t\t\t\tif (stopped || terminal) return cleanup;\n\t\t\t\t\t\tconst abs = normalizePath(absPath);\n\t\t\t\t\t\tconst rel = normalizePath(relative(relRoot, abs));\n\t\t\t\t\t\tif (!accepts(abs, rel)) continue;\n\t\t\t\t\t\tpending.set(abs, {\n\t\t\t\t\t\t\ttype: \"create\",\n\t\t\t\t\t\t\tpath: abs,\n\t\t\t\t\t\t\troot,\n\t\t\t\t\t\t\trelativePath: rel,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tready = true;\n\t\t\t\tfor (const [key, event] of buffered) pending.set(key, event);\n\t\t\t\tbuffered.clear();\n\t\t\t\tif (pending.size > 0) schedule();\n\t\t\t} catch (err) {\n\t\t\t\temitError(err);\n\t\t\t}\n\t\t}\n\n\t\treturn cleanup;\n\t});\n}\n\nexport function fromSpawn(\n\tcmd: string,\n\targs: readonly string[] = [],\n\topts: FromSpawnOptions = {},\n): Operator<never, SpawnEvent> {\n\tif (typeof cmd !== \"string\" || cmd.length === 0) {\n\t\tthrow new TypeError(\"fromSpawn: cmd must be a non-empty string\");\n\t}\n\tconst killGraceMs = opts.killGraceMs ?? 1000;\n\tvalidateNonNegativeFinite(\"fromSpawn: killGraceMs\", killGraceMs);\n\treturn source<SpawnEvent>(\"fromSpawn\", (ctx) => {\n\t\tlet alive = true;\n\t\tlet terminal = false;\n\t\tlet exitInfo: { code: number | null; signal: NodeJS.Signals | null } | undefined;\n\t\tlet child: ReturnType<typeof spawn>;\n\t\tlet killTimer: ReturnType<typeof setTimeout> | undefined;\n\t\tconst clearKillTimer = () => {\n\t\t\tif (killTimer !== undefined) clearTimeout(killTimer);\n\t\t\tkillTimer = undefined;\n\t\t};\n\t\tconst stop = () => {\n\t\t\talive = false;\n\t\t\tchild?.stdout?.removeAllListeners(\"data\");\n\t\t\tchild?.stderr?.removeAllListeners(\"data\");\n\t\t\tif (!terminal) {\n\t\t\t\ttry {\n\t\t\t\t\tchild?.kill(\"SIGTERM\");\n\t\t\t\t} catch {\n\t\t\t\t\t// Process may already have exited.\n\t\t\t\t}\n\t\t\t\tkillTimer = setTimeout(() => {\n\t\t\t\t\tif (!terminal) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tchild?.kill(\"SIGKILL\");\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Process may already have exited.\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}, killGraceMs);\n\t\t\t\tkillTimer.unref?.();\n\t\t\t}\n\t\t};\n\t\ttry {\n\t\t\tchild = spawn(cmd, [...args], {\n\t\t\t\tcwd: opts.cwd,\n\t\t\t\tenv: opts.env,\n\t\t\t\tshell: opts.shell,\n\t\t\t\tsignal: opts.signal,\n\t\t\t\tstdio: (opts.stdio as SpawnOptions[\"stdio\"]) ?? \"pipe\",\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tterminal = true;\n\t\t\tctx.down([[\"ERROR\", errorPayload(err)]]);\n\t\t\treturn () => undefined;\n\t\t}\n\t\tchild.stdout?.on(\"data\", (chunk: Buffer) => {\n\t\t\tif (alive) ctx.down([[\"DATA\", { kind: \"stdout\", chunk }]]);\n\t\t});\n\t\tchild.stderr?.on(\"data\", (chunk: Buffer) => {\n\t\t\tif (alive) ctx.down([[\"DATA\", { kind: \"stderr\", chunk }]]);\n\t\t});\n\t\tchild.on(\"error\", (err) => {\n\t\t\tif (!alive || terminal) return;\n\t\t\tterminal = true;\n\t\t\talive = false;\n\t\t\tctx.down([[\"ERROR\", errorPayload(err)]]);\n\t\t});\n\t\tchild.on(\"exit\", (code, signal) => {\n\t\t\texitInfo = { code, signal: signal as NodeJS.Signals | null };\n\t\t});\n\t\tchild.on(\"close\", () => {\n\t\t\tclearKillTimer();\n\t\t\tif (!alive || terminal) return;\n\t\t\tterminal = true;\n\t\t\talive = false;\n\t\t\tconst info = exitInfo ?? { code: null, signal: null };\n\t\t\tctx.down([[\"DATA\", { kind: \"exit\", code: info.code, signal: info.signal }], [\"COMPLETE\"]]);\n\t\t});\n\t\treturn stop;\n\t});\n}\n\n/**\n * Node.js process EnvironmentDriver for D130/D131 adapters.\n *\n * Import this from `@graphrefly/ts/sources/node` and install it with\n * `EnvironmentDrivers.empty().withProcess(nodeProcessDriver())`. The child process is an\n * adapter-boundary side effect; graph nodes only observe ordinary ProcessResult DATA or ERROR.\n */\nexport function nodeProcessDriver(opts: NodeProcessDriverOptions = {}): LocalProcessDriver {\n\tconst killGraceMs = opts.killGraceMs ?? 1000;\n\tconst maxBufferBytes = opts.maxBufferBytes ?? 16 * 1024 * 1024;\n\tvalidateNonNegativeFinite(\"nodeProcessDriver: killGraceMs\", killGraceMs);\n\tvalidateNonNegativeFinite(\"nodeProcessDriver: maxBufferBytes\", maxBufferBytes);\n\treturn {\n\t\trun(command, callback) {\n\t\t\treturn runNodeProcessCommand(command, callback, {\n\t\t\t\tkillGraceMs,\n\t\t\t\tmaxBufferBytes,\n\t\t\t\tshell: opts.shell,\n\t\t\t});\n\t\t},\n\t};\n}\n\nexport function runProcess(\n\tcmd: string,\n\targs: readonly string[] = [],\n\topts: FromSpawnOptions = {},\n): Operator<never, ProcessResult> {\n\tif (typeof cmd !== \"string\" || cmd.length === 0) {\n\t\tthrow new TypeError(\"runProcess: cmd must be a non-empty string\");\n\t}\n\tconst killGraceMs = opts.killGraceMs ?? 1000;\n\tvalidateNonNegativeFinite(\"runProcess: killGraceMs\", killGraceMs);\n\treturn source<ProcessResult>(\"runProcess\", (ctx) => {\n\t\tlet alive = true;\n\t\tlet terminal = false;\n\t\tconst stdoutChunks: Buffer[] = [];\n\t\tconst stderrChunks: Buffer[] = [];\n\t\tlet exitInfo: { code: number | null; signal: NodeJS.Signals | null } | undefined;\n\t\tlet child: ReturnType<typeof spawn>;\n\t\tlet killTimer: ReturnType<typeof setTimeout> | undefined;\n\t\tconst clearKillTimer = () => {\n\t\t\tif (killTimer !== undefined) clearTimeout(killTimer);\n\t\t\tkillTimer = undefined;\n\t\t};\n\t\tconst stop = () => {\n\t\t\talive = false;\n\t\t\tchild?.stdout?.removeAllListeners(\"data\");\n\t\t\tchild?.stderr?.removeAllListeners(\"data\");\n\t\t\tif (!terminal) {\n\t\t\t\ttry {\n\t\t\t\t\tchild?.kill(\"SIGTERM\");\n\t\t\t\t} catch {\n\t\t\t\t\t// Process may already have exited.\n\t\t\t\t}\n\t\t\t\tkillTimer = setTimeout(() => {\n\t\t\t\t\tif (!terminal) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tchild?.kill(\"SIGKILL\");\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Process may already have exited.\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}, killGraceMs);\n\t\t\t\tkillTimer.unref?.();\n\t\t\t}\n\t\t};\n\t\ttry {\n\t\t\tchild = spawn(cmd, [...args], {\n\t\t\t\tcwd: opts.cwd,\n\t\t\t\tenv: opts.env,\n\t\t\t\tshell: opts.shell,\n\t\t\t\tsignal: opts.signal,\n\t\t\t\tstdio: (opts.stdio as SpawnOptions[\"stdio\"]) ?? \"pipe\",\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tterminal = true;\n\t\t\tctx.down([[\"ERROR\", errorPayload(err)]]);\n\t\t\treturn () => undefined;\n\t\t}\n\t\tchild.stdout?.on(\"data\", (chunk: Buffer) => {\n\t\t\tif (alive) stdoutChunks.push(chunk);\n\t\t});\n\t\tchild.stderr?.on(\"data\", (chunk: Buffer) => {\n\t\t\tif (alive) stderrChunks.push(chunk);\n\t\t});\n\t\tchild.on(\"error\", (err) => {\n\t\t\tif (!alive || terminal) return;\n\t\t\tterminal = true;\n\t\t\talive = false;\n\t\t\tctx.down([[\"ERROR\", errorPayload(err)]]);\n\t\t});\n\t\tchild.on(\"exit\", (code, signal) => {\n\t\t\texitInfo = { code, signal: signal as NodeJS.Signals | null };\n\t\t});\n\t\tchild.on(\"close\", () => {\n\t\t\tclearKillTimer();\n\t\t\tif (!alive || terminal) return;\n\t\t\tterminal = true;\n\t\t\talive = false;\n\t\t\tconst info = exitInfo ?? { code: null, signal: null };\n\t\t\tctx.down([\n\t\t\t\t[\n\t\t\t\t\t\"DATA\",\n\t\t\t\t\t{\n\t\t\t\t\t\tstdout: Buffer.concat(stdoutChunks).toString(\"utf8\"),\n\t\t\t\t\t\tstderr: Buffer.concat(stderrChunks).toString(\"utf8\"),\n\t\t\t\t\t\texitCode: info.code,\n\t\t\t\t\t\tsignal: info.signal,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t[\"COMPLETE\"],\n\t\t\t]);\n\t\t});\n\t\treturn stop;\n\t});\n}\n\nfunction runNodeProcessCommand(\n\tcommand: ProcessCommand,\n\tcallback: (result: DriverResult<EnvironmentProcessResult>) => void,\n\topts: {\n\t\treadonly killGraceMs: number;\n\t\treadonly maxBufferBytes: number;\n\t\treadonly shell?: boolean | string;\n\t},\n): () => void {\n\tif (typeof command.program !== \"string\" || command.program.length === 0) {\n\t\tcallback({\n\t\t\tok: false,\n\t\t\terror: new TypeError(\"nodeProcessDriver: program must be a non-empty string\"),\n\t\t});\n\t\treturn () => undefined;\n\t}\n\tlet alive = true;\n\tlet terminal = false;\n\tconst stdoutChunks: Buffer[] = [];\n\tconst stderrChunks: Buffer[] = [];\n\tlet bufferedBytes = 0;\n\tlet exitInfo: { code: number | null; signal: string | null } | undefined;\n\tlet child: ReturnType<typeof spawn>;\n\tlet killTimer: ReturnType<typeof setTimeout> | undefined;\n\tconst clearKillTimer = () => {\n\t\tif (killTimer !== undefined) clearTimeout(killTimer);\n\t\tkillTimer = undefined;\n\t};\n\tconst stop = () => {\n\t\tif (!alive) return;\n\t\talive = false;\n\t\tchild?.stdout?.removeAllListeners(\"data\");\n\t\tchild?.stderr?.removeAllListeners(\"data\");\n\t\tif (!terminal) {\n\t\t\ttry {\n\t\t\t\tchild?.kill(\"SIGTERM\");\n\t\t\t} catch {\n\t\t\t\t// Process may already have exited.\n\t\t\t}\n\t\t\tkillTimer = setTimeout(() => {\n\t\t\t\tif (!terminal) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tchild?.kill(\"SIGKILL\");\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Process may already have exited.\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, opts.killGraceMs);\n\t\t\tkillTimer.unref?.();\n\t\t}\n\t};\n\ttry {\n\t\tchild = spawn(command.program, [...command.args], {\n\t\t\tcwd: command.cwd,\n\t\t\tenv: command.env === undefined ? undefined : Object.fromEntries(command.env),\n\t\t\tshell: opts.shell,\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t});\n\t} catch (err) {\n\t\tterminal = true;\n\t\tcallback({ ok: false, error: err });\n\t\treturn () => undefined;\n\t}\n\tconst fail = (error: unknown) => {\n\t\tclearKillTimer();\n\t\tif (!alive || terminal) return;\n\t\tterminal = true;\n\t\talive = false;\n\t\tchild.stdout?.removeAllListeners(\"data\");\n\t\tchild.stderr?.removeAllListeners(\"data\");\n\t\ttry {\n\t\t\tchild.kill(\"SIGTERM\");\n\t\t} catch {\n\t\t\t// Process may already have exited.\n\t\t}\n\t\tkillTimer = setTimeout(() => {\n\t\t\ttry {\n\t\t\t\tchild.kill(\"SIGKILL\");\n\t\t\t} catch {\n\t\t\t\t// Process may already have exited.\n\t\t\t}\n\t\t}, opts.killGraceMs);\n\t\tkillTimer.unref?.();\n\t\tcallback({ ok: false, error });\n\t};\n\tconst pushOutput = (chunks: Buffer[], chunk: Buffer) => {\n\t\tif (!alive) return;\n\t\tbufferedBytes += chunk.byteLength;\n\t\tif (bufferedBytes > opts.maxBufferBytes) {\n\t\t\tfail(\n\t\t\t\tnew RangeError(\n\t\t\t\t\t`nodeProcessDriver: stdout/stderr exceeded maxBufferBytes (${opts.maxBufferBytes})`,\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tchunks.push(chunk);\n\t};\n\tchild.stdout?.on(\"data\", (chunk: Buffer) => {\n\t\tpushOutput(stdoutChunks, chunk);\n\t});\n\tchild.stderr?.on(\"data\", (chunk: Buffer) => {\n\t\tpushOutput(stderrChunks, chunk);\n\t});\n\tchild.on(\"error\", (err) => {\n\t\tclearKillTimer();\n\t\tif (!alive || terminal) return;\n\t\tterminal = true;\n\t\talive = false;\n\t\tcallback({ ok: false, error: err });\n\t});\n\tchild.on(\"exit\", (code, signal) => {\n\t\texitInfo = { code, signal };\n\t});\n\tchild.on(\"close\", () => {\n\t\tclearKillTimer();\n\t\tif (!alive || terminal) return;\n\t\tterminal = true;\n\t\talive = false;\n\t\tconst info = exitInfo ?? { code: null, signal: null };\n\t\tcallback({\n\t\t\tok: true,\n\t\t\tvalue: {\n\t\t\t\tstdout: Buffer.concat(stdoutChunks).toString(\"utf8\"),\n\t\t\t\tstderr: Buffer.concat(stderrChunks).toString(\"utf8\"),\n\t\t\t\texitCode: info.code,\n\t\t\t\tsignal: info.signal,\n\t\t\t},\n\t\t});\n\t});\n\treturn stop;\n}\n\ninterface GitPollResult {\n\treadonly head: string;\n\treadonly files: readonly string[];\n\treadonly message: string;\n\treadonly author: string;\n}\n\nfunction stripFinalLineBreak(value: string): string {\n\treturn value.replace(/\\r?\\n$/, \"\");\n}\n\nfunction gitText(repoPath: string, args: readonly string[]): string {\n\treturn stripFinalLineBreak(execFileSync(\"git\", [\"-C\", repoPath, ...args], { encoding: \"utf8\" }));\n}\n\nfunction gitPathList(repoPath: string, args: readonly string[]): readonly string[] {\n\tconst out = execFileSync(\"git\", [\"-C\", repoPath, ...args, \"-z\"]) as Buffer;\n\tconst text = out.toString(\"utf8\");\n\tif (text.length === 0) return [];\n\treturn text.split(\"\\0\").filter((part) => part.length > 0);\n}\n\nfunction readGitHead(\n\trepoPath: string,\n\tpreviousHead: string | undefined,\n): GitPollResult | undefined {\n\tconst head = gitText(repoPath, [\"rev-parse\", \"HEAD\"]);\n\tif (head.length === 0 || head === previousHead) return undefined;\n\tconst files =\n\t\tpreviousHead === undefined\n\t\t\t? []\n\t\t\t: gitPathList(repoPath, [\"diff\", \"--name-only\", `${previousHead}..${head}`]);\n\treturn {\n\t\thead,\n\t\tfiles,\n\t\tmessage: gitText(repoPath, [\"log\", \"-1\", \"--format=%s\", head]),\n\t\tauthor: gitText(repoPath, [\"log\", \"-1\", \"--format=%an\", head]),\n\t};\n}\n\nexport function fromGitHook(\n\trepoPath: string,\n\topts: FromGitHookOptions = {},\n): Operator<never, GitEvent> {\n\tconst { pollMs = 5000, include, exclude, maxConsecutiveErrors = 1, signal } = opts;\n\tvalidatePositiveFinite(\"fromGitHook: pollMs\", pollMs);\n\tif (!Number.isFinite(maxConsecutiveErrors) && maxConsecutiveErrors !== Infinity) {\n\t\tthrow new RangeError(\"fromGitHook: maxConsecutiveErrors must be finite or Infinity\");\n\t}\n\tif (maxConsecutiveErrors <= 0) {\n\t\tthrow new RangeError(\"fromGitHook: maxConsecutiveErrors must be positive\");\n\t}\n\tconst resolvedRepoPath = resolvePath(repoPath);\n\tconst includePatterns = (include ?? []).map(globToRegExp);\n\tconst excludePatterns = (exclude ?? []).map(globToRegExp);\n\tconst accepts = (file: string): boolean => {\n\t\tconst normalized = normalizePath(file);\n\t\tconst included = includePatterns.length === 0 || matchesAny(normalized, includePatterns);\n\t\treturn included && !matchesAny(normalized, excludePatterns);\n\t};\n\n\treturn source<GitEvent>(\"fromGitHook\", (ctx) => {\n\t\tlet done = false;\n\t\tlet lastSeen: string | undefined;\n\t\tlet consecutiveErrors = 0;\n\t\tlet intervalId: ReturnType<typeof setInterval> | undefined;\n\t\tconst cleanup = () => {\n\t\t\tdone = true;\n\t\t\tif (intervalId !== undefined) clearInterval(intervalId);\n\t\t\tintervalId = undefined;\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t};\n\t\tconst fail = (err: unknown) => {\n\t\t\tif (done) return;\n\t\t\tcleanup();\n\t\t\tctx.down([[\"ERROR\", errorPayload(err)]]);\n\t\t};\n\t\tconst onAbort = () => fail(signal?.reason);\n\t\tconst poll = () => {\n\t\t\tif (done) return;\n\t\t\ttry {\n\t\t\t\tconst result = readGitHead(resolvedRepoPath, lastSeen);\n\t\t\t\tconsecutiveErrors = 0;\n\t\t\t\tif (result === undefined) return;\n\t\t\t\tconst isBaseline = lastSeen === undefined;\n\t\t\t\tlastSeen = result.head;\n\t\t\t\tif (isBaseline) return;\n\t\t\t\tctx.down([\n\t\t\t\t\t[\n\t\t\t\t\t\t\"DATA\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thook: \"post-commit\",\n\t\t\t\t\t\t\tcommit: result.head,\n\t\t\t\t\t\t\tfiles: result.files.filter(accepts),\n\t\t\t\t\t\t\tmessage: result.message,\n\t\t\t\t\t\t\tauthor: result.author,\n\t\t\t\t\t\t\ttimestamp_ns: timestampNsNow(),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t]);\n\t\t\t} catch (err) {\n\t\t\t\tconsecutiveErrors += 1;\n\t\t\t\tif (consecutiveErrors >= maxConsecutiveErrors) fail(err);\n\t\t\t}\n\t\t};\n\t\tif (signal?.aborted) {\n\t\t\tonAbort();\n\t\t\treturn cleanup;\n\t\t}\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\tpoll();\n\t\tif (!done) intervalId = setInterval(poll, pollMs);\n\t\treturn cleanup;\n\t});\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/sources/node.ts"],"sourcesContent":["/**\n * Node-only source factories. Import from `@graphrefly/ts/sources/node`; the universal\n * `@graphrefly/ts/sources` barrel stays browser-safe.\n */\n\nimport { execFileSync, type SpawnOptions, spawn } from \"node:child_process\";\nimport { type Dirent, existsSync, type FSWatcher, readdirSync, statSync, watch } from \"node:fs\";\nimport { dirname, join, relative, resolve as resolvePath } from \"node:path\";\nimport type { Ctx } from \"../ctx/types.js\";\nimport type {\n\tDriverResult,\n\tProcessResult as EnvironmentProcessResult,\n\tLocalProcessDriver,\n\tProcessCommand,\n} from \"../graph/environment.js\";\nimport type { Operator } from \"../graph/operators.js\";\nimport { errorPayload } from \"../protocol/messages.js\";\n\nexport type FSEventType = \"change\" | \"rename\" | \"create\" | \"delete\";\n\nexport interface FSEvent {\n\treadonly type: FSEventType;\n\treadonly path: string;\n\treadonly root: string;\n\treadonly relativePath: string;\n}\n\nexport interface FromFSWatchOptions {\n\t/** Use Node's recursive fs.watch mode where the host platform supports it. Default: false. */\n\treadonly recursive?: boolean;\n\t/** Coalesce events per path for this many milliseconds. Default: 100. */\n\treadonly debounceMs?: number;\n\t/** Emit create events for existing files after watcher registration. Default: false. */\n\treadonly initialScan?: boolean | \"files\";\n\t/** Include glob patterns matched against absolute and relative slash-normalized paths. */\n\treadonly include?: readonly string[];\n\t/** Exclude glob patterns matched against absolute and relative slash-normalized paths. */\n\treadonly exclude?: readonly string[];\n\t/** AbortSignal aborts the source to ERROR and closes all watchers. */\n\treadonly signal?: AbortSignal;\n}\n\nexport type SpawnEvent =\n\t| { readonly kind: \"stdout\"; readonly chunk: Buffer }\n\t| { readonly kind: \"stderr\"; readonly chunk: Buffer }\n\t| { readonly kind: \"exit\"; readonly code: number | null; readonly signal: NodeJS.Signals | null };\n\nexport interface FromSpawnOptions {\n\treadonly cwd?: string;\n\treadonly env?: NodeJS.ProcessEnv;\n\treadonly shell?: boolean | string;\n\treadonly signal?: AbortSignal;\n\treadonly stdio?: \"pipe\" | readonly (\"pipe\" | \"ignore\" | \"inherit\")[];\n\t/** Milliseconds after teardown SIGTERM before sending SIGKILL. Default: 1000. */\n\treadonly killGraceMs?: number;\n}\n\n/**\n * Node-only process driver options for D130/D131 EnvironmentDrivers.\n *\n * These knobs configure host child-process behavior at the driver boundary only; they do not\n * change graph wave, tier, or message semantics.\n */\nexport interface NodeProcessDriverOptions {\n\t/** Milliseconds after cancellation SIGTERM before sending SIGKILL. Default: 1000. */\n\treadonly killGraceMs?: number;\n\t/** Maximum captured stdout + stderr bytes before terminating with ERROR. Default: 16 MiB. */\n\treadonly maxBufferBytes?: number;\n\t/** Optional shell mode passed to Node's child_process.spawn. Default: false. */\n\treadonly shell?: boolean | string;\n}\n\nexport interface ProcessResult {\n\treadonly stdout: string;\n\treadonly stderr: string;\n\treadonly exitCode: number | null;\n\treadonly signal: NodeJS.Signals | null;\n}\n\nexport type GitHookType = \"post-commit\" | \"post-merge\" | \"post-checkout\" | \"post-rewrite\";\n\nexport interface GitEvent {\n\treadonly hook: GitHookType;\n\treadonly commit: string;\n\treadonly files: readonly string[];\n\treadonly message: string;\n\treadonly author: string;\n\treadonly timestamp_ns: string;\n}\n\nexport interface FromGitHookOptions {\n\treadonly pollMs?: number;\n\treadonly include?: readonly string[];\n\treadonly exclude?: readonly string[];\n\treadonly maxConsecutiveErrors?: number;\n\treadonly signal?: AbortSignal;\n}\n\nfunction source<T>(\n\tfactory: string,\n\tsetup: (ctx: Ctx) => undefined | (() => void),\n): Operator<never, T> {\n\treturn {\n\t\tfactory,\n\t\tbody: (ctx) => {\n\t\t\tconst cleanup = setup(ctx);\n\t\t\tif (typeof cleanup === \"function\") ctx.onDeactivation(cleanup);\n\t\t},\n\t};\n}\n\nfunction normalizePath(path: string): string {\n\treturn path.replaceAll(\"\\\\\", \"/\");\n}\n\nfunction escapeRegExp(value: string): string {\n\treturn value.replace(/[|\\\\{}()[\\]^$+?.]/g, \"\\\\$&\");\n}\n\nfunction globToRegExp(pattern: string): RegExp {\n\tlet out = \"^\";\n\tfor (let i = 0; i < pattern.length; i += 1) {\n\t\tconst ch = pattern[i];\n\t\tif (ch === \"*\") {\n\t\t\tif (pattern[i + 1] === \"*\") {\n\t\t\t\tout += \".*\";\n\t\t\t\ti += 1;\n\t\t\t} else {\n\t\t\t\tout += \"[^/]*\";\n\t\t\t}\n\t\t} else {\n\t\t\tout += escapeRegExp(ch);\n\t\t}\n\t}\n\treturn new RegExp(`${out}$`);\n}\n\nfunction matchesAny(value: string, patterns: readonly RegExp[]): boolean {\n\treturn patterns.some((pattern) => pattern.test(value));\n}\n\nfunction timestampNsNow(): string {\n\treturn (BigInt(Date.now()) * 1_000_000n).toString();\n}\n\nfunction validatePositiveFinite(name: string, value: number): void {\n\tif (!Number.isFinite(value) || value <= 0) {\n\t\tthrow new RangeError(`${name} must be a positive finite number`);\n\t}\n}\n\nfunction validateNonNegativeFinite(name: string, value: number): void {\n\tif (!Number.isFinite(value) || value < 0) {\n\t\tthrow new RangeError(`${name} must be a non-negative finite number`);\n\t}\n}\n\nfunction eventTypeFor(eventType: \"rename\" | \"change\", path: string): FSEventType {\n\tif (eventType === \"change\") return \"change\";\n\ttry {\n\t\treturn existsSync(path) ? \"create\" : \"delete\";\n\t} catch {\n\t\treturn \"rename\";\n\t}\n}\n\nfunction scanFiles(\n\troot: string,\n\trecursive: boolean,\n\tisExcluded: (abs: string, rel: string) => boolean,\n): readonly string[] {\n\tconst resolved = resolvePath(root);\n\ttry {\n\t\tconst st = statSync(resolved);\n\t\tif (st.isFile()) return [resolved];\n\t\tif (!st.isDirectory()) return [];\n\t} catch {\n\t\treturn [];\n\t}\n\n\tconst out: string[] = [];\n\tfunction walk(dir: string): void {\n\t\tlet entries: Dirent[];\n\t\ttry {\n\t\t\tentries = readdirSync(dir, { withFileTypes: true });\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t\tfor (const entry of entries) {\n\t\t\tconst abs = join(dir, entry.name);\n\t\t\tconst rel = relative(resolved, abs);\n\t\t\tif (entry.isFile()) {\n\t\t\t\tout.push(abs);\n\t\t\t} else if (recursive && entry.isDirectory() && !isExcluded(abs, rel)) {\n\t\t\t\twalk(abs);\n\t\t\t}\n\t\t}\n\t}\n\twalk(resolved);\n\treturn out;\n}\n\n/**\n * fromFSWatch: Node.js filesystem watcher source.\n *\n * External fs callbacks are a source boundary (R-no-raw-async): events enter the graph only via\n * `ctx.down`, and cleanup is tied to node deactivation through `ctx.onDeactivation`.\n */\nexport function fromFSWatch(\n\tpaths: string | readonly string[],\n\topts: FromFSWatchOptions = {},\n): Operator<never, FSEvent> {\n\tconst list = (Array.isArray(paths) ? paths : [paths]).map((path) => resolvePath(path));\n\tif (list.length === 0) throw new RangeError(\"fromFSWatch: paths must not be empty\");\n\tconst {\n\t\trecursive = false,\n\t\tdebounceMs = 100,\n\t\tinitialScan = false,\n\t\tinclude,\n\t\texclude = [\"**/node_modules/**\", \"**/.git/**\", \"**/dist/**\"],\n\t\tsignal,\n\t} = opts;\n\tif (!Number.isFinite(debounceMs) || debounceMs < 0) {\n\t\tthrow new RangeError(\"fromFSWatch: debounceMs must be a non-negative finite number\");\n\t}\n\tconst includePatterns = (include ?? []).map(globToRegExp);\n\tconst excludePatterns = exclude.map(globToRegExp);\n\n\tconst accepts = (abs: string, rel: string): boolean => {\n\t\tconst normalized = normalizePath(abs);\n\t\tconst relNormalized = normalizePath(rel);\n\t\tconst included =\n\t\t\tincludePatterns.length === 0 ||\n\t\t\tmatchesAny(normalized, includePatterns) ||\n\t\t\tmatchesAny(relNormalized, includePatterns);\n\t\tif (!included) return false;\n\t\treturn !isExcluded(normalized, relNormalized);\n\t};\n\tconst isExcluded = (abs: string, rel: string): boolean => {\n\t\tconst normalized = normalizePath(abs);\n\t\tconst relNormalized = normalizePath(rel);\n\t\treturn (\n\t\t\tmatchesAny(normalized, excludePatterns) ||\n\t\t\tmatchesAny(relNormalized, excludePatterns) ||\n\t\t\tmatchesAny(`${normalized}/`, excludePatterns) ||\n\t\t\t(relNormalized !== \"\" && matchesAny(`${relNormalized}/`, excludePatterns))\n\t\t);\n\t};\n\n\treturn source<FSEvent>(\"fromFSWatch\", (ctx) => {\n\t\tlet stopped = false;\n\t\tlet terminal = false;\n\t\tlet ready = initialScan === false;\n\t\tlet generation = 0;\n\t\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\t\tconst watchers: FSWatcher[] = [];\n\t\tconst pending = new Map<string, FSEvent>();\n\t\tconst buffered = new Map<string, FSEvent>();\n\n\t\tconst close = () => {\n\t\t\tfor (const watcher of watchers.splice(0)) watcher.close();\n\t\t};\n\t\tconst cleanup = () => {\n\t\t\tstopped = true;\n\t\t\tgeneration += 1;\n\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tclose();\n\t\t\tpending.clear();\n\t\t\tbuffered.clear();\n\t\t};\n\t\tconst emitError = (err: unknown) => {\n\t\t\tif (terminal) return;\n\t\t\tterminal = true;\n\t\t\tcleanup();\n\t\t\tctx.down([[\"ERROR\", errorPayload(err)]]);\n\t\t};\n\t\tfunction onAbort() {\n\t\t\temitError(signal?.reason);\n\t\t}\n\t\tconst flush = (token: number) => {\n\t\t\ttimer = undefined;\n\t\t\tif (stopped || terminal || token !== generation || pending.size === 0) return;\n\t\t\tconst msgs = [...pending.values()].map((event): [\"DATA\", FSEvent] => [\"DATA\", event]);\n\t\t\tpending.clear();\n\t\t\tctx.down(msgs);\n\t\t};\n\t\tconst schedule = () => {\n\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t\tconst token = generation;\n\t\t\tif (debounceMs === 0) flush(token);\n\t\t\telse timer = setTimeout(() => flush(token), debounceMs);\n\t\t};\n\t\tconst enqueue = (event: FSEvent) => {\n\t\t\tif (!ready) {\n\t\t\t\tbuffered.set(event.path, event);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpending.set(event.path, event);\n\t\t\tschedule();\n\t\t};\n\t\tconst eventFor = (\n\t\t\tbasePath: string,\n\t\t\teventType: \"rename\" | \"change\",\n\t\t\tfileName: string | Buffer | null,\n\t\t): FSEvent | undefined => {\n\t\t\tconst root = normalizePath(resolvePath(basePath));\n\t\t\tconst abs = normalizePath(fileName == null ? root : resolvePath(basePath, String(fileName)));\n\t\t\tconst rel = normalizePath(fileName == null ? \"\" : relative(root, abs));\n\t\t\tif (!accepts(abs, rel)) return undefined;\n\t\t\treturn {\n\t\t\t\ttype: eventTypeFor(eventType, abs),\n\t\t\t\tpath: abs,\n\t\t\t\troot,\n\t\t\t\trelativePath: rel,\n\t\t\t};\n\t\t};\n\n\t\tif (signal?.aborted) {\n\t\t\tonAbort();\n\t\t\treturn cleanup;\n\t\t}\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\ttry {\n\t\t\tfor (const basePath of list) {\n\t\t\t\tconst watcher = watch(basePath, { recursive }, (eventType, fileName) => {\n\t\t\t\t\tif (stopped || terminal) return;\n\t\t\t\t\tconst event = eventFor(basePath, eventType, fileName);\n\t\t\t\t\tif (event !== undefined) enqueue(event);\n\t\t\t\t});\n\t\t\t\twatcher.on(\"error\", emitError);\n\t\t\t\twatchers.push(watcher);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\temitError(err);\n\t\t\treturn cleanup;\n\t\t}\n\n\t\tif (initialScan !== false) {\n\t\t\ttry {\n\t\t\t\tfor (const basePath of list) {\n\t\t\t\t\tconst root = normalizePath(resolvePath(basePath));\n\t\t\t\t\tlet relRoot = root;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (statSync(basePath).isFile()) relRoot = dirname(root);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\trelRoot = root;\n\t\t\t\t\t}\n\t\t\t\t\tfor (const absPath of scanFiles(basePath, recursive, isExcluded)) {\n\t\t\t\t\t\tif (stopped || terminal) return cleanup;\n\t\t\t\t\t\tconst abs = normalizePath(absPath);\n\t\t\t\t\t\tconst rel = normalizePath(relative(relRoot, abs));\n\t\t\t\t\t\tif (!accepts(abs, rel)) continue;\n\t\t\t\t\t\tpending.set(abs, {\n\t\t\t\t\t\t\ttype: \"create\",\n\t\t\t\t\t\t\tpath: abs,\n\t\t\t\t\t\t\troot,\n\t\t\t\t\t\t\trelativePath: rel,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tready = true;\n\t\t\t\tfor (const [key, event] of buffered) pending.set(key, event);\n\t\t\t\tbuffered.clear();\n\t\t\t\tif (pending.size > 0) schedule();\n\t\t\t} catch (err) {\n\t\t\t\temitError(err);\n\t\t\t}\n\t\t}\n\n\t\treturn cleanup;\n\t});\n}\n\nexport function fromSpawn(\n\tcmd: string,\n\targs: readonly string[] = [],\n\topts: FromSpawnOptions = {},\n): Operator<never, SpawnEvent> {\n\tif (typeof cmd !== \"string\" || cmd.length === 0) {\n\t\tthrow new TypeError(\"fromSpawn: cmd must be a non-empty string\");\n\t}\n\tconst killGraceMs = opts.killGraceMs ?? 1000;\n\tvalidateNonNegativeFinite(\"fromSpawn: killGraceMs\", killGraceMs);\n\treturn source<SpawnEvent>(\"fromSpawn\", (ctx) => {\n\t\tlet alive = true;\n\t\tlet terminal = false;\n\t\tlet exitInfo: { code: number | null; signal: NodeJS.Signals | null } | undefined;\n\t\tlet child: ReturnType<typeof spawn>;\n\t\tlet killTimer: ReturnType<typeof setTimeout> | undefined;\n\t\tconst clearKillTimer = () => {\n\t\t\tif (killTimer !== undefined) clearTimeout(killTimer);\n\t\t\tkillTimer = undefined;\n\t\t};\n\t\tconst stop = () => {\n\t\t\talive = false;\n\t\t\tchild?.stdout?.removeAllListeners(\"data\");\n\t\t\tchild?.stderr?.removeAllListeners(\"data\");\n\t\t\tif (!terminal) {\n\t\t\t\ttry {\n\t\t\t\t\tchild?.kill(\"SIGTERM\");\n\t\t\t\t} catch {\n\t\t\t\t\t// Process may already have exited.\n\t\t\t\t}\n\t\t\t\tkillTimer = setTimeout(() => {\n\t\t\t\t\tif (!terminal) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tchild?.kill(\"SIGKILL\");\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Process may already have exited.\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}, killGraceMs);\n\t\t\t\tkillTimer.unref?.();\n\t\t\t}\n\t\t};\n\t\ttry {\n\t\t\tchild = spawn(cmd, [...args], {\n\t\t\t\tcwd: opts.cwd,\n\t\t\t\tenv: opts.env,\n\t\t\t\tshell: opts.shell,\n\t\t\t\tsignal: opts.signal,\n\t\t\t\tstdio: (opts.stdio as SpawnOptions[\"stdio\"]) ?? \"pipe\",\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tterminal = true;\n\t\t\tctx.down([[\"ERROR\", errorPayload(err)]]);\n\t\t\treturn () => undefined;\n\t\t}\n\t\tchild.stdout?.on(\"data\", (chunk: Buffer) => {\n\t\t\tif (alive) ctx.down([[\"DATA\", { kind: \"stdout\", chunk }]]);\n\t\t});\n\t\tchild.stderr?.on(\"data\", (chunk: Buffer) => {\n\t\t\tif (alive) ctx.down([[\"DATA\", { kind: \"stderr\", chunk }]]);\n\t\t});\n\t\tchild.on(\"error\", (err) => {\n\t\t\tif (!alive || terminal) return;\n\t\t\tterminal = true;\n\t\t\talive = false;\n\t\t\tctx.down([[\"ERROR\", errorPayload(err)]]);\n\t\t});\n\t\tchild.on(\"exit\", (code, signal) => {\n\t\t\texitInfo = { code, signal: signal as NodeJS.Signals | null };\n\t\t});\n\t\tchild.on(\"close\", () => {\n\t\t\tclearKillTimer();\n\t\t\tif (!alive || terminal) return;\n\t\t\tterminal = true;\n\t\t\talive = false;\n\t\t\tconst info = exitInfo ?? { code: null, signal: null };\n\t\t\tctx.down([[\"DATA\", { kind: \"exit\", code: info.code, signal: info.signal }], [\"COMPLETE\"]]);\n\t\t});\n\t\treturn stop;\n\t});\n}\n\n/**\n * Node.js process EnvironmentDriver for D130/D131 adapters.\n *\n * Import this from `@graphrefly/ts/sources/node` and install it with\n * `EnvironmentDrivers.empty().withProcess(nodeProcessDriver())`. The child process is an\n * adapter-boundary side effect; graph nodes only observe ordinary ProcessResult DATA or ERROR.\n */\nexport function nodeProcessDriver(opts: NodeProcessDriverOptions = {}): LocalProcessDriver {\n\tconst killGraceMs = opts.killGraceMs ?? 1000;\n\tconst maxBufferBytes = opts.maxBufferBytes ?? 16 * 1024 * 1024;\n\tvalidateNonNegativeFinite(\"nodeProcessDriver: killGraceMs\", killGraceMs);\n\tvalidateNonNegativeFinite(\"nodeProcessDriver: maxBufferBytes\", maxBufferBytes);\n\treturn {\n\t\trun(command, callback) {\n\t\t\treturn runNodeProcessCommand(command, callback, {\n\t\t\t\tkillGraceMs,\n\t\t\t\tmaxBufferBytes,\n\t\t\t\tshell: opts.shell,\n\t\t\t});\n\t\t},\n\t};\n}\n\nexport function runProcess(\n\tcmd: string,\n\targs: readonly string[] = [],\n\topts: FromSpawnOptions = {},\n): Operator<never, ProcessResult> {\n\tif (typeof cmd !== \"string\" || cmd.length === 0) {\n\t\tthrow new TypeError(\"runProcess: cmd must be a non-empty string\");\n\t}\n\tconst killGraceMs = opts.killGraceMs ?? 1000;\n\tvalidateNonNegativeFinite(\"runProcess: killGraceMs\", killGraceMs);\n\treturn source<ProcessResult>(\"runProcess\", (ctx) => {\n\t\tlet alive = true;\n\t\tlet terminal = false;\n\t\tconst stdoutChunks: Buffer[] = [];\n\t\tconst stderrChunks: Buffer[] = [];\n\t\tlet exitInfo: { code: number | null; signal: NodeJS.Signals | null } | undefined;\n\t\tlet child: ReturnType<typeof spawn>;\n\t\tlet killTimer: ReturnType<typeof setTimeout> | undefined;\n\t\tconst clearKillTimer = () => {\n\t\t\tif (killTimer !== undefined) clearTimeout(killTimer);\n\t\t\tkillTimer = undefined;\n\t\t};\n\t\tconst stop = () => {\n\t\t\talive = false;\n\t\t\tchild?.stdout?.removeAllListeners(\"data\");\n\t\t\tchild?.stderr?.removeAllListeners(\"data\");\n\t\t\tif (!terminal) {\n\t\t\t\ttry {\n\t\t\t\t\tchild?.kill(\"SIGTERM\");\n\t\t\t\t} catch {\n\t\t\t\t\t// Process may already have exited.\n\t\t\t\t}\n\t\t\t\tkillTimer = setTimeout(() => {\n\t\t\t\t\tif (!terminal) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tchild?.kill(\"SIGKILL\");\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Process may already have exited.\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}, killGraceMs);\n\t\t\t\tkillTimer.unref?.();\n\t\t\t}\n\t\t};\n\t\ttry {\n\t\t\tchild = spawn(cmd, [...args], {\n\t\t\t\tcwd: opts.cwd,\n\t\t\t\tenv: opts.env,\n\t\t\t\tshell: opts.shell,\n\t\t\t\tsignal: opts.signal,\n\t\t\t\tstdio: (opts.stdio as SpawnOptions[\"stdio\"]) ?? \"pipe\",\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tterminal = true;\n\t\t\tctx.down([[\"ERROR\", errorPayload(err)]]);\n\t\t\treturn () => undefined;\n\t\t}\n\t\tchild.stdout?.on(\"data\", (chunk: Buffer) => {\n\t\t\tif (alive) stdoutChunks.push(chunk);\n\t\t});\n\t\tchild.stderr?.on(\"data\", (chunk: Buffer) => {\n\t\t\tif (alive) stderrChunks.push(chunk);\n\t\t});\n\t\tchild.on(\"error\", (err) => {\n\t\t\tif (!alive || terminal) return;\n\t\t\tterminal = true;\n\t\t\talive = false;\n\t\t\tctx.down([[\"ERROR\", errorPayload(err)]]);\n\t\t});\n\t\tchild.on(\"exit\", (code, signal) => {\n\t\t\texitInfo = { code, signal: signal as NodeJS.Signals | null };\n\t\t});\n\t\tchild.on(\"close\", () => {\n\t\t\tclearKillTimer();\n\t\t\tif (!alive || terminal) return;\n\t\t\tterminal = true;\n\t\t\talive = false;\n\t\t\tconst info = exitInfo ?? { code: null, signal: null };\n\t\t\tctx.down([\n\t\t\t\t[\n\t\t\t\t\t\"DATA\",\n\t\t\t\t\t{\n\t\t\t\t\t\tstdout: Buffer.concat(stdoutChunks).toString(\"utf8\"),\n\t\t\t\t\t\tstderr: Buffer.concat(stderrChunks).toString(\"utf8\"),\n\t\t\t\t\t\texitCode: info.code,\n\t\t\t\t\t\tsignal: info.signal,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t[\"COMPLETE\"],\n\t\t\t]);\n\t\t});\n\t\treturn stop;\n\t});\n}\n\nfunction runNodeProcessCommand(\n\tcommand: ProcessCommand,\n\tcallback: (result: DriverResult<EnvironmentProcessResult>) => void,\n\topts: {\n\t\treadonly killGraceMs: number;\n\t\treadonly maxBufferBytes: number;\n\t\treadonly shell?: boolean | string;\n\t},\n): () => void {\n\tif (typeof command.program !== \"string\" || command.program.length === 0) {\n\t\tcallback({\n\t\t\tok: false,\n\t\t\terror: new TypeError(\"nodeProcessDriver: program must be a non-empty string\"),\n\t\t});\n\t\treturn () => undefined;\n\t}\n\tlet alive = true;\n\tlet terminal = false;\n\tconst stdoutChunks: Buffer[] = [];\n\tconst stderrChunks: Buffer[] = [];\n\tlet bufferedBytes = 0;\n\tlet exitInfo: { code: number | null; signal: string | null } | undefined;\n\tlet child: ReturnType<typeof spawn>;\n\tlet killTimer: ReturnType<typeof setTimeout> | undefined;\n\tconst clearKillTimer = () => {\n\t\tif (killTimer !== undefined) clearTimeout(killTimer);\n\t\tkillTimer = undefined;\n\t};\n\tconst stop = () => {\n\t\tif (!alive) return;\n\t\talive = false;\n\t\tchild?.stdout?.removeAllListeners(\"data\");\n\t\tchild?.stderr?.removeAllListeners(\"data\");\n\t\tif (!terminal) {\n\t\t\ttry {\n\t\t\t\tchild?.kill(\"SIGTERM\");\n\t\t\t} catch {\n\t\t\t\t// Process may already have exited.\n\t\t\t}\n\t\t\tkillTimer = setTimeout(() => {\n\t\t\t\tif (!terminal) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tchild?.kill(\"SIGKILL\");\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Process may already have exited.\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, opts.killGraceMs);\n\t\t\tkillTimer.unref?.();\n\t\t}\n\t};\n\ttry {\n\t\tchild = spawn(command.program, [...command.args], {\n\t\t\tcwd: command.cwd,\n\t\t\tenv: command.env === undefined ? undefined : Object.fromEntries(command.env),\n\t\t\tshell: opts.shell,\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t});\n\t} catch (err) {\n\t\tterminal = true;\n\t\tcallback({ ok: false, error: err });\n\t\treturn () => undefined;\n\t}\n\tconst fail = (error: unknown) => {\n\t\tclearKillTimer();\n\t\tif (!alive || terminal) return;\n\t\tterminal = true;\n\t\talive = false;\n\t\tchild.stdout?.removeAllListeners(\"data\");\n\t\tchild.stderr?.removeAllListeners(\"data\");\n\t\ttry {\n\t\t\tchild.kill(\"SIGTERM\");\n\t\t} catch {\n\t\t\t// Process may already have exited.\n\t\t}\n\t\tkillTimer = setTimeout(() => {\n\t\t\ttry {\n\t\t\t\tchild.kill(\"SIGKILL\");\n\t\t\t} catch {\n\t\t\t\t// Process may already have exited.\n\t\t\t}\n\t\t}, opts.killGraceMs);\n\t\tkillTimer.unref?.();\n\t\tcallback({ ok: false, error });\n\t};\n\tconst pushOutput = (chunks: Buffer[], chunk: Buffer) => {\n\t\tif (!alive) return;\n\t\tbufferedBytes += chunk.byteLength;\n\t\tif (bufferedBytes > opts.maxBufferBytes) {\n\t\t\tfail(\n\t\t\t\tnew RangeError(\n\t\t\t\t\t`nodeProcessDriver: stdout/stderr exceeded maxBufferBytes (${opts.maxBufferBytes})`,\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tchunks.push(chunk);\n\t};\n\tchild.stdout?.on(\"data\", (chunk: Buffer) => {\n\t\tpushOutput(stdoutChunks, chunk);\n\t});\n\tchild.stderr?.on(\"data\", (chunk: Buffer) => {\n\t\tpushOutput(stderrChunks, chunk);\n\t});\n\tchild.on(\"error\", (err) => {\n\t\tclearKillTimer();\n\t\tif (!alive || terminal) return;\n\t\tterminal = true;\n\t\talive = false;\n\t\tcallback({ ok: false, error: err });\n\t});\n\tchild.on(\"exit\", (code, signal) => {\n\t\texitInfo = { code, signal };\n\t});\n\tchild.on(\"close\", () => {\n\t\tclearKillTimer();\n\t\tif (!alive || terminal) return;\n\t\tterminal = true;\n\t\talive = false;\n\t\tconst info = exitInfo ?? { code: null, signal: null };\n\t\tcallback({\n\t\t\tok: true,\n\t\t\tvalue: {\n\t\t\t\tstdout: Buffer.concat(stdoutChunks).toString(\"utf8\"),\n\t\t\t\tstderr: Buffer.concat(stderrChunks).toString(\"utf8\"),\n\t\t\t\texitCode: info.code,\n\t\t\t\tsignal: info.signal,\n\t\t\t},\n\t\t});\n\t});\n\treturn stop;\n}\n\ninterface GitPollResult {\n\treadonly head: string;\n\treadonly files: readonly string[];\n\treadonly message: string;\n\treadonly author: string;\n}\n\nfunction stripFinalLineBreak(value: string): string {\n\treturn value.replace(/\\r?\\n$/, \"\");\n}\n\nfunction gitText(repoPath: string, args: readonly string[]): string {\n\treturn stripFinalLineBreak(execFileSync(\"git\", [\"-C\", repoPath, ...args], { encoding: \"utf8\" }));\n}\n\nfunction gitPathList(repoPath: string, args: readonly string[]): readonly string[] {\n\tconst out = execFileSync(\"git\", [\"-C\", repoPath, ...args, \"-z\"]) as Buffer;\n\tconst text = out.toString(\"utf8\");\n\tif (text.length === 0) return [];\n\treturn text.split(\"\\0\").filter((part) => part.length > 0);\n}\n\nfunction readGitHead(\n\trepoPath: string,\n\tpreviousHead: string | undefined,\n): GitPollResult | undefined {\n\tconst head = gitText(repoPath, [\"rev-parse\", \"HEAD\"]);\n\tif (head.length === 0 || head === previousHead) return undefined;\n\tconst files =\n\t\tpreviousHead === undefined\n\t\t\t? []\n\t\t\t: gitPathList(repoPath, [\"diff\", \"--name-only\", `${previousHead}..${head}`]);\n\treturn {\n\t\thead,\n\t\tfiles,\n\t\tmessage: gitText(repoPath, [\"log\", \"-1\", \"--format=%s\", head]),\n\t\tauthor: gitText(repoPath, [\"log\", \"-1\", \"--format=%an\", head]),\n\t};\n}\n\nexport function fromGitHook(\n\trepoPath: string,\n\topts: FromGitHookOptions = {},\n): Operator<never, GitEvent> {\n\tconst { pollMs = 5000, include, exclude, maxConsecutiveErrors = 1, signal } = opts;\n\tvalidatePositiveFinite(\"fromGitHook: pollMs\", pollMs);\n\tif (!Number.isFinite(maxConsecutiveErrors) && maxConsecutiveErrors !== Infinity) {\n\t\tthrow new RangeError(\"fromGitHook: maxConsecutiveErrors must be finite or Infinity\");\n\t}\n\tif (maxConsecutiveErrors <= 0) {\n\t\tthrow new RangeError(\"fromGitHook: maxConsecutiveErrors must be positive\");\n\t}\n\tconst resolvedRepoPath = resolvePath(repoPath);\n\tconst includePatterns = (include ?? []).map(globToRegExp);\n\tconst excludePatterns = (exclude ?? []).map(globToRegExp);\n\tconst accepts = (file: string): boolean => {\n\t\tconst normalized = normalizePath(file);\n\t\tconst included = includePatterns.length === 0 || matchesAny(normalized, includePatterns);\n\t\treturn included && !matchesAny(normalized, excludePatterns);\n\t};\n\n\treturn source<GitEvent>(\"fromGitHook\", (ctx) => {\n\t\tlet done = false;\n\t\tlet lastSeen: string | undefined;\n\t\tlet consecutiveErrors = 0;\n\t\tlet intervalId: ReturnType<typeof setInterval> | undefined;\n\t\tconst cleanup = () => {\n\t\t\tdone = true;\n\t\t\tif (intervalId !== undefined) clearInterval(intervalId);\n\t\t\tintervalId = undefined;\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t};\n\t\tconst fail = (err: unknown) => {\n\t\t\tif (done) return;\n\t\t\tcleanup();\n\t\t\tctx.down([[\"ERROR\", errorPayload(err)]]);\n\t\t};\n\t\tconst onAbort = () => fail(signal?.reason);\n\t\tconst poll = () => {\n\t\t\tif (done) return;\n\t\t\ttry {\n\t\t\t\tconst result = readGitHead(resolvedRepoPath, lastSeen);\n\t\t\t\tconsecutiveErrors = 0;\n\t\t\t\tif (result === undefined) return;\n\t\t\t\tconst isBaseline = lastSeen === undefined;\n\t\t\t\tlastSeen = result.head;\n\t\t\t\tif (isBaseline) return;\n\t\t\t\tctx.down([\n\t\t\t\t\t[\n\t\t\t\t\t\t\"DATA\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thook: \"post-commit\",\n\t\t\t\t\t\t\tcommit: result.head,\n\t\t\t\t\t\t\tfiles: result.files.filter(accepts),\n\t\t\t\t\t\t\tmessage: result.message,\n\t\t\t\t\t\t\tauthor: result.author,\n\t\t\t\t\t\t\ttimestamp_ns: timestampNsNow(),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t]);\n\t\t\t} catch (err) {\n\t\t\t\tconsecutiveErrors += 1;\n\t\t\t\tif (consecutiveErrors >= maxConsecutiveErrors) fail(err);\n\t\t\t}\n\t\t};\n\t\tif (signal?.aborted) {\n\t\t\tonAbort();\n\t\t\treturn cleanup;\n\t\t}\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\tpoll();\n\t\tif (!done) intervalId = setInterval(poll, pollMs);\n\t\treturn cleanup;\n\t});\n}\n"],"mappings":"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","names":[]}
@@ -79,9 +79,16 @@ function sortedJsonValue(value, seen = /* @__PURE__ */ new Set(), path = "$", st
79
79
  }
80
80
  for (const key of Object.getOwnPropertyNames(value)) {
81
81
  const isIndex = /^(0|[1-9]\d*)$/.test(key) && Number.isSafeInteger(Number(key)) && Number(key) < value.length;
82
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
83
+ if (descriptor !== void 0 && ("get" in descriptor || "set" in descriptor)) {
84
+ throw new TypeError(`stableJsonString: accessor property at ${path}.${key}`);
85
+ }
82
86
  if (key !== "length" && !isIndex) {
83
87
  throw new TypeError(`stableJsonString: non-index array property at ${path}.${key}`);
84
88
  }
89
+ if (key !== "length" && descriptor !== void 0 && !descriptor.enumerable) {
90
+ throw new TypeError(`stableJsonString: non-enumerable array property at ${path}.${key}`);
91
+ }
85
92
  }
86
93
  const out2 = [];
87
94
  for (let i = 0; i < value.length; i += 1) {
@@ -95,6 +102,15 @@ function sortedJsonValue(value, seen = /* @__PURE__ */ new Set(), path = "$", st
95
102
  if (Object.getOwnPropertySymbols(value).length > 0) {
96
103
  throw new TypeError(`stableJsonString: symbol-keyed properties at ${path}`);
97
104
  }
105
+ for (const key of Object.getOwnPropertyNames(value)) {
106
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
107
+ if (descriptor !== void 0 && ("get" in descriptor || "set" in descriptor)) {
108
+ throw new TypeError(`stableJsonString: accessor property at ${path}.${key}`);
109
+ }
110
+ if (descriptor !== void 0 && !descriptor.enumerable) {
111
+ throw new TypeError(`stableJsonString: non-enumerable property at ${path}.${key}`);
112
+ }
113
+ }
98
114
  const out = /* @__PURE__ */ Object.create(null);
99
115
  for (const key of Object.keys(value).sort()) {
100
116
  out[key] = sortedJsonValue(