silvery 0.19.2 → 0.21.0

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 (218) hide show
  1. package/README.md +9 -4
  2. package/dist/Text-Lq0dmj8-.mjs +239 -0
  3. package/dist/Text-Lq0dmj8-.mjs.map +1 -0
  4. package/dist/UPNG-Bo33r8rA.mjs +3 -0
  5. package/dist/UPNG-DosRPdF4.mjs +5075 -0
  6. package/dist/UPNG-DosRPdF4.mjs.map +1 -0
  7. package/dist/__vite-browser-external-2447137e-D_JM6skp.mjs +6 -0
  8. package/dist/__vite-browser-external-2447137e-D_JM6skp.mjs.map +1 -0
  9. package/dist/{animation-Cn64yepo.mjs → animation-ZMN2_XKv.mjs} +2 -2
  10. package/dist/animation-ZMN2_XKv.mjs.map +1 -0
  11. package/dist/{ansi-Cc33mW54.d.mts → ansi-2Xn0yatP.d.mts} +1 -1
  12. package/dist/{ansi-Cc33mW54.d.mts.map → ansi-2Xn0yatP.d.mts.map} +1 -1
  13. package/dist/{ansi-CLOitHKx.mjs → ansi-D1KQMAbf.mjs} +1 -1
  14. package/dist/{ansi-CLOitHKx.mjs.map → ansi-D1KQMAbf.mjs.map} +1 -1
  15. package/dist/ansi-yC4RyBNY.mjs +22441 -0
  16. package/dist/ansi-yC4RyBNY.mjs.map +1 -0
  17. package/dist/apng-CR08rIaH.mjs +58 -0
  18. package/dist/apng-CR08rIaH.mjs.map +1 -0
  19. package/dist/apng-DaHfVaVI.mjs +3 -0
  20. package/dist/assets/resvgjs.darwin-arm64-BtufyGW1.node +0 -0
  21. package/dist/assets/skia.darwin-arm64-DQs5sT6N.node +0 -0
  22. package/dist/backend-B-WYLUib.mjs +13396 -0
  23. package/dist/backend-B-WYLUib.mjs.map +1 -0
  24. package/dist/backends-CUtan80W.mjs +3 -0
  25. package/dist/backends-DIVYzKqd.mjs +1083 -0
  26. package/dist/backends-DIVYzKqd.mjs.map +1 -0
  27. package/dist/bound-term-0sPrrzH1.d.mts +4640 -0
  28. package/dist/bound-term-0sPrrzH1.d.mts.map +1 -0
  29. package/dist/canvas-1v7dPT-_.mjs +3 -0
  30. package/dist/canvas-CSuPOMNt.mjs +1442 -0
  31. package/dist/canvas-CSuPOMNt.mjs.map +1 -0
  32. package/dist/{chunk-Vs_PY4HZ.mjs → chunk-BSw8zbkd.mjs} +1 -1
  33. package/dist/cli-dvo0r2fs.mjs +4 -0
  34. package/dist/compare-CQodSH4G.mjs +376 -0
  35. package/dist/compare-CQodSH4G.mjs.map +1 -0
  36. package/dist/compare-DHlcxEYA.mjs +3 -0
  37. package/dist/context-BU5LkkIy.mjs.map +1 -1
  38. package/dist/devtools-CJdt5H0X.mjs +2 -0
  39. package/dist/{devtools-DxkSLXDA.mjs → devtools-DcQjgyjL.mjs} +5 -4
  40. package/dist/{devtools-DxkSLXDA.mjs.map → devtools-DcQjgyjL.mjs.map} +1 -1
  41. package/dist/easing-BI-ASGMO.d.mts +24 -0
  42. package/dist/easing-BI-ASGMO.d.mts.map +1 -0
  43. package/dist/{eta-Bb3RH3wh.mjs → eta-CJlGH06n.mjs} +1 -1
  44. package/dist/{eta-Bb3RH3wh.mjs.map → eta-CJlGH06n.mjs.map} +1 -1
  45. package/dist/flexily-zero-adapter-C3Vj0fPt.mjs +306 -0
  46. package/dist/flexily-zero-adapter-C3Vj0fPt.mjs.map +1 -0
  47. package/dist/{flexily-zero-adapter-CMxXhdOL.mjs → flexily-zero-adapter-C4lW_Ov5.mjs} +1 -1
  48. package/dist/fonts-BFmhXDv7.mjs +88 -0
  49. package/dist/fonts-BFmhXDv7.mjs.map +1 -0
  50. package/dist/gif-C_AjaT9d.mjs +188 -0
  51. package/dist/gif-C_AjaT9d.mjs.map +1 -0
  52. package/dist/gif-DaC4XrxA.mjs +3 -0
  53. package/dist/gifenc-BOUT-KFB.mjs +730 -0
  54. package/dist/gifenc-BOUT-KFB.mjs.map +1 -0
  55. package/dist/image-C2Birh2x.mjs +1252 -0
  56. package/dist/image-C2Birh2x.mjs.map +1 -0
  57. package/dist/index-BUMxS65f.d.mts +453 -0
  58. package/dist/index-BUMxS65f.d.mts.map +1 -0
  59. package/dist/{index-D3saHouR.d.mts → index-CSQf13CI.d.mts} +1057 -1133
  60. package/dist/index-CSQf13CI.d.mts.map +1 -0
  61. package/dist/{index-BXslOebb.d.mts → index-Cl9KKjQ_.d.mts} +4919 -3921
  62. package/dist/index-Cl9KKjQ_.d.mts.map +1 -0
  63. package/dist/index-XbNrPhWl.d.mts +336 -0
  64. package/dist/index-XbNrPhWl.d.mts.map +1 -0
  65. package/dist/index.d.mts +8 -5
  66. package/dist/index.d.mts.map +1 -1
  67. package/dist/index.mjs +14 -12
  68. package/dist/index.mjs.map +1 -1
  69. package/dist/key-mapping-CS-YD_cD.mjs +132 -0
  70. package/dist/key-mapping-CS-YD_cD.mjs.map +1 -0
  71. package/dist/key-mapping-Yn-Jgrij.mjs +3 -0
  72. package/dist/{layout-engine-B6Cdz1yZ.mjs → layout-engine-C07LEXWT.mjs} +1 -1
  73. package/dist/layout-engine-C2px0RJE.mjs +67 -0
  74. package/dist/layout-engine-C2px0RJE.mjs.map +1 -0
  75. package/dist/layout-signals-Cnw6xk8Q.mjs +988 -0
  76. package/dist/layout-signals-Cnw6xk8Q.mjs.map +1 -0
  77. package/dist/mouse-events-Dki3ISIp.mjs +1044 -0
  78. package/dist/mouse-events-Dki3ISIp.mjs.map +1 -0
  79. package/dist/{multi-progress-Bq9Oi_WI.mjs → multi-progress-CIRjrzma.mjs} +3 -3
  80. package/dist/{multi-progress-Bq9Oi_WI.mjs.map → multi-progress-CIRjrzma.mjs.map} +1 -1
  81. package/dist/{multi-progress-DAQC7eap.d.mts → multi-progress-DHZ2xUT2.d.mts} +2 -2
  82. package/dist/{multi-progress-DAQC7eap.d.mts.map → multi-progress-DHZ2xUT2.d.mts.map} +1 -1
  83. package/dist/{node-BeWlnCPY.mjs → node-CjM5Rt-M.mjs} +4 -4
  84. package/dist/node-CjM5Rt-M.mjs.map +1 -0
  85. package/dist/playwright-D5YiZcNS.mjs +76397 -0
  86. package/dist/playwright-D5YiZcNS.mjs.map +1 -0
  87. package/dist/png-codec-Dp84742B.mjs +36 -0
  88. package/dist/png-codec-Dp84742B.mjs.map +1 -0
  89. package/dist/png-codec-QwOtJ8Zs.mjs +3 -0
  90. package/dist/progress-DB_Xo071.mjs +675 -0
  91. package/dist/progress-DB_Xo071.mjs.map +1 -0
  92. package/dist/{progress-bar-CXE5Qfkd.mjs → progress-bar-oJwq22CR.mjs} +4 -4
  93. package/dist/{progress-bar-CXE5Qfkd.mjs.map → progress-bar-oJwq22CR.mjs.map} +1 -1
  94. package/dist/rasterizer-BRXrDdWx.mjs +3 -0
  95. package/dist/rasterizer-CpEhJvdR.mjs +296 -0
  96. package/dist/rasterizer-CpEhJvdR.mjs.map +1 -0
  97. package/dist/reconciler-DldIJB93.mjs +2083 -0
  98. package/dist/reconciler-DldIJB93.mjs.map +1 -0
  99. package/dist/{render-string-CDCeYkS3.mjs → render-string-BcoCpjCB.mjs} +1 -1
  100. package/dist/{render-string-Darrg7ku.mjs → render-string-DkQacASz.mjs} +2707 -549
  101. package/dist/render-string-DkQacASz.mjs.map +1 -0
  102. package/dist/resvg-js-DkOndZI3.mjs +203 -0
  103. package/dist/resvg-js-DkOndZI3.mjs.map +1 -0
  104. package/dist/runtime.d.mts +3 -2
  105. package/dist/runtime.mjs +3 -3
  106. package/dist/schemes-JjNp4aSl.mjs +2611 -0
  107. package/dist/schemes-JjNp4aSl.mjs.map +1 -0
  108. package/dist/{spinner-CGo34vyR.d.mts → spinner-CZINHpkV.d.mts} +2 -2
  109. package/dist/{spinner-CGo34vyR.d.mts.map → spinner-CZINHpkV.d.mts.map} +1 -1
  110. package/dist/{spinner-CeOmcuw_.mjs → spinner-D9lrHr8s.mjs} +7 -7
  111. package/dist/spinner-D9lrHr8s.mjs.map +1 -0
  112. package/dist/src-5w9QR6_8.mjs +1071 -0
  113. package/dist/src-5w9QR6_8.mjs.map +1 -0
  114. package/dist/src-BNTToU7l.mjs +4387 -0
  115. package/dist/src-BNTToU7l.mjs.map +1 -0
  116. package/dist/{src-CF-6UN01.mjs → src-BR4xNwdG.mjs} +10436 -2622
  117. package/dist/src-BR4xNwdG.mjs.map +1 -0
  118. package/dist/{types-Bk2yw9Qj.mjs → src-DKp-_OFG.mjs} +34 -94
  119. package/dist/src-DKp-_OFG.mjs.map +1 -0
  120. package/dist/src-bt8wSrfJ.mjs +258 -0
  121. package/dist/src-bt8wSrfJ.mjs.map +1 -0
  122. package/dist/src-e33Y6kNJ.mjs +3 -0
  123. package/dist/src-iDwu25UD.mjs +1814 -0
  124. package/dist/src-iDwu25UD.mjs.map +1 -0
  125. package/dist/steps-Bp2uNqnn.d.mts +202 -0
  126. package/dist/steps-Bp2uNqnn.d.mts.map +1 -0
  127. package/dist/svg-15lZZzxq.mjs +486 -0
  128. package/dist/svg-15lZZzxq.mjs.map +1 -0
  129. package/dist/svg-Cz0UXcDj.mjs +255 -0
  130. package/dist/svg-Cz0UXcDj.mjs.map +1 -0
  131. package/dist/svg-DY72a4HK.mjs +3 -0
  132. package/dist/svg-g1D6ErwR.d.mts +82 -0
  133. package/dist/svg-g1D6ErwR.d.mts.map +1 -0
  134. package/dist/term.d.mts +3 -0
  135. package/dist/term.mjs +9 -0
  136. package/dist/term.mjs.map +1 -0
  137. package/dist/theme.d.mts +95 -2
  138. package/dist/theme.d.mts.map +1 -0
  139. package/dist/theme.mjs +9 -3
  140. package/dist/theme.mjs.map +1 -0
  141. package/dist/{types-BH_v3iMT.d.mts → types-kt_fKR37.d.mts} +2 -15
  142. package/dist/types-kt_fKR37.d.mts.map +1 -0
  143. package/dist/ui/animation.d.mts +2 -1
  144. package/dist/ui/animation.mjs +1 -1
  145. package/dist/ui/ansi.d.mts +1 -1
  146. package/dist/ui/ansi.mjs +1 -1
  147. package/dist/ui/cli.d.mts +3 -3
  148. package/dist/ui/cli.mjs +5 -5
  149. package/dist/ui/display.d.mts +1 -1
  150. package/dist/ui/image.d.mts +2 -2
  151. package/dist/ui/image.mjs +2 -2
  152. package/dist/ui/input.d.mts +1 -1
  153. package/dist/ui/input.mjs +4 -2
  154. package/dist/ui/input.mjs.map +1 -1
  155. package/dist/ui/progress.d.mts +5 -249
  156. package/dist/ui/progress.mjs +5 -858
  157. package/dist/ui/react.d.mts +1 -1
  158. package/dist/ui/react.mjs +2 -2
  159. package/dist/ui/recording-chrome-react.d.mts +21 -0
  160. package/dist/ui/recording-chrome-react.d.mts.map +1 -0
  161. package/dist/ui/recording-chrome-react.mjs +105 -0
  162. package/dist/ui/recording-chrome-react.mjs.map +1 -0
  163. package/dist/ui/recording-chrome.d.mts +2 -0
  164. package/dist/ui/recording-chrome.mjs +2 -0
  165. package/dist/ui/utils.mjs +1 -1
  166. package/dist/ui/wrappers.d.mts +3 -3
  167. package/dist/ui/wrappers.mjs +2 -2
  168. package/dist/ui.d.mts +7 -6
  169. package/dist/ui.mjs +8 -7
  170. package/dist/{useLatest-Bg2x4bfP.d.mts → useLatest-DRDDVwjh.d.mts} +5 -25
  171. package/dist/useLatest-DRDDVwjh.d.mts.map +1 -0
  172. package/dist/{with-text-input-CRfoiFFG.d.mts → with-text-input-YeohVLeo.d.mts} +4 -55
  173. package/dist/with-text-input-YeohVLeo.d.mts.map +1 -0
  174. package/dist/wrapper-C70ATkVv.mjs +3527 -0
  175. package/dist/wrapper-C70ATkVv.mjs.map +1 -0
  176. package/dist/{wrappers-UTADQkSY.mjs → wrappers-BCUYITrY.mjs} +5 -157
  177. package/dist/wrappers-BCUYITrY.mjs.map +1 -0
  178. package/dist/{yoga-adapter-8oRGRw8V.mjs → yoga-adapter-BnZX1PAY.mjs} +28 -2
  179. package/dist/yoga-adapter-BnZX1PAY.mjs.map +1 -0
  180. package/dist/yoga-adapter-DxgsQ_gg.mjs +2 -0
  181. package/dist/zipBundle-3nqeDRtm.mjs +3 -0
  182. package/dist/zipBundle-VNAYFmqJ.mjs +2003 -0
  183. package/dist/zipBundle-VNAYFmqJ.mjs.map +1 -0
  184. package/package.json +20 -9
  185. package/dist/animation-Cn64yepo.mjs.map +0 -1
  186. package/dist/cli-BKp0YtBD.mjs +0 -4
  187. package/dist/devtools-9QY4teqI.mjs +0 -2
  188. package/dist/flexily-zero-adapter-BlQa46nr.mjs +0 -3385
  189. package/dist/flexily-zero-adapter-BlQa46nr.mjs.map +0 -1
  190. package/dist/image-CTII5QWI.mjs +0 -477
  191. package/dist/image-CTII5QWI.mjs.map +0 -1
  192. package/dist/index-BXslOebb.d.mts.map +0 -1
  193. package/dist/index-BnA7mNpo.d.mts +0 -175
  194. package/dist/index-BnA7mNpo.d.mts.map +0 -1
  195. package/dist/index-D3saHouR.d.mts.map +0 -1
  196. package/dist/layout-engine-ClUgv6jB.mjs +0 -50
  197. package/dist/layout-engine-ClUgv6jB.mjs.map +0 -1
  198. package/dist/node-BeWlnCPY.mjs.map +0 -1
  199. package/dist/reconciler-Cwgm8hRR.mjs +0 -8459
  200. package/dist/reconciler-Cwgm8hRR.mjs.map +0 -1
  201. package/dist/render-string-Darrg7ku.mjs.map +0 -1
  202. package/dist/spinner-CeOmcuw_.mjs.map +0 -1
  203. package/dist/src-B5GjfG7g.mjs +0 -4305
  204. package/dist/src-B5GjfG7g.mjs.map +0 -1
  205. package/dist/src-CChwjk0Z.mjs +0 -738
  206. package/dist/src-CChwjk0Z.mjs.map +0 -1
  207. package/dist/src-CF-6UN01.mjs.map +0 -1
  208. package/dist/src-NCKb8kE5.mjs +0 -2660
  209. package/dist/src-NCKb8kE5.mjs.map +0 -1
  210. package/dist/types-BH_v3iMT.d.mts.map +0 -1
  211. package/dist/types-Bk2yw9Qj.mjs.map +0 -1
  212. package/dist/ui/progress.d.mts.map +0 -1
  213. package/dist/ui/progress.mjs.map +0 -1
  214. package/dist/useLatest-Bg2x4bfP.d.mts.map +0 -1
  215. package/dist/with-text-input-CRfoiFFG.d.mts.map +0 -1
  216. package/dist/wrappers-UTADQkSY.mjs.map +0 -1
  217. package/dist/yoga-adapter-8oRGRw8V.mjs.map +0 -1
  218. package/dist/yoga-adapter-D_CcxSt5.mjs +0 -2
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-Bk2yw9Qj.mjs","names":[],"sources":["../node_modules/.bun/alien-signals@3.1.2/node_modules/alien-signals/esm/system.mjs","../node_modules/.bun/alien-signals@3.1.2/node_modules/alien-signals/esm/index.mjs","../packages/ag/src/layout-signals.ts","../packages/ag/src/types.ts"],"sourcesContent":["export const ReactiveFlags = {\n None: 0,\n Mutable: 1,\n Watching: 2,\n RecursedCheck: 4,\n Recursed: 8,\n Dirty: 16,\n Pending: 32,\n};\nexport function createReactiveSystem({ update, notify, unwatched, }) {\n return {\n link,\n unlink,\n propagate,\n checkDirty,\n shallowPropagate,\n };\n function link(dep, sub, version) {\n const prevDep = sub.depsTail;\n if (prevDep !== undefined && prevDep.dep === dep) {\n return;\n }\n const nextDep = prevDep !== undefined ? prevDep.nextDep : sub.deps;\n if (nextDep !== undefined && nextDep.dep === dep) {\n nextDep.version = version;\n sub.depsTail = nextDep;\n return;\n }\n const prevSub = dep.subsTail;\n if (prevSub !== undefined && prevSub.version === version && prevSub.sub === sub) {\n return;\n }\n const newLink = sub.depsTail\n = dep.subsTail\n = {\n version,\n dep,\n sub,\n prevDep,\n nextDep,\n prevSub,\n nextSub: undefined,\n };\n if (nextDep !== undefined) {\n nextDep.prevDep = newLink;\n }\n if (prevDep !== undefined) {\n prevDep.nextDep = newLink;\n }\n else {\n sub.deps = newLink;\n }\n if (prevSub !== undefined) {\n prevSub.nextSub = newLink;\n }\n else {\n dep.subs = newLink;\n }\n }\n function unlink(link, sub = link.sub) {\n const dep = link.dep;\n const prevDep = link.prevDep;\n const nextDep = link.nextDep;\n const nextSub = link.nextSub;\n const prevSub = link.prevSub;\n if (nextDep !== undefined) {\n nextDep.prevDep = prevDep;\n }\n else {\n sub.depsTail = prevDep;\n }\n if (prevDep !== undefined) {\n prevDep.nextDep = nextDep;\n }\n else {\n sub.deps = nextDep;\n }\n if (nextSub !== undefined) {\n nextSub.prevSub = prevSub;\n }\n else {\n dep.subsTail = prevSub;\n }\n if (prevSub !== undefined) {\n prevSub.nextSub = nextSub;\n }\n else if ((dep.subs = nextSub) === undefined) {\n unwatched(dep);\n }\n return nextDep;\n }\n function propagate(link) {\n let next = link.nextSub;\n let stack;\n top: do {\n const sub = link.sub;\n let flags = sub.flags;\n if (!(flags & (4 | 8 | 16 | 32))) {\n sub.flags = flags | 32;\n }\n else if (!(flags & (4 | 8))) {\n flags = 0;\n }\n else if (!(flags & 4)) {\n sub.flags = (flags & ~8) | 32;\n }\n else if (!(flags & (16 | 32)) && isValidLink(link, sub)) {\n sub.flags = flags | (8 | 32);\n flags &= 1;\n }\n else {\n flags = 0;\n }\n if (flags & 2) {\n notify(sub);\n }\n if (flags & 1) {\n const subSubs = sub.subs;\n if (subSubs !== undefined) {\n const nextSub = (link = subSubs).nextSub;\n if (nextSub !== undefined) {\n stack = { value: next, prev: stack };\n next = nextSub;\n }\n continue;\n }\n }\n if ((link = next) !== undefined) {\n next = link.nextSub;\n continue;\n }\n while (stack !== undefined) {\n link = stack.value;\n stack = stack.prev;\n if (link !== undefined) {\n next = link.nextSub;\n continue top;\n }\n }\n break;\n } while (true);\n }\n function checkDirty(link, sub) {\n let stack;\n let checkDepth = 0;\n let dirty = false;\n top: do {\n const dep = link.dep;\n const flags = dep.flags;\n if (sub.flags & 16) {\n dirty = true;\n }\n else if ((flags & (1 | 16)) === (1 | 16)) {\n if (update(dep)) {\n const subs = dep.subs;\n if (subs.nextSub !== undefined) {\n shallowPropagate(subs);\n }\n dirty = true;\n }\n }\n else if ((flags & (1 | 32)) === (1 | 32)) {\n if (link.nextSub !== undefined || link.prevSub !== undefined) {\n stack = { value: link, prev: stack };\n }\n link = dep.deps;\n sub = dep;\n ++checkDepth;\n continue;\n }\n if (!dirty) {\n const nextDep = link.nextDep;\n if (nextDep !== undefined) {\n link = nextDep;\n continue;\n }\n }\n while (checkDepth--) {\n const firstSub = sub.subs;\n const hasMultipleSubs = firstSub.nextSub !== undefined;\n if (hasMultipleSubs) {\n link = stack.value;\n stack = stack.prev;\n }\n else {\n link = firstSub;\n }\n if (dirty) {\n if (update(sub)) {\n if (hasMultipleSubs) {\n shallowPropagate(firstSub);\n }\n sub = link.sub;\n continue;\n }\n dirty = false;\n }\n else {\n sub.flags &= ~32;\n }\n sub = link.sub;\n const nextDep = link.nextDep;\n if (nextDep !== undefined) {\n link = nextDep;\n continue top;\n }\n }\n return dirty;\n } while (true);\n }\n function shallowPropagate(link) {\n do {\n const sub = link.sub;\n const flags = sub.flags;\n if ((flags & (32 | 16)) === 32) {\n sub.flags = flags | 16;\n if ((flags & (2 | 4)) === 2) {\n notify(sub);\n }\n }\n } while ((link = link.nextSub) !== undefined);\n }\n function isValidLink(checkLink, sub) {\n let link = sub.depsTail;\n while (link !== undefined) {\n if (link === checkLink) {\n return true;\n }\n link = link.prevDep;\n }\n return false;\n }\n}\n","import { createReactiveSystem } from './system.mjs';\nlet cycle = 0;\nlet batchDepth = 0;\nlet notifyIndex = 0;\nlet queuedLength = 0;\nlet activeSub;\nconst queued = [];\nconst { link, unlink, propagate, checkDirty, shallowPropagate, } = createReactiveSystem({\n update(node) {\n if (node.depsTail !== undefined) {\n return updateComputed(node);\n }\n else {\n return updateSignal(node);\n }\n },\n notify(effect) {\n let insertIndex = queuedLength;\n let firstInsertedIndex = insertIndex;\n do {\n queued[insertIndex++] = effect;\n effect.flags &= ~2;\n effect = effect.subs?.sub;\n if (effect === undefined || !(effect.flags & 2)) {\n break;\n }\n } while (true);\n queuedLength = insertIndex;\n while (firstInsertedIndex < --insertIndex) {\n const left = queued[firstInsertedIndex];\n queued[firstInsertedIndex++] = queued[insertIndex];\n queued[insertIndex] = left;\n }\n },\n unwatched(node) {\n if (!(node.flags & 1)) {\n effectScopeOper.call(node);\n }\n else if (node.depsTail !== undefined) {\n node.depsTail = undefined;\n node.flags = 1 | 16;\n purgeDeps(node);\n }\n },\n});\nexport function getActiveSub() {\n return activeSub;\n}\nexport function setActiveSub(sub) {\n const prevSub = activeSub;\n activeSub = sub;\n return prevSub;\n}\nexport function getBatchDepth() {\n return batchDepth;\n}\nexport function startBatch() {\n ++batchDepth;\n}\nexport function endBatch() {\n if (!--batchDepth) {\n flush();\n }\n}\nexport function isSignal(fn) {\n return fn.name === 'bound ' + signalOper.name;\n}\nexport function isComputed(fn) {\n return fn.name === 'bound ' + computedOper.name;\n}\nexport function isEffect(fn) {\n return fn.name === 'bound ' + effectOper.name;\n}\nexport function isEffectScope(fn) {\n return fn.name === 'bound ' + effectScopeOper.name;\n}\nexport function signal(initialValue) {\n return signalOper.bind({\n currentValue: initialValue,\n pendingValue: initialValue,\n subs: undefined,\n subsTail: undefined,\n flags: 1,\n });\n}\nexport function computed(getter) {\n return computedOper.bind({\n value: undefined,\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: 0,\n getter: getter,\n });\n}\nexport function effect(fn) {\n const e = {\n fn,\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: 2 | 4,\n };\n const prevSub = setActiveSub(e);\n if (prevSub !== undefined) {\n link(e, prevSub, 0);\n }\n try {\n e.fn();\n }\n finally {\n activeSub = prevSub;\n e.flags &= ~4;\n }\n return effectOper.bind(e);\n}\nexport function effectScope(fn) {\n const e = {\n deps: undefined,\n depsTail: undefined,\n subs: undefined,\n subsTail: undefined,\n flags: 0,\n };\n const prevSub = setActiveSub(e);\n if (prevSub !== undefined) {\n link(e, prevSub, 0);\n }\n try {\n fn();\n }\n finally {\n activeSub = prevSub;\n }\n return effectScopeOper.bind(e);\n}\nexport function trigger(fn) {\n const sub = {\n deps: undefined,\n depsTail: undefined,\n flags: 2,\n };\n const prevSub = setActiveSub(sub);\n try {\n fn();\n }\n finally {\n activeSub = prevSub;\n let link = sub.deps;\n while (link !== undefined) {\n const dep = link.dep;\n link = unlink(link, sub);\n const subs = dep.subs;\n if (subs !== undefined) {\n sub.flags = 0;\n propagate(subs);\n shallowPropagate(subs);\n }\n }\n if (!batchDepth) {\n flush();\n }\n }\n}\nfunction updateComputed(c) {\n ++cycle;\n c.depsTail = undefined;\n c.flags = 1 | 4;\n const prevSub = setActiveSub(c);\n try {\n const oldValue = c.value;\n return oldValue !== (c.value = c.getter(oldValue));\n }\n finally {\n activeSub = prevSub;\n c.flags &= ~4;\n purgeDeps(c);\n }\n}\nfunction updateSignal(s) {\n s.flags = 1;\n return s.currentValue !== (s.currentValue = s.pendingValue);\n}\nfunction run(e) {\n const flags = e.flags;\n if (flags & 16\n || (flags & 32\n && checkDirty(e.deps, e))) {\n ++cycle;\n e.depsTail = undefined;\n e.flags = 2 | 4;\n const prevSub = setActiveSub(e);\n try {\n e.fn();\n }\n finally {\n activeSub = prevSub;\n e.flags &= ~4;\n purgeDeps(e);\n }\n }\n else {\n e.flags = 2;\n }\n}\nfunction flush() {\n try {\n while (notifyIndex < queuedLength) {\n const effect = queued[notifyIndex];\n queued[notifyIndex++] = undefined;\n run(effect);\n }\n }\n finally {\n while (notifyIndex < queuedLength) {\n const effect = queued[notifyIndex];\n queued[notifyIndex++] = undefined;\n effect.flags |= 2 | 8;\n }\n notifyIndex = 0;\n queuedLength = 0;\n }\n}\nfunction computedOper() {\n const flags = this.flags;\n if (flags & 16\n || (flags & 32\n && (checkDirty(this.deps, this)\n || (this.flags = flags & ~32, false)))) {\n if (updateComputed(this)) {\n const subs = this.subs;\n if (subs !== undefined) {\n shallowPropagate(subs);\n }\n }\n }\n else if (!flags) {\n this.flags = 1 | 4;\n const prevSub = setActiveSub(this);\n try {\n this.value = this.getter();\n }\n finally {\n activeSub = prevSub;\n this.flags &= ~4;\n }\n }\n const sub = activeSub;\n if (sub !== undefined) {\n link(this, sub, cycle);\n }\n return this.value;\n}\nfunction signalOper(...value) {\n if (value.length) {\n if (this.pendingValue !== (this.pendingValue = value[0])) {\n this.flags = 1 | 16;\n const subs = this.subs;\n if (subs !== undefined) {\n propagate(subs);\n if (!batchDepth) {\n flush();\n }\n }\n }\n }\n else {\n if (this.flags & 16) {\n if (updateSignal(this)) {\n const subs = this.subs;\n if (subs !== undefined) {\n shallowPropagate(subs);\n }\n }\n }\n let sub = activeSub;\n while (sub !== undefined) {\n if (sub.flags & (1 | 2)) {\n link(this, sub, cycle);\n break;\n }\n sub = sub.subs?.sub;\n }\n return this.currentValue;\n }\n}\nfunction effectOper() {\n effectScopeOper.call(this);\n}\nfunction effectScopeOper() {\n this.depsTail = undefined;\n this.flags = 0;\n purgeDeps(this);\n const sub = this.subs;\n if (sub !== undefined) {\n unlink(sub);\n }\n}\nfunction purgeDeps(sub) {\n const depsTail = sub.depsTail;\n let dep = depsTail !== undefined ? depsTail.nextDep : sub.deps;\n while (dep !== undefined) {\n dep = unlink(dep, sub);\n }\n}\n","/**\n * withLayoutSignals — reactive signal layer for AgNode layout outputs.\n *\n * Composable plugin that wraps an AgNode with reactive signals for layout\n * rects, text content, and focus state. Engine-agnostic — works with\n * Flexily, Yoga, or any future layout engine.\n *\n * Signals are WeakMap-backed and lazily created. Nodes without subscribers\n * pay zero cost. After layout completes, the pipeline calls `syncSignals()`\n * to propagate imperative state into signals.\n *\n * ## Usage\n *\n * ```ts\n * import { getLayoutSignals, syncSignals } from \"@silvery/ag/layout-signals\"\n *\n * // Get (or create) signals for a node\n * const signals = getLayoutSignals(node)\n * signals.boxRect() // read current rect\n * signals.textContent() // read current text\n *\n * // After layout/reconciler mutations, sync imperative → reactive\n * syncSignals(node)\n * ```\n *\n * ## Three-layer stack\n *\n * Layer 0: alien-signals (signal, computed, effect)\n * Layer 1: getLayoutSignals() — this module (@silvery/ag, framework-agnostic)\n * Layer 2: useSignal(signal) — @silvery/ag-react (React bridge)\n * Layer 3: useBoxRect(), useAgNode() — semantic convenience hooks\n */\n\nimport { signal } from \"@silvery/signals\"\nimport type { AgNode, Rect } from \"./types\"\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Writable signal — call with no args to read, call with value to write.\n */\ntype WritableSignal<T> = {\n (): T\n (value: T): void\n}\n\n/**\n * All reactive signals for an AgNode.\n *\n * Combined rect signals (layout outputs) + node signals (content/state).\n * One interface, one WeakMap, one sync function.\n */\nexport interface LayoutSignals {\n // Layout rects (synced after layout + scroll + sticky phases)\n readonly boxRect: WritableSignal<Rect | null>\n readonly scrollRect: WritableSignal<Rect | null>\n readonly screenRect: WritableSignal<Rect | null>\n\n // Node state (synced from reconciler + focus manager)\n readonly textContent: WritableSignal<string | undefined>\n readonly focused: WritableSignal<boolean>\n}\n\n// ============================================================================\n// Cache\n// ============================================================================\n\nconst signalMap = new WeakMap<AgNode, LayoutSignals>()\n\n/**\n * Get or create layout signals for a node.\n *\n * Lazily created on first access. Automatically garbage-collected\n * when the node is removed from the tree (WeakMap semantics).\n */\nexport function getLayoutSignals(node: AgNode): LayoutSignals {\n let s = signalMap.get(node)\n if (!s) {\n s = {\n boxRect: signal<Rect | null>(node.boxRect),\n scrollRect: signal<Rect | null>(node.scrollRect),\n screenRect: signal<Rect | null>(node.screenRect),\n textContent: signal<string | undefined>(node.textContent),\n focused: signal<boolean>(node.interactiveState?.focused ?? false),\n }\n signalMap.set(node, s)\n }\n return s\n}\n\n/** Check whether a node has signals allocated (for testing). */\nexport function hasLayoutSignals(node: AgNode): boolean {\n return signalMap.has(node)\n}\n\n// ============================================================================\n// Sync: imperative state → signals\n// ============================================================================\n\n/**\n * Sync all rect signals from the node's current values.\n *\n * Called from notifyLayoutSubscribers after layout + scroll + sticky\n * phases complete. Only syncs nodes that have signals allocated.\n * Reference-equality check prevents unnecessary downstream updates.\n */\nexport function syncRectSignals(node: AgNode): void {\n const s = signalMap.get(node)\n if (!s) return\n\n if (node.boxRect !== s.boxRect()) s.boxRect(node.boxRect)\n if (node.scrollRect !== s.scrollRect()) s.scrollRect(node.scrollRect)\n if (node.screenRect !== s.screenRect()) s.screenRect(node.screenRect)\n}\n\n/**\n * Sync textContent signal from the node's current value.\n *\n * Called from commitTextUpdate in the reconciler.\n */\nexport function syncTextContentSignal(node: AgNode): void {\n const s = signalMap.get(node)\n if (!s) return\n\n if (node.textContent !== s.textContent()) s.textContent(node.textContent)\n}\n\n/**\n * Sync focused signal for a node.\n *\n * Called from FocusManager when focus changes.\n */\nexport function syncFocusedSignal(node: AgNode, focused: boolean): void {\n const s = signalMap.get(node)\n if (!s) return\n\n if (focused !== s.focused()) s.focused(focused)\n}\n","/**\n * Silvery Types\n *\n * Core types for the Silvery renderer architecture.\n */\n\nimport type { DragEventProps } from \"./drag-event-types\"\nimport type { FocusEventProps } from \"./focus-events\"\nimport type { LayoutNode } from \"./layout-types\"\nimport type { MouseEventProps } from \"./mouse-event-types\"\n\n// ============================================================================\n// Layout Types\n// ============================================================================\n\n// ============================================================================\n// Selection Types\n// ============================================================================\n\n/**\n * CSS user-select equivalent for controlling text selectability.\n * - \"auto\": inherit from parent (root resolves to \"text\")\n * - \"none\": not selectable\n * - \"text\": force selectable (overrides parent \"none\")\n * - \"contain\": selectable, but selection cannot escape this node's bounds\n */\nexport type UserSelect = \"auto\" | \"none\" | \"text\" | \"contain\"\n\n// ============================================================================\n// Layout Types\n// ============================================================================\n\n/**\n * A rectangle with position and size.\n * All values are in terminal columns/rows (integers).\n */\nexport interface Rect {\n /** X position (0-indexed terminal column) */\n x: number\n /** Y position (0-indexed terminal row) */\n y: number\n /** Width in terminal columns */\n width: number\n /** Height in terminal rows */\n height: number\n}\n\n/**\n * Check if two rects are equal (same position and size).\n */\nexport function rectEqual(a: Rect | null, b: Rect | null): boolean {\n if (a === b) return true\n if (!a || !b) return false\n return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height\n}\n\n// ============================================================================\n// Interactive State Types\n// ============================================================================\n\n/**\n * Per-node interactive state — written by pointer/selection/focus state machines,\n * read by theme/render for automatic styling.\n *\n * These are plain mutable booleans, NOT reactive signals. State machines set them\n * synchronously during event processing, and the next render reads them.\n * React re-renders are driven by the event processing, not signal subscriptions.\n *\n * The object is lazily created on first write to avoid overhead on non-interactive nodes.\n */\nexport interface InteractiveState {\n /** Pointer is over this node (mouseenter/mouseleave) */\n hovered: boolean\n /** Pointer-down on this node, awaiting pointer-up (will receive click) */\n armed: boolean\n /** Node is in the current selection set */\n selected: boolean\n /** Node has keyboard focus */\n focused: boolean\n /** A drag operation is hovering over this node */\n dropTarget: boolean\n}\n\n// ============================================================================\n// Node Types\n// ============================================================================\n\n/**\n * Silvery node types - the primitive elements in the render tree.\n */\nexport type AgNodeType = \"silvery-root\" | \"silvery-box\" | \"silvery-text\"\n\n/**\n * Flexbox properties that can be applied to Box nodes.\n */\nexport interface FlexboxProps {\n // Size\n width?: number | string\n height?: number | string\n minWidth?: number | string\n minHeight?: number | string\n maxWidth?: number | string\n maxHeight?: number | string\n\n // Flex\n flexGrow?: number\n flexShrink?: number\n flexBasis?: number | string\n flexDirection?: \"row\" | \"column\" | \"row-reverse\" | \"column-reverse\"\n flexWrap?: \"nowrap\" | \"wrap\" | \"wrap-reverse\"\n\n // Alignment\n alignItems?: \"flex-start\" | \"flex-end\" | \"center\" | \"stretch\" | \"baseline\"\n alignSelf?: \"auto\" | \"flex-start\" | \"flex-end\" | \"center\" | \"stretch\" | \"baseline\"\n alignContent?:\n | \"flex-start\"\n | \"flex-end\"\n | \"center\"\n | \"stretch\"\n | \"space-between\"\n | \"space-around\"\n | \"space-evenly\"\n justifyContent?:\n | \"flex-start\"\n | \"flex-end\"\n | \"center\"\n | \"space-between\"\n | \"space-around\"\n | \"space-evenly\"\n\n // Spacing\n padding?: number\n paddingTop?: number\n paddingBottom?: number\n paddingLeft?: number\n paddingRight?: number\n paddingX?: number\n paddingY?: number\n margin?: number\n marginTop?: number\n marginBottom?: number\n marginLeft?: number\n marginRight?: number\n marginX?: number\n marginY?: number\n gap?: number\n columnGap?: number\n rowGap?: number\n\n // Position\n position?: \"relative\" | \"absolute\" | \"sticky\" | \"static\"\n\n // Position offsets (used with position='absolute' or position='relative')\n top?: number | string\n left?: number | string\n bottom?: number | string\n right?: number | string\n\n // Sticky offsets (only used when position='sticky')\n // The element will \"stick\" when it reaches this offset from the container edge\n stickyTop?: number\n stickyBottom?: number\n\n // Aspect ratio\n aspectRatio?: number\n\n // Display\n display?: \"flex\" | \"none\"\n\n // Overflow\n overflow?: \"visible\" | \"hidden\" | \"scroll\"\n overflowX?: \"visible\" | \"hidden\"\n overflowY?: \"visible\" | \"hidden\"\n\n // Scroll control (only used when overflow='scroll')\n /** Child index to ensure visible (edge-based: only scrolls if off-screen) */\n scrollTo?: number\n /** Explicit scroll offset in rows (used when scrollTo is undefined for frozen scroll state) */\n scrollOffset?: number\n}\n\n/**\n * Props for testing and identification.\n * These props are stored in the node for DOM query access.\n */\nexport interface TestProps {\n /** Element ID for DOM queries and visual debugging */\n id?: string\n /** Test ID for querying nodes (like Playwright's data-testid) */\n testID?: string\n /** Allow arbitrary data-* attributes for testing */\n [key: `data-${string}`]: unknown\n}\n\n/**\n * Underline style variants (SGR 4:x codes).\n * - false: no underline\n * - 'single': standard underline (SGR 4 or 4:1)\n * - 'double': double underline (SGR 4:2)\n * - 'curly': curly/wavy underline (SGR 4:3)\n * - 'dotted': dotted underline (SGR 4:4)\n * - 'dashed': dashed underline (SGR 4:5)\n */\nexport type UnderlineStyle = false | \"single\" | \"double\" | \"curly\" | \"dotted\" | \"dashed\"\n\n/**\n * Style properties for text rendering.\n */\nexport interface StyleProps {\n color?: string\n backgroundColor?: string\n bold?: boolean\n /**\n * @deprecated Use a semantic token instead: `$muted` for captions,\n * `$faint` (via `<Small>`) for fine print, `$disabledfg` for inactive.\n * `dim` is a rendering detail with uneven terminal support; tokens\n * resolve to pre-dimmed hex values at truecolor. Will be removed in the\n * next silvery major. Internal renderer still emits SGR 2 at ANSI 16\n * / mono tiers for tokens that resolve there.\n */\n dim?: boolean\n /**\n * @deprecated Alias for `dim` (Ink compatibility). Migrate to a semantic\n * token instead — `$muted` / `$faint` / `$disabledfg`. Will be removed in\n * the next silvery major.\n */\n dimColor?: boolean\n italic?: boolean\n /** Enable underline. Use underlineStyle for style variants. */\n underline?: boolean\n /**\n * Underline style variant: 'single' | 'double' | 'curly' | 'dotted' | 'dashed'.\n * Setting this implies underline=true. Takes precedence over underline prop.\n */\n underlineStyle?: UnderlineStyle\n /**\n * Underline color (independent of text color).\n * Uses SGR 58 (underline color). Falls back to text color if not specified.\n */\n underlineColor?: string\n strikethrough?: boolean\n inverse?: boolean\n\n /**\n * Text size scale factor via OSC 66 (Kitty v0.40+).\n *\n * Float multiplier: 2.0 = double (headings), 1.0 = normal, 0.5 = half (small print).\n * The terminal renders subsequent text at this scale until reset.\n * Requires a terminal that supports the kitty text sizing protocol.\n * Terminals without support silently ignore the escape sequence.\n */\n textSize?: number\n}\n\n/**\n * Props for Box component.\n */\nexport interface BoxProps\n extends FlexboxProps, StyleProps, TestProps, MouseEventProps, DragEventProps, FocusEventProps {\n /** Text truncation mode for child text content (passed through to Text children). */\n wrap?:\n | \"wrap\"\n | \"hard\"\n | \"even\"\n | \"truncate\"\n | \"truncate-start\"\n | \"truncate-middle\"\n | \"truncate-end\"\n | \"clip\"\n | boolean\n borderStyle?: \"single\" | \"double\" | \"round\" | \"bold\" | \"singleDouble\" | \"doubleSingle\" | \"classic\"\n borderColor?: string\n /** Background color for all border sides (shorthand). Per-side props override this. */\n borderBackgroundColor?: string\n /** Background color for the top border (overrides borderBackgroundColor). */\n borderTopBackgroundColor?: string\n /** Background color for the bottom border (overrides borderBackgroundColor). */\n borderBottomBackgroundColor?: string\n /** Background color for the left border (overrides borderBackgroundColor). */\n borderLeftBackgroundColor?: string\n /** Background color for the right border (overrides borderBackgroundColor). */\n borderRightBackgroundColor?: string\n borderTop?: boolean\n borderBottom?: boolean\n borderLeft?: boolean\n borderRight?: boolean\n\n /**\n * Outline style — renders border characters OUTSIDE the box without affecting layout.\n *\n * Unlike `borderStyle` which adds border dimensions inside the box (shrinking the\n * content area), `outlineStyle` draws one cell beyond each edge — in the gap/margin\n * space between siblings. The layout engine sees no border at all.\n *\n * This matches CSS `outline` semantics: outside the border box, no layout impact.\n *\n * Use cases: focus rings, hover highlights, selection indicators, edit bounds —\n * anything that should visually frame a box without affecting layout or content.\n */\n outlineStyle?:\n | \"single\"\n | \"double\"\n | \"round\"\n | \"bold\"\n | \"singleDouble\"\n | \"doubleSingle\"\n | \"classic\"\n /** Foreground color for the outline */\n outlineColor?: string\n /** Apply dim styling to the outline */\n outlineDimColor?: boolean\n /** Show top outline edge (default: true) */\n outlineTop?: boolean\n /** Show bottom outline edge (default: true) */\n outlineBottom?: boolean\n /** Show left outline edge (default: true) */\n outlineLeft?: boolean\n /** Show right outline edge (default: true) */\n outlineRight?: boolean\n\n /**\n * Override theme for this subtree — $token colors resolve against this theme.\n * Pushed onto the context theme stack during render phase tree walk.\n */\n theme?: import(\"@silvery/ansi\").Theme\n\n /** CSS pointer-events equivalent. \"none\" makes this node and its subtree invisible to hit testing. */\n pointerEvents?: \"auto\" | \"none\"\n\n /**\n * CSS user-select equivalent. Controls whether text in this node is selectable.\n * - \"auto\" (default): inherit from parent. Root resolves to \"text\".\n * - \"none\": not selectable. Mouse-drag on this node does not start text selection.\n * - \"text\": force selectable, even if parent is \"none\".\n * - \"contain\": selectable, but selection range cannot escape this node's bounds.\n */\n userSelect?: UserSelect\n\n /**\n * Whether this node can be dragged via mouse.\n * When true, mousedown + drag past threshold initiates a node drag gesture\n * instead of text selection. Not inherited — only the node with draggable=true\n * is draggable, not its children.\n */\n draggable?: boolean\n\n onLayout?: (layout: Rect) => void\n\n /**\n * Show scroll overflow indicators (▲N / ▼N) for scrollable containers.\n *\n * For bordered containers, indicators appear on the border.\n * For borderless containers, indicators overlay the content at top-right/bottom-right.\n *\n * Only applies when overflow='scroll'.\n */\n overflowIndicator?: boolean\n}\n\n/**\n * Props for Text component.\n */\nexport interface TextProps extends StyleProps, TestProps, MouseEventProps {\n children?: React.ReactNode\n wrap?:\n | \"wrap\"\n | \"hard\"\n | \"even\"\n | \"truncate\"\n | \"truncate-start\"\n | \"truncate-middle\"\n | \"truncate-end\"\n | \"clip\"\n | boolean\n /** Internal transform function applied to each rendered line. Used by Transform component. */\n internal_transform?: (line: string, index: number) => string\n}\n\n/**\n * The core Silvery node - represents an element in the render tree.\n *\n * Each node has:\n * - A Yoga node for layout calculation\n * - Computed layout after Yoga runs\n * - Subscribers that get notified when layout changes\n * - Dirty flags for incremental updates\n */\nexport interface AgNode {\n /** Node type */\n type: AgNodeType\n\n /** Props passed to this node */\n props: BoxProps | TextProps | Record<string, unknown>\n\n /** Child nodes */\n children: AgNode[]\n\n /** Parent node (null for root) */\n parent: AgNode | null\n\n /** The layout node for layout calculation (null for raw text nodes) */\n layoutNode: LayoutNode | null\n\n /** Computed layout from previous render (for change detection) */\n prevLayout: Rect | null\n\n /**\n * Content-relative position (like CSS offsetTop/offsetLeft).\n * Position within the scrollable content, ignoring scroll offsets.\n * Set after layout phase.\n */\n boxRect: Rect | null\n\n /**\n * Screen-relative position (like CSS getBoundingClientRect).\n * Actual position on the terminal screen, accounting for scroll offsets.\n * Set after screen rect phase.\n *\n * Note: For sticky children, this reflects the node's layout position\n * adjusted for scroll offsets, NOT the actual render position. Use\n * `screenRect` for the actual pixel position on screen.\n */\n scrollRect: Rect | null\n\n /** Previous screen rect (for change detection in notifyLayoutSubscribers) */\n prevScrollRect: Rect | null\n\n /**\n * Actual render position on the terminal screen.\n * For non-sticky nodes, this equals `scrollRect`.\n * For sticky nodes (position=\"sticky\"), this accounts for sticky render\n * offsets — the position where pixels are actually painted.\n *\n * Use this for hit testing, cursor positioning, and any feature that\n * needs to know where a node visually appears on screen.\n * Set after screen rect phase.\n */\n screenRect: Rect | null\n\n /** Previous render rect (for change detection) */\n prevScreenRect: Rect | null\n\n /** Epoch when layout changed (position or size).\n * Set by propagateLayout in layout phase. Compared against renderEpoch by render phase.\n * This is the authoritative signal for \"did layout change?\" — unlike\n * !rectEqual(prevLayout, boxRect) which becomes stale when layout\n * phase skips (no dirty nodes).\n * Value: renderEpoch when dirty, INITIAL_EPOCH (-1) when clean. */\n layoutChangedThisFrame: number\n\n /**\n * Bit-packed dirty flags for the current epoch.\n *\n * Seven dirty flags packed into a single number:\n * bit 0 (CONTENT_BIT): content changed (text content or content-affecting props)\n * bit 1 (STYLE_PROPS_BIT): visual props changed (color, bg, border, etc.)\n * bit 2 (BG_BIT): backgroundColor specifically changed\n * bit 3 (CHILDREN_BIT): direct children added/removed/reordered\n * bit 4 (SUBTREE_BIT): this node or any descendant has dirty content/layout\n * bit 5 (ABS_CHILD_BIT): absolute child had structural changes\n * bit 6 (DESC_OVERFLOW_BIT): descendant overflow changed\n *\n * Outlines do NOT get a dirty bit — the decoration phase redraws them\n * every frame with per-cell snapshots (see pipeline/decoration-phase.ts).\n *\n * Check: `isDirty(node.dirtyBits, node.dirtyEpoch, BIT)`\n * Set: `node.dirtyBits = setDirtyBit(node.dirtyBits, node.dirtyEpoch, BIT); node.dirtyEpoch = getRenderEpoch()`\n * Clear: `advanceRenderEpoch()` — all nodes instantly become clean\n *\n * NOTE: measure phase may clear CONTENT_BIT — STYLE_PROPS_BIT acts as the\n * surviving witness for style changes. See render-phase.ts contentAreaAffected.\n */\n dirtyBits: number\n\n /**\n * Epoch when dirtyBits was last written.\n * When `dirtyEpoch !== renderEpoch`, all bits are stale (node is clean).\n * Value: renderEpoch when any bit is dirty, INITIAL_EPOCH (-1) when clean.\n */\n dirtyEpoch: number\n\n /** Text content for text nodes */\n textContent?: string\n\n /** True if this is a raw text node (created by createTextInstance) */\n isRawText?: boolean\n\n /** True if this node is hidden (for Suspense support) */\n hidden?: boolean\n\n /** Sticky children with computed render positions (for non-scroll containers).\n * When a parent has sticky children but is NOT a scroll container, this array\n * holds the computed render offsets. Same shape as scrollState.stickyChildren. */\n stickyChildren?: Array<{\n /** Index of the sticky child */\n index: number\n /** Computed Y offset to render at (relative to parent content area) */\n renderOffset: number\n /** Original natural Y position (relative to parent content area) */\n naturalTop: number\n /** Height of the sticky element */\n height: number\n }>\n\n /** Inline rects for virtual text nodes (no layout node). Computed during text rendering.\n * Array for wrapped text (one rect per line fragment). Enables hit testing on nested Text. */\n inlineRects?: Array<{ x: number; y: number; width: number; height: number }> | null\n\n /**\n * Interactive state signals — written by pointer/selection/focus state machines,\n * read by theme/render for automatic styling (hover highlights, focus rings, etc.).\n *\n * Lazily created on first write. Null means no interactive state has been set.\n * See InteractiveState for field docs.\n */\n interactiveState?: InteractiveState | null\n\n /** Scroll state for overflow='scroll' containers */\n scrollState?: {\n /** Current scroll offset (in terminal rows) */\n offset: number\n /** Previous scroll offset from last render (for incremental rendering) */\n prevOffset: number\n /** Total content height (all children) */\n contentHeight: number\n /** Visible height (container height minus borders/padding) */\n viewportHeight: number\n /** Index of first visible child */\n firstVisibleChild: number\n /** Index of last visible child */\n lastVisibleChild: number\n /** Previous first visible child from last render (for incremental rendering) */\n prevFirstVisibleChild: number\n /** Previous last visible child from last render (for incremental rendering) */\n prevLastVisibleChild: number\n /** Count of items hidden above viewport */\n hiddenAbove: number\n /** Count of items hidden below viewport */\n hiddenBelow: number\n /** Sticky children with their computed render positions */\n stickyChildren?: Array<{\n /** Index of the sticky child */\n index: number\n /** Computed Y offset to render at (relative to viewport, not content) */\n renderOffset: number\n /** Original natural Y position (before sticky adjustment) */\n naturalTop: number\n /** Height of the sticky element */\n height: number\n }>\n }\n}\n\n// ============================================================================\n// Terminal Buffer Types\n// ============================================================================\n\n/**\n * Text attributes that can be applied to a cell.\n */\nexport interface CellAttrs {\n bold?: boolean\n dim?: boolean\n italic?: boolean\n /** Simple underline flag (for backwards compatibility) */\n underline?: boolean\n /**\n * Underline style: 'single' | 'double' | 'curly' | 'dotted' | 'dashed'.\n * When set, takes precedence over the underline boolean.\n */\n underlineStyle?: UnderlineStyle\n strikethrough?: boolean\n inverse?: boolean\n}\n\n/**\n * A single cell in the terminal buffer.\n */\nexport interface Cell {\n /** The character (grapheme cluster) in this cell */\n char: string\n /** Foreground color (ANSI code or RGB) */\n fg: string | null\n /** Background color (ANSI code or RGB) */\n bg: string | null\n /** Text attributes */\n attrs: CellAttrs\n /** True if this is a wide character (CJK) that takes 2 cells */\n wide: boolean\n /** True if this cell is the continuation of a wide character */\n continuation: boolean\n}\n\n/**\n * Interface for the terminal buffer.\n */\nexport interface TerminalBuffer {\n readonly width: number\n readonly height: number\n getCell(x: number, y: number): Cell\n setCell(x: number, y: number, cell: Cell): void\n clear(): void\n}\n\n// ============================================================================\n// Event Types\n// ============================================================================\n\n/**\n * Keyboard event with key information and modifiers.\n */\nexport interface KeyEvent {\n type: \"key\"\n /** The key pressed (character or key name like 'ArrowUp') */\n key: string\n /** Ctrl modifier was held */\n ctrl?: boolean\n /** Meta/Alt modifier was held */\n meta?: boolean\n /** Shift modifier was held */\n shift?: boolean\n /** Alt/Option modifier was held */\n alt?: boolean\n /** Super/Cmd modifier was held. Requires Kitty protocol. */\n super?: boolean\n /** Hyper modifier was held. Requires Kitty protocol. */\n hyper?: boolean\n /** Kitty event type. Requires Kitty flag 2. */\n eventType?: \"press\" | \"repeat\" | \"release\"\n /** CapsLock is active. Kitty modifier bit 6. */\n capsLock?: boolean\n /** NumLock is active. Kitty modifier bit 7. */\n numLock?: boolean\n}\n\n/**\n * Mouse event with position and button information.\n */\nexport interface MouseEvent {\n type: \"mouse\"\n /** X position in terminal columns (0-indexed) */\n x: number\n /** Y position in terminal rows (0-indexed) */\n y: number\n /** Mouse button (0=left, 1=middle, 2=right) */\n button: number\n /** Event action */\n action: \"down\" | \"up\" | \"move\" | \"wheel\"\n /** Wheel delta for scroll events */\n delta?: number\n}\n\n/**\n * Terminal resize event.\n */\nexport interface ResizeEvent {\n type: \"resize\"\n /** New width in columns */\n width: number\n /** New height in rows */\n height: number\n}\n\n/**\n * Terminal focus event.\n */\nexport interface FocusEvent {\n type: \"focus\"\n}\n\n/**\n * Terminal blur event.\n */\nexport interface BlurEvent {\n type: \"blur\"\n}\n\n/**\n * Signal event (SIGINT, SIGTERM, etc.).\n */\nexport interface SignalEvent {\n type: \"signal\"\n /** Signal name (e.g., 'SIGINT', 'SIGTERM') */\n signal: string\n}\n\n/**\n * Custom event for extensibility.\n */\nexport interface CustomEvent {\n type: \"custom\"\n /** Event name */\n name: string\n /** Event data */\n data: unknown\n}\n\n/**\n * Union of all event types.\n *\n * Events drive the render loop in interactive mode. When events are present,\n * the render loop runs until exit() is called. When events are absent,\n * the render completes when the UI is stable.\n */\nexport type Event =\n | KeyEvent\n | MouseEvent\n | ResizeEvent\n | FocusEvent\n | BlurEvent\n | SignalEvent\n | CustomEvent\n\n/**\n * Event source that can be subscribed to and unsubscribed from.\n */\nexport interface EventSource {\n /** Subscribe to events, returns unsubscribe function */\n subscribe(handler: (event: Event) => void): () => void\n /** Convert to async iterable */\n [Symbol.asyncIterator](): AsyncIterator<Event>\n}\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"progress.d.mts","names":[],"sources":["../../packages/ag-react/src/ui/progress/step-node.ts","../../packages/ag-react/src/ui/progress/als-context.ts","../../packages/ag-react/src/ui/progress/declarative.ts","../../packages/ag-react/src/ui/progress/steps.ts","../../packages/ag-react/src/ui/progress/task.ts","../../packages/ag-react/src/ui/progress/tasks.ts"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"progress.mjs","names":["isGenerator","runGenerator","isAsyncGenerator","runAsyncGenerator","isDeclareSteps","isPromiseLike","PHASE_LABELS","isGenerator","runGenerator","isPromiseLike"],"sources":["../../packages/ag-react/src/ui/progress/als-context.ts","../../packages/ag-react/src/ui/progress/step-node.ts","../../packages/ag-react/src/ui/progress/declarative.ts","../../packages/ag-react/src/ui/progress/steps.ts","../../packages/ag-react/src/ui/progress/task.ts","../../packages/ag-react/src/ui/progress/tasks.ts"],"sourcesContent":["/**\n * AsyncLocalStorage context for step progress reporting\n *\n * Provides a `step()` function that work functions can call to report progress.\n * Returns a no-op context when called outside of a steps() execution context,\n * so functions work in tests without the progress UI.\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\"\nimport type { TaskHandle } from \"../cli/multi-progress\"\n\n/**\n * Context available to work functions during step execution\n */\nexport interface StepContext {\n /** Update progress on current step */\n progress(current: number, total: number): void\n\n /** Create a sub-step (auto-completes previous sub-step) */\n sub(label: string): void\n\n /** Get current step label (for debugging) */\n readonly label: string\n}\n\n/**\n * Internal context with additional fields for the runner\n */\nexport interface InternalStepContext extends StepContext {\n /** TaskHandle for this step */\n readonly handle: TaskHandle\n\n /** Add a sub-step handle (called by runner) */\n _addSubHandle(label: string, handle: TaskHandle): void\n\n /** Get a pre-declared sub-step handle by label */\n _getSubHandle(label: string): TaskHandle | undefined\n\n /** Set the current sub-step (when starting a pre-declared step) */\n _setCurrentSubHandle(label: string, handle: TaskHandle): void\n\n /** Complete current sub-step (called by runner) */\n _completeSubStep(): void\n}\n\n// AsyncLocalStorage instance\nconst stepContext = new AsyncLocalStorage<InternalStepContext>()\n\n/**\n * Get the current step context\n *\n * Safe to call anywhere - returns a no-op context when called outside\n * of a steps() execution context.\n *\n * @example\n * ```typescript\n * async function processFiles(files: string[]) {\n * for (let i = 0; i < files.length; i++) {\n * step().progress(i + 1, files.length);\n * await process(files[i]);\n * }\n * }\n *\n * // In tests (no steps context)\n * await processFiles([\"a.md\", \"b.md\"]); // step() returns no-op, no errors\n *\n * // In production (with steps context)\n * await steps({ process: processFiles }).run(); // Shows progress\n * ```\n */\nexport function step(): StepContext {\n return stepContext.getStore() ?? NO_OP_CONTEXT\n}\n\n/**\n * Run a function with step context (internal use by runner)\n */\nexport function runWithStepContext<T>(ctx: InternalStepContext, fn: () => T): T {\n return stepContext.run(ctx, fn)\n}\n\n/**\n * Create an internal step context for the runner\n */\nexport function createStepContext(\n label: string,\n handle: TaskHandle,\n onSubStep?: (label: string) => TaskHandle,\n): InternalStepContext {\n let currentSubLabel: string | undefined\n let currentSubHandle: TaskHandle | null = null\n let subStepStartTime = 0\n const declaredHandles = new Map<string, TaskHandle>()\n\n return {\n get label() {\n return label\n },\n\n get handle() {\n return handle\n },\n\n progress(current: number, total: number) {\n if (currentSubHandle) {\n currentSubHandle.setTitle(`${currentSubLabel} (${current}/${total})`)\n } else {\n handle.setTitle(`${label} (${current}/${total})`)\n }\n },\n\n sub(subLabel: string) {\n // Complete previous sub-step if any\n this._completeSubStep()\n\n currentSubLabel = subLabel\n subStepStartTime = Date.now()\n\n if (onSubStep) {\n currentSubHandle = onSubStep(subLabel)\n currentSubHandle.start()\n }\n },\n\n _addSubHandle(subLabel: string, subHandle: TaskHandle) {\n declaredHandles.set(subLabel, subHandle)\n },\n\n _getSubHandle(subLabel: string) {\n return declaredHandles.get(subLabel)\n },\n\n _setCurrentSubHandle(subLabel: string, subHandle: TaskHandle) {\n currentSubLabel = subLabel\n currentSubHandle = subHandle\n subStepStartTime = Date.now()\n },\n\n _completeSubStep() {\n if (currentSubHandle && currentSubLabel) {\n const elapsed = Date.now() - subStepStartTime\n // Use numeric timing - preserves current title (which may have progress info)\n currentSubHandle.complete(elapsed)\n currentSubHandle = null\n currentSubLabel = undefined\n }\n },\n }\n}\n\n/**\n * No-op context for when step() is called outside execution context\n */\nconst NO_OP_CONTEXT: StepContext = {\n progress: () => {},\n sub: () => {},\n get label() {\n return \"\"\n },\n}\n","/**\n * Step node tree structure for declarative steps\n *\n * Parses the user's declarative object structure into an internal tree\n * that can be rendered and executed.\n */\n\n/**\n * A single step in the tree\n */\nexport interface StepNode {\n /** Display label (auto-generated or custom) */\n label: string\n\n /** Object key from the declaration */\n key: string\n\n /** Work function (if leaf node) */\n work?: (...args: unknown[]) => unknown\n\n /** Child steps (if group node) */\n children?: StepNode[]\n\n /** Indentation level for display */\n indent: number\n}\n\n/**\n * What users can declare as a step value\n */\nexport type StepValue =\n | ((...args: unknown[]) => unknown) // Function (auto-named)\n | [string, (...args: unknown[]) => unknown] // [label, function]\n | StepsDef // Nested group\n\n/**\n * The declarative structure users provide\n */\nexport type StepsDef = {\n [key: string]: StepValue\n}\n\n/**\n * Parse a declarative steps definition into a tree of StepNodes\n *\n * @param def - The declarative structure\n * @param indent - Current indentation level (internal)\n * @returns Array of StepNodes\n */\nexport function parseStepsDef(def: StepsDef, indent = 0): StepNode[] {\n const nodes: StepNode[] = []\n\n for (const [key, value] of Object.entries(def)) {\n if (typeof value === \"function\") {\n // Function: auto-generate label from key\n nodes.push({\n key,\n label: generateLabel(key),\n work: value,\n indent,\n })\n } else if (Array.isArray(value) && value.length === 2) {\n // Tuple: [label, function]\n const [label, work] = value as [string, (...args: unknown[]) => unknown]\n nodes.push({\n key,\n label,\n work,\n indent,\n })\n } else if (typeof value === \"object\" && value !== null) {\n // Nested group\n const children = parseStepsDef(value as StepsDef, indent + 1)\n nodes.push({\n key,\n label: generateLabel(key),\n children,\n indent,\n })\n }\n }\n\n return nodes\n}\n\n/**\n * Flatten the tree for sequential execution\n *\n * Returns nodes in depth-first order, with groups followed by their children.\n */\nexport function flattenStepNodes(nodes: StepNode[]): StepNode[] {\n const result: StepNode[] = []\n\n for (const node of nodes) {\n result.push(node)\n if (node.children) {\n result.push(...flattenStepNodes(node.children))\n }\n }\n\n return result\n}\n\n/**\n * Get only leaf nodes (nodes with work functions)\n */\nexport function getLeafNodes(nodes: StepNode[]): StepNode[] {\n const result: StepNode[] = []\n\n for (const node of nodes) {\n if (node.work) {\n result.push(node)\n }\n if (node.children) {\n result.push(...getLeafNodes(node.children))\n }\n }\n\n return result\n}\n\n/**\n * Generate a display label from a camelCase function name\n *\n * @example\n * generateLabel(\"loadModules\") // \"Load modules\"\n * generateLabel(\"parseMarkdown\") // \"Parse markdown\"\n * generateLabel(\"initBoardStateGenerator\") // \"Init board state generator\"\n */\nexport function generateLabel(fnName: string): string {\n return fnName\n .replace(/([A-Z])/g, \" $1\") // Insert space before capitals\n .replace(/(\\d+)/g, \" $1\") // Insert space before numbers\n .toLowerCase() // Convert all to lowercase\n .trim() // Remove leading/trailing spaces\n .replace(/\\s+/g, \" \") // Collapse multiple spaces\n .replace(/^./, (s) => s.toUpperCase()) // Capitalize only first letter\n}\n\n/**\n * Check if a value is a StepsDef (nested group)\n */\nexport function isStepsDef(value: unknown): value is StepsDef {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n typeof value !== \"function\"\n )\n}\n\n/**\n * Check if a value is a tuple [label, function]\n */\nexport function isLabelTuple(value: unknown): value is [string, (...args: unknown[]) => unknown] {\n return (\n Array.isArray(value) &&\n value.length === 2 &&\n typeof value[0] === \"string\" &&\n typeof value[1] === \"function\"\n )\n}\n","/**\n * Declarative steps implementation\n *\n * Provides the declarative overload for steps() that accepts an object\n * structure and shows all steps upfront before execution.\n */\n\nimport { MultiProgress, type TaskHandle } from \"../cli/multi-progress\"\nimport {\n step as getStepContext,\n createStepContext,\n runWithStepContext,\n type InternalStepContext,\n} from \"./als-context\"\nimport {\n parseStepsDef,\n flattenStepNodes,\n getLeafNodes,\n type StepNode,\n type StepsDef,\n} from \"./step-node\"\n\n// Re-export step() for convenience\nexport { step } from \"./als-context\"\n\n// Node.js globals for yielding to event loop\ndeclare function setImmediate(callback: (value?: unknown) => void): unknown\ndeclare function setTimeout(callback: (value?: unknown) => void, ms: number): unknown\n\n/**\n * Options for run() and pipe() execution\n */\nexport interface ExecuteOptions {\n /** Clear progress display after completion (default: false) */\n clear?: boolean\n}\n\n/**\n * Extract the return type from a generator or async generator\n */\ntype GeneratorReturn<T> =\n T extends Generator<unknown, infer R, unknown>\n ? R\n : T extends AsyncGenerator<unknown, infer R, unknown>\n ? R\n : T\n\n/**\n * Unwrap the result type, handling generators specially\n */\ntype UnwrapResult<T> = Awaited<GeneratorReturn<Awaited<T>>>\n\n/**\n * Result type: maps step keys to their return values\n */\ntype StepResults<T extends StepsDef> = {\n [K in keyof T]: T[K] extends (...args: unknown[]) => infer R\n ? UnwrapResult<R>\n : T[K] extends [string, (...args: unknown[]) => infer R]\n ? UnwrapResult<R>\n : T[K] extends StepsDef\n ? StepResults<T[K]>\n : unknown\n}\n\n/**\n * The runner object returned by steps()\n */\nexport interface StepsRunner<T extends StepsDef> {\n /** Internal: the parsed step nodes (for testing) */\n readonly _steps: StepNode[]\n\n /**\n * Execute all steps sequentially\n * @returns Results keyed by step name\n */\n run(options?: ExecuteOptions): Promise<StepResults<T>>\n\n /**\n * Execute all steps in a pipeline (each receives previous result)\n * @returns Final step's result\n */\n pipe(options?: ExecuteOptions): Promise<unknown>\n\n /**\n * Manually signal completion (for manual execution mode)\n */\n done(options?: { clear?: boolean }): void\n}\n\n/**\n * Create a declarative steps runner\n *\n * @param def - Object structure defining steps\n * @returns StepsRunner with run(), pipe(), and done() methods\n *\n * @example\n * ```typescript\n * const loader = stepsDeclarative({\n * loadModules, // \"Load modules\"\n * loadRepo: { // \"Load repo\" (group)\n * discover, // \"Discover\"\n * parse, // \"Parse\"\n * },\n * });\n *\n * const results = await loader.run({ clear: true });\n * ```\n */\nexport function stepsDeclarative<T extends StepsDef>(def: T): StepsRunner<T> {\n const rootNodes = parseStepsDef(def)\n const allNodes = flattenStepNodes(rootNodes)\n\n let multi: MultiProgress | null = null\n const handles = new Map<StepNode, TaskHandle>()\n\n // Build group tracking: map each group to its leaf nodes\n const groupLeaves = new Map<StepNode, StepNode[]>()\n const leafToGroups = new Map<StepNode, StepNode[]>()\n\n for (const node of allNodes) {\n if (node.children) {\n const leaves = getLeafNodes([node])\n groupLeaves.set(node, leaves)\n for (const leaf of leaves) {\n const groups = leafToGroups.get(leaf) ?? []\n groups.push(node)\n leafToGroups.set(leaf, groups)\n }\n }\n }\n\n return {\n get _steps() {\n return rootNodes\n },\n\n async run(options?: ExecuteOptions): Promise<StepResults<T>> {\n multi = new MultiProgress()\n\n // Register all steps upfront (shows pending state)\n registerAllSteps(allNodes, multi, handles)\n\n // Group timing tracking\n const groupStartTimes = new Map<StepNode, number>()\n const completedLeaves = new Set<StepNode>()\n\n multi.start()\n\n // Yield to event loop to ensure initial render is displayed\n // before we start modifying task states\n await new Promise((resolve) => setImmediate(resolve))\n\n const results: Record<string, unknown> = {}\n\n try {\n // Execute each step with work\n for (const node of allNodes) {\n if (node.work) {\n // Start parent groups if not started\n const groups = leafToGroups.get(node) ?? []\n for (const group of groups) {\n if (!groupStartTimes.has(group)) {\n groupStartTimes.set(group, Date.now())\n handles.get(group)?.start()\n }\n }\n\n const result = await executeStep(node, handles, multi)\n setNestedResult(results, node.key, result)\n\n // Mark leaf as complete and check group completion\n completedLeaves.add(node)\n for (const group of groups) {\n const leaves = groupLeaves.get(group) ?? []\n if (leaves.every((l) => completedLeaves.has(l))) {\n const elapsed = Date.now() - groupStartTimes.get(group)!\n handles.get(group)?.complete(elapsed)\n }\n }\n }\n }\n } finally {\n multi.stop(options?.clear ?? false)\n }\n\n return results as StepResults<T>\n },\n\n async pipe(options?: ExecuteOptions): Promise<unknown> {\n multi = new MultiProgress()\n\n // Register all steps upfront\n registerAllSteps(allNodes, multi, handles)\n\n // Group timing tracking\n const groupStartTimes = new Map<StepNode, number>()\n const completedLeaves = new Set<StepNode>()\n\n multi.start()\n\n // Yield to event loop to ensure initial render is displayed\n // before we start modifying task states\n await new Promise((resolve) => setImmediate(resolve))\n\n let previousResult: unknown = undefined\n\n try {\n // Execute each step, passing previous result\n for (const node of allNodes) {\n if (node.work) {\n // Start parent groups if not started\n const groups = leafToGroups.get(node) ?? []\n for (const group of groups) {\n if (!groupStartTimes.has(group)) {\n groupStartTimes.set(group, Date.now())\n handles.get(group)?.start()\n }\n }\n\n previousResult = await executeStep(node, handles, multi, previousResult)\n\n // Mark leaf as complete and check group completion\n completedLeaves.add(node)\n for (const group of groups) {\n const leaves = groupLeaves.get(group) ?? []\n if (leaves.every((l) => completedLeaves.has(l))) {\n const elapsed = Date.now() - groupStartTimes.get(group)!\n handles.get(group)?.complete(elapsed)\n }\n }\n }\n }\n } finally {\n multi.stop(options?.clear ?? false)\n }\n\n return previousResult\n },\n\n done(options?: { clear?: boolean }) {\n if (multi) {\n multi.stop(options?.clear ?? false)\n multi = null\n }\n },\n }\n}\n\n/**\n * Register all steps with MultiProgress upfront\n */\nfunction registerAllSteps(\n nodes: StepNode[],\n multi: MultiProgress,\n handles: Map<StepNode, TaskHandle>,\n): void {\n // Register in order without insertAfter - simpler and correct\n for (const node of nodes) {\n const isGroup = node.children && !node.work\n const handle = multi.add(node.label, {\n type: isGroup ? \"group\" : \"spinner\",\n indent: node.indent,\n })\n handles.set(node, handle)\n }\n}\n\n/**\n * Execute a single step\n */\nasync function executeStep(\n node: StepNode,\n handles: Map<StepNode, TaskHandle>,\n multi: MultiProgress,\n input?: unknown,\n): Promise<unknown> {\n const handle = handles.get(node)!\n const startTime = Date.now()\n\n // Yield to event loop before starting\n await new Promise((resolve) => setImmediate(resolve))\n\n // Create step context for ALS\n const ctx = createStepContext(node.label, handle, (subLabel) => {\n // Create sub-step handle when step().sub() is called\n return multi.add(subLabel, {\n type: \"spinner\",\n indent: node.indent + 1,\n insertAfter: handle.id,\n })\n })\n\n handle.start()\n\n try {\n // Run work function with ALS context\n const result = await runWithStepContext(ctx, () => {\n if (input !== undefined) {\n return (node.work as (input: unknown) => unknown)(input)\n }\n return node.work!()\n })\n\n // Handle generator results\n if (isGenerator(result)) {\n return await runGenerator(result, ctx, node, multi)\n }\n\n if (isAsyncGenerator(result)) {\n return await runAsyncGenerator(result, ctx, node, multi)\n }\n\n // Complete any remaining sub-step\n ctx._completeSubStep()\n\n // Complete the step with timing\n const elapsed = Date.now() - startTime\n handle.complete(elapsed)\n\n return result\n } catch (error) {\n handle.fail()\n throw error\n }\n}\n\n/**\n * Run a sync generator step\n */\nasync function runGenerator<T>(\n gen: Generator<unknown, T, unknown>,\n ctx: InternalStepContext,\n node: StepNode,\n multi: MultiProgress,\n): Promise<T> {\n const startTime = Date.now()\n let result = gen.next()\n let hasSubSteps = false\n // Track last inserted handle to maintain correct order\n // Each new sub-step inserts after the previous one, not after parent\n let lastInsertedId = ctx.handle.id\n\n while (!result.done) {\n const value = result.value\n\n // Handle yielded values\n if (isDeclareSteps(value)) {\n // Declare all sub-steps upfront (show as pending)\n if (!hasSubSteps) {\n hasSubSteps = true\n ctx.handle.setType(\"group\")\n }\n for (const label of value.declare) {\n const subHandle = multi.add(label, {\n type: \"spinner\",\n indent: node.indent + 1,\n insertAfter: lastInsertedId,\n })\n lastInsertedId = subHandle.id\n ctx._addSubHandle(label, subHandle)\n }\n } else if (typeof value === \"string\") {\n // String = start a sub-step with this label\n ctx._completeSubStep()\n\n // First sub-step: change parent from spinner to group (no animation)\n if (!hasSubSteps) {\n hasSubSteps = true\n ctx.handle.setType(\"group\")\n }\n\n // Check if already declared, otherwise create new\n const existingHandle = ctx._getSubHandle?.(value)\n if (existingHandle) {\n ctx._setCurrentSubHandle(value, existingHandle)\n existingHandle.start()\n } else {\n const subHandle = multi.add(value, {\n type: \"spinner\",\n indent: node.indent + 1,\n insertAfter: lastInsertedId,\n })\n lastInsertedId = subHandle.id\n ctx._addSubHandle(value, subHandle)\n subHandle.start()\n }\n } else if (isProgressUpdate(value)) {\n // Progress update\n ctx.progress(value.current ?? 0, value.total ?? 0)\n }\n\n // Yield to event loop for animation\n await new Promise((resolve) => setTimeout(resolve, 0))\n\n result = gen.next()\n }\n\n // Complete any remaining sub-step\n ctx._completeSubStep()\n\n // Complete the step with timing\n const elapsed = Date.now() - startTime\n ctx.handle.complete(elapsed)\n\n return result.value\n}\n\n/**\n * Run an async generator step\n */\nasync function runAsyncGenerator<T>(\n gen: AsyncGenerator<unknown, T, unknown>,\n ctx: InternalStepContext,\n node: StepNode,\n multi: MultiProgress,\n): Promise<T> {\n const startTime = Date.now()\n let result = await gen.next()\n let hasSubSteps = false\n // Track last inserted handle to maintain correct order\n // Each new sub-step inserts after the previous one, not after parent\n let lastInsertedId = ctx.handle.id\n\n while (!result.done) {\n const value = result.value\n\n // Handle yielded values\n if (isDeclareSteps(value)) {\n // Declare all sub-steps upfront (show as pending)\n if (!hasSubSteps) {\n hasSubSteps = true\n ctx.handle.setType(\"group\")\n }\n for (const label of value.declare) {\n const subHandle = multi.add(label, {\n type: \"spinner\",\n indent: node.indent + 1,\n insertAfter: lastInsertedId,\n })\n lastInsertedId = subHandle.id\n ctx._addSubHandle(label, subHandle)\n }\n } else if (typeof value === \"string\") {\n // String = start a sub-step with this label\n ctx._completeSubStep()\n\n // First sub-step: change parent from spinner to group (no animation)\n if (!hasSubSteps) {\n hasSubSteps = true\n ctx.handle.setType(\"group\")\n }\n\n // Check if already declared, otherwise create new\n const existingHandle = ctx._getSubHandle(value)\n if (existingHandle) {\n ctx._setCurrentSubHandle(value, existingHandle)\n existingHandle.start()\n } else {\n const subHandle = multi.add(value, {\n type: \"spinner\",\n indent: node.indent + 1,\n insertAfter: lastInsertedId,\n })\n lastInsertedId = subHandle.id\n ctx._addSubHandle(value, subHandle)\n subHandle.start()\n }\n } else if (isProgressUpdate(value)) {\n // Progress update\n ctx.progress(value.current ?? 0, value.total ?? 0)\n }\n\n // Yield to event loop for animation\n await new Promise((resolve) => setTimeout(resolve, 0))\n\n result = await gen.next()\n }\n\n // Complete any remaining sub-step\n ctx._completeSubStep()\n\n // Complete the step with timing\n const elapsed = Date.now() - startTime\n ctx.handle.complete(elapsed)\n\n return result.value\n}\n\n/**\n * Set a nested result value by key path\n */\nfunction setNestedResult(results: Record<string, unknown>, key: string, value: unknown): void {\n // For now, flat keys only - nested groups would need path handling\n results[key] = value\n}\n\n/**\n * Type guards\n */\nfunction isGenerator(value: unknown): value is Generator<unknown, unknown, unknown> {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as Generator).next === \"function\" &&\n typeof (value as Generator)[Symbol.iterator] === \"function\"\n )\n}\n\nfunction isAsyncGenerator(value: unknown): value is AsyncGenerator<unknown, unknown, unknown> {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as AsyncGenerator).next === \"function\" &&\n typeof (value as AsyncGenerator)[Symbol.asyncIterator] === \"function\"\n )\n}\n\ninterface ProgressUpdate {\n current?: number\n total?: number\n}\n\ninterface DeclareSteps {\n declare: string[]\n}\n\nfunction isProgressUpdate(value: unknown): value is ProgressUpdate {\n return (\n value !== null &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n (\"current\" in value || \"total\" in value)\n )\n}\n\nfunction isDeclareSteps(value: unknown): value is DeclareSteps {\n return (\n value !== null &&\n typeof value === \"object\" &&\n \"declare\" in value &&\n Array.isArray((value as DeclareSteps).declare)\n )\n}\n","/**\n * Sequential step runner with progress display\n *\n * Supports two modes:\n *\n * ## Declarative Mode (recommended)\n *\n * Pass an object to declare all steps upfront:\n *\n * ```typescript\n * import { steps, step } from \"./index\";\n *\n * const loader = steps({\n * loadModules, // Auto-named: \"Load modules\"\n * loadRepo: { // Group: \"Load repo\"\n * discover, // \"Discover\"\n * parse, // \"Parse\"\n * },\n * });\n *\n * const results = await loader.run({ clear: true });\n *\n * // Inside work functions, use step() to report progress:\n * async function discover() {\n * const files = await glob(\"**\\/*.md\");\n * for (let i = 0; i < files.length; i++) {\n * step().progress(i + 1, files.length);\n * await process(files[i]);\n * }\n * return files;\n * }\n * ```\n *\n * ## Fluent Mode (legacy)\n *\n * Chain steps with `.run()` and execute with `.execute()`:\n *\n * ```typescript\n * await steps()\n * .run(\"Loading modules\", () => import(\"./app\"))\n * .run(\"Building view\", async () => buildView())\n * .execute();\n * ```\n *\n * Generators can yield sub-step progress:\n * - Yield a **string** to create a new sub-step\n * - Yield an **object** `{ current, total }` to update progress on current sub-step\n */\n\nimport { MultiProgress, type TaskHandle } from \"../cli/multi-progress\"\nimport { stepsDeclarative, type StepsRunner } from \"./declarative\"\nimport type { StepsDef } from \"./step-node\"\n\n// Re-export step() context helper\nexport { step } from \"./als-context\"\n\n// Re-export types from declarative\nexport type { StepsRunner } from \"./declarative\"\nexport type { StepsDef, StepNode } from \"./step-node\"\nexport type { StepContext } from \"./als-context\"\n\n// Node.js globals for yielding to event loop\ndeclare function setImmediate(callback: (value?: unknown) => void): unknown\ndeclare function setTimeout(callback: (value?: unknown) => void, ms: number): unknown\n\n/** Progress update (object form) */\ninterface ProgressUpdate {\n current?: number\n total?: number\n}\n\n/** Declare all sub-steps upfront (optional, yield as first value) */\ninterface DeclareSteps {\n declare: string[]\n}\n\n/** What generators can yield */\ntype StepYield = string | ProgressUpdate | DeclareSteps\n\n/**\n * Controller for creating and updating sub-steps\n *\n * Passed to work functions that need to report sub-step progress.\n */\nexport interface StepController {\n /** Create a new sub-step (auto-completes previous sub-step) */\n new (label: string): void\n\n /** Update progress on current sub-step */\n progress(current: number, total: number): void\n\n /** Explicitly complete current sub-step (optional - new() auto-completes) */\n done(): void\n}\n\n/** Work function types */\ntype SyncWork<T> = () => T\ntype AsyncWork<T> = () => PromiseLike<T>\ntype SyncGeneratorWork<T> = () => Generator<StepYield, T, unknown>\ntype AsyncGeneratorWork<T> = () => AsyncGenerator<StepYield, T, unknown>\n/** Work function with step controller for sub-step progress */\ntype WorkWithStep<T> = (step: StepController) => T | PromiseLike<T>\n\ntype WorkFn<T> =\n | SyncWork<T>\n | AsyncWork<T>\n | SyncGeneratorWork<T>\n | AsyncGeneratorWork<T>\n | WorkWithStep<T>\n\n/** Step definition */\ninterface StepDef<T = unknown> {\n title: string\n work: WorkFn<T>\n}\n\n/** Options for execute() */\nexport interface ExecuteOptions {\n /** Clear progress display after completion (default: false) */\n clear?: boolean\n}\n\nexport interface StepBuilder {\n /**\n * Add a step to run\n *\n * @param title - Display title for this step\n * @param work - Function to execute. Can be:\n * - Sync function: `() => result`\n * - Async function: `async () => result`\n * - Sync generator: `function* () { yield \"sub-step\"; return result; }`\n * - Async generator: `async function* () { yield \"sub-step\"; return result; }`\n *\n * Generators can yield:\n * - `\"string\"` - Creates a new sub-step with that label\n * - `{ current: N, total: M }` - Updates progress on current sub-step\n */\n run<T>(title: string, work: WorkFn<T>): StepBuilder\n\n /**\n * Execute all steps in sequence\n * @param options - Execution options\n * @returns Results keyed by step title\n */\n execute(options?: ExecuteOptions): Promise<Record<string, unknown>>\n}\n\n/**\n * Create a step runner\n *\n * @overload Declarative mode - pass an object to declare steps upfront\n * @overload Fluent mode - chain steps with .run() and execute with .execute()\n *\n * @example Declarative mode (recommended)\n * ```typescript\n * const loader = steps({\n * loadModules,\n * loadRepo: { discover, parse },\n * });\n * const results = await loader.run({ clear: true });\n * ```\n *\n * @example Fluent mode\n * ```typescript\n * await steps()\n * .run(\"Step 1\", doStep1)\n * .run(\"Step 2\", doStep2)\n * .execute();\n * ```\n */\nexport function steps<T extends StepsDef>(def: T): StepsRunner<T>\nexport function steps(): StepBuilder\nexport function steps<T extends StepsDef>(def?: T): StepsRunner<T> | StepBuilder {\n // Declarative mode: object passed\n if (def !== undefined) {\n return stepsDeclarative(def)\n }\n\n // Fluent mode: no arguments\n return createFluentBuilder()\n}\n\n/**\n * Create a no-op StepController for work functions that don't use sub-steps.\n * This satisfies the type union while being harmless if not used.\n */\nfunction createNoopStepController(): StepController {\n const controller = (_label: string) => {}\n controller.progress = (_current: number, _total: number) => {}\n controller.done = () => {}\n // StepController uses `new` as a callable signature, not a constructor\n return controller as unknown as StepController\n}\n\n/**\n * Create the fluent step builder (legacy mode)\n */\nfunction createFluentBuilder(): StepBuilder {\n const stepList: StepDef[] = []\n\n const builder: StepBuilder = {\n run<T>(title: string, work: WorkFn<T>): StepBuilder {\n stepList.push({ title, work: work as WorkFn<unknown> })\n return builder\n },\n\n async execute(options?: ExecuteOptions): Promise<Record<string, unknown>> {\n const multi = new MultiProgress()\n const handles = new Map<string, TaskHandle>()\n const results: Record<string, unknown> = {}\n\n // Register all steps upfront (shows pending state)\n for (const step of stepList) {\n handles.set(step.title, multi.add(step.title, { type: \"spinner\" }))\n }\n\n multi.start()\n\n try {\n for (const step of stepList) {\n const handle = handles.get(step.title)!\n\n // Yield to event loop before potentially blocking work\n await new Promise((resolve) => setImmediate(resolve))\n\n const result = step.work(createNoopStepController())\n\n if (isAsyncGenerator(result)) {\n // Async generator: parent stays static while sub-steps animate\n results[step.title] = await runAsyncGenerator(result, handle, step.title, multi)\n } else if (isSyncGenerator(result)) {\n // Sync generator: same handling\n results[step.title] = await runSyncGenerator(result, handle, step.title, multi)\n } else if (isPromiseLike(result)) {\n handle.start()\n results[step.title] = await result\n handle.complete()\n } else {\n handle.start()\n results[step.title] = result\n handle.complete()\n }\n }\n } finally {\n multi.stop(options?.clear ?? false)\n }\n\n return results\n },\n }\n\n return builder\n}\n\n/**\n * Process a yielded value:\n * - { declare: [...] } = declare all sub-steps upfront (show as pending)\n * - string = start/create a sub-step with that label\n * - { current, total } = update progress on current sub-step\n */\nfunction processYield(value: StepYield, state: GeneratorState, multi: MultiProgress): void {\n // Handle declaration of all sub-steps upfront\n if (isDeclareSteps(value)) {\n for (const label of value.declare) {\n const handle = multi.add(label, {\n type: \"spinner\",\n indent: 1,\n insertAfter: state.lastInsertId,\n })\n state.lastInsertId = handle.id\n state.declaredSteps.set(label, handle)\n }\n return\n }\n\n if (typeof value === \"string\") {\n // String = start a sub-step with this label\n if (state.currentHandle && state.currentLabel) {\n const elapsed = Date.now() - state.subStepStartTime\n state.currentHandle.complete(elapsed)\n }\n\n state.currentLabel = value\n state.subStepStartTime = Date.now()\n\n // Use pre-declared handle if available, otherwise create new one\n const declared = state.declaredSteps.get(value)\n if (declared) {\n state.currentHandle = declared\n state.currentHandle.start()\n } else {\n state.currentHandle = multi.add(value, {\n type: \"spinner\",\n indent: 1,\n insertAfter: state.lastInsertId,\n })\n state.lastInsertId = state.currentHandle.id\n state.currentHandle.start()\n }\n } else if (value && typeof value === \"object\") {\n // Object = progress update on current sub-step\n const { current, total } = value as ProgressUpdate\n if (state.currentHandle && total && total > 0) {\n state.currentHandle.setTitle(`${state.currentLabel} (${current ?? 0}/${total})`)\n }\n }\n}\n\nfunction isDeclareSteps(value: StepYield): value is DeclareSteps {\n return (\n value !== null &&\n typeof value === \"object\" &&\n \"declare\" in value &&\n Array.isArray((value as DeclareSteps).declare)\n )\n}\n\n/** State for generator processing */\ninterface GeneratorState {\n currentLabel: string | undefined\n currentHandle: TaskHandle | null\n lastInsertId: string\n subStepStartTime: number\n startTime: number\n /** Pre-declared sub-steps (pending until started) */\n declaredSteps: Map<string, TaskHandle>\n}\n\n/**\n * Run an async generator step\n */\nasync function runAsyncGenerator<T>(\n gen: AsyncGenerator<StepYield, T, unknown>,\n parentHandle: TaskHandle,\n parentTitle: string,\n multi: MultiProgress,\n): Promise<T> {\n const state: GeneratorState = {\n currentLabel: undefined,\n currentHandle: null,\n lastInsertId: parentHandle.id,\n subStepStartTime: Date.now(),\n startTime: Date.now(),\n declaredSteps: new Map(),\n }\n\n let result = await gen.next()\n\n while (!result.done) {\n processYield(result.value, state, multi)\n\n // Yield to event loop for animation\n await new Promise((resolve) => setTimeout(resolve, 0))\n\n result = await gen.next()\n }\n\n // Complete final sub-step\n if (state.currentHandle && state.currentLabel) {\n const elapsed = Date.now() - state.subStepStartTime\n state.currentHandle.complete(elapsed)\n }\n\n // Complete parent step\n const totalElapsed = Date.now() - state.startTime\n parentHandle.complete(totalElapsed)\n\n return result.value\n}\n\n/**\n * Run a sync generator step\n */\nasync function runSyncGenerator<T>(\n gen: Generator<StepYield, T, unknown>,\n parentHandle: TaskHandle,\n parentTitle: string,\n multi: MultiProgress,\n): Promise<T> {\n const state: GeneratorState = {\n currentLabel: undefined,\n currentHandle: null,\n lastInsertId: parentHandle.id,\n subStepStartTime: Date.now(),\n startTime: Date.now(),\n declaredSteps: new Map(),\n }\n\n let result = gen.next()\n\n while (!result.done) {\n processYield(result.value, state, multi)\n\n // Yield to event loop for animation\n await new Promise((resolve) => setTimeout(resolve, 0))\n\n result = gen.next()\n }\n\n // Complete final sub-step\n if (state.currentHandle && state.currentLabel) {\n const elapsed = Date.now() - state.subStepStartTime\n state.currentHandle.complete(elapsed)\n }\n\n // Complete parent step\n const totalElapsed = Date.now() - state.startTime\n parentHandle.complete(totalElapsed)\n\n return result.value\n}\n\nfunction isAsyncGenerator(value: unknown): value is AsyncGenerator<StepYield, unknown, unknown> {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as AsyncGenerator).next === \"function\" &&\n typeof (value as AsyncGenerator)[Symbol.asyncIterator] === \"function\"\n )\n}\n\nfunction isSyncGenerator(value: unknown): value is Generator<StepYield, unknown, unknown> {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as Generator).next === \"function\" &&\n typeof (value as Generator)[Symbol.iterator] === \"function\"\n )\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as PromiseLike<unknown>).then === \"function\"\n )\n}\n","/**\n * Fluent single-task wrapper\n *\n * @deprecated Use `steps()` from `@silvery/ag-react/ui/progress` instead.\n *\n * @example\n * ```typescript\n * // OLD (deprecated):\n * import { task } from \"./index\";\n * const data = await task(\"Loading data\").wrap(fetchData());\n *\n * // NEW:\n * import { steps } from \"./index\";\n * const results = await steps({ loadData: fetchData }).run();\n * ```\n */\n\nimport type { ProgressInfo } from \"../types.js\"\nimport { createSpinner } from \"../cli/spinner\"\n\n/** Phase labels for common operations */\nconst PHASE_LABELS: Record<string, string> = {\n reading: \"Reading events\",\n applying: \"Applying events\",\n rules: \"Evaluating rules\",\n scanning: \"Scanning files\",\n reconciling: \"Reconciling changes\",\n board: \"Building view\",\n}\n\nexport interface TaskWrapper {\n /**\n * Wrap work with a spinner indicator\n * @param work - Promise, function, or generator\n */\n wrap<T>(\n work:\n | T\n | PromiseLike<T>\n | (() => T | PromiseLike<T>)\n | (() => Generator<ProgressInfo, T, unknown>),\n ): Promise<T>\n}\n\n/**\n * Create a task wrapper with spinner\n *\n * @param title - Display title for the task\n * @returns TaskWrapper with wrap() method\n */\nexport function task(title: string): TaskWrapper {\n return {\n async wrap<T>(\n work:\n | T\n | PromiseLike<T>\n | (() => T | PromiseLike<T>)\n | (() => Generator<ProgressInfo, T, unknown>),\n ): Promise<T> {\n const spinner = createSpinner()\n spinner(title)\n\n try {\n // If it's a function, call it\n if (typeof work === \"function\") {\n const result = (work as () => unknown)()\n\n // Check if it's a generator\n if (isGenerator(result)) {\n return await runGenerator(result as Generator<ProgressInfo, T, unknown>, spinner, title)\n }\n\n // Check if it's a promise\n if (isPromiseLike(result)) {\n const value = await result\n spinner.succeed(title)\n return value as T\n }\n\n // Sync function\n spinner.succeed(title)\n return result as T\n }\n\n // If it's a promise-like, await it\n if (isPromiseLike(work)) {\n const value = await work\n spinner.succeed(title)\n return value as T\n }\n\n // Otherwise it's a direct value\n spinner.succeed(title)\n return work as T\n } catch (error) {\n spinner.fail(title)\n throw error\n }\n },\n }\n}\n\n/**\n * Run a generator with progress updates\n */\nasync function runGenerator<T>(\n gen: Generator<ProgressInfo, T, unknown>,\n spinner: ReturnType<typeof createSpinner>,\n baseTitle: string,\n): Promise<T> {\n let result = gen.next()\n\n while (!result.done) {\n const info = result.value\n const phase = info.phase ?? \"\"\n const phaseLabel = PHASE_LABELS[phase] ?? (phase || baseTitle)\n\n // Update spinner with phase and progress count\n if (info.total && info.total > 0) {\n spinner(`${phaseLabel} (${info.current}/${info.total})`)\n } else {\n spinner(phaseLabel)\n }\n\n // Yield to event loop for animation\n await new Promise((resolve) => setImmediate(resolve))\n\n result = gen.next()\n }\n\n spinner.succeed(baseTitle)\n return result.value\n}\n\nfunction isGenerator(value: unknown): value is Generator<ProgressInfo, unknown, unknown> {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as Generator).next === \"function\" &&\n typeof (value as Generator).throw === \"function\"\n )\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as PromiseLike<unknown>).then === \"function\"\n )\n}\n","/**\n * Fluent sequential task builder\n *\n * @deprecated Use `steps()` from `@silvery/ag-react/ui/progress` instead.\n *\n * @example\n * ```typescript\n * // OLD (deprecated):\n * import { tasks } from \"./index\";\n * const results = await tasks()\n * .add(\"Loading\", loadModules)\n * .add(\"Processing\", processData)\n * .run({ clear: true });\n *\n * // NEW:\n * import { steps } from \"./index\";\n * const results = await steps({\n * loadModules,\n * processData,\n * }).run({ clear: true });\n * ```\n */\n\nimport type { ProgressInfo } from \"../types.js\"\nimport { MultiProgress, type TaskHandle } from \"../cli/multi-progress\"\n\n// Node.js globals for yielding to event loop\ndeclare function setImmediate(callback: (value?: unknown) => void): unknown\ndeclare function setTimeout(callback: (value?: unknown) => void, ms: number): unknown\n\n/** Phase labels for common operations */\nconst PHASE_LABELS: Record<string, string> = {\n // Repo loading phases\n discover: \"Discovering files\",\n parse: \"Parsing markdown\",\n apply: \"Applying changes\",\n resolve: \"Resolving links\",\n materialize: \"Evaluating rules\",\n // Board building\n board: \"Building view\",\n // Legacy/alternative names\n reading: \"Reading events\",\n applying: \"Applying events\",\n rules: \"Evaluating rules\",\n scanning: \"Scanning files\",\n reconciling: \"Reconciling changes\",\n}\n\n/** Task definition */\ninterface TaskDef<T = unknown> {\n title: string\n work: () => T | PromiseLike<T> | Generator<ProgressInfo, T, unknown>\n}\n\n/** Options for run() */\nexport interface RunOptions {\n /** Clear progress display after completion (default: false) */\n clear?: boolean\n}\n\nexport interface TaskBuilder {\n /**\n * Add a task to the sequence\n * @param title - Display title\n * @param work - Function, async function, or generator\n */\n add<T>(\n title: string,\n work: () => T | PromiseLike<T> | Generator<ProgressInfo, T, unknown>,\n ): TaskBuilder\n\n /**\n * Run all tasks in sequence\n * @param options - Run options\n * @returns Results keyed by task title\n */\n run(options?: RunOptions): Promise<Record<string, unknown>>\n}\n\n/**\n * Create a sequential task builder\n *\n * @returns TaskBuilder with add() and run() methods\n */\nexport function tasks(): TaskBuilder {\n const taskList: TaskDef[] = []\n\n const builder: TaskBuilder = {\n add<T>(\n title: string,\n work: () => T | PromiseLike<T> | Generator<ProgressInfo, T, unknown>,\n ): TaskBuilder {\n taskList.push({ title, work })\n return builder\n },\n\n async run(options?: RunOptions): Promise<Record<string, unknown>> {\n const multi = new MultiProgress()\n const handles = new Map<string, TaskHandle>()\n const results: Record<string, unknown> = {}\n\n // Register all tasks upfront (shows pending state)\n for (const task of taskList) {\n handles.set(task.title, multi.add(task.title, { type: \"spinner\" }))\n }\n\n multi.start()\n\n try {\n for (const task of taskList) {\n const handle = handles.get(task.title)!\n\n // Force render before potentially blocking operation\n await new Promise((resolve) => setImmediate(resolve))\n\n const result = task.work()\n\n if (isGenerator(result)) {\n // Generator: parent stays static, phases animate underneath\n results[task.title] = await runGenerator(result, handle, task.title, multi)\n } else if (isPromiseLike(result)) {\n handle.start()\n results[task.title] = await result\n handle.complete()\n } else {\n handle.start()\n results[task.title] = result\n handle.complete()\n }\n }\n } finally {\n multi.stop(options?.clear ?? false)\n }\n\n return results\n },\n }\n\n return builder\n}\n\n/**\n * Run a generator task with progress updates\n * Parent task stays visible while sub-phases are indented below\n */\nasync function runGenerator<T>(\n gen: Generator<ProgressInfo, T, unknown>,\n parentHandle: TaskHandle,\n baseTitle: string,\n multi: MultiProgress,\n): Promise<T> {\n let result = gen.next()\n let currentPhase: string | undefined\n let currentPhaseHandle: TaskHandle | null = null\n let lastInsertId = parentHandle.id // Insert phases after parent (then after each other)\n let phaseStartTime = Date.now()\n const taskStartTime = Date.now()\n\n while (!result.done) {\n const info = result.value\n const phase = info.phase ?? \"\"\n\n // When phase changes, complete current phase and start new one (indented)\n if (phase && phase !== currentPhase) {\n if (currentPhaseHandle && currentPhase) {\n // Complete previous phase with timing\n const elapsed = Date.now() - phaseStartTime\n const prevLabel = PHASE_LABELS[currentPhase] ?? currentPhase\n currentPhaseHandle.complete(`${prevLabel} (${elapsed}ms)`)\n }\n\n // Start new phase line (indented under parent, inserted after last phase)\n currentPhase = phase\n phaseStartTime = Date.now()\n const phaseLabel = PHASE_LABELS[phase] ?? phase\n currentPhaseHandle = multi.add(phaseLabel, {\n type: \"spinner\",\n indent: 1,\n insertAfter: lastInsertId,\n })\n lastInsertId = currentPhaseHandle.id\n currentPhaseHandle.start()\n }\n\n // Update progress count on current phase line\n if (currentPhaseHandle && info.total && info.total > 0) {\n const phaseLabel = PHASE_LABELS[phase] ?? phase\n currentPhaseHandle.setTitle(`${phaseLabel} (${info.current}/${info.total})`)\n }\n\n // Yield to event loop for animation\n await new Promise((resolve) => setTimeout(resolve, 0))\n\n result = gen.next()\n }\n\n // Complete final phase\n if (currentPhaseHandle && currentPhase) {\n const elapsed = Date.now() - phaseStartTime\n const finalLabel = PHASE_LABELS[currentPhase] ?? currentPhase\n currentPhaseHandle.complete(`${finalLabel} (${elapsed}ms)`)\n }\n\n // Complete parent task with total timing\n const totalElapsed = Date.now() - taskStartTime\n parentHandle.complete(`${baseTitle} (${totalElapsed}ms)`)\n\n return result.value\n}\n\nfunction isGenerator(value: unknown): value is Generator<ProgressInfo, unknown, unknown> {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as Generator).next === \"function\" &&\n typeof (value as Generator).throw === \"function\"\n )\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as PromiseLike<unknown>).then === \"function\"\n )\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useLatest-Bg2x4bfP.d.mts","names":[],"sources":["../packages/ag-react/src/ui/animation/easing.ts","../packages/ag-react/src/ui/animation/useAnimation.ts","../packages/ag-react/src/ui/animation/useTransition.ts","../packages/ag-react/src/ui/animation/useInterval.ts","../packages/ag-react/src/ui/animation/useTimeout.ts","../packages/ag-react/src/ui/animation/useLatest.ts"],"mappings":";;AAYA;;;;;AAMA;AAAA,KANY,QAAA,IAAY,CAAA;AAAA,cAMX,OAAA;EAAA;;;;;;;;KAUD,UAAA,gBAA0B,OAAA;;iBAOtB,aAAA,CAAc,MAAA,EAAQ,UAAA,GAAa,QAAA,GAAW,QAAA;;;UCpB7C,mBAAA;EDW4B;ECT3C,QAAA;;EAEA,MAAA,GAAS,UAAA,GAAa,QAAA;;EAEtB,KAAA;;EAEA,UAAA;;EAEA,OAAA;AAAA;AAAA,UAGe,kBAAA;;EAEf,KAAA;;EAEA,WAAA;EDPwB;ECSxB,KAAA;AAAA;;;;ADCF;;;;;;;;iBCwBgB,YAAA,CAAa,OAAA,EAAS,mBAAA,GAAsB,kBAAA;;;UC5C3C,oBAAA;EFW4B;EET3C,QAAA;;EAEA,MAAA,GAAS,UAAA,GAAa,QAAA;AAAA;;;;;;;;;;;;;AFSxB;;;iBEoBgB,aAAA,CAAc,WAAA,UAAqB,OAAA,GAAU,oBAAA;;;;AFpC7D;;;;;AAMA;;;;;;;;;;AAAA,iBGKgB,WAAA,CAAY,QAAA,cAAsB,EAAA,UAAY,OAAA;;;;AHX9D;;;;;AAMA;;;;;;;;;;;;;iBIQgB,UAAA,CACd,QAAA,cACA,EAAA,UACA,OAAA;EACG,KAAA;EAAmB,KAAA;AAAA;;;;AJlBxB;;;;;AAMA;;;;;;;;;;;;;;;;;iBKYgB,SAAA,GAAA,CAAa,KAAA,EAAO,CAAA;EAAA,SAAe,OAAA,EAAS,CAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"with-text-input-CRfoiFFG.d.mts","names":[],"sources":["../packages/ag-react/src/ui/wrappers/with-spinner.ts","../packages/ag-react/src/ui/wrappers/with-progress.ts","../packages/ag-react/src/ui/wrappers/wrap-generator.ts","../packages/ag-react/src/ui/wrappers/wrap-emitter.ts","../packages/ag-react/src/ui/wrappers/with-select.ts","../packages/ag-react/src/ui/wrappers/with-text-input.ts"],"mappings":";;;;;AA6BA;;;;;;;;;;;;;;;;;;;;;;AAAA,iBAAsB,WAAA,GAAA,CACpB,OAAA,EAAS,OAAA,CAAQ,CAAA,WAAY,CAAA,GAAI,OAAA,CAAQ,CAAA,IACzC,IAAA,aAAiB,cAAA,sBACjB,OAAA,GAAS,kBAAA,GACR,OAAA,CAAQ,CAAA;;;;;;AAmDX;;;;;;;iBAAgB,aAAA,GAAA,CACd,OAAA,EAAS,OAAA,CAAQ,CAAA,GACjB,IAAA,UACA,OAAA,GAAS,kBAAA,IACP,OAAA,CAAQ,CAAA,GAAI,OAAA;;;;;;;;;;;;;;;;AAJhB;;;;;;;;;;;;;;;;;;;;iBCnBsB,YAAA,GAAA,CACpB,EAAA,GAAK,UAAA,EAAY,gBAAA,KAAqB,CAAA,GAAI,OAAA,CAAQ,CAAA,GAClD,OAAA,GAAS,mBAAA,GACR,OAAA,CAAQ,CAAA;;;;;;AAHX;;;;;;;;;iBAsIgB,sBAAA,CACd,OAAA,GAAS,mBAAA,IACP,gBAAA;;;;AD5KJ;;;;;;;;;;;;;;;;;iBEHsB,aAAA,GAAA,CACpB,SAAA,EAAW,iBAAA,CAAkB,CAAA,GAC7B,YAAA,aAAyB,QAAA;EAAY,OAAA;EAAiB,KAAA;AAAA,eACtD,OAAA;EAAW,eAAA;AAAA,IACV,OAAA,CAAQ,CAAA;;;;;;AFsDX;;;;;;iBEeuB,oBAAA,GAAA,CACrB,QAAA,EAAU,QAAA,CAAS,CAAA,IAAK,aAAA,CAAc,CAAA,GACtC,KAAA,UACA,OAAA;EAAW,eAAA;AAAA,IACV,cAAA,CAAe,CAAA;;;;UC/FR,WAAA;EHqBuB;EGnB/B,IAAA;EHoBiB;EGlBjB,OAAA,IAAW,IAAA;EHkBkB;EGhB7B,OAAA;EHgBiC;EGdjC,IAAA;EHiBS;EGfT,IAAA;AAAA;;UAIQ,iBAAA;EHQC;EGNT,MAAA,EAAQ,MAAA,SAAe,WAAA;EHMM;EGJ7B,WAAA;AAAA;;;;;;;;;;AH0DF;;;;;;;;;;iBGpCgB,WAAA,CAAY,OAAA,EAAS,YAAA,EAAc,MAAA,EAAQ,iBAAA;;;;;;;;;;iBA0DrC,YAAA,CACpB,OAAA,EAAS,YAAA,EACT,SAAA,UACA,IAAA,UACA,OAAA;EACE,UAAA;EACA,OAAA;AAAA,IAED,OAAA;;;;AHrFH;;;;;;;;;;;;;;;;;;;iBIOsB,UAAA,GAAA,CACpB,MAAA,UACA,OAAA,EAAS,YAAA,CAAa,CAAA,KACtB,aAAA,GAAe,iBAAA,GACd,OAAA,CAAQ,CAAA;;;;;;;;;AJ4CX;;;;;iBIgHgB,YAAA,CACd,cAAA,GAAgB,iBAAA,OACX,MAAA,UAAgB,OAAA,EAAS,YAAA,CAAa,CAAA,KAAM,SAAA,GAAY,iBAAA,KAAsB,OAAA,CAAQ,CAAA;;;;AJzK7F;;;;;;;;;;;;;;;;;;;;;iBKQsB,aAAA,CACpB,MAAA,UACA,OAAA,GAAS,gBAAA,GACR,OAAA;;;;;;;AL4CH;;;;;;iBKkNgB,eAAA,CAAgB,MAAA,UAAgB,OAAA,GAAS,gBAAA,GAAwB,iBAAA;;UA0EhE,iBAAA;ELxRM;EK0RrB,KAAA;EL9R4B;EKgS5B,cAAA;EL/RiB;EKiSjB,MAAA;ELhSA;EKkSA,MAAA,CAAO,IAAA;ELjSP;EKmSA,SAAA;ELlSU;EKoSV,MAAA;ELpSqB;EKsSrB,KAAA;;EAEA,gBAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"wrappers-UTADQkSY.mjs","names":[],"sources":["../packages/ag-react/src/ui/wrappers/with-spinner.ts","../packages/ag-react/src/ui/wrappers/with-progress.ts","../packages/ag-react/src/ui/wrappers/wrap-generator.ts","../packages/ag-react/src/ui/wrappers/wrap-emitter.ts","../packages/ag-react/src/ui/wrappers/with-select.ts","../packages/ag-react/src/ui/wrappers/with-text-input.ts"],"sourcesContent":["/**\n * withSpinner - Wrap promises with an animated spinner\n */\n\nimport type { WithSpinnerOptions } from \"../types.js\"\nimport { Spinner } from \"../cli/spinner\"\n\n/**\n * Wrap a promise with an animated spinner\n *\n * @example\n * ```ts\n * // Simple usage\n * const data = await withSpinner(fetchData(), \"Loading data...\");\n *\n * // With options\n * const result = await withSpinner(\n * processFiles(),\n * \"Processing...\",\n * { style: \"arc\", clearOnComplete: true }\n * );\n *\n * // With dynamic text\n * const result = await withSpinner(\n * longOperation(),\n * (elapsed) => `Processing... (${elapsed}s)`\n * );\n * ```\n */\nexport async function withSpinner<T>(\n promise: Promise<T> | (() => T | Promise<T>),\n text: string | ((elapsedSeconds: number) => string),\n options: WithSpinnerOptions = {},\n): Promise<T> {\n const spinner = new Spinner({\n text: typeof text === \"string\" ? text : text(0),\n style: options.style,\n color: options.color,\n })\n\n let timer: ReturnType<typeof setInterval> | null = null\n const startTime = Date.now()\n\n spinner.start()\n\n // Update text if dynamic\n if (typeof text === \"function\") {\n timer = setInterval(() => {\n const elapsed = Math.floor((Date.now() - startTime) / 1000)\n spinner.currentText = text(elapsed)\n }, 1000)\n }\n\n try {\n const result = await (typeof promise === \"function\" ? promise() : promise)\n\n if (timer) clearInterval(timer)\n\n if (options.clearOnComplete) {\n spinner.stop()\n } else {\n spinner.succeed()\n }\n\n return result\n } catch (error) {\n if (timer) clearInterval(timer)\n spinner.fail(error instanceof Error ? error.message : \"Failed\")\n throw error\n }\n}\n\n/**\n * Attach a spinner to a promise for manual control\n * Returns [result, spinner] tuple for custom control\n *\n * @example\n * ```ts\n * const [promise, spinner] = attachSpinner(fetchData(), \"Loading...\");\n * spinner.text = \"Still loading...\";\n * const result = await promise;\n * spinner.succeed(\"Loaded!\");\n * ```\n */\nexport function attachSpinner<T>(\n promise: Promise<T>,\n text: string,\n options: WithSpinnerOptions = {},\n): [Promise<T>, Spinner] {\n const spinner = new Spinner({\n text,\n style: options.style,\n color: options.color,\n })\n\n spinner.start()\n\n async function wrapPromise(): Promise<T> {\n try {\n return await promise\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : \"Failed\")\n throw error\n }\n }\n\n return [wrapPromise(), spinner]\n}\n","/**\n * withProgress - Wrap callback-based progress functions\n *\n * @deprecated Use `steps()` from `@silvery/ag-react/ui/progress` instead.\n *\n * @example\n * ```typescript\n * // OLD (deprecated):\n * import { withProgress } from \"./index\";\n * const result = await withProgress(\n * (onProgress) => manager.syncFromFs(onProgress),\n * { phases: SYNC_PHASES }\n * );\n *\n * // NEW:\n * import { steps } from \"../progress/index\";\n * const results = await steps({ syncFiles: () => manager.syncFromFs() }).run();\n * ```\n */\n\nimport type { ProgressInfo, ProgressCallback, WithProgressOptions } from \"../types.js\"\nimport { ProgressBar } from \"../cli/progress-bar\"\nimport { Spinner } from \"../cli/spinner\"\nimport { CURSOR_HIDE, CURSOR_SHOW, write, isTTY } from \"../cli/ansi\"\n\n// Declare timer globals (not exposed by bun-types)\ndeclare function setTimeout(callback: () => void, ms: number): unknown\ndeclare function clearTimeout(id: unknown): void\n\n// Timer type - opaque handle, we only store and clear it\ntype TimerId = unknown\n\n/**\n * Wrap a function that takes a progress callback\n *\n * @example\n * ```ts\n * // Wrap existing km sync API\n * const result = await withProgress(\n * (onProgress) => manager.syncFromFs(onProgress),\n * {\n * phases: {\n * scanning: \"Scanning files\",\n * reconciling: \"Reconciling changes\",\n * rules: \"Evaluating rules\"\n * }\n * }\n * );\n *\n * // Simple usage without phases\n * await withProgress((onProgress) => rebuildState(onProgress));\n *\n * // With custom format\n * await withProgress(\n * (p) => processFiles(p),\n * { format: \":phase :bar :percent\" }\n * );\n *\n * // Show loading immediately (showAfter: 0) or after delay\n * await withProgress(\n * (p) => slowOperation(p),\n * { showAfter: 1000, initialMessage: \"Loading...\" }\n * );\n * ```\n */\nexport async function withProgress<T>(\n fn: (onProgress: ProgressCallback) => T | Promise<T>,\n options: WithProgressOptions = {},\n): Promise<T> {\n const stream = process.stdout\n const isTty = isTTY(stream)\n\n // Determine format\n const format =\n options.format ??\n (options.phases ? \":phase [:bar] :current/:total\" : \"[:bar] :current/:total :percent\")\n\n const bar = new ProgressBar({\n format,\n phases: options.phases ?? {},\n hideCursor: true,\n })\n\n let lastPhase: string | null = null\n let started = false\n\n // Initial spinner (shown before progress starts)\n const showAfter = options.showAfter ?? 1000\n const initialMessage = options.initialMessage ?? \"Loading...\"\n let spinner: Spinner | null = null\n let spinnerTimerId: TimerId | null = null\n\n // Hide cursor\n if (isTty) {\n write(CURSOR_HIDE, stream)\n }\n\n // Schedule initial spinner if configured\n if (isTty && showAfter >= 0) {\n spinnerTimerId = setTimeout(() => {\n if (!started) {\n spinner = new Spinner({ text: initialMessage })\n spinner.start()\n }\n }, showAfter)\n }\n\n const onProgress: ProgressCallback = (info: ProgressInfo) => {\n // Stop initial spinner if it was shown\n if (spinner) {\n spinner.stop()\n spinner = null\n }\n if (spinnerTimerId !== null) {\n clearTimeout(spinnerTimerId)\n spinnerTimerId = null\n }\n\n // Handle phase transitions\n if (info.phase && info.phase !== lastPhase) {\n if (lastPhase !== null && isTty) {\n // Print newline before switching phases\n write(\"\\n\", stream)\n }\n lastPhase = info.phase\n\n // Start or update bar with new phase\n if (!started) {\n bar.start(info.current, info.total)\n started = true\n }\n bar.setPhase(info.phase, { current: info.current, total: info.total })\n } else {\n if (!started) {\n bar.start(info.current, info.total)\n started = true\n }\n bar.update(info.current)\n }\n }\n\n try {\n const result = await fn(onProgress)\n\n // Clean up spinner if still pending\n if (spinnerTimerId !== null) {\n clearTimeout(spinnerTimerId)\n }\n // Note: spinner may be set by setTimeout callback - TS can't track this\n const pendingSpinner = spinner as unknown as Spinner | null\n if (pendingSpinner) {\n pendingSpinner.stop()\n }\n\n // Stop and show cursor\n if (started) {\n bar.stop(options.clearOnComplete)\n }\n if (isTty) {\n write(CURSOR_SHOW, stream)\n }\n\n return result\n } catch (error) {\n // Clean up spinner\n if (spinnerTimerId !== null) {\n clearTimeout(spinnerTimerId)\n }\n // Note: spinner may be set by setTimeout callback - TS can't track this\n const errorSpinner = spinner as unknown as Spinner | null\n if (errorSpinner) {\n errorSpinner.stop()\n }\n\n // Restore cursor on error\n if (started) {\n bar.stop()\n }\n if (isTty) {\n write(CURSOR_SHOW, stream)\n }\n throw error\n }\n}\n\n/**\n * Create a progress callback that can be passed to existing APIs\n * Returns [callback, complete] tuple\n *\n * @example\n * ```ts\n * const [onProgress, complete] = createProgressCallback({\n * phases: { scanning: \"Scanning\", reconciling: \"Reconciling\" }\n * });\n *\n * const result = await manager.syncFromFs(onProgress);\n * complete();\n * ```\n */\nexport function createProgressCallback(\n options: WithProgressOptions = {},\n): [ProgressCallback, () => void] {\n const stream = process.stdout\n const isTty = isTTY(stream)\n\n const format =\n options.format ??\n (options.phases ? \":phase [:bar] :current/:total\" : \"[:bar] :current/:total :percent\")\n\n const bar = new ProgressBar({\n format,\n phases: options.phases ?? {},\n hideCursor: true,\n })\n\n let lastPhase: string | null = null\n let started = false\n\n if (isTty) {\n write(CURSOR_HIDE, stream)\n }\n\n const callback: ProgressCallback = (info: ProgressInfo) => {\n if (info.phase && info.phase !== lastPhase) {\n if (lastPhase !== null && isTty) {\n write(\"\\n\", stream)\n }\n lastPhase = info.phase\n\n if (!started) {\n bar.start(info.current, info.total)\n started = true\n }\n bar.setPhase(info.phase, { current: info.current, total: info.total })\n } else {\n if (!started) {\n bar.start(info.current, info.total)\n started = true\n }\n bar.update(info.current)\n }\n }\n\n const complete = () => {\n if (started) {\n bar.stop(options.clearOnComplete)\n }\n if (isTty) {\n write(CURSOR_SHOW, stream)\n }\n }\n\n return [callback, complete]\n}\n","/**\n * wrapGenerator - Consume a generator while showing progress\n */\n\nimport type { ProgressGenerator } from \"../types.js\"\nimport { ProgressBar } from \"../cli/progress-bar\"\nimport { CURSOR_HIDE, CURSOR_SHOW, write, isTTY } from \"../cli/ansi\"\n\n/**\n * Consume a progress generator while displaying progress\n *\n * @example\n * ```ts\n * // Wrap existing generator (like evaluateAllRules())\n * await wrapGenerator(evaluateAllRules(), \"Evaluating rules\");\n *\n * // With custom format\n * await wrapGenerator(\n * processItems(),\n * ({ current, total }) => `Processing: ${current}/${total}`\n * );\n *\n * // Get the generator's return value\n * const result = await wrapGenerator(generatorWithReturn(), \"Processing\");\n * ```\n */\nexport async function wrapGenerator<T>(\n generator: ProgressGenerator<T>,\n textOrFormat: string | ((progress: { current: number; total: number }) => string),\n options: { clearOnComplete?: boolean } = {},\n): Promise<T> {\n const stream = process.stdout\n const isTty = isTTY(stream)\n\n const isCustomFormat = typeof textOrFormat === \"function\"\n const label = isCustomFormat ? \"\" : textOrFormat\n\n const bar = new ProgressBar({\n format: label ? `${label} [:bar] :current/:total :percent` : \":bar :current/:total :percent\",\n hideCursor: true,\n })\n\n if (isTty) {\n write(CURSOR_HIDE, stream)\n }\n\n let started = false\n let result: IteratorResult<{ current: number; total: number }, T>\n\n try {\n // Consume the generator\n while (true) {\n result = generator.next()\n\n if (result.done) {\n break\n }\n\n const { current, total } = result.value\n\n if (!started) {\n bar.start(current, total)\n started = true\n } else {\n bar.update(current)\n }\n }\n\n // Stop bar\n if (started) {\n bar.stop(options.clearOnComplete)\n }\n if (isTty) {\n write(CURSOR_SHOW, stream)\n }\n\n return result.value\n } catch (error) {\n if (started) {\n bar.stop()\n }\n if (isTty) {\n write(CURSOR_SHOW, stream)\n }\n throw error\n }\n}\n\n/**\n * Create an async iterable wrapper that shows progress\n *\n * @example\n * ```ts\n * const items = [1, 2, 3, 4, 5];\n * for await (const item of withIterableProgress(items, \"Processing\")) {\n * await processItem(item);\n * }\n * ```\n */\nexport async function* withIterableProgress<T>(\n iterable: Iterable<T> | AsyncIterable<T>,\n label: string,\n options: { clearOnComplete?: boolean } = {},\n): AsyncGenerator<T, void, unknown> {\n const stream = process.stdout\n const isTty = isTTY(stream)\n\n // Try to get length if array\n const items = Array.isArray(iterable) ? iterable : null\n const total = items?.length ?? 0\n\n const bar = new ProgressBar({\n format: `${label} [:bar] :current/:total :percent`,\n total,\n hideCursor: true,\n })\n\n if (isTty) {\n write(CURSOR_HIDE, stream)\n }\n\n let current = 0\n bar.start(0, total)\n\n try {\n for await (const item of iterable as AsyncIterable<T>) {\n yield item\n current++\n bar.update(current)\n }\n\n bar.stop(options.clearOnComplete)\n if (isTty) {\n write(CURSOR_SHOW, stream)\n }\n } catch (error) {\n bar.stop()\n if (isTty) {\n write(CURSOR_SHOW, stream)\n }\n throw error\n }\n}\n","/**\n * wrapEmitter - Track EventEmitter state changes with progress indicators\n */\n\nimport type { EventEmitter } from \"events\"\nimport { Spinner } from \"../cli/spinner\"\n\n/** Event handler configuration */\ninterface EventConfig {\n /** Display text for this event */\n text?: string\n /** Dynamic text based on event data */\n getText?: (data: unknown) => string\n /** Mark spinner as succeeded */\n succeed?: boolean\n /** Mark spinner as failed */\n fail?: boolean\n /** Stop tracking */\n stop?: boolean\n}\n\n/** Configuration for wrapEmitter */\ninterface WrapEmitterConfig {\n /** Event handlers */\n events: Record<string, EventConfig>\n /** Initial text */\n initialText?: string\n}\n\n/**\n * Track EventEmitter state changes with a spinner\n *\n * @example\n * ```ts\n * const stop = wrapEmitter(syncManager, {\n * initialText: \"Starting sync...\",\n * events: {\n * 'ready': { text: \"Watcher ready\", succeed: true },\n * 'state-change': { getText: (s) => `State: ${s}` },\n * 'error': { fail: true },\n * 'idle': { stop: true }\n * }\n * });\n *\n * // Later, to stop manually\n * stop();\n * ```\n */\nexport function wrapEmitter(emitter: EventEmitter, config: WrapEmitterConfig): () => void {\n const spinner = new Spinner(config.initialText ?? \"\")\n const handlers: Map<string, (...args: unknown[]) => void> = new Map()\n\n spinner.start()\n\n // Set up event handlers\n for (const [eventName, eventConfig] of Object.entries(config.events)) {\n const handler = (data: unknown) => {\n // Update text\n if (eventConfig.getText) {\n spinner.currentText = eventConfig.getText(data)\n } else if (eventConfig.text) {\n spinner.currentText = eventConfig.text\n }\n\n // Handle terminal states\n if (eventConfig.succeed) {\n spinner.succeed()\n cleanup()\n } else if (eventConfig.fail) {\n const message = data instanceof Error ? data.message : String(data ?? \"Failed\")\n spinner.fail(message)\n cleanup()\n } else if (eventConfig.stop) {\n spinner.stop()\n cleanup()\n }\n }\n\n handlers.set(eventName, handler)\n emitter.on(eventName, handler)\n }\n\n // Cleanup function\n function cleanup() {\n for (const [eventName, handler] of handlers) {\n emitter.off(eventName, handler)\n }\n handlers.clear()\n }\n\n // Return stop function\n return () => {\n spinner.stop()\n cleanup()\n }\n}\n\n/**\n * Wait for an EventEmitter to emit a specific event\n * Shows a spinner while waiting\n *\n * @example\n * ```ts\n * await waitForEvent(syncManager, \"ready\", \"Waiting for watcher...\");\n * ```\n */\nexport async function waitForEvent(\n emitter: EventEmitter,\n eventName: string,\n text: string,\n options: {\n errorEvent?: string\n timeout?: number\n } = {},\n): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const spinner = new Spinner(text)\n spinner.start()\n\n let timer: ReturnType<typeof setTimeout> | null = null\n\n const cleanup = () => {\n emitter.off(eventName, successHandler)\n if (options.errorEvent) {\n emitter.off(options.errorEvent, errorHandler)\n }\n if (timer) {\n clearTimeout(timer)\n }\n }\n\n const successHandler = (data: unknown) => {\n cleanup()\n spinner.succeed()\n resolve(data)\n }\n\n const errorHandler = (error: unknown) => {\n cleanup()\n spinner.fail(error instanceof Error ? error.message : \"Error\")\n reject(error instanceof Error ? error : new Error(String(error)))\n }\n\n emitter.once(eventName, successHandler)\n\n if (options.errorEvent) {\n emitter.once(options.errorEvent, errorHandler)\n }\n\n if (options.timeout) {\n timer = setTimeout(() => {\n cleanup()\n spinner.fail(\"Timeout\")\n reject(new Error(`Timeout waiting for ${eventName}`))\n }, options.timeout)\n }\n })\n}\n","/**\n * withSelect - Interactive CLI selection list\n */\n\nimport chalk from \"@silvery/ink/chalk\"\nimport type { SelectOption, WithSelectOptions } from \"../types.js\"\nimport {\n CURSOR_HIDE,\n CURSOR_SHOW,\n CURSOR_TO_START,\n CLEAR_LINE_END,\n cursorUp,\n write,\n isTTY,\n} from \"../cli/ansi\"\n\n/**\n * Display an interactive selection list in the terminal\n *\n * @example\n * ```ts\n * // Simple usage\n * const color = await withSelect(\"Choose a color:\", [\n * { label: \"Red\", value: \"red\" },\n * { label: \"Green\", value: \"green\" },\n * { label: \"Blue\", value: \"blue\" },\n * ]);\n *\n * // With options\n * const result = await withSelect(\n * \"Select item:\",\n * options,\n * { initial: 2, maxVisible: 5 }\n * );\n * ```\n */\nexport async function withSelect<T>(\n prompt: string,\n options: SelectOption<T>[],\n selectOptions: WithSelectOptions = {},\n): Promise<T> {\n const { initial = 0, maxVisible = 10 } = selectOptions\n const stream = process.stdout\n const stdin = process.stdin\n\n if (!isTTY(stream) || !stdin.isTTY) {\n // Non-interactive mode: return first option or initial\n return options[initial]?.value ?? options[0]!.value\n }\n\n return new Promise((resolve, reject) => {\n let highlightIndex = Math.min(Math.max(0, initial), options.length - 1)\n let linesRendered = 0\n\n // Enable raw mode for character-by-character input\n stdin.setRawMode(true)\n stdin.resume()\n stdin.setEncoding(\"utf8\")\n\n // Hide cursor\n write(CURSOR_HIDE, stream)\n\n function render() {\n // Clear previously rendered lines\n if (linesRendered > 0) {\n write(cursorUp(linesRendered), stream)\n }\n\n // Calculate scroll window\n const scrollOffset = Math.max(\n 0,\n Math.min(highlightIndex - Math.floor(maxVisible / 2), options.length - maxVisible),\n )\n const visibleCount = Math.min(maxVisible, options.length)\n const visibleOptions = options.slice(scrollOffset, scrollOffset + visibleCount)\n const hasMoreAbove = scrollOffset > 0\n const hasMoreBelow = scrollOffset + visibleCount < options.length\n\n // Render prompt\n write(`${CURSOR_TO_START}${chalk.bold(prompt)}${CLEAR_LINE_END}\\n`, stream)\n\n let lines = 1\n\n // Render scroll indicator (above)\n if (hasMoreAbove) {\n write(`${CURSOR_TO_START} ${chalk.dim(\"...\")}${CLEAR_LINE_END}\\n`, stream)\n lines++\n }\n\n // Render options\n for (let i = 0; i < visibleOptions.length; i++) {\n const option = visibleOptions[i]\n const actualIndex = scrollOffset + i\n const isHighlighted = actualIndex === highlightIndex\n\n const indicator = isHighlighted ? chalk.cyan(\">\") : \" \"\n const label = isHighlighted ? chalk.cyan(option!.label) : option!.label\n\n write(`${CURSOR_TO_START}${indicator} ${label}${CLEAR_LINE_END}\\n`, stream)\n lines++\n }\n\n // Render scroll indicator (below)\n if (hasMoreBelow) {\n write(`${CURSOR_TO_START} ${chalk.dim(\"...\")}${CLEAR_LINE_END}\\n`, stream)\n lines++\n }\n\n linesRendered = lines\n }\n\n function cleanup() {\n stdin.setRawMode(false)\n stdin.pause()\n stdin.removeListener(\"data\", onKeypress)\n write(CURSOR_SHOW, stream)\n }\n\n function onKeypress(key: string) {\n // Handle key sequences\n const keyCode = key.charCodeAt(0)\n\n // Ctrl+C\n if (key === \"\\x03\") {\n cleanup()\n reject(new Error(\"User cancelled\"))\n return\n }\n\n // Enter/Return\n if (key === \"\\r\" || key === \"\\n\") {\n cleanup()\n resolve(options[highlightIndex]!.value)\n return\n }\n\n // Escape\n if (key === \"\\x1b\" && key.length === 1) {\n cleanup()\n reject(new Error(\"User cancelled\"))\n return\n }\n\n // Arrow keys (escape sequences)\n if (key.startsWith(\"\\x1b[\")) {\n const code = key.slice(2)\n if (code === \"A\") {\n // Up arrow\n highlightIndex = Math.max(0, highlightIndex - 1)\n render()\n } else if (code === \"B\") {\n // Down arrow\n highlightIndex = Math.min(options.length - 1, highlightIndex + 1)\n render()\n }\n return\n }\n\n // j/k vim keys\n if (key === \"j\" || key === \"J\") {\n highlightIndex = Math.min(options.length - 1, highlightIndex + 1)\n render()\n return\n }\n if (key === \"k\" || key === \"K\") {\n highlightIndex = Math.max(0, highlightIndex - 1)\n render()\n return\n }\n\n // Space to select (optional alternative to Enter)\n if (key === \" \") {\n cleanup()\n resolve(options[highlightIndex]!.value)\n return\n }\n }\n\n stdin.on(\"data\", onKeypress)\n render()\n })\n}\n\n/**\n * Create a reusable select instance for multiple selections\n *\n * @example\n * ```ts\n * const select = createSelect({\n * maxVisible: 5,\n * });\n *\n * const first = await select(\"Choose first:\", options1);\n * const second = await select(\"Choose second:\", options2);\n * ```\n */\nexport function createSelect(\n defaultOptions: WithSelectOptions = {},\n): <T>(prompt: string, options: SelectOption<T>[], overrides?: WithSelectOptions) => Promise<T> {\n return <T>(prompt: string, options: SelectOption<T>[], overrides: WithSelectOptions = {}) =>\n withSelect(prompt, options, { ...defaultOptions, ...overrides })\n}\n","/**\n * withTextInput - CLI wrapper for text input prompts\n */\n\nimport chalk from \"@silvery/ink/chalk\"\nimport type { TextInputOptions } from \"../types.js\"\nimport {\n CURSOR_HIDE,\n CURSOR_SHOW,\n CURSOR_TO_START,\n CLEAR_LINE_END,\n write,\n isTTY,\n} from \"../cli/ansi\"\n\n/**\n * Prompt for text input in the terminal\n *\n * @example\n * ```ts\n * // Simple usage\n * const name = await withTextInput(\"What is your name?\");\n *\n * // With options\n * const password = await withTextInput(\"Password:\", { mask: \"*\" });\n *\n * // With validation\n * const email = await withTextInput(\"Email:\", {\n * validate: (v) => v.includes(\"@\") ? undefined : \"Invalid email\"\n * });\n *\n * // With autocomplete\n * const fruit = await withTextInput(\"Pick a fruit:\", {\n * autocomplete: [\"apple\", \"banana\", \"cherry\"]\n * });\n * ```\n */\nexport async function withTextInput(\n prompt: string,\n options: TextInputOptions = {},\n): Promise<string> {\n const stream = options.stream ?? process.stdout\n const inputStream = options.inputStream ?? process.stdin\n const isTty = isTTY(stream)\n\n // Initialize state\n let value = options.defaultValue ?? \"\"\n let cursorPosition = value.length\n let errorMessage: string | undefined\n\n // Setup raw mode for character-by-character input\n if (inputStream.isTTY) {\n inputStream.setRawMode(true)\n }\n inputStream.resume()\n\n // Render the current state\n const render = () => {\n const displayValue = options.mask ? options.mask.repeat(value.length) : value\n\n const suggestion = getAutocompleteSuggestion(value, options.autocomplete)\n const suggestionSuffix = suggestion ? chalk.dim(suggestion.slice(value.length)) : \"\"\n\n // Build cursor display\n const beforeCursor = displayValue.slice(0, cursorPosition)\n const cursorChar = displayValue[cursorPosition] ?? \" \"\n const afterCursor = displayValue.slice(cursorPosition + 1)\n\n // Placeholder when empty\n const showPlaceholder = !value && options.placeholder\n const inputDisplay = showPlaceholder\n ? chalk.dim(options.placeholder) + chalk.inverse(\" \")\n : beforeCursor + chalk.inverse(cursorChar) + afterCursor + suggestionSuffix\n\n // Error message\n const errorDisplay = errorMessage ? chalk.red(` (${errorMessage})`) : \"\"\n\n const line = `${chalk.cyan(\"?\")} ${chalk.bold(prompt)} ${inputDisplay}${errorDisplay}`\n\n if (isTty) {\n write(`${CURSOR_TO_START}${line}${CLEAR_LINE_END}`, stream)\n }\n }\n\n // Hide cursor during input (we show our own)\n if (isTty) {\n write(CURSOR_HIDE, stream)\n }\n\n render()\n\n return new Promise<string>((resolve, reject) => {\n const cleanup = () => {\n inputStream.removeListener(\"data\", onData)\n inputStream.removeListener(\"error\", onError)\n if (inputStream.isTTY) {\n inputStream.setRawMode(false)\n }\n inputStream.pause()\n if (isTty) {\n write(CURSOR_SHOW, stream)\n }\n }\n\n const submit = () => {\n // Validate before accepting\n if (options.validate) {\n const error = options.validate(value)\n if (error) {\n errorMessage = error\n render()\n return\n }\n }\n\n cleanup()\n\n // Show final value\n const displayValue = options.mask ? options.mask.repeat(value.length) : value\n write(\n `${CURSOR_TO_START}${chalk.green(\"✔\")} ${chalk.bold(prompt)} ${chalk.dim(displayValue)}${CLEAR_LINE_END}\\n`,\n stream,\n )\n\n resolve(value)\n }\n\n const onError = (err: Error) => {\n cleanup()\n reject(err)\n }\n\n const onData = (data: Buffer) => {\n const input = data.toString()\n errorMessage = undefined // Clear error on any input\n\n // Handle special keys\n for (let i = 0; i < input.length; i++) {\n const char = input[i]!\n const code = char.charCodeAt(0)\n\n // Enter (CR or LF)\n if (code === 13 || code === 10) {\n submit()\n return\n }\n\n // Ctrl+C - abort\n if (code === 3) {\n cleanup()\n write(\"\\n\", stream)\n reject(new Error(\"User aborted\"))\n return\n }\n\n // Escape - clear or abort\n if (code === 27) {\n // Check for arrow key sequences\n if (input[i + 1] === \"[\") {\n const arrowCode = input[i + 2]\n if (arrowCode === \"D\") {\n // Left arrow\n cursorPosition = Math.max(0, cursorPosition - 1)\n i += 2\n continue\n }\n if (arrowCode === \"C\") {\n // Right arrow\n cursorPosition = Math.min(value.length, cursorPosition + 1)\n i += 2\n continue\n }\n if (arrowCode === \"H\") {\n // Home\n cursorPosition = 0\n i += 2\n continue\n }\n if (arrowCode === \"F\") {\n // End\n cursorPosition = value.length\n i += 2\n continue\n }\n // Skip other escape sequences\n i += 2\n continue\n }\n // Plain escape - clear input\n value = \"\"\n cursorPosition = 0\n continue\n }\n\n // Backspace (127 or 8)\n if (code === 127 || code === 8) {\n if (cursorPosition > 0) {\n value = value.slice(0, cursorPosition - 1) + value.slice(cursorPosition)\n cursorPosition--\n }\n continue\n }\n\n // Delete (escape sequence handled above)\n if (code === 4) {\n // Ctrl+D acts as delete\n if (cursorPosition < value.length) {\n value = value.slice(0, cursorPosition) + value.slice(cursorPosition + 1)\n }\n continue\n }\n\n // Tab - accept autocomplete suggestion\n if (code === 9) {\n const suggestion = getAutocompleteSuggestion(value, options.autocomplete)\n if (suggestion) {\n value = suggestion\n cursorPosition = value.length\n }\n continue\n }\n\n // Ctrl+A - beginning of line\n if (code === 1) {\n cursorPosition = 0\n continue\n }\n\n // Ctrl+E - end of line\n if (code === 5) {\n cursorPosition = value.length\n continue\n }\n\n // Ctrl+U - clear to beginning\n if (code === 21) {\n value = value.slice(cursorPosition)\n cursorPosition = 0\n continue\n }\n\n // Ctrl+K - clear to end\n if (code === 11) {\n value = value.slice(0, cursorPosition)\n continue\n }\n\n // Ctrl+W - delete word backward\n if (code === 23) {\n const before = value.slice(0, cursorPosition)\n const after = value.slice(cursorPosition)\n const trimmed = before.trimEnd()\n const lastSpace = trimmed.lastIndexOf(\" \")\n const newBefore = lastSpace === -1 ? \"\" : trimmed.slice(0, lastSpace + 1)\n value = newBefore + after\n cursorPosition = newBefore.length\n continue\n }\n\n // Regular printable character\n if (code >= 32 && code < 127) {\n value = value.slice(0, cursorPosition) + char + value.slice(cursorPosition)\n cursorPosition++\n continue\n }\n\n // Handle UTF-8 characters (multi-byte)\n if (code > 127) {\n value = value.slice(0, cursorPosition) + char + value.slice(cursorPosition)\n cursorPosition++\n continue\n }\n }\n\n render()\n }\n\n inputStream.on(\"data\", onData)\n inputStream.on(\"error\", onError)\n })\n}\n\n/**\n * Create a text input instance for manual control\n *\n * @example\n * ```ts\n * const input = createTextInput(\"Name:\", { placeholder: \"Enter name\" });\n * input.render();\n *\n * // Later, get the value\n * const value = await input.waitForSubmit();\n * ```\n */\nexport function createTextInput(prompt: string, options: TextInputOptions = {}): TextInputInstance {\n const stream = options.stream ?? process.stdout\n const isTty = isTTY(stream)\n\n let value = options.defaultValue ?? \"\"\n let cursorPosition = value.length\n\n const render = () => {\n const displayValue = options.mask ? options.mask.repeat(value.length) : value\n\n const suggestion = getAutocompleteSuggestion(value, options.autocomplete)\n const suggestionSuffix = suggestion ? chalk.dim(suggestion.slice(value.length)) : \"\"\n\n const beforeCursor = displayValue.slice(0, cursorPosition)\n const cursorChar = displayValue[cursorPosition] ?? \" \"\n const afterCursor = displayValue.slice(cursorPosition + 1)\n\n const showPlaceholder = !value && options.placeholder\n const inputDisplay = showPlaceholder\n ? chalk.dim(options.placeholder) + chalk.inverse(\" \")\n : beforeCursor + chalk.inverse(cursorChar) + afterCursor + suggestionSuffix\n\n const line = `${chalk.cyan(\"?\")} ${chalk.bold(prompt)} ${inputDisplay}`\n\n if (isTty) {\n write(`${CURSOR_TO_START}${line}${CLEAR_LINE_END}`, stream)\n }\n }\n\n return {\n get value() {\n return value\n },\n set value(v: string) {\n value = v\n cursorPosition = Math.min(cursorPosition, v.length)\n },\n get cursorPosition() {\n return cursorPosition\n },\n set cursorPosition(pos: number) {\n cursorPosition = Math.max(0, Math.min(value.length, pos))\n },\n render,\n insert(char: string) {\n value = value.slice(0, cursorPosition) + char + value.slice(cursorPosition)\n cursorPosition += char.length\n },\n backspace() {\n if (cursorPosition > 0) {\n value = value.slice(0, cursorPosition - 1) + value.slice(cursorPosition)\n cursorPosition--\n }\n },\n delete() {\n if (cursorPosition < value.length) {\n value = value.slice(0, cursorPosition) + value.slice(cursorPosition + 1)\n }\n },\n clear() {\n value = \"\"\n cursorPosition = 0\n },\n acceptSuggestion() {\n const suggestion = getAutocompleteSuggestion(value, options.autocomplete)\n if (suggestion) {\n value = suggestion\n cursorPosition = value.length\n }\n },\n }\n}\n\n/** Instance returned by createTextInput for manual control */\nexport interface TextInputInstance {\n /** Current input value */\n value: string\n /** Current cursor position */\n cursorPosition: number\n /** Render the current state */\n render(): void\n /** Insert text at cursor */\n insert(char: string): void\n /** Delete character before cursor */\n backspace(): void\n /** Delete character at cursor */\n delete(): void\n /** Clear all input */\n clear(): void\n /** Accept autocomplete suggestion */\n acceptSuggestion(): void\n}\n\n/**\n * Find a matching autocomplete suggestion for the current input\n */\nfunction getAutocompleteSuggestion(value: string, autocomplete?: string[]): string | undefined {\n if (!value || !autocomplete?.length) {\n return undefined\n }\n\n const lowerValue = value.toLowerCase()\n return autocomplete.find(\n (item) => item.toLowerCase().startsWith(lowerValue) && item.length > value.length,\n )\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"yoga-adapter-8oRGRw8V.mjs","names":[],"sources":["../packages/ag-term/src/adapters/yoga-adapter.ts"],"sourcesContent":["/**\n * Yoga Layout Engine Adapter\n *\n * Wraps yoga-wasm-web to implement the LayoutEngine interface.\n */\n\nimport type {\n Align,\n Direction,\n Display,\n Edge,\n FlexDirection,\n Gutter,\n Justify,\n Overflow,\n PositionType,\n Wrap,\n Yoga,\n Node as YogaNode,\n} from \"yoga-wasm-web\"\nimport type { LayoutNode, MeasureFunc, MeasureMode } from \"@silvery/ag/layout-types\"\nimport type {\n AlignValue,\n DirectionValue,\n DisplayValue,\n EdgeValue,\n FlexDirectionValue,\n GutterValue,\n JustifyValue,\n LayoutConstants,\n LayoutEngine,\n MeasureModeValue,\n OverflowValue,\n PositionTypeValue,\n WrapValue,\n} from \"../layout-engine\"\n\n// ============================================================================\n// Yoga Node Adapter\n// ============================================================================\n\n/**\n * Wraps a Yoga node to implement LayoutNode interface.\n */\nclass YogaNodeAdapter implements LayoutNode {\n private node: YogaNode\n private yoga: Yoga\n private hasMeasureFunc = false\n\n constructor(node: YogaNode, yoga: Yoga) {\n this.node = node\n this.yoga = yoga\n }\n\n /** Get the underlying Yoga node (for tree operations) */\n getYogaNode(): YogaNode {\n return this.node\n }\n\n // Tree operations\n insertChild(child: LayoutNode, index: number): void {\n const yogaChild = (child as YogaNodeAdapter).getYogaNode()\n this.node.insertChild(yogaChild, index)\n }\n\n removeChild(child: LayoutNode): void {\n const yogaChild = (child as YogaNodeAdapter).getYogaNode()\n this.node.removeChild(yogaChild)\n }\n\n free(): void {\n this.node.free()\n }\n\n // Measure function\n setMeasureFunc(measureFunc: MeasureFunc): void {\n this.hasMeasureFunc = true\n this.node.setMeasureFunc((width, widthMode, height, heightMode) => {\n const widthModeStr = this.measureModeToString(widthMode)\n const heightModeStr = this.measureModeToString(heightMode)\n return measureFunc(width, widthModeStr, height, heightModeStr)\n })\n }\n\n // Dirty tracking - forces layout recalculation\n // Yoga only allows markDirty() on leaf nodes with measure functions\n markDirty(): void {\n if (this.hasMeasureFunc) {\n this.node.markDirty()\n }\n }\n isDirty(): boolean {\n return this.node.isDirty()\n }\n\n private measureModeToString(mode: number): MeasureMode {\n if (mode === this.yoga.MEASURE_MODE_EXACTLY) return \"exactly\"\n if (mode === this.yoga.MEASURE_MODE_AT_MOST) return \"at-most\"\n return \"undefined\"\n }\n\n // Dimension setters\n setWidth(value: number): void {\n this.node.setWidth(value)\n }\n setWidthPercent(value: number): void {\n this.node.setWidthPercent(value)\n }\n setWidthAuto(): void {\n this.node.setWidthAuto()\n }\n setWidthFitContent(): void {\n // Yoga doesn't support fit-content natively — fall back to auto\n this.node.setWidthAuto()\n }\n setWidthSnugContent(): void {\n // Yoga doesn't support snug-content natively — fall back to auto\n this.node.setWidthAuto()\n }\n setHeight(value: number): void {\n this.node.setHeight(value)\n }\n setHeightPercent(value: number): void {\n this.node.setHeightPercent(value)\n }\n setHeightAuto(): void {\n this.node.setHeightAuto()\n }\n setMinWidth(value: number): void {\n this.node.setMinWidth(value)\n }\n setMinWidthPercent(value: number): void {\n this.node.setMinWidthPercent(value)\n }\n setMinHeight(value: number): void {\n this.node.setMinHeight(value)\n }\n setMinHeightPercent(value: number): void {\n this.node.setMinHeightPercent(value)\n }\n setMaxWidth(value: number): void {\n this.node.setMaxWidth(value)\n }\n setMaxWidthPercent(value: number): void {\n this.node.setMaxWidthPercent(value)\n }\n setMaxHeight(value: number): void {\n this.node.setMaxHeight(value)\n }\n setMaxHeightPercent(value: number): void {\n this.node.setMaxHeightPercent(value)\n }\n\n // Flex properties\n setFlexGrow(value: number): void {\n this.node.setFlexGrow(value)\n }\n setFlexShrink(value: number): void {\n this.node.setFlexShrink(value)\n }\n setFlexBasis(value: number): void {\n this.node.setFlexBasis(value)\n }\n setFlexBasisPercent(value: number): void {\n this.node.setFlexBasisPercent(value)\n }\n setFlexBasisAuto(): void {\n this.node.setFlexBasisAuto()\n }\n setFlexDirection(direction: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded FlexDirection type\n this.node.setFlexDirection(direction as FlexDirection)\n }\n setFlexWrap(wrap: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Wrap type\n this.node.setFlexWrap(wrap as Wrap)\n }\n\n // Alignment\n setAlignItems(align: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Align type\n this.node.setAlignItems(align as Align)\n }\n setAlignSelf(align: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Align type\n this.node.setAlignSelf(align as Align)\n }\n setAlignContent(align: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Align type\n this.node.setAlignContent(align as Align)\n }\n setJustifyContent(justify: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Justify type\n this.node.setJustifyContent(justify as Justify)\n }\n\n // Spacing\n setPadding(edge: number, value: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Edge type\n this.node.setPadding(edge as Edge, value)\n }\n setMargin(edge: number, value: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Edge type\n this.node.setMargin(edge as Edge, value)\n }\n setBorder(edge: number, value: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Edge type\n this.node.setBorder(edge as Edge, value)\n }\n setGap(gutter: number, value: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Gutter type\n this.node.setGap(gutter as Gutter, value)\n }\n\n // Display & Position\n setDisplay(display: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Display type\n this.node.setDisplay(display as Display)\n }\n setPositionType(positionType: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded PositionType type\n this.node.setPositionType(positionType as PositionType)\n }\n setPosition(edge: number, value: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Edge type\n this.node.setPosition(edge as Edge, value)\n }\n setPositionPercent(edge: number, value: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Edge type\n this.node.setPositionPercent(edge as Edge, value)\n }\n setOverflow(overflow: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Overflow type\n this.node.setOverflow(overflow as Overflow)\n }\n\n // Aspect Ratio\n setAspectRatio(value: number): void {\n this.node.setAspectRatio(value)\n }\n\n // Layout calculation\n calculateLayout(width: number, height: number, direction?: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Direction type\n this.node.calculateLayout(width, height, (direction ?? this.yoga.DIRECTION_LTR) as Direction)\n }\n\n // Layout results\n getComputedLeft(): number {\n return this.node.getComputedLeft()\n }\n getComputedTop(): number {\n return this.node.getComputedTop()\n }\n getComputedWidth(): number {\n return this.node.getComputedWidth()\n }\n getComputedHeight(): number {\n return this.node.getComputedHeight()\n }\n}\n\n// ============================================================================\n// Yoga Layout Engine\n// ============================================================================\n\n/**\n * Layout engine implementation using Yoga (WASM).\n */\nexport class YogaLayoutEngine implements LayoutEngine {\n private yoga: Yoga\n private _constants: LayoutConstants\n\n constructor(yoga: Yoga) {\n this.yoga = yoga\n // Cast Yoga's branded types to our LayoutEngine branded types at the adapter boundary\n this._constants = {\n // Flex Direction\n FLEX_DIRECTION_COLUMN: yoga.FLEX_DIRECTION_COLUMN as unknown as FlexDirectionValue,\n FLEX_DIRECTION_COLUMN_REVERSE:\n yoga.FLEX_DIRECTION_COLUMN_REVERSE as unknown as FlexDirectionValue,\n FLEX_DIRECTION_ROW: yoga.FLEX_DIRECTION_ROW as unknown as FlexDirectionValue,\n FLEX_DIRECTION_ROW_REVERSE: yoga.FLEX_DIRECTION_ROW_REVERSE as unknown as FlexDirectionValue,\n\n // Wrap\n WRAP_NO_WRAP: yoga.WRAP_NO_WRAP as unknown as WrapValue,\n WRAP_WRAP: yoga.WRAP_WRAP as unknown as WrapValue,\n WRAP_WRAP_REVERSE: yoga.WRAP_WRAP_REVERSE as unknown as WrapValue,\n\n // Align\n ALIGN_AUTO: yoga.ALIGN_AUTO as unknown as AlignValue,\n ALIGN_FLEX_START: yoga.ALIGN_FLEX_START as unknown as AlignValue,\n ALIGN_CENTER: yoga.ALIGN_CENTER as unknown as AlignValue,\n ALIGN_FLEX_END: yoga.ALIGN_FLEX_END as unknown as AlignValue,\n ALIGN_STRETCH: yoga.ALIGN_STRETCH as unknown as AlignValue,\n ALIGN_BASELINE: yoga.ALIGN_BASELINE as unknown as AlignValue,\n ALIGN_SPACE_BETWEEN: yoga.ALIGN_SPACE_BETWEEN as unknown as AlignValue,\n ALIGN_SPACE_AROUND: yoga.ALIGN_SPACE_AROUND as unknown as AlignValue,\n ALIGN_SPACE_EVENLY: (yoga as any).ALIGN_SPACE_EVENLY as unknown as AlignValue,\n\n // Justify\n JUSTIFY_FLEX_START: yoga.JUSTIFY_FLEX_START as unknown as JustifyValue,\n JUSTIFY_CENTER: yoga.JUSTIFY_CENTER as unknown as JustifyValue,\n JUSTIFY_FLEX_END: yoga.JUSTIFY_FLEX_END as unknown as JustifyValue,\n JUSTIFY_SPACE_BETWEEN: yoga.JUSTIFY_SPACE_BETWEEN as unknown as JustifyValue,\n JUSTIFY_SPACE_AROUND: yoga.JUSTIFY_SPACE_AROUND as unknown as JustifyValue,\n JUSTIFY_SPACE_EVENLY: yoga.JUSTIFY_SPACE_EVENLY as unknown as JustifyValue,\n\n // Edge\n EDGE_LEFT: yoga.EDGE_LEFT as unknown as EdgeValue,\n EDGE_TOP: yoga.EDGE_TOP as unknown as EdgeValue,\n EDGE_RIGHT: yoga.EDGE_RIGHT as unknown as EdgeValue,\n EDGE_BOTTOM: yoga.EDGE_BOTTOM as unknown as EdgeValue,\n EDGE_HORIZONTAL: yoga.EDGE_HORIZONTAL as unknown as EdgeValue,\n EDGE_VERTICAL: yoga.EDGE_VERTICAL as unknown as EdgeValue,\n EDGE_ALL: yoga.EDGE_ALL as unknown as EdgeValue,\n\n // Gutter\n GUTTER_COLUMN: yoga.GUTTER_COLUMN as unknown as GutterValue,\n GUTTER_ROW: yoga.GUTTER_ROW as unknown as GutterValue,\n GUTTER_ALL: yoga.GUTTER_ALL as unknown as GutterValue,\n\n // Display\n DISPLAY_FLEX: yoga.DISPLAY_FLEX as unknown as DisplayValue,\n DISPLAY_NONE: yoga.DISPLAY_NONE as unknown as DisplayValue,\n\n // Position Type\n POSITION_TYPE_STATIC: yoga.POSITION_TYPE_STATIC as unknown as PositionTypeValue,\n POSITION_TYPE_RELATIVE: yoga.POSITION_TYPE_RELATIVE as unknown as PositionTypeValue,\n POSITION_TYPE_ABSOLUTE: yoga.POSITION_TYPE_ABSOLUTE as unknown as PositionTypeValue,\n\n // Overflow\n OVERFLOW_VISIBLE: yoga.OVERFLOW_VISIBLE as unknown as OverflowValue,\n OVERFLOW_HIDDEN: yoga.OVERFLOW_HIDDEN as unknown as OverflowValue,\n OVERFLOW_SCROLL: yoga.OVERFLOW_SCROLL as unknown as OverflowValue,\n\n // Direction\n DIRECTION_LTR: yoga.DIRECTION_LTR as unknown as DirectionValue,\n\n // Measure Mode\n MEASURE_MODE_UNDEFINED: yoga.MEASURE_MODE_UNDEFINED as unknown as MeasureModeValue,\n MEASURE_MODE_EXACTLY: yoga.MEASURE_MODE_EXACTLY as unknown as MeasureModeValue,\n MEASURE_MODE_AT_MOST: yoga.MEASURE_MODE_AT_MOST as unknown as MeasureModeValue,\n }\n }\n\n createNode(): LayoutNode {\n return new YogaNodeAdapter(this.yoga.Node.create(), this.yoga)\n }\n\n get constants(): LayoutConstants {\n return this._constants\n }\n\n get name(): string {\n return \"yoga\"\n }\n}\n\n// ============================================================================\n// Initialization Helper\n// ============================================================================\n\n/**\n * Create a Yoga layout engine from an initialized Yoga instance.\n */\nexport function createYogaEngine(yoga: Yoga): YogaLayoutEngine {\n return new YogaLayoutEngine(yoga)\n}\n\n/**\n * Initialize Yoga and create a layout engine.\n * Uses yoga-wasm-web/auto which automatically selects the right implementation.\n */\nexport async function initYogaEngine(): Promise<YogaLayoutEngine> {\n const { default: yoga } = (await import(\"yoga-wasm-web/auto\")) as {\n default: Yoga\n }\n return new YogaLayoutEngine(yoga)\n}\n"],"mappings":";;;;AA4CA,IAAM,kBAAN,MAA4C;CAC1C;CACA;CACA,iBAAyB;CAEzB,YAAY,MAAgB,MAAY;AACtC,OAAK,OAAO;AACZ,OAAK,OAAO;;;CAId,cAAwB;AACtB,SAAO,KAAK;;CAId,YAAY,OAAmB,OAAqB;EAClD,MAAM,YAAa,MAA0B,aAAa;AAC1D,OAAK,KAAK,YAAY,WAAW,MAAM;;CAGzC,YAAY,OAAyB;EACnC,MAAM,YAAa,MAA0B,aAAa;AAC1D,OAAK,KAAK,YAAY,UAAU;;CAGlC,OAAa;AACX,OAAK,KAAK,MAAM;;CAIlB,eAAe,aAAgC;AAC7C,OAAK,iBAAiB;AACtB,OAAK,KAAK,gBAAgB,OAAO,WAAW,QAAQ,eAAe;AAGjE,UAAO,YAAY,OAFE,KAAK,oBAAoB,UAAU,EAEhB,QADlB,KAAK,oBAAoB,WAAW,CACI;IAC9D;;CAKJ,YAAkB;AAChB,MAAI,KAAK,eACP,MAAK,KAAK,WAAW;;CAGzB,UAAmB;AACjB,SAAO,KAAK,KAAK,SAAS;;CAG5B,oBAA4B,MAA2B;AACrD,MAAI,SAAS,KAAK,KAAK,qBAAsB,QAAO;AACpD,MAAI,SAAS,KAAK,KAAK,qBAAsB,QAAO;AACpD,SAAO;;CAIT,SAAS,OAAqB;AAC5B,OAAK,KAAK,SAAS,MAAM;;CAE3B,gBAAgB,OAAqB;AACnC,OAAK,KAAK,gBAAgB,MAAM;;CAElC,eAAqB;AACnB,OAAK,KAAK,cAAc;;CAE1B,qBAA2B;AAEzB,OAAK,KAAK,cAAc;;CAE1B,sBAA4B;AAE1B,OAAK,KAAK,cAAc;;CAE1B,UAAU,OAAqB;AAC7B,OAAK,KAAK,UAAU,MAAM;;CAE5B,iBAAiB,OAAqB;AACpC,OAAK,KAAK,iBAAiB,MAAM;;CAEnC,gBAAsB;AACpB,OAAK,KAAK,eAAe;;CAE3B,YAAY,OAAqB;AAC/B,OAAK,KAAK,YAAY,MAAM;;CAE9B,mBAAmB,OAAqB;AACtC,OAAK,KAAK,mBAAmB,MAAM;;CAErC,aAAa,OAAqB;AAChC,OAAK,KAAK,aAAa,MAAM;;CAE/B,oBAAoB,OAAqB;AACvC,OAAK,KAAK,oBAAoB,MAAM;;CAEtC,YAAY,OAAqB;AAC/B,OAAK,KAAK,YAAY,MAAM;;CAE9B,mBAAmB,OAAqB;AACtC,OAAK,KAAK,mBAAmB,MAAM;;CAErC,aAAa,OAAqB;AAChC,OAAK,KAAK,aAAa,MAAM;;CAE/B,oBAAoB,OAAqB;AACvC,OAAK,KAAK,oBAAoB,MAAM;;CAItC,YAAY,OAAqB;AAC/B,OAAK,KAAK,YAAY,MAAM;;CAE9B,cAAc,OAAqB;AACjC,OAAK,KAAK,cAAc,MAAM;;CAEhC,aAAa,OAAqB;AAChC,OAAK,KAAK,aAAa,MAAM;;CAE/B,oBAAoB,OAAqB;AACvC,OAAK,KAAK,oBAAoB,MAAM;;CAEtC,mBAAyB;AACvB,OAAK,KAAK,kBAAkB;;CAE9B,iBAAiB,WAAyB;AAExC,OAAK,KAAK,iBAAiB,UAA2B;;CAExD,YAAY,MAAoB;AAE9B,OAAK,KAAK,YAAY,KAAa;;CAIrC,cAAc,OAAqB;AAEjC,OAAK,KAAK,cAAc,MAAe;;CAEzC,aAAa,OAAqB;AAEhC,OAAK,KAAK,aAAa,MAAe;;CAExC,gBAAgB,OAAqB;AAEnC,OAAK,KAAK,gBAAgB,MAAe;;CAE3C,kBAAkB,SAAuB;AAEvC,OAAK,KAAK,kBAAkB,QAAmB;;CAIjD,WAAW,MAAc,OAAqB;AAE5C,OAAK,KAAK,WAAW,MAAc,MAAM;;CAE3C,UAAU,MAAc,OAAqB;AAE3C,OAAK,KAAK,UAAU,MAAc,MAAM;;CAE1C,UAAU,MAAc,OAAqB;AAE3C,OAAK,KAAK,UAAU,MAAc,MAAM;;CAE1C,OAAO,QAAgB,OAAqB;AAE1C,OAAK,KAAK,OAAO,QAAkB,MAAM;;CAI3C,WAAW,SAAuB;AAEhC,OAAK,KAAK,WAAW,QAAmB;;CAE1C,gBAAgB,cAA4B;AAE1C,OAAK,KAAK,gBAAgB,aAA6B;;CAEzD,YAAY,MAAc,OAAqB;AAE7C,OAAK,KAAK,YAAY,MAAc,MAAM;;CAE5C,mBAAmB,MAAc,OAAqB;AAEpD,OAAK,KAAK,mBAAmB,MAAc,MAAM;;CAEnD,YAAY,UAAwB;AAElC,OAAK,KAAK,YAAY,SAAqB;;CAI7C,eAAe,OAAqB;AAClC,OAAK,KAAK,eAAe,MAAM;;CAIjC,gBAAgB,OAAe,QAAgB,WAA0B;AAEvE,OAAK,KAAK,gBAAgB,OAAO,QAAS,aAAa,KAAK,KAAK,cAA4B;;CAI/F,kBAA0B;AACxB,SAAO,KAAK,KAAK,iBAAiB;;CAEpC,iBAAyB;AACvB,SAAO,KAAK,KAAK,gBAAgB;;CAEnC,mBAA2B;AACzB,SAAO,KAAK,KAAK,kBAAkB;;CAErC,oBAA4B;AAC1B,SAAO,KAAK,KAAK,mBAAmB;;;;;;AAWxC,IAAa,mBAAb,MAAsD;CACpD;CACA;CAEA,YAAY,MAAY;AACtB,OAAK,OAAO;AAEZ,OAAK,aAAa;GAEhB,uBAAuB,KAAK;GAC5B,+BACE,KAAK;GACP,oBAAoB,KAAK;GACzB,4BAA4B,KAAK;GAGjC,cAAc,KAAK;GACnB,WAAW,KAAK;GAChB,mBAAmB,KAAK;GAGxB,YAAY,KAAK;GACjB,kBAAkB,KAAK;GACvB,cAAc,KAAK;GACnB,gBAAgB,KAAK;GACrB,eAAe,KAAK;GACpB,gBAAgB,KAAK;GACrB,qBAAqB,KAAK;GAC1B,oBAAoB,KAAK;GACzB,oBAAqB,KAAa;GAGlC,oBAAoB,KAAK;GACzB,gBAAgB,KAAK;GACrB,kBAAkB,KAAK;GACvB,uBAAuB,KAAK;GAC5B,sBAAsB,KAAK;GAC3B,sBAAsB,KAAK;GAG3B,WAAW,KAAK;GAChB,UAAU,KAAK;GACf,YAAY,KAAK;GACjB,aAAa,KAAK;GAClB,iBAAiB,KAAK;GACtB,eAAe,KAAK;GACpB,UAAU,KAAK;GAGf,eAAe,KAAK;GACpB,YAAY,KAAK;GACjB,YAAY,KAAK;GAGjB,cAAc,KAAK;GACnB,cAAc,KAAK;GAGnB,sBAAsB,KAAK;GAC3B,wBAAwB,KAAK;GAC7B,wBAAwB,KAAK;GAG7B,kBAAkB,KAAK;GACvB,iBAAiB,KAAK;GACtB,iBAAiB,KAAK;GAGtB,eAAe,KAAK;GAGpB,wBAAwB,KAAK;GAC7B,sBAAsB,KAAK;GAC3B,sBAAsB,KAAK;GAC5B;;CAGH,aAAyB;AACvB,SAAO,IAAI,gBAAgB,KAAK,KAAK,KAAK,QAAQ,EAAE,KAAK,KAAK;;CAGhE,IAAI,YAA6B;AAC/B,SAAO,KAAK;;CAGd,IAAI,OAAe;AACjB,SAAO;;;;;;AAWX,SAAgB,iBAAiB,MAA8B;AAC7D,QAAO,IAAI,iBAAiB,KAAK;;;;;;AAOnC,eAAsB,iBAA4C;CAChE,MAAM,EAAE,SAAS,SAAU,MAAM,OAAO;AAGxC,QAAO,IAAI,iBAAiB,KAAK"}
@@ -1,2 +0,0 @@
1
- import { r as initYogaEngine } from "./yoga-adapter-8oRGRw8V.mjs";
2
- export { initYogaEngine };