@field/cascade 0.2.22

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 (319) hide show
  1. package/AGENTS.md +168 -0
  2. package/ARCHITECTURE.md +137 -0
  3. package/DESIGN.md +161 -0
  4. package/LICENSE +21 -0
  5. package/README.md +229 -0
  6. package/dist/assets/CodeEditor-DR7u0q7p.css +1 -0
  7. package/dist/assets/CodeEditor-DoaNEUaM.js +641 -0
  8. package/dist/assets/CodePanel-B0_2XJ-t.js +2 -0
  9. package/dist/assets/CodePanel-IT1secyI.css +1 -0
  10. package/dist/assets/CustomNodeDialog-026lzecD.js +1 -0
  11. package/dist/assets/CustomNodeDialog-JGYnWY6m.css +1 -0
  12. package/dist/assets/ExportDialog-DOq0flMV.css +1 -0
  13. package/dist/assets/ExportDialog-DWN4nhXI.js +358 -0
  14. package/dist/assets/ProjectSettings-BzT164Yx.js +2 -0
  15. package/dist/assets/ProjectSettings-DdO9xoQz.css +1 -0
  16. package/dist/assets/SettingsDialog-CeK7ytpY.css +1 -0
  17. package/dist/assets/SettingsDialog-DmHb1V0r.js +1 -0
  18. package/dist/assets/VersionHistoryDialog-CWNmHQ-P.css +1 -0
  19. package/dist/assets/VersionHistoryDialog-hH6VsXLX.js +3 -0
  20. package/dist/assets/abap-08VXUWAP.js +1 -0
  21. package/dist/assets/apex-BWPQTe0t.js +1 -0
  22. package/dist/assets/azcli-Bc_sGQ0U.js +1 -0
  23. package/dist/assets/bat-i0X4ZdIN.js +1 -0
  24. package/dist/assets/bicep-B5-_aFwp.js +2 -0
  25. package/dist/assets/cameligo-DMUM7wLl.js +1 -0
  26. package/dist/assets/cascade.jpg +0 -0
  27. package/dist/assets/clojure-Cm7r79vr.js +1 -0
  28. package/dist/assets/codicon-Brq4_Ui5.ttf +0 -0
  29. package/dist/assets/coffee-Ba7i2nA0.js +1 -0
  30. package/dist/assets/core-Bji4aZUU.js +965 -0
  31. package/dist/assets/cpp-C7h46wYY.js +1 -0
  32. package/dist/assets/csharp-BKxtCVv1.js +1 -0
  33. package/dist/assets/csp-bTuwJoIa.js +1 -0
  34. package/dist/assets/css-DIMkf-bt.js +3 -0
  35. package/dist/assets/css.worker-B3ciXF_0.js +93 -0
  36. package/dist/assets/cssMode-B6Z_Q1Kh.js +1 -0
  37. package/dist/assets/cypher-CVaqCwHa.js +1 -0
  38. package/dist/assets/dart-onAF5SnQ.js +1 -0
  39. package/dist/assets/dockerfile-DZFCIeNp.js +1 -0
  40. package/dist/assets/ecl-D05T4iGw.js +1 -0
  41. package/dist/assets/editor-1FQrmyyI.css +1 -0
  42. package/dist/assets/editor.api-jMoW_43X.js +847 -0
  43. package/dist/assets/editor.worker-q-txB4vs.js +30 -0
  44. package/dist/assets/elixir-6RTg0lbw.js +1 -0
  45. package/dist/assets/flow9-C5_-GSwl.js +1 -0
  46. package/dist/assets/freemarker2-DvvPV6m5.js +3 -0
  47. package/dist/assets/fsharp-C8Ef5oNN.js +1 -0
  48. package/dist/assets/geo-CXmCtzMM.js +2 -0
  49. package/dist/assets/go-C-y9NEjX.js +1 -0
  50. package/dist/assets/graphql-fmXr3nnJ.js +1 -0
  51. package/dist/assets/handlebars-B8rfuSIa.js +1 -0
  52. package/dist/assets/hcl-CpzslTdj.js +1 -0
  53. package/dist/assets/html-DyHm6JCp.js +1 -0
  54. package/dist/assets/html.worker-C93Ht9o9.js +506 -0
  55. package/dist/assets/htmlMode-E9XLWE5u.js +1 -0
  56. package/dist/assets/image-BUcQC7PG.js +2076 -0
  57. package/dist/assets/index-BXYXSdgh.js +224 -0
  58. package/dist/assets/index-CrNke7SW.css +1 -0
  59. package/dist/assets/index-client-DN_FvjN8.js +1 -0
  60. package/dist/assets/ini-sBoK_t0W.js +1 -0
  61. package/dist/assets/java-BEtHBSE6.js +1 -0
  62. package/dist/assets/javascript-C_bM5PCN.js +1 -0
  63. package/dist/assets/json.worker-B2V3pomh.js +62 -0
  64. package/dist/assets/jsonMode-BdyVS7G4.js +7 -0
  65. package/dist/assets/julia-Bri6UV-V.js +1 -0
  66. package/dist/assets/kotlin-BOotOW0E.js +1 -0
  67. package/dist/assets/legacy-DIu3XRwl.js +2 -0
  68. package/dist/assets/less-B9JPFI3C.js +2 -0
  69. package/dist/assets/lexon-CfSJPG6W.js +1 -0
  70. package/dist/assets/liquid-CDkn3spA.js +1 -0
  71. package/dist/assets/lspLanguageFeatures-AB5DMAsr.js +4 -0
  72. package/dist/assets/lua-CsQS60Ue.js +1 -0
  73. package/dist/assets/m3-D-oSqn_W.js +1 -0
  74. package/dist/assets/markdown-Cimd5fb3.js +1 -0
  75. package/dist/assets/mdx-BvH_NjDN.js +1 -0
  76. package/dist/assets/mips-CIPQ_RoX.js +1 -0
  77. package/dist/assets/msdax-DauUninz.js +1 -0
  78. package/dist/assets/mysql-SOo6toE5.js +1 -0
  79. package/dist/assets/nodeTypeUtils-CweA3NHd.js +1 -0
  80. package/dist/assets/objective-c-FvmIjYaQ.js +1 -0
  81. package/dist/assets/pascal-DrH0SRf2.js +1 -0
  82. package/dist/assets/pascaligo-D-ptJ9y-.js +1 -0
  83. package/dist/assets/perl-oz_6vUea.js +1 -0
  84. package/dist/assets/pgsql-DTj74zXo.js +1 -0
  85. package/dist/assets/php-nr791fC2.js +1 -0
  86. package/dist/assets/pla-CopQ2nXW.js +1 -0
  87. package/dist/assets/postiats-43DmfD33.js +1 -0
  88. package/dist/assets/powerquery-D3hlyOfw.js +1 -0
  89. package/dist/assets/powershell-DmHpPYUd.js +1 -0
  90. package/dist/assets/projectSettingsApi-C1WvIwfP.js +1 -0
  91. package/dist/assets/protobuf-C531GsRP.js +2 -0
  92. package/dist/assets/pug-Z5eAx3Zn.js +1 -0
  93. package/dist/assets/python-B7uii4fi.js +1 -0
  94. package/dist/assets/qsharp-DkqhCAOL.js +1 -0
  95. package/dist/assets/quill-DjZ69wL_.js +121 -0
  96. package/dist/assets/r-BwWrilGY.js +1 -0
  97. package/dist/assets/razor-Z48fWdJc.js +1 -0
  98. package/dist/assets/redis-ClamHrr6.js +1 -0
  99. package/dist/assets/redshift-DT7zqm-g.js +1 -0
  100. package/dist/assets/restructuredtext-BYgofb2h.js +1 -0
  101. package/dist/assets/ruby-DezsRK8O.js +1 -0
  102. package/dist/assets/rust-DdL9SqIa.js +1 -0
  103. package/dist/assets/sb-CcwsVR0C.js +1 -0
  104. package/dist/assets/scala-DHpiXF5c.js +1 -0
  105. package/dist/assets/scheme-BeGwcela.js +1 -0
  106. package/dist/assets/scss-gp-XZpBa.js +3 -0
  107. package/dist/assets/shell-CC2rA5mh.js +1 -0
  108. package/dist/assets/solidity-BEEn4gHE.js +1 -0
  109. package/dist/assets/sophia-CRfGWb83.js +1 -0
  110. package/dist/assets/sparql-D_Lu-MrJ.js +1 -0
  111. package/dist/assets/sql-NEE52Syq.js +1 -0
  112. package/dist/assets/st-DbInun42.js +1 -0
  113. package/dist/assets/swift-Bxkupp3x.js +1 -0
  114. package/dist/assets/systemverilog-Bz4Y3fRF.js +1 -0
  115. package/dist/assets/tcl-DISqw1ZD.js +1 -0
  116. package/dist/assets/ts.worker-D7T1-Ig5.js +67738 -0
  117. package/dist/assets/tsMode-BDgacVG4.js +11 -0
  118. package/dist/assets/twig-De2hgUGE.js +1 -0
  119. package/dist/assets/typescript-Derb6Oqa.js +1 -0
  120. package/dist/assets/typespec-B8J7ngcE.js +1 -0
  121. package/dist/assets/vb-DV3o63ZY.js +1 -0
  122. package/dist/assets/wgsl-DpFanUEy.js +298 -0
  123. package/dist/assets/workers-BtoMX_pm.js +1 -0
  124. package/dist/assets/xml-B1CaFSrG.js +1 -0
  125. package/dist/assets/yaml-HmIeA0KH.js +1 -0
  126. package/dist/cli/index.js +11377 -0
  127. package/dist/cli/index.js.map +7 -0
  128. package/dist/cli/runtime/io.ts +445 -0
  129. package/dist/cli/runtime/net.ts +19 -0
  130. package/dist/cli/runtime/shell.ts +46 -0
  131. package/dist/cli/runtime/stage.ts +132 -0
  132. package/dist/contracts/capabilities.d.ts +109 -0
  133. package/dist/contracts/capabilities.d.ts.map +1 -0
  134. package/dist/contracts/capabilities.js +11 -0
  135. package/dist/contracts/capabilities.js.map +1 -0
  136. package/dist/contracts/color.d.ts +67 -0
  137. package/dist/contracts/color.d.ts.map +1 -0
  138. package/dist/contracts/color.js +83 -0
  139. package/dist/contracts/color.js.map +1 -0
  140. package/dist/contracts/definition.d.ts +118 -0
  141. package/dist/contracts/definition.d.ts.map +1 -0
  142. package/dist/contracts/definition.js +2 -0
  143. package/dist/contracts/definition.js.map +1 -0
  144. package/dist/contracts/document.d.ts +50 -0
  145. package/dist/contracts/document.d.ts.map +1 -0
  146. package/dist/contracts/document.js +2 -0
  147. package/dist/contracts/document.js.map +1 -0
  148. package/dist/contracts/geometry.d.ts +301 -0
  149. package/dist/contracts/geometry.d.ts.map +1 -0
  150. package/dist/contracts/geometry.js +604 -0
  151. package/dist/contracts/geometry.js.map +1 -0
  152. package/dist/contracts/index.d.ts +8 -0
  153. package/dist/contracts/index.d.ts.map +1 -0
  154. package/dist/contracts/index.js +8 -0
  155. package/dist/contracts/index.js.map +1 -0
  156. package/dist/contracts/schema.d.ts +6 -0
  157. package/dist/contracts/schema.d.ts.map +1 -0
  158. package/dist/contracts/schema.js +85 -0
  159. package/dist/contracts/schema.js.map +1 -0
  160. package/dist/contracts/validate.d.ts +13 -0
  161. package/dist/contracts/validate.d.ts.map +1 -0
  162. package/dist/contracts/validate.js +202 -0
  163. package/dist/contracts/validate.js.map +1 -0
  164. package/dist/contracts/values.d.ts +100 -0
  165. package/dist/contracts/values.d.ts.map +1 -0
  166. package/dist/contracts/values.js +59 -0
  167. package/dist/contracts/values.js.map +1 -0
  168. package/dist/graphs/default-orig.cascade +128 -0
  169. package/dist/graphs/default.cascade +21 -0
  170. package/dist/index.html +19 -0
  171. package/dist/runtime/browser.d.ts +3 -0
  172. package/dist/runtime/browser.d.ts.map +1 -0
  173. package/dist/runtime/browser.js +12 -0
  174. package/dist/runtime/browser.js.map +1 -0
  175. package/dist/runtime/builtins/core/index.d.ts +9 -0
  176. package/dist/runtime/builtins/core/index.d.ts.map +1 -0
  177. package/dist/runtime/builtins/core/index.js +21 -0
  178. package/dist/runtime/builtins/core/index.js.map +1 -0
  179. package/dist/runtime/builtins/core/random.d.ts +66 -0
  180. package/dist/runtime/builtins/core/random.d.ts.map +1 -0
  181. package/dist/runtime/builtins/core/random.js +46 -0
  182. package/dist/runtime/builtins/core/random.js.map +1 -0
  183. package/dist/runtime/builtins/core/remap.d.ts +105 -0
  184. package/dist/runtime/builtins/core/remap.d.ts.map +1 -0
  185. package/dist/runtime/builtins/core/remap.js +43 -0
  186. package/dist/runtime/builtins/core/remap.js.map +1 -0
  187. package/dist/runtime/builtins/core/routing.d.ts +117 -0
  188. package/dist/runtime/builtins/core/routing.d.ts.map +1 -0
  189. package/dist/runtime/builtins/core/routing.js +114 -0
  190. package/dist/runtime/builtins/core/routing.js.map +1 -0
  191. package/dist/runtime/builtins/core/structural.d.ts +86 -0
  192. package/dist/runtime/builtins/core/structural.d.ts.map +1 -0
  193. package/dist/runtime/builtins/core/structural.js +63 -0
  194. package/dist/runtime/builtins/core/structural.js.map +1 -0
  195. package/dist/runtime/builtins/geo/copyToPoints.d.ts +58 -0
  196. package/dist/runtime/builtins/geo/copyToPoints.d.ts.map +1 -0
  197. package/dist/runtime/builtins/geo/copyToPoints.js +35 -0
  198. package/dist/runtime/builtins/geo/copyToPoints.js.map +1 -0
  199. package/dist/runtime/builtins/geo/definitions.d.ts +526 -0
  200. package/dist/runtime/builtins/geo/definitions.d.ts.map +1 -0
  201. package/dist/runtime/builtins/geo/definitions.js +182 -0
  202. package/dist/runtime/builtins/geo/definitions.js.map +1 -0
  203. package/dist/runtime/builtins/geo/generators.d.ts +94 -0
  204. package/dist/runtime/builtins/geo/generators.d.ts.map +1 -0
  205. package/dist/runtime/builtins/geo/generators.js +41 -0
  206. package/dist/runtime/builtins/geo/generators.js.map +1 -0
  207. package/dist/runtime/builtins/geo/index.d.ts +23 -0
  208. package/dist/runtime/builtins/geo/index.d.ts.map +1 -0
  209. package/dist/runtime/builtins/geo/index.js +35 -0
  210. package/dist/runtime/builtins/geo/index.js.map +1 -0
  211. package/dist/runtime/builtins/geo/merge.d.ts +40 -0
  212. package/dist/runtime/builtins/geo/merge.d.ts.map +1 -0
  213. package/dist/runtime/builtins/geo/merge.js +24 -0
  214. package/dist/runtime/builtins/geo/merge.js.map +1 -0
  215. package/dist/runtime/builtins/geo/namespace.d.ts +15 -0
  216. package/dist/runtime/builtins/geo/namespace.d.ts.map +1 -0
  217. package/dist/runtime/builtins/geo/namespace.js +17 -0
  218. package/dist/runtime/builtins/geo/namespace.js.map +1 -0
  219. package/dist/runtime/builtins/geo/svgExport.d.ts +130 -0
  220. package/dist/runtime/builtins/geo/svgExport.d.ts.map +1 -0
  221. package/dist/runtime/builtins/geo/svgExport.js +50 -0
  222. package/dist/runtime/builtins/geo/svgExport.js.map +1 -0
  223. package/dist/runtime/builtins/geo/transform.d.ts +60 -0
  224. package/dist/runtime/builtins/geo/transform.d.ts.map +1 -0
  225. package/dist/runtime/builtins/geo/transform.js +32 -0
  226. package/dist/runtime/builtins/geo/transform.js.map +1 -0
  227. package/dist/runtime/builtins/index.d.ts +9 -0
  228. package/dist/runtime/builtins/index.d.ts.map +1 -0
  229. package/dist/runtime/builtins/index.js +16 -0
  230. package/dist/runtime/builtins/index.js.map +1 -0
  231. package/dist/runtime/definition/architecture.d.ts +8 -0
  232. package/dist/runtime/definition/architecture.d.ts.map +1 -0
  233. package/dist/runtime/definition/architecture.js +112 -0
  234. package/dist/runtime/definition/architecture.js.map +1 -0
  235. package/dist/runtime/definition/extract.d.ts +12 -0
  236. package/dist/runtime/definition/extract.d.ts.map +1 -0
  237. package/dist/runtime/definition/extract.js +151 -0
  238. package/dist/runtime/definition/extract.js.map +1 -0
  239. package/dist/runtime/error.d.ts +8 -0
  240. package/dist/runtime/error.d.ts.map +1 -0
  241. package/dist/runtime/error.js +11 -0
  242. package/dist/runtime/error.js.map +1 -0
  243. package/dist/runtime/geometry/attributes.d.ts +65 -0
  244. package/dist/runtime/geometry/attributes.d.ts.map +1 -0
  245. package/dist/runtime/geometry/attributes.js +201 -0
  246. package/dist/runtime/geometry/attributes.js.map +1 -0
  247. package/dist/runtime/geometry/builder.d.ts +57 -0
  248. package/dist/runtime/geometry/builder.d.ts.map +1 -0
  249. package/dist/runtime/geometry/builder.js +153 -0
  250. package/dist/runtime/geometry/builder.js.map +1 -0
  251. package/dist/runtime/geometry/copy.d.ts +36 -0
  252. package/dist/runtime/geometry/copy.d.ts.map +1 -0
  253. package/dist/runtime/geometry/copy.js +68 -0
  254. package/dist/runtime/geometry/copy.js.map +1 -0
  255. package/dist/runtime/geometry/generate.d.ts +43 -0
  256. package/dist/runtime/geometry/generate.d.ts.map +1 -0
  257. package/dist/runtime/geometry/generate.js +76 -0
  258. package/dist/runtime/geometry/generate.js.map +1 -0
  259. package/dist/runtime/geometry/groups.d.ts +18 -0
  260. package/dist/runtime/geometry/groups.d.ts.map +1 -0
  261. package/dist/runtime/geometry/groups.js +69 -0
  262. package/dist/runtime/geometry/groups.js.map +1 -0
  263. package/dist/runtime/geometry/index.d.ts +23 -0
  264. package/dist/runtime/geometry/index.d.ts.map +1 -0
  265. package/dist/runtime/geometry/index.js +23 -0
  266. package/dist/runtime/geometry/index.js.map +1 -0
  267. package/dist/runtime/geometry/matrix.d.ts +26 -0
  268. package/dist/runtime/geometry/matrix.d.ts.map +1 -0
  269. package/dist/runtime/geometry/matrix.js +27 -0
  270. package/dist/runtime/geometry/matrix.js.map +1 -0
  271. package/dist/runtime/geometry/merge.d.ts +33 -0
  272. package/dist/runtime/geometry/merge.d.ts.map +1 -0
  273. package/dist/runtime/geometry/merge.js +185 -0
  274. package/dist/runtime/geometry/merge.js.map +1 -0
  275. package/dist/runtime/geometry/primitives.d.ts +41 -0
  276. package/dist/runtime/geometry/primitives.d.ts.map +1 -0
  277. package/dist/runtime/geometry/primitives.js +131 -0
  278. package/dist/runtime/geometry/primitives.js.map +1 -0
  279. package/dist/runtime/geometry/promote.d.ts +44 -0
  280. package/dist/runtime/geometry/promote.d.ts.map +1 -0
  281. package/dist/runtime/geometry/promote.js +203 -0
  282. package/dist/runtime/geometry/promote.js.map +1 -0
  283. package/dist/runtime/geometry/resample.d.ts +29 -0
  284. package/dist/runtime/geometry/resample.d.ts.map +1 -0
  285. package/dist/runtime/geometry/resample.js +165 -0
  286. package/dist/runtime/geometry/resample.js.map +1 -0
  287. package/dist/runtime/geometry/svg.d.ts +91 -0
  288. package/dist/runtime/geometry/svg.d.ts.map +1 -0
  289. package/dist/runtime/geometry/svg.js +216 -0
  290. package/dist/runtime/geometry/svg.js.map +1 -0
  291. package/dist/runtime/geometry/transform.d.ts +18 -0
  292. package/dist/runtime/geometry/transform.d.ts.map +1 -0
  293. package/dist/runtime/geometry/transform.js +56 -0
  294. package/dist/runtime/geometry/transform.js.map +1 -0
  295. package/dist/runtime/index.d.ts +5 -0
  296. package/dist/runtime/index.d.ts.map +1 -0
  297. package/dist/runtime/index.js +4 -0
  298. package/dist/runtime/index.js.map +1 -0
  299. package/dist/runtime/node.d.ts +4 -0
  300. package/dist/runtime/node.d.ts.map +1 -0
  301. package/dist/runtime/node.js +12 -0
  302. package/dist/runtime/node.js.map +1 -0
  303. package/dist/runtime/runtime.d.ts +3 -0
  304. package/dist/runtime/runtime.d.ts.map +1 -0
  305. package/dist/runtime/runtime.js +1198 -0
  306. package/dist/runtime/runtime.js.map +1 -0
  307. package/dist/runtime/types.d.ts +241 -0
  308. package/dist/runtime/types.d.ts.map +1 -0
  309. package/dist/runtime/types.js +2 -0
  310. package/dist/runtime/types.js.map +1 -0
  311. package/dist/shell.d.ts +8 -0
  312. package/dist/shell.js +54 -0
  313. package/dist/shell.js.map +7 -0
  314. package/dist/stage.d.ts +7 -0
  315. package/dist/stage.js +84 -0
  316. package/dist/stage.js.map +7 -0
  317. package/dist/studio/panel.d.ts +48 -0
  318. package/doc/PROJECT_AUTHORING.md +360 -0
  319. package/package.json +126 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../server/src/pathSafety.ts", "../../server/src/credentials.ts", "../../server/src/projectConfig.ts", "../../server/src/shell/types.ts", "../../server/src/shell/service.ts", "../../server/src/project.ts", "../../server/src/compile.ts", "../../server/src/stageRunner.ts", "../../server/src/config.ts", "../../server/src/formatCascadeJson.ts", "../../server/src/git.ts", "../../server/src/routes/graph.ts", "../../server/src/routes/assets.ts", "../../server/src/nodeWatch.ts", "../../server/src/routes/nodes.ts", "../../server/src/routes/panels.ts", "../../server/src/pythonWorker.ts", "../../server/src/security.ts", "../../server/src/routes/exec.ts", "../../server/src/routes/shell.ts", "../../server/src/routes/projectSettings.ts", "../../server/src/routes/net.ts", "../../server/src/routes/media.ts", "../../server/src/build.ts", "../../server/src/index.ts", "../../server/src/projectTemplate.ts", "../../server/src/cliCommands.ts", "../../src/utils/nodeTypeUtils.ts", "../../src/utils/colorUtils.ts", "../../src/engine/expressions/ExpressionEngine.ts", "../../src/nodes/Node.ts", "../../src/nodes/annotations/Annotation.ts", "../../src/nodes/annotations/Image.ts", "../../src/nodes/annotations/Text.ts", "../../src/nodes/annotations/Group.ts", "../../src/nodes/annotations/Line.ts", "../../src/nodes/annotations/Polyline.ts", "../../src/engine/AssetManager.ts", "../../src/engine/PackageManager.ts", "../../src/engine/ModuleResolver.ts", "../../src/engine/GraphValidator.ts", "../../src/engine/nodeModuleLoader.ts", "../../packages/contracts/src/color.ts", "../../packages/contracts/src/geometry.ts", "../../packages/contracts/src/values.ts", "../../packages/contracts/src/validate.ts", "../../src/types/coreTypes.ts", "../../src/nodes/CookScheduler.ts", "../../src/nodes/Graph.ts", "../../src/engine/NodeAssetLoader.ts", "../../src/cli/runner.ts", "../../src/cli/projectRuntime.ts", "../../packages/runtime/src/error.ts", "../../packages/runtime/src/geometry/attributes.ts", "../../packages/runtime/src/geometry/builder.ts", "../../packages/runtime/src/geometry/groups.ts", "../../packages/runtime/src/geometry/matrix.ts", "../../packages/runtime/src/geometry/merge.ts", "../../packages/runtime/src/geometry/transform.ts", "../../packages/runtime/src/geometry/copy.ts", "../../packages/runtime/src/geometry/generate.ts", "../../packages/runtime/src/geometry/primitives.ts", "../../packages/runtime/src/geometry/svg.ts", "../../packages/runtime/src/builtins/core/random.ts", "../../packages/runtime/src/builtins/core/remap.ts", "../../packages/runtime/src/builtins/core/routing.ts", "../../packages/runtime/src/builtins/core/structural.ts", "../../packages/runtime/src/builtins/core/index.ts", "../../packages/runtime/src/builtins/geo/definitions.ts", "../../packages/runtime/src/builtins/geo/namespace.ts", "../../packages/runtime/src/builtins/geo/copyToPoints.ts", "../../packages/runtime/src/builtins/geo/generators.ts", "../../packages/runtime/src/builtins/geo/merge.ts", "../../packages/runtime/src/builtins/geo/svgExport.ts", "../../packages/runtime/src/builtins/geo/transform.ts", "../../packages/runtime/src/builtins/geo/index.ts", "../../packages/runtime/src/builtins/index.ts", "../../packages/runtime/src/runtime.ts", "../../packages/runtime/src/node.ts", "../../packages/runtime/src/definition/extract.ts", "../../packages/runtime/src/definition/architecture.ts", "../../server/src/runtime/stage.ts", "../../src/cli/index.ts"],
4
+ "sourcesContent": ["/**\n * Path-traversal guard shared by projects.ts and assets.ts. Both routers\n * built `path.join(PROJECTS_DIR, req.params.id, ...)` straight from\n * request params with no validation \u2014 fine when this server only ever\n * talked only to a trusted local Studio page, not fine\n * once it's reachable from a browser. resolveWithinRoot is the one place\n * that check happens; every route handler goes through it before any fs\n * call.\n */\nimport path from 'path';\nimport fs from 'node:fs';\n\nexport class PathSafetyError extends Error {}\n\n/**\n * Resolves `...segments` against `root` and throws PathSafetyError if the\n * result would land outside `root` \u2014 checked against the RESOLVED\n * absolute path, not the raw input string (a normalize-then-compare, so\n * `..`, encoded separators, or a segment that's itself an absolute path\n * can't sneak through).\n */\nexport function resolveWithinRoot(root: string, ...segments: string[]): string {\n for (const seg of segments) {\n if (path.isAbsolute(seg)) {\n throw new PathSafetyError(`absolute path segment not allowed: ${seg}`);\n }\n }\n const full = path.resolve(root, ...segments);\n const rel = path.relative(root, full);\n if (rel.startsWith('..') || path.isAbsolute(rel)) {\n throw new PathSafetyError(`path escapes root: ${segments.join('/')}`);\n }\n const canonicalRoot = canonical(root, `project root is not accessible: ${root}`);\n let existing = full;\n while (!existsIncludingSymlink(existing)) {\n const parent = path.dirname(existing);\n if (parent === existing) {\n throw new PathSafetyError(`path has no accessible parent: ${segments.join('/')}`);\n }\n existing = parent;\n }\n const canonicalExisting = canonical(existing, `path is not accessible: ${segments.join('/')}`);\n const canonicalRel = path.relative(canonicalRoot, canonicalExisting);\n if (canonicalRel.startsWith('..') || path.isAbsolute(canonicalRel)) {\n throw new PathSafetyError(`path escapes root through a symbolic link: ${segments.join('/')}`);\n }\n return full;\n}\n\nfunction existsIncludingSymlink(candidate: string): boolean {\n try {\n fs.lstatSync(candidate);\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return false;\n throw error;\n }\n}\n\nfunction canonical(candidate: string, message: string): string {\n try {\n return fs.realpathSync(candidate);\n } catch {\n throw new PathSafetyError(message);\n }\n}\n", "import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nexport interface CredentialDefinition {\n readonly name: string;\n readonly fields: Readonly<Record<string, string>>;\n readonly hosts: readonly string[];\n readonly header?: string;\n readonly scheme?: string;\n readonly field?: string;\n readonly env?: string;\n}\n\nexport class CredentialStore {\n constructor(readonly file = process.env.CASCADE_CREDENTIALS || path.join(os.homedir(), '.cascade', 'credentials.yaml')) {}\n\n has(name: string): boolean {\n const definition = this.read().get(name);\n return !!definition && Object.keys(definition.fields).length > 0;\n }\n\n get(name: string): CredentialDefinition | null { return this.read().get(name) ?? null; }\n\n environment(names: readonly string[]): Record<string, string> {\n const definitions = this.read();\n const env: Record<string, string> = {};\n for (const name of names) {\n const definition = definitions.get(name);\n if (!definition) continue;\n const normalizedName = envName(name);\n for (const [field, value] of Object.entries(definition.fields)) {\n env[`CASCADE_CREDENTIAL_${normalizedName}_${envName(field)}`] = value;\n }\n const secret = secretValue(definition);\n if (secret) env[safeEnvName(definition.env) ?? `CASCADE_CREDENTIAL_${normalizedName}`] = secret;\n }\n return env;\n }\n\n private read(): Map<string, CredentialDefinition> {\n let source: string;\n try { source = fs.readFileSync(this.file, 'utf8'); }\n catch (error) { if ((error as NodeJS.ErrnoException).code === 'ENOENT') return new Map(); throw error; }\n return parseCredentials(source);\n }\n}\n\nexport function secretValue(definition: CredentialDefinition): string | null {\n const key = definition.field;\n if (key && definition.fields[key]) return definition.fields[key];\n for (const candidate of ['value', 'api_key', 'apiKey', 'access_token', 'token', 'key']) {\n if (definition.fields[candidate]) return definition.fields[candidate];\n }\n return null;\n}\n\nfunction parseCredentials(source: string): Map<string, CredentialDefinition> {\n const json = source.trim().startsWith('{') ? JSON.parse(source) : null;\n const raw = json && typeof json === 'object' ? json as Record<string, unknown> : parseSimpleYaml(source);\n const result = new Map<string, CredentialDefinition>();\n for (const [name, value] of Object.entries(raw)) {\n if (!/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(name) || !value || typeof value !== 'object' || Array.isArray(value)) continue;\n const record = value as Record<string, unknown>;\n const fields = Object.fromEntries(Object.entries(record).filter(([key, item]) => typeof item === 'string' && !['header', 'scheme', 'field', 'env'].includes(key)));\n const hosts = Array.isArray(record.hosts) ? record.hosts.filter((item): item is string => typeof item === 'string').map(normalizeHost).filter(Boolean) : [];\n result.set(name, Object.freeze({ name, fields: Object.freeze(fields as Record<string, string>), hosts: Object.freeze(hosts),\n ...(typeof record.header === 'string' ? { header: record.header } : {}),\n ...(typeof record.scheme === 'string' ? { scheme: record.scheme } : {}),\n ...(typeof record.field === 'string' ? { field: record.field } : {}),\n ...(typeof record.env === 'string' ? { env: record.env } : {}) }));\n }\n return result;\n}\n\nfunction parseSimpleYaml(source: string): Record<string, Record<string, unknown>> {\n const result: Record<string, Record<string, unknown>> = {};\n let current: Record<string, unknown> | null = null;\n for (const rawLine of source.split(/\\r?\\n/)) {\n const line = rawLine.replace(/\\s+#.*$/, '');\n if (!line.trim()) continue;\n const top = line.match(/^([A-Za-z0-9][A-Za-z0-9._-]*):\\s*$/);\n if (top) { current = {}; result[top[1]] = current; continue; }\n const field = line.match(/^\\s{2,}([A-Za-z0-9_-]+):\\s*(.*?)\\s*$/);\n if (!current || !field) throw new Error(`Unsupported credentials.yaml syntax near ${JSON.stringify(rawLine)}`);\n const value = unquote(field[2]);\n current[field[1]] = value.startsWith('[') && value.endsWith(']')\n ? value.slice(1, -1).split(',').map((item) => unquote(item.trim())).filter(Boolean)\n : value;\n }\n return result;\n}\n\nfunction unquote(value: string): string {\n if ((value.startsWith('\"') && value.endsWith('\"')) || (value.startsWith(\"'\") && value.endsWith(\"'\"))) return value.slice(1, -1);\n return value;\n}\n\nfunction normalizeHost(value: string): string {\n try { return value.includes('://') ? new URL(value).hostname.toLowerCase() : value.toLowerCase(); } catch { return ''; }\n}\n\nfunction envName(value: string): string { return value.replace(/[^A-Za-z0-9]/g, '_').toUpperCase(); }\n\nfunction safeEnvName(value: string | undefined): string | null {\n return value && /^[A-Za-z_][A-Za-z0-9_]{0,127}$/.test(value) && !/^(?:PATH|NODE_OPTIONS|PYTHONPATH|LD_.*|DYLD_.*)$/i.test(value)\n ? value\n : null;\n}\n", "import fs from 'node:fs';\nimport path from 'node:path';\n\nexport interface ProjectManifest {\n readonly name: string;\n readonly commands: Readonly<Record<string, string>>;\n readonly credentials: readonly string[];\n readonly settings: Readonly<Record<string, unknown>>;\n}\n\nconst CREDENTIAL_NAME = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;\nconst SECRET_KEY = /^(?:api[_-]?key|apiKey|secret|password|access[_-]?token|refresh[_-]?token|credential|credentials)$/i;\n\nexport function readProjectManifest(root: string): ProjectManifest {\n const raw = readRaw(root);\n return normalizeManifest(raw);\n}\n\nexport function writeProjectManifest(root: string, input: unknown): ProjectManifest {\n if (!input || typeof input !== 'object' || Array.isArray(input)) throw new Error('project manifest must be an object');\n const value = input as Record<string, unknown>;\n const current = readRaw(root);\n const next = {\n ...current,\n name: typeof value.name === 'string' ? value.name.trim() : '',\n commands: stringRecord(value.commands, 'commands'),\n credentials: credentialNames(value.credentials),\n settings: settingsRecord(value.settings),\n };\n fs.writeFileSync(path.join(root, 'cascade.json'), `${JSON.stringify(next, null, 2)}\\n`, 'utf8');\n return normalizeManifest(next);\n}\n\nfunction readRaw(root: string): Record<string, unknown> {\n try {\n const value = JSON.parse(fs.readFileSync(path.join(root, 'cascade.json'), 'utf8'));\n if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error('root must be an object');\n return value;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return {};\n throw new Error(`Cannot read cascade.json: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\nfunction normalizeManifest(raw: Record<string, unknown>): ProjectManifest {\n return Object.freeze({\n name: typeof raw.name === 'string' ? raw.name : '',\n commands: Object.freeze(stringRecord(raw.commands, 'commands')),\n credentials: Object.freeze(credentialNames(raw.credentials)),\n settings: Object.freeze(settingsRecord(raw.settings)),\n });\n}\n\nfunction stringRecord(input: unknown, label: string): Record<string, string> {\n if (input === undefined) return {};\n if (!input || typeof input !== 'object' || Array.isArray(input)) throw new Error(`${label} must be an object of strings`);\n const entries = Object.entries(input);\n if (entries.some(([key, value]) => !CREDENTIAL_NAME.test(key) || typeof value !== 'string' || value.includes('\\0'))) {\n throw new Error(`${label} must contain safe names and string values`);\n }\n return Object.fromEntries(entries) as Record<string, string>;\n}\n\nfunction credentialNames(input: unknown): string[] {\n if (input === undefined) return [];\n if (!Array.isArray(input) || input.some((name) => typeof name !== 'string' || !CREDENTIAL_NAME.test(name))) {\n throw new Error('credentials must be an array of safe names');\n }\n return [...new Set(input as string[])];\n}\n\nfunction settingsRecord(input: unknown): Record<string, unknown> {\n if (input === undefined) return {};\n if (!input || typeof input !== 'object' || Array.isArray(input)) throw new Error('settings must be an object');\n assertSafeSettings(input, 0);\n return structuredClone(input as Record<string, unknown>);\n}\n\nfunction assertSafeSettings(value: unknown, depth: number): void {\n if (depth > 12) throw new Error('settings nesting is too deep');\n if (value === null || typeof value === 'string' || typeof value === 'boolean' || (typeof value === 'number' && Number.isFinite(value))) return;\n if (Array.isArray(value)) return value.forEach((item) => assertSafeSettings(item, depth + 1));\n if (!value || typeof value !== 'object') throw new Error('settings must contain JSON values');\n for (const [key, item] of Object.entries(value)) {\n if (key === '__proto__' || key === 'constructor' || key === 'prototype' || SECRET_KEY.test(key)) {\n throw new Error(`settings key ${JSON.stringify(key)} looks secret or unsafe; credentials belong outside the project`);\n }\n assertSafeSettings(item, depth + 1);\n }\n}\n", "export interface ShellRunResult {\n readonly stdout: string;\n readonly stderr: string;\n readonly code: number | null;\n readonly timedOut: boolean;\n readonly cancelled: boolean;\n readonly outputLimited: boolean;\n}\n\nexport type ShellProcessErrorKind = 'nonzero' | 'invalid-json' | 'spawn' | 'timeout' | 'cancelled' | 'output-limit';\n\nexport class ShellProcessError extends Error {\n readonly name = 'ShellProcessError';\n\n constructor(readonly kind: ShellProcessErrorKind, readonly result: ShellRunResult, message?: string) {\n super(message ?? `Shell process failed: ${kind}`);\n }\n}\n\nexport interface ShellRunOptions {\n readonly cwd?: string;\n readonly timeout?: number;\n readonly stdin?: string;\n readonly env?: Readonly<Record<string, string>>;\n readonly signal?: AbortSignal;\n}\n\nexport interface ShellCapability {\n run(command: string, args?: readonly string[], options?: ShellRunOptions): Promise<ShellRunResult>;\n runJson<T = unknown>(command: string, args?: readonly string[], options?: ShellRunOptions): Promise<T>;\n}\n\nexport class ShellRequestError extends Error {\n constructor(readonly code: 'COMMAND_NOT_ALLOWED' | 'INVALID_REQUEST' | 'MISSING_EXECUTABLE', message: string) {\n super(message);\n }\n}\n\nexport interface ShellAuditRecord {\n readonly id: string;\n readonly command: string;\n readonly cwd: string;\n readonly durationMs: number;\n readonly code: number | null;\n readonly errorKind?: ShellProcessErrorKind | ShellRequestError['code'];\n readonly timedOut: boolean;\n readonly cancelled: boolean;\n readonly outputLimited: boolean;\n}\n", "import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { execFile, spawn, type ChildProcess } from 'node:child_process';\nimport { randomUUID } from 'node:crypto';\nimport type { ProjectRoot } from '../project.js';\nimport { CredentialStore } from '../credentials.js';\nimport { readProjectManifest } from '../projectConfig.js';\nimport { ShellProcessError, ShellRequestError, type ShellAuditRecord, type ShellCapability, type ShellRunOptions, type ShellRunResult } from './types.js';\n\nconst MAX_BUFFER = 64 * 1024 * 1024;\nconst MAX_ARGS = 4096;\nconst MAX_ARG_BYTES = 1024 * 1024;\nconst MAX_STDIN_BYTES = 16 * 1024 * 1024;\nconst MAX_ENV_BYTES = 1024 * 1024;\nconst MAX_ENV_KEYS = 128;\nconst ENV_NAME = /^[A-Za-z_][A-Za-z0-9_]{0,127}$/;\nconst ALIAS = /^[A-Za-z0-9._-]+$/;\nconst BLOCKED_ENV = /^(?:PATH|NODE_OPTIONS|PYTHONPATH|RUBYOPT|PERL5OPT|BASH_ENV|ENV|SHELLOPTS|IFS|CDPATH|GLOBIGNORE|LD_.*|DYLD_.*)$/i;\n\ninterface ShellConfig {\n commands: Record<string, string>;\n shell: { timeout: number; env: Record<string, string>; allowedRequestEnv: Set<string> };\n}\n\ntype AuditSink = (record: ShellAuditRecord) => void;\n\nexport class ShellService implements ShellCapability {\n private config: ShellConfig;\n private configRevision: string;\n private readonly executables = new Map<string, string | null>();\n private auditSink: AuditSink = (record) => console.info('[cascade-shell]', JSON.stringify(record));\n\n constructor(private readonly project: ProjectRoot) {\n this.config = loadConfig(project.root);\n this.configRevision = readConfigRevision(project.root);\n for (const [alias, target] of Object.entries(this.config.commands)) {\n if (!ALIAS.test(alias)) {\n console.warn(`[cascade-shell] ignoring invalid command alias ${JSON.stringify(alias)}`);\n continue;\n }\n const executable = resolveExecutable(project.root, target);\n this.executables.set(alias, executable);\n if (!executable) console.warn(`[cascade-shell] command ${JSON.stringify(alias)} could not be resolved`);\n }\n }\n\n setAuditSink(sink: AuditSink): void {\n this.auditSink = sink;\n }\n\n async run(command: string, args: readonly string[] = [], options: ShellRunOptions = {}): Promise<ShellRunResult> {\n const started = Date.now();\n const id = randomUUID();\n let cwd = '.';\n let result: ShellRunResult = emptyResult();\n let errorKind: ShellAuditRecord['errorKind'];\n try {\n this.reloadConfig();\n const executable = this.resolveCommand(command);\n const validated = this.validate(args, options);\n cwd = validated.relativeCwd;\n result = await execute(executable, validated.args, {\n cwd: validated.cwd,\n timeout: validated.timeout,\n stdin: validated.stdin,\n env: validated.env,\n signal: options.signal,\n });\n return result;\n } catch (error) {\n if (error instanceof ShellProcessError) {\n result = error.result;\n errorKind = error.kind;\n } else if (error instanceof ShellRequestError) {\n errorKind = error.code;\n }\n throw error;\n } finally {\n this.auditSink({ id, command, cwd, durationMs: Date.now() - started, code: result.code, errorKind,\n timedOut: result.timedOut, cancelled: result.cancelled, outputLimited: result.outputLimited });\n }\n }\n\n private reloadConfig(): void {\n const revision = readConfigRevision(this.project.root);\n if (revision === this.configRevision) return;\n this.config = loadConfig(this.project.root);\n this.configRevision = revision;\n this.executables.clear();\n for (const [alias, target] of Object.entries(this.config.commands)) {\n if (!ALIAS.test(alias)) continue;\n this.executables.set(alias, resolveExecutable(this.project.root, target));\n }\n }\n\n async runJson<T = unknown>(command: string, args: readonly string[] = [], options: ShellRunOptions = {}): Promise<T> {\n const result = await this.run(command, args, options);\n if (result.code !== 0) throw new ShellProcessError('nonzero', result, result.stderr || `Command exited with code ${result.code}`);\n const lines = result.stdout.split(/\\r?\\n/).filter((value) => value.trim());\n const line = lines[lines.length - 1] ?? '';\n try {\n return JSON.parse(line) as T;\n } catch {\n throw new ShellProcessError('invalid-json', result, 'Command output was not valid JSON');\n }\n }\n\n private resolveCommand(command: string): string {\n if (!ALIAS.test(command)) throw new ShellRequestError('INVALID_REQUEST', 'command must be an allowlist alias');\n if (!this.executables.has(command)) {\n throw new ShellRequestError('COMMAND_NOT_ALLOWED',\n `Command \"${command}\" is not allowed. Add this under \"commands\" in ${this.project.root}/cascade.json: \"${command}\": \"<path>\"`);\n }\n const executable = this.executables.get(command);\n if (!executable) throw new ShellRequestError('MISSING_EXECUTABLE', `Configured command \"${command}\" is not available`);\n return executable;\n }\n\n private validate(args: readonly string[], options: ShellRunOptions) {\n if (!Array.isArray(args) || args.length > MAX_ARGS || args.some((arg) => typeof arg !== 'string' || Buffer.byteLength(arg) > MAX_ARG_BYTES || arg.includes('\\0'))) {\n throw new ShellRequestError('INVALID_REQUEST', 'args must be an array of bounded strings');\n }\n if (options.stdin !== undefined && (typeof options.stdin !== 'string' || Buffer.byteLength(options.stdin) > MAX_STDIN_BYTES || options.stdin.includes('\\0'))) {\n throw new ShellRequestError('INVALID_REQUEST', 'stdin exceeds the 16 MiB limit or is invalid');\n }\n const { cwd, relativeCwd } = resolveCwd(this.project.root, options.cwd ?? '.');\n const requestEnv = options.env ?? {};\n const entries = Object.entries(requestEnv);\n if (entries.length > MAX_ENV_KEYS || entries.reduce((sum, [key, value]) => sum + Buffer.byteLength(key) + Buffer.byteLength(String(value)), 0) > MAX_ENV_BYTES) {\n throw new ShellRequestError('INVALID_REQUEST', 'request environment exceeds its limit');\n }\n for (const [key, value] of entries) {\n if (!ENV_NAME.test(key) || typeof value !== 'string' || value.length > 65_536 || value.includes('\\0') || BLOCKED_ENV.test(key) || !this.config.shell.allowedRequestEnv.has(key)) {\n throw new ShellRequestError('INVALID_REQUEST', `request environment variable ${JSON.stringify(key)} is not allowed`);\n }\n }\n if (options.timeout !== undefined && (typeof options.timeout !== 'number' || !Number.isFinite(options.timeout))) {\n throw new ShellRequestError('INVALID_REQUEST', 'timeout must be a finite number');\n }\n const timeout = Math.min(600_000, Math.max(1, Math.trunc(options.timeout ?? this.config.shell.timeout)));\n const credentialEnv = new CredentialStore().environment(readProjectManifest(this.project.root).credentials);\n return { args: [...args], cwd, relativeCwd, timeout, stdin: options.stdin,\n env: { ...process.env, ...this.config.shell.env, ...requestEnv, ...credentialEnv } as NodeJS.ProcessEnv };\n }\n}\n\nfunction readConfigRevision(root: string): string {\n try { return fs.readFileSync(path.join(root, 'cascade.json'), 'utf8'); }\n catch (error) { if ((error as NodeJS.ErrnoException).code === 'ENOENT') return ''; throw error; }\n}\n\n/** Bind the single project service to a headless runtime/run signal. */\nexport function createDirectShellCapability(shell: ShellCapability, runtimeSignal?: AbortSignal): ShellCapability {\n const bind = (options: ShellRunOptions = {}): ShellRunOptions => ({\n ...options,\n signal: combineSignals(runtimeSignal, options.signal),\n });\n return Object.freeze({\n run: (command: string, args?: readonly string[], options?: ShellRunOptions) => shell.run(command, args, bind(options)),\n runJson: <T = unknown>(command: string, args?: readonly string[], options?: ShellRunOptions) => shell.runJson<T>(command, args, bind(options)),\n });\n}\n\nfunction combineSignals(first?: AbortSignal, second?: AbortSignal): AbortSignal | undefined {\n if (!first) return second;\n if (!second || first === second) return first;\n return AbortSignal.any([first, second]);\n}\n\nfunction loadConfig(root: string): ShellConfig {\n let raw: any = {};\n try {\n raw = JSON.parse(fs.readFileSync(path.join(root, 'cascade.json'), 'utf8'));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error;\n }\n return {\n commands: raw?.commands && typeof raw.commands === 'object' ? raw.commands : {},\n shell: {\n timeout: Number.isFinite(raw?.shell?.timeout) ? Math.min(600_000, Math.max(1, Math.trunc(raw.shell.timeout))) : 120_000,\n env: stringRecord(raw?.shell?.env),\n allowedRequestEnv: new Set(Array.isArray(raw?.shell?.allowedRequestEnv) ? raw.shell.allowedRequestEnv.filter((v: unknown) => typeof v === 'string') : []),\n },\n };\n}\n\nfunction stringRecord(value: unknown): Record<string, string> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return {};\n return Object.fromEntries(Object.entries(value).filter(([key, item]) =>\n ENV_NAME.test(key) && !BLOCKED_ENV.test(key) && typeof item === 'string' && item.length <= 65_536 && !item.includes('\\0')) as [string, string][]);\n}\n\nfunction resolveExecutable(root: string, target: unknown): string | null {\n if (typeof target !== 'string' || !target || target.includes('\\0')) return null;\n const expanded = target.replace(/^~(?=\\/|$)/, os.homedir());\n if (!path.isAbsolute(expanded) && !/[\\\\/]/.test(expanded)) {\n for (const dir of (process.env.PATH ?? '').split(path.delimiter)) {\n const found = executableFile(path.join(dir, expanded));\n if (found) return found;\n }\n return null;\n }\n const candidate = path.isAbsolute(expanded) ? expanded : path.resolve(root, expanded);\n if (!path.isAbsolute(expanded) && !within(fs.realpathSync(root), safeRealpath(candidate))) return null;\n return executableFile(candidate);\n}\n\nfunction executableFile(candidate: string): string | null {\n try { fs.accessSync(candidate, fs.constants.X_OK); return fs.statSync(candidate).isFile() ? fs.realpathSync(candidate) : null; } catch { return null; }\n}\n\nfunction safeRealpath(candidate: string): string {\n try { return fs.realpathSync(candidate); } catch { return candidate; }\n}\n\nfunction resolveCwd(root: string, requested: string): { cwd: string; relativeCwd: string } {\n if (typeof requested !== 'string' || path.isAbsolute(requested) || requested.includes('\\0')) throw new ShellRequestError('INVALID_REQUEST', 'cwd must be project-relative');\n const lexical = path.resolve(root, requested);\n if (!within(root, lexical)) throw new ShellRequestError('INVALID_REQUEST', 'cwd escapes project root');\n let real: string;\n try { real = fs.realpathSync(lexical); } catch { throw new ShellRequestError('INVALID_REQUEST', 'cwd does not exist'); }\n const realRoot = fs.realpathSync(root);\n if (!within(realRoot, real)) throw new ShellRequestError('INVALID_REQUEST', 'cwd escapes project root through a symlink');\n return { cwd: real, relativeCwd: path.relative(realRoot, real) || '.' };\n}\n\nfunction within(root: string, candidate: string): boolean {\n const relative = path.relative(root, candidate);\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nfunction emptyResult(): ShellRunResult {\n return { stdout: '', stderr: '', code: null, timedOut: false, cancelled: false, outputLimited: false };\n}\n\nfunction execute(executable: string, args: string[], options: { cwd: string; timeout: number; stdin?: string; env: NodeJS.ProcessEnv; signal?: AbortSignal }): Promise<ShellRunResult> {\n return new Promise((resolve, reject) => {\n type TerminalCause = 'exit' | 'signal' | 'spawn' | 'timeout' | 'cancelled' | 'output-limit';\n let terminal: TerminalCause | null = null;\n let spawnError: Error | undefined;\n let termination: TreeTermination | undefined;\n const stdout: Buffer[] = [];\n const stderr: Buffer[] = [];\n let stdoutBytes = 0;\n let stderrBytes = 0;\n const child = spawn(executable, args, {\n cwd: options.cwd,\n env: options.env,\n detached: process.platform !== 'win32',\n shell: false,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n const finishCause = (cause: TerminalCause) => {\n if (terminal) return;\n terminal = cause;\n if (cause === 'timeout' || cause === 'cancelled' || cause === 'output-limit') termination = terminateTree(child);\n };\n const timer = setTimeout(() => finishCause('timeout'), options.timeout);\n const abort = () => finishCause('cancelled');\n options.signal?.addEventListener('abort', abort, { once: true });\n child.stdout.on('data', (chunk: Buffer) => {\n stdoutBytes += chunk.length;\n if (stdoutBytes <= MAX_BUFFER) stdout.push(chunk);\n else finishCause('output-limit');\n });\n child.stderr.on('data', (chunk: Buffer) => {\n stderrBytes += chunk.length;\n if (stderrBytes <= MAX_BUFFER) stderr.push(chunk);\n else finishCause('output-limit');\n });\n child.once('error', (error) => {\n spawnError = error;\n finishCause('spawn');\n });\n child.once('exit', (code, signal) => finishCause(code === null || signal ? 'signal' : 'exit'));\n child.once('close', async (code, signal) => {\n clearTimeout(timer);\n options.signal?.removeEventListener('abort', abort);\n await termination?.beforeSettle();\n const output = { stdout: Buffer.concat(stdout).toString('utf8'), stderr: Buffer.concat(stderr).toString('utf8') };\n if (terminal === 'timeout' || terminal === 'cancelled' || terminal === 'output-limit') {\n const result = { ...output, code: null, timedOut: terminal === 'timeout', cancelled: terminal === 'cancelled', outputLimited: terminal === 'output-limit' };\n reject(new ShellProcessError(terminal, result));\n } else if (terminal === 'spawn' || terminal === 'signal' || spawnError || code === null || signal) {\n const reason = spawnError ? 'Unable to spawn configured command' : `Command terminated by signal ${signal ?? 'unknown'}`;\n reject(new ShellProcessError('spawn', { ...emptyResult(), ...output }, reason));\n } else {\n resolve({ ...output, code, timedOut: false, cancelled: false, outputLimited: false });\n }\n });\n if (options.stdin !== undefined) child.stdin.end(options.stdin); else child.stdin.end();\n if (options.signal?.aborted) abort();\n });\n}\n\ninterface TreeTermination {\n beforeSettle(): Promise<void>;\n}\n\nfunction terminateTree(child: ChildProcess): TreeTermination {\n if (!child.pid) return { beforeSettle: async () => undefined };\n if (process.platform === 'win32') {\n const taskkill = new Promise<void>((resolve) => {\n execFile('taskkill.exe', ['/PID', String(child.pid), '/T', '/F'], () => resolve());\n });\n return { beforeSettle: () => taskkill };\n }\n try { process.kill(-child.pid, 'SIGTERM'); } catch { child.kill('SIGTERM'); }\n const killTimer = setTimeout(() => {\n forceKillTree(child);\n }, 2_000);\n killTimer.unref();\n return {\n beforeSettle: async () => {\n clearTimeout(killTimer);\n forceKillTree(child);\n },\n };\n}\n\nfunction forceKillTree(child: ChildProcess): void {\n if (!child.pid) return;\n if (process.platform === 'win32') return;\n try { process.kill(-child.pid, 'SIGKILL'); } catch { child.kill('SIGKILL'); }\n}\n", "/**\n * Single-project model \u2014 round 32 re-scope, per Marcus's own architecture:\n * Cascade is a generic framework/CLI, not a multi-project manager. A\n * \"project\" is just any existing git repo with a `.cascade` graph file at\n * its root and a `nodes/<module-name>/index.ts` folder for custom nodes\n * (an existing artwork repo becomes a project exactly as it already sits \u2014\n * no migration, no separate projects database). `cascade .` starts a\n * server scoped to CWD (or an explicit path argument); there is no\n * project list/switch inside the app \u2014 switching projects means running\n * `cascade` in a different directory.\n *\n * This replaces the earlier multi-project PROJECTS_DIR model entirely \u2014\n * everything here is scoped to ONE fixed PROJECT_ROOT, set once at\n * startup (see cli.ts), not per-request.\n */\nimport fs from 'fs/promises';\nimport fssync from 'fs';\nimport path from 'path';\nimport { resolveWithinRoot, PathSafetyError } from './pathSafety.js';\nimport { ShellService } from './shell/service.js';\n\nexport { PathSafetyError };\n\nexport interface ProjectPanelMeta {\n readonly name: string;\n readonly title: string;\n readonly icon: string | null;\n readonly rendererTypes?: readonly string[];\n}\n\nexport class ProjectRoot {\n readonly root: string;\n readonly shell: ShellService;\n /** Graph named explicitly on the command line (`cascade artwork.cascade`),\n * relative to the root. Null when `cascade` was pointed at a directory \u2014\n * resolveDefaultGraph() then picks one by convention. */\n readonly explicitGraph: string | null;\n\n constructor(root: string, explicitGraph: string | null = null) {\n this.root = path.resolve(root);\n if (!fssync.existsSync(this.root) || !fssync.statSync(this.root).isDirectory()) {\n throw new Error(`Project root does not exist or is not a directory: ${this.root}`);\n }\n this.explicitGraph = explicitGraph;\n this.shell = new ShellService(this);\n }\n\n /** The graph the client should open on startup, or null when there is\n * nothing obvious to open. Order: the file named on the command line,\n * then `index.cascade` by convention, then the sole `.cascade` file if\n * there is exactly one. With several files and no `index.cascade` this\n * returns null rather than guessing \u2014 the app opens empty and File >\n * Open picks. */\n async resolveDefaultGraph(): Promise<string | null> {\n if (this.explicitGraph) return this.explicitGraph;\n const graphs = await this.listGraphFiles();\n if (graphs.includes('index.cascade')) return 'index.cascade';\n if (graphs.length === 1) return graphs[0];\n return null;\n }\n\n /** Split a `cascade <arg>` argument into a root directory and, when the\n * argument named a `.cascade` file, the graph inside it. */\n static fromArg(arg: string): ProjectRoot {\n const resolved = path.resolve(arg);\n const isFile = fssync.existsSync(resolved) && fssync.statSync(resolved).isFile();\n if (isFile || resolved.endsWith('.cascade')) {\n if (!resolved.endsWith('.cascade')) {\n throw new Error(`Not a .cascade file: ${resolved}`);\n }\n if (!isFile) {\n throw new Error(`Graph file does not exist: ${resolved}`);\n }\n return new ProjectRoot(path.dirname(resolved), path.basename(resolved));\n }\n return new ProjectRoot(resolved);\n }\n\n resolve(relativePath: string = ''): string {\n return resolveWithinRoot(this.root, relativePath);\n }\n\n /** Resolve browser-readable project media. `shared/` is the one intentional\n * external root: projects use it for reusable nodes, panels, and cached source\n * assets. Its canonical target remains independently confined, while every\n * other symlink escape is rejected by resolve(). */\n resolveMedia(relativePath: string): string {\n const normalized = relativePath.split('\\\\').join('/');\n if (normalized === 'shared' || normalized.startsWith('shared/')) {\n return this.resolveShared(...normalized.split('/').slice(1));\n }\n return this.resolve(relativePath);\n }\n\n get isGitRepo(): boolean {\n return fssync.existsSync(path.join(this.root, '.git'));\n }\n\n /** Every `*.cascade` file directly in the project root, relative names,\n * sorted \u2014 a project may have exactly one (the common case) or several\n * (test-quill's convo1/convo2/test-quill1 is real, not a bug to design\n * away). The caller decides what \"the\" graph means when there's more\n * than one; this just reports what's actually there. */\n async listGraphFiles(): Promise<string[]> {\n const entries = await fs.readdir(this.root, { withFileTypes: true });\n return entries\n .filter((e) => e.isFile() && e.name.endsWith('.cascade'))\n .map((e) => e.name)\n .sort();\n }\n\n async readGraph(filename: string): Promise<string> {\n const full = this.resolve(filename);\n if (!filename.endsWith('.cascade')) {\n throw new PathSafetyError(`not a .cascade file: ${filename}`);\n }\n return fs.readFile(full, 'utf-8');\n }\n\n async writeGraph(filename: string, content: string): Promise<void> {\n const full = this.resolve(filename);\n if (!filename.endsWith('.cascade')) {\n throw new PathSafetyError(`not a .cascade file: ${filename}`);\n }\n await fs.writeFile(full, content, 'utf-8');\n }\n\n /** `nodes/<moduleName>/` folders \u2014 one per custom node type. */\n async listNodeModules(): Promise<string[]> {\n const nodesDir = this.resolve('nodes');\n if (!fssync.existsSync(nodesDir)) return [];\n const entries = await fs.readdir(nodesDir, { withFileTypes: true });\n return entries.filter((e) => e.isDirectory() && !e.name.startsWith('.')).map((e) => e.name).sort();\n }\n\n /** Project-owned browser panels. A project-local panel overrides a panel\n * with the same name provided by `shared/panels`. */\n async listPanels(): Promise<string[]> {\n const [local, shared] = await Promise.all([\n this.listPanelDirectory(this.resolve('panels')),\n this.listPanelDirectory(this.resolveShared('panels')),\n ]);\n return [...new Set([...local, ...shared])].sort();\n }\n\n /** Statically declared panel metadata. Reading this never imports or\n * executes project code. */\n async panelMeta(name: string): Promise<ProjectPanelMeta> {\n const source = await this.readPanelModuleFile(name);\n const rendererTypes = exportedStringArray(source, 'rendererTypes');\n return {\n name,\n title: exportedString(source, 'title') ?? name,\n icon: exportedString(source, 'icon'),\n ...(rendererTypes === null ? {} : { rendererTypes }),\n };\n }\n\n /** Resolve the selected panel entry, preferring the project-local version.\n * Kept public for the compiler; callers must not use it for arbitrary files. */\n async resolvePanelEntry(name: string): Promise<string> {\n this.assertExtensionName(name, 'panel');\n const entries = [\n this.resolve(path.join('panels', name, 'index.ts')),\n this.resolveShared('panels', name, 'index.ts'),\n ];\n for (const entry of entries) {\n try {\n const stat = await fs.stat(entry);\n if (stat.isFile()) return entry;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n }\n // Preserve normal filesystem ENOENT semantics for route error handling.\n await fs.access(entries[0]);\n return entries[0];\n }\n\n /**\n * Where a node module's work actually happens.\n *\n * A declaration normally wins. `cascade/shell` is the exception: it is a\n * server-only effect, so declaring that import as browser code is rejected\n * before compilation or loading. Otherwise the environment is inferred,\n * distinction is already legible in the code \u2014 a node whose work happens\n * server-side is exactly one that calls the exec bridge, since a module\n * compiled into the browser cannot spawn a subprocess itself. That fallback\n * is what makes every existing Python-backed node report correctly without\n * being edited.\n *\n * Both kinds are peers: they exchange images as project-relative paths, which\n * the browser reads back through /api/media.\n */\n async moduleRunsOn(moduleName: string): Promise<'portable' | 'server' | 'browser'> {\n let source: string;\n try {\n source = await this.readNodeModuleFile(moduleName);\n } catch {\n return 'browser';\n }\n const declared = source.match(/export\\s+const\\s+runsOn\\s*[:=][^'\"`]*['\"`](portable|server|browser)['\"`]/);\n const importsShell = /(?:from\\s+|import\\s*(?:\\(\\s*)?|require\\s*\\(\\s*)['\"`]cascade\\/shell['\"`]/.test(source);\n if (importsShell && declared && declared[1] !== 'server') {\n throw new Error(`Node module \"${moduleName}\" imports cascade/shell but declares runsOn = '${declared?.[1]}'; shell nodes must run on the server`);\n }\n if (declared) return declared[1] as 'portable' | 'server' | 'browser';\n return /\\/api\\/exec|runStage\\s*\\(/.test(source) || importsShell ? 'server' : 'browser';\n }\n\n /**\n * A node module's declared icon, if it names one: `export const icon = 'Cloud'`.\n *\n * A project's nodes all fell back to the same cog, because the icon table is a\n * hardcoded list of Cascade's own built-ins and knows nothing about a project.\n * Letting a module say what it is turns a wall of identical boxes into\n * something you can read at a glance.\n */\n async moduleIcon(moduleName: string): Promise<string | null> {\n try {\n const source = await this.readNodeModuleFile(moduleName);\n return source.match(/export\\s+const\\s+icon\\s*[:=][^'\"`]*['\"`]([A-Za-z0-9]+)['\"`]/)?.[1] ?? null;\n } catch {\n return null;\n }\n }\n\n private async readPanelModuleFile(name: string): Promise<string> {\n return fs.readFile(await this.resolvePanelEntry(name), 'utf-8');\n }\n\n private async listPanelDirectory(directory: string): Promise<string[]> {\n let entries: import('node:fs').Dirent[];\n try {\n entries = await fs.readdir(directory, { withFileTypes: true });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return [];\n throw err;\n }\n\n const panels = await Promise.all(entries\n .filter((entry) => !entry.name.startsWith('.') && (entry.isDirectory() || entry.isSymbolicLink()))\n .map(async (entry) => {\n try {\n return (await fs.stat(path.join(directory, entry.name, 'index.ts'))).isFile() ? entry.name : null;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return null;\n throw err;\n }\n }));\n return panels.filter((name): name is string => name !== null);\n }\n\n /** `shared/` may intentionally link to a sibling library. Its canonical\n * target is a second confined root for shared project extensions only. */\n private resolveShared(...segments: string[]): string {\n const sharedLink = path.join(this.root, 'shared');\n let sharedRoot = sharedLink;\n try {\n sharedRoot = fssync.realpathSync(sharedLink);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return path.join(sharedLink, ...segments);\n throw error;\n }\n return resolveWithinRoot(sharedRoot, ...segments);\n }\n\n private assertExtensionName(name: string, kind: string): void {\n if (!name || name === '.' || name === '..' || name.startsWith('.') || name !== path.basename(name)) {\n throw new PathSafetyError(`invalid ${kind} name: ${name}`);\n }\n }\n\n async readNodeModuleFile(moduleName: string, relativeFile: string = 'index.ts'): Promise<string> {\n const full = this.resolve(path.join('nodes', moduleName, relativeFile));\n return fs.readFile(full, 'utf-8');\n }\n\n async writeNodeModuleFile(moduleName: string, relativeFile: string, content: string): Promise<void> {\n const full = this.resolve(path.join('nodes', moduleName, relativeFile));\n await fs.mkdir(path.dirname(full), { recursive: true });\n await fs.writeFile(full, content, 'utf-8');\n }\n\n async ensureNodeModuleScaffold(moduleName: string): Promise<void> {\n const dir = this.resolve(path.join('nodes', moduleName));\n await fs.mkdir(dir, { recursive: true });\n const indexPath = path.join(dir, 'index.ts');\n if (!fssync.existsSync(indexPath)) {\n await fs.writeFile(\n indexPath,\n `// ${moduleName} \u2014 scaffolded by Cascade. Replace with real node logic.\\n` +\n `// Every node module exports execute(node, graph); real imports work here \u2014\\n` +\n `// relative files in this project, npm deps, whatever the code needs.\\n\\n` +\n `export function execute(node, graph) {\\n // node.in('name', defaultValue) / node.out('name').setValue(value)\\n}\\n`,\n 'utf-8'\n );\n }\n }\n}\n\n/** Extract a literal `export const` string without evaluating the module. */\nfunction exportedString(source: string, exportName: string): string | null {\n const match = source.match(new RegExp(\n `export\\\\s+const\\\\s+${exportName}\\\\s*(?::[^=]+)?=\\\\s*([\\\\'\\\"\\x60])((?:\\\\\\\\.|(?!\\\\1)[^\\\\\\\\])*)\\\\1`\n ));\n if (!match || (match[1] === '`' && match[2].includes('${'))) return null;\n if (match[1] === '\"') {\n try {\n return JSON.parse(`\"${match[2]}\"`) as string;\n } catch {\n return null;\n }\n }\n return match[2].replace(/\\\\([\\\\'\"`])/g, '$1');\n}\n\n/** Extract a literal exported string array. Any non-literal member makes the\n * declaration undiscoverable rather than causing project code to execute. */\nfunction exportedStringArray(source: string, exportName: string): string[] | null {\n const declaration = new RegExp(`export\\\\s+const\\\\s+${exportName}\\\\s*(?::[^=]+)?=\\\\s*\\\\[`).exec(source);\n if (!declaration) return null;\n\n const values: string[] = [];\n const start = declaration.index + declaration[0].length;\n const end = source.indexOf(']', start);\n if (end < 0) return null;\n const contents = source.slice(start, end);\n const literal = /(['\"`])([^'\"`]*)\\1/g;\n let cursor = 0;\n for (const match of contents.matchAll(literal)) {\n if (!/^[\\s,]*$/.test(contents.slice(cursor, match.index))) return null;\n if (match[1] === '`' && match[2].includes('${')) return null;\n const decoded = exportedString(`export const value = ${match[0]}`, 'value');\n if (decoded === null) return null;\n values.push(decoded);\n cursor = (match.index ?? 0) + match[0].length;\n }\n return /^[\\s,]*$/.test(contents.slice(cursor)) ? values : null;\n}\n", "/**\n * Compiles node modules into real, importable ES modules using esbuild \u2014\n * replacing the old `new Function('node','graph', code)` sandbox (no\n * imports at all) with genuine `import`/`export`, shared helper files,\n * and npm deps resolved server-side (the browser can't resolve any of\n * that itself). Two entry shapes, same pipeline underneath:\n *\n * - project module: a real file on disk, `nodes/<name>/index.ts` \u2014\n * esbuild bundles it directly, so relative imports to sibling files\n * in that module (or elsewhere in the project) resolve normally.\n * - embedded module: code that only exists inline in the `.cascade`\n * file \u2014 fed to esbuild as a virtual stdin entry with the project\n * root as its resolve directory, so it can still `import` from real\n * project files even though it has no file of its own.\n *\n * Both must export `execute(node, graph)` \u2014 see project.ts's scaffold.\n */\nimport * as esbuild from 'esbuild';\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport type { ProjectRoot } from './project.js';\nimport { readProjectManifest } from './projectConfig.js';\n\nconst __dirname_compile = path.dirname(fileURLToPath(import.meta.url));\n\n/**\n * `import { loadImage, saveImage } from 'cascade/io'` \u2014 the runtime a\n * browser-side node uses to read and write project files. Provided by Cascade\n * rather than copied into each project, so the interop contract has one\n * definition and every project gets the same one. Resolved from this file's\n * install location, so it works wherever the CLI is run from.\n */\nfunction cascadeRuntimePlugin(project: ProjectRoot): esbuild.Plugin {\n return {\n name: 'cascade-runtime',\n setup(build) {\n build.onResolve({ filter: /^cascade\\/(?:io|shell|net|config|stage)$/ }, (args) => ({\n path: args.path,\n namespace: 'cascade-runtime',\n }));\n // `runtime/shell.ts` re-exports a *value* (ShellProcessError) from the\n // contracts package. In this repo a workspace link resolves that; in an\n // installed copy of Cascade there is no `@cascade/contracts` on disk at\n // all, only the bundled `dist/contracts` \u2014 so esbuild failed with\n // \"Could not resolve\" and every project node importing `cascade/shell`\n // was uncompilable off this machine. Resolved from the install location\n // exactly as the shims themselves are.\n build.onResolve({ filter: /^@cascade\\/contracts$/ }, () => {\n // Beside the bundled CLI when installed, in the workspace when running from src.\n const candidates = [\n path.join(__dirname_compile, '..', 'contracts', 'index.js'),\n path.join(__dirname_compile, '..', '..', 'packages', 'contracts', 'dist', 'index.js'),\n ];\n const found = candidates.find((c) => fs.existsSync(c));\n if (!found) {\n return { errors: [{ text: `@cascade/contracts not found (looked in ${candidates.join(', ')})` }] };\n }\n return { path: found };\n });\n build.onLoad({ filter: /.*/, namespace: 'cascade-runtime' }, (args) => {\n if (args.path === 'cascade/config') {\n return { contents: configRuntimeSource(readProjectManifest(project.root).settings), loader: 'ts' as const };\n }\n // Beside this file when running from src (tsx), one level up in dist.\n const candidates = [\n path.join(__dirname_compile, 'runtime', `${args.path.slice('cascade/'.length)}.ts`),\n path.join(__dirname_compile, '..', 'src', 'runtime', `${args.path.slice('cascade/'.length)}.ts`),\n ];\n const found = candidates.find((c) => fs.existsSync(c));\n if (!found) {\n return { errors: [{ text: `${args.path} runtime not found (looked in ${candidates.join(', ')})` }] };\n }\n return { contents: fs.readFileSync(found, 'utf-8'), loader: 'ts' as const, resolveDir: path.dirname(found) };\n });\n },\n };\n}\n\nexport interface CompileResult {\n ok: boolean;\n code: string;\n errors: string[];\n}\n\nfunction commonOptions(project: ProjectRoot): esbuild.BuildOptions {\n return { bundle: true, format: 'esm', platform: 'browser', target: 'es2022', write: false,\n logLevel: 'silent', plugins: [cascadeRuntimePlugin(project)] };\n}\n\nexport async function compileProjectModule(project: ProjectRoot, moduleName: string): Promise<CompileResult> {\n try {\n // Classification is also a preflight: server-only imports such as\n // cascade/shell must not be smuggled into an explicitly browser module.\n await project.moduleRunsOn(moduleName);\n return await compileEntry(project, project.resolve(`nodes/${moduleName}/index.ts`));\n } catch (err) {\n return { ok: false, code: '', errors: [errorMessage(err)] };\n }\n}\n\n/** Compile a project panel as browser ESM without importing it on the server. */\nexport async function compileProjectPanel(project: ProjectRoot, panelName: string): Promise<CompileResult> {\n try {\n return await compileEntry(project, await project.resolvePanelEntry(panelName));\n } catch (err) {\n return { ok: false, code: '', errors: [errorMessage(err)] };\n }\n}\n\nexport async function compileEmbedded(project: ProjectRoot, code: string): Promise<CompileResult> {\n try {\n const result = await esbuild.build({\n ...commonOptions(project),\n stdin: {\n contents: code,\n loader: 'ts',\n resolveDir: project.root,\n sourcefile: 'embedded.ts',\n },\n });\n return toResult(result);\n } catch (err) {\n return { ok: false, code: '', errors: [errorMessage(err)] };\n }\n}\n\nfunction toResult(result: esbuild.BuildResult): CompileResult {\n const errors = result.errors.map((e) => e.text);\n const code = result.outputFiles?.[0]?.text ?? '';\n return { ok: errors.length === 0, code, errors };\n}\n\nasync function compileEntry(project: ProjectRoot, entryPath: string): Promise<CompileResult> {\n return toResult(await esbuild.build({ ...commonOptions(project), entryPoints: [entryPath] }));\n}\n\nfunction configRuntimeSource(settings: Readonly<Record<string, unknown>>): string {\n return `function deepFreeze(value) { if (value && typeof value === 'object') { for (const item of Object.values(value)) deepFreeze(item); Object.freeze(value); } return value; }\nconst values = deepFreeze(${JSON.stringify(settings)});\nfunction value(name) { return Object.prototype.hasOwnProperty.call(values, name) ? values[name] : undefined; }\nexport const config = Object.freeze({\n get(name, fallback) { return value(name) ?? fallback; },\n string(name, fallback = '') { const item = value(name); return typeof item === 'string' ? item : fallback; },\n number(name, fallback = 0) { const item = value(name); return typeof item === 'number' && Number.isFinite(item) ? item : fallback; },\n boolean(name, fallback = false) { const item = value(name); return typeof item === 'boolean' ? item : fallback; },\n has(name) { return value(name) !== undefined; }\n});`;\n}\n\nfunction errorMessage(err: unknown): string {\n if (err && typeof err === 'object' && 'errors' in err) {\n const errors = (err as { errors?: Array<{ text: string }> }).errors;\n if (errors?.length) return errors.map((e) => e.text).join('\\n');\n }\n return err instanceof Error ? err.message : String(err);\n}\n", "/**\n * Run a project's Python stage without an HTTP request.\n *\n * The exec route does this for the page; a headless host needs the same thing\n * with no Express in the picture, and duplicating it in the CLI is how the two\n * would drift. So the mechanics live here and both callers use them.\n */\nimport { execFile } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport type { ProjectRoot } from './project.js';\n\nconst TIMEOUT_MS = 10 * 60 * 1000;\nconst MAX_BUFFER = 64 * 1024 * 1024;\n\nexport interface StageConfig {\n python: string;\n entrypoint: string;\n worker?: string;\n}\n\nexport interface StageRunOptions {\n readonly env?: NodeJS.ProcessEnv;\n readonly timeout?: number;\n readonly signal?: AbortSignal;\n}\n\nfunction resolveProjectExecutable(project: ProjectRoot, configuredPath: string): string {\n if (path.isAbsolute(configuredPath)) {\n throw new Error('cascade.json exec.stages.python must be python, python3, or a project-relative executable');\n }\n const executable = path.resolve(project.root, configuredPath);\n const relative = path.relative(project.root, executable);\n if (!relative || relative === '..' || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {\n throw new Error('cascade.json exec.stages.python must be python, python3, or a project-relative executable');\n }\n return executable;\n}\n\n/**\n * Reads exec.stages from cascade.json.\n *\n * Straight from the file rather than through readProjectManifest, which\n * projects the manifest down to its declared settings and drops `exec` \u2014\n * reading it there reports every configured project as having no stages.\n */\nexport function readStageConfig(project: ProjectRoot): StageConfig {\n let raw: unknown;\n try {\n raw = JSON.parse(fs.readFileSync(project.resolve('cascade.json'), 'utf8'));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new Error('Project stages are not configured; add exec.stages to cascade.json');\n }\n throw new Error(`Cannot read cascade.json: ${error instanceof Error ? error.message : String(error)}`);\n }\n const stages = (raw as { exec?: { stages?: unknown } })?.exec?.stages;\n const value = stages && typeof stages === 'object' && !Array.isArray(stages)\n ? stages as Record<string, unknown>\n : null;\n const entrypoint = value && typeof value.entrypoint === 'string' ? value.entrypoint : '';\n if (!entrypoint) {\n throw new Error('Project stages are not configured; add exec.stages.entrypoint to cascade.json');\n }\n // Resolving it here keeps a stage path inside the project, the same check the\n // HTTP route makes.\n project.resolve(entrypoint);\n const worker = typeof value?.worker === 'string' && value.worker ? value.worker : undefined;\n if (value?.worker !== undefined && !worker) {\n throw new Error('cascade.json exec.stages.worker must be a project-relative path');\n }\n if (worker) project.resolve(worker);\n const configuredPython = value?.python;\n let python = 'python3';\n if (configuredPython !== undefined) {\n if (typeof configuredPython !== 'string' || !configuredPython.trim()) {\n throw new Error('cascade.json exec.stages.python must be python, python3, or a project-relative executable');\n }\n const executable = configuredPython.trim();\n python = executable === 'python' || executable === 'python3'\n ? executable\n : resolveProjectExecutable(project, executable);\n }\n return { python, entrypoint, ...(worker ? { worker } : {}) };\n}\n\n/**\n * Invoke one stage and return its parsed result.\n *\n * The dispatcher's answer is the LAST line it printed, so a stage that logs on\n * its way through does not corrupt its own return value \u2014 and an `error` field\n * in that answer is raised here, because a stage that reports failure as data\n * would otherwise pass silently.\n */\nexport async function runProjectStage(\n project: ProjectRoot,\n stage: string,\n args: Record<string, unknown>,\n options: StageRunOptions = {},\n): Promise<unknown> {\n if (!/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(stage)) {\n throw new Error('stage contains unsupported characters');\n }\n const { python, entrypoint } = readStageConfig(project);\n const script = project.resolve(entrypoint);\n const payload = JSON.stringify(args);\n const stdout = await new Promise<string>((resolve, reject) => {\n const child = execFile(\n python,\n [script, '--stage', stage, '--args', '-'],\n {\n cwd: project.root,\n timeout: options.timeout ?? TIMEOUT_MS,\n maxBuffer: MAX_BUFFER,\n env: options.env ?? process.env,\n signal: options.signal,\n },\n (error, out, err) => {\n if (error) {\n const output = err?.trim() || out.trim().split('\\n').pop() || error.message;\n return reject(new Error(`stage \"${stage}\" failed: ${output}`));\n }\n resolve(out);\n },\n );\n child.stdin?.end(payload);\n });\n const lastLine = stdout.trim().split('\\n').pop() || '{}';\n let parsed: unknown;\n try {\n parsed = JSON.parse(lastLine);\n } catch {\n throw new Error(`stage \"${stage}\" returned no JSON: ${lastLine.slice(0, 200)}`);\n }\n if (parsed && typeof parsed === 'object' && 'error' in parsed) {\n throw new Error(`stage \"${stage}\" failed: ${String((parsed as { error: unknown }).error)}`);\n }\n return parsed;\n}\n", "/**\n * Where Cascade keeps its projects, and how a bare project name resolves.\n *\n * `cascade .` scoping to the current directory stays the primary way in \u2014 this\n * only adds a default home so `cascade new <name>` has somewhere to put things\n * and `cascade <name>` can find a project without a path. Marcus's own call:\n * one folder for all Cascade projects.\n */\nimport fs from 'fs';\nimport os from 'os';\nimport path from 'path';\n\nconst CONFIG_DIR = path.join(os.homedir(), '.cascade');\nconst CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');\nconst DEFAULT_PROJECTS_ROOT = path.join(os.homedir(), 'Documents', 'Cascade');\n\nexport interface CascadeConfig {\n projectsRoot: string;\n}\n\nexport function loadConfig(): CascadeConfig {\n try {\n const raw = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf-8'));\n if (typeof raw?.projectsRoot === 'string' && raw.projectsRoot.trim()) {\n // A leading ~ is what anyone hand-editing this file will write.\n const expanded = raw.projectsRoot.replace(/^~(?=\\/|$)/, os.homedir());\n return { projectsRoot: path.resolve(expanded) };\n }\n } catch {\n // No config yet, or an unreadable one \u2014 the default is the right answer\n // either way, and this must never be a reason the CLI won't start.\n }\n return { projectsRoot: DEFAULT_PROJECTS_ROOT };\n}\n\nexport function saveConfig(config: CascadeConfig): void {\n fs.mkdirSync(CONFIG_DIR, { recursive: true });\n fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\n}\n\nexport function configPath(): string {\n return CONFIG_FILE;\n}\n", "/**\n * Compact-array JSON formatting for .cascade files \u2014 ported unchanged\n * from the original routes/projects.ts (real design work: keeps small\n * arrays like [x, y] coordinates and [from, to] connections on one line\n * instead of exploding them across many, so a saved graph stays readable\n * and diffable in git \u2014 which matters now that every save is a commit.\n */\n/**\n * Format JSON string with compact arrays (keeps small arrays on single lines)\n * This function finds multi-line arrays with 2-4 elements and compacts them\n * Handles both numeric arrays and arrays containing small arrays (like connections)\n */\nfunction formatCompactJSON(jsonString: string, indent: number = 2): string {\n // Process multiple passes to handle nested arrays\n let result = jsonString;\n let previousResult = '';\n \n // Keep processing until no more changes (handles nested arrays)\n while (result !== previousResult) {\n previousResult = result;\n result = formatCompactJSONPass(result, indent);\n }\n \n return result;\n}\n\n/**\n * Single pass of compact formatting\n */\nfunction formatCompactJSONPass(jsonString: string, indent: number = 2): string {\n const lines = jsonString.split('\\n');\n const result: string[] = [];\n \n let i = 0;\n while (i < lines.length) {\n const line = lines[i];\n const trimmed = line.trim();\n \n // Check if this line starts an array (pattern: \"key\": [ or just [)\n if (trimmed.endsWith('[') && (trimmed.includes(':') || trimmed === '[')) {\n // Collect lines until we find the closing bracket\n let arrayLines: string[] = [line];\n let bracketDepth = 1;\n let j = i + 1;\n \n while (j < lines.length && bracketDepth > 0) {\n const currentLine = lines[j];\n arrayLines.push(currentLine);\n \n // Count bracket depth\n for (const char of currentLine) {\n if (char === '[') bracketDepth++;\n if (char === ']') bracketDepth--;\n }\n j++;\n }\n \n // Extract array content (lines between opening and closing brackets)\n // Handle nested arrays by extracting complete array elements\n const arrayContent: string[] = [];\n let k = 1;\n while (k < arrayLines.length - 1) {\n const currentLine = arrayLines[k].trim();\n \n // Check if this line starts a nested array\n if (currentLine.endsWith('[') || (currentLine.startsWith('[') && !currentLine.endsWith(']'))) {\n // Extract the complete nested array\n let nestedArrayLines: string[] = [arrayLines[k]];\n let nestedDepth = 1;\n let m = k + 1;\n \n while (m < arrayLines.length - 1 && nestedDepth > 0) {\n nestedArrayLines.push(arrayLines[m]);\n for (const char of arrayLines[m]) {\n if (char === '[') nestedDepth++;\n if (char === ']') nestedDepth--;\n }\n m++;\n }\n \n // Join nested array lines into a single compact representation\n const nestedContent: string[] = [];\n for (let n = 1; n < nestedArrayLines.length - 1; n++) {\n const nestedLine = nestedArrayLines[n].trim().replace(/,$/, '').trim();\n if (nestedLine) {\n nestedContent.push(nestedLine);\n }\n }\n \n // Create compact nested array string\n const nestedArray = '[' + nestedContent.map(c => c.trim()).join(', ') + ']';\n arrayContent.push(nestedArray);\n k = m;\n } else {\n // Simple element\n const content = currentLine.replace(/,$/, '').trim();\n if (content) {\n arrayContent.push(content);\n }\n k++;\n }\n }\n \n // Check if it's a small numeric array (2-4 elements)\n const isSmallNumericArray = arrayContent.length >= 2 && \n arrayContent.length <= 4 &&\n arrayContent.every(item => {\n const trimmed = item.trim();\n return /^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(trimmed);\n });\n \n // Check if it's an array containing small arrays (like connections: [[a, b], [c, d]])\n // Look for patterns where each element is a small array (2-4 elements)\n // This handles both already-compacted arrays and multi-line nested arrays\n let isArrayOfSmallArrays = false;\n if (arrayContent.length >= 2 && arrayContent.length <= 20) { // Reasonable limit for connections\n // Check if elements are arrays (either compact or multi-line)\n const allAreArrays = arrayContent.every(item => {\n const trimmed = item.trim();\n // Already compact array like [a, b] or [\"a\", 0]\n if (trimmed.startsWith('[') && trimmed.endsWith(']')) {\n const inner = trimmed.slice(1, -1).trim();\n const parts = inner.split(',').map(p => p.trim()).filter(p => p);\n return parts.length >= 2 && parts.length <= 4;\n }\n // Multi-line array - check if this line starts an array\n if (trimmed.endsWith('[')) {\n return true; // This will be handled in a later pass\n }\n return false;\n });\n \n if (allAreArrays) {\n // Check if inner arrays are small (2-4 elements each)\n // For multi-line arrays, we'll need to extract their content\n let allSmall = true;\n for (const item of arrayContent) {\n const trimmed = item.trim();\n if (trimmed.startsWith('[') && trimmed.endsWith(']')) {\n // Already compact - check size\n const inner = trimmed.slice(1, -1).trim();\n const parts = inner.split(',').map(p => p.trim()).filter(p => p);\n if (parts.length < 2 || parts.length > 4) {\n allSmall = false;\n break;\n }\n } else if (trimmed.endsWith('[')) {\n // Multi-line array - will be compacted in next pass, assume it's small for now\n // We'll handle this in the multi-pass approach\n } else {\n allSmall = false;\n break;\n }\n }\n isArrayOfSmallArrays = allSmall;\n }\n }\n \n if (isSmallNumericArray || isArrayOfSmallArrays) {\n // Compact format: put entire array on one line\n const indentLevel = (line.match(/^(\\s*)/)?.[1] || '').length;\n // Extract the key part (everything before the opening bracket)\n const keyMatch = trimmed.match(/^(.+?)\\s*\\[\\s*$/);\n const keyPart = keyMatch ? keyMatch[1] : '';\n \n // Check if the closing bracket line has a comma (last line in arrayLines)\n const closingLine = arrayLines[arrayLines.length - 1];\n const hasComma = closingLine.trim().endsWith(',');\n \n // Format array content\n let formattedContent: string;\n if (isArrayOfSmallArrays) {\n // For arrays of arrays, each element should be compact\n // If an element is a multi-line array (ends with [), we can't compact it yet\n // Otherwise, use the already-compact form\n formattedContent = arrayContent.map(c => {\n const trimmed = c.trim();\n // If it's already compact, use it as-is\n if (trimmed.startsWith('[') && trimmed.endsWith(']')) {\n return trimmed;\n }\n // If it's a multi-line array start, we'll need another pass\n // For now, return as-is (will be handled in next pass)\n return trimmed;\n }).join(', ');\n } else {\n // Simple numeric array\n formattedContent = arrayContent.map(c => c.trim()).join(', ');\n }\n \n const compactArray = keyPart + ' [' + formattedContent + ']' + (hasComma ? ',' : '');\n result.push(' '.repeat(indentLevel) + compactArray);\n i = j; // Skip the processed lines\n continue;\n }\n }\n \n result.push(line);\n i++;\n }\n \n return result.join('\\n');\n}\n\nexport { formatCompactJSON };\n", "/**\n * Auto-commit \u2014 \"every save auto-commits to that project's own existing\n * git history\" (Marcus's own call, confirmed: auto over manual). Scoped\n * to whatever ProjectRoot it's given; never touches any other repo.\n */\nimport { execFile } from 'child_process';\nimport { promisify } from 'util';\nimport fssync from 'fs';\nimport path from 'path';\n\nconst execFileAsync = promisify(execFile);\n\nasync function git(cwd: string, args: string[]): Promise<{ stdout: string; stderr: string }> {\n return execFileAsync('git', args, { cwd });\n}\n\n/** Initializes a git repo in `root` if one doesn't already exist. Cascade\n * projects are expected to already be git repos (Marcus's model), but a\n * brand-new project scaffolded fresh has nothing to commit to yet \u2014 this\n * makes `cascade .` work from an empty directory too, without a separate\n * manual `git init` step. Never re-inits an existing repo. */\nexport async function ensureGitRepo(root: string): Promise<void> {\n if (fssync.existsSync(path.join(root, '.git'))) return;\n await git(root, ['init']);\n}\n\n/** Stages everything and commits, IF there's actually something to\n * commit \u2014 `git commit` on a clean tree is a real error, not a no-op, so\n * this checks `git status --porcelain` first rather than letting every\n * save-with-no-changes surface a commit failure. */\nexport async function autoCommit(\n root: string,\n message: string,\n paths?: string[]\n): Promise<{ committed: boolean; sha?: string }> {\n await ensureGitRepo(root);\n // Scoped to the files the request actually touched when the caller names\n // them. Without this a graph save sweeps up every unrelated change in the\n // working tree, which makes the per-file history useless for reverting \u2014\n // and the whole point of auto-commit is that you can go back.\n const scope = paths && paths.length ? ['--', ...paths] : [];\n await git(root, scope.length ? ['add', ...scope] : ['add', '-A']);\n const { stdout } = await git(root, ['status', '--porcelain', ...scope]);\n if (!stdout.trim()) {\n return { committed: false };\n }\n await git(root, ['commit', '-m', message, ...scope]);\n const { stdout: sha } = await git(root, ['rev-parse', 'HEAD']);\n return { committed: true, sha: sha.trim() };\n}\n\nexport interface FileVersion {\n sha: string;\n shortSha: string;\n date: string;\n message: string;\n}\n\nconst LOG_SEP = '\\x1f';\n\n/** Commits that touched one file, newest first. Empty when the file has no\n * history yet (never committed, or not a git repo) \u2014 an empty list, never\n * an error, because \"no versions yet\" is a normal state the UI shows. */\nexport async function listFileVersions(\n root: string,\n file: string,\n limit = 50\n): Promise<FileVersion[]> {\n if (!fssync.existsSync(path.join(root, '.git'))) return [];\n try {\n const { stdout } = await git(root, [\n 'log',\n `--max-count=${limit}`,\n `--format=%H${LOG_SEP}%aI${LOG_SEP}%s`,\n '--',\n file,\n ]);\n return stdout\n .split('\\n')\n .filter(Boolean)\n .map((line) => {\n const [sha, date, ...rest] = line.split(LOG_SEP);\n return { sha, shortSha: sha.slice(0, 7), date, message: rest.join(LOG_SEP) };\n });\n } catch {\n return [];\n }\n}\n\n/** True when the file on disk differs from the last commit \u2014 i.e. there are\n * changes that no version captures yet. */\nexport async function isFileDirty(root: string, file: string): Promise<boolean> {\n if (!fssync.existsSync(path.join(root, '.git'))) return false;\n try {\n const { stdout } = await git(root, ['status', '--porcelain', '--', file]);\n return Boolean(stdout.trim());\n } catch {\n return false;\n }\n}\n\n/** The file's contents as of one commit. Throws if the commit doesn't have it. */\nexport async function readFileAtVersion(root: string, file: string, sha: string): Promise<string> {\n if (!/^[0-9a-fA-F]{4,40}$/.test(sha)) {\n throw new Error(`Not a commit hash: ${sha}`);\n }\n try {\n const { stdout } = await git(root, ['show', `${sha}:${file}`]);\n return stdout;\n } catch (err) {\n // A commit that doesn't exist, or one that predates the file, is a\n // not-found rather than a server fault \u2014 the version list can outlive\n // the history it was read from.\n const notFound = new Error(`No version ${sha} of ${file}`) as NodeJS.ErrnoException;\n notFound.code = 'ENOENT';\n throw notFound;\n }\n}\n", "/**\n * Graph routes \u2014 replaces the old multi-project routes/projects.ts\n * entirely (round 32 re-scope: one server instance, one project, the\n * directory `cascade` was launched in). Everything here is scoped to the\n * single ProjectRoot passed in at server startup (see cli.ts), never a\n * `:project` URL param \u2014 there is no other project to accidentally reach.\n */\nimport { Router } from 'express';\nimport type { ProjectRoot } from '../project.js';\nimport { PathSafetyError } from '../pathSafety.js';\nimport { formatCompactJSON } from '../formatCascadeJson.js';\nimport { autoCommit, listFileVersions, isFileDirty, readFileAtVersion } from '../git.js';\n\nfunction handleError(res: import('express').Response, err: unknown) {\n if (err instanceof PathSafetyError) {\n res.status(400).json({ error: err.message });\n return;\n }\n const code = (err as NodeJS.ErrnoException)?.code;\n if (code === 'ENOENT') {\n res.status(404).json({ error: 'not found' });\n return;\n }\n console.error('[graph route] error:', err);\n res.status(500).json({ error: String(err) });\n}\n\nexport function createGraphRouter(project: ProjectRoot): Router {\n const router = Router();\n\n // List every *.cascade file at the project root \u2014 may be one (the\n // common case) or several (a project can have more than one graph,\n // e.g. multiple conversation/scene files side by side).\n router.get('/', async (_req, res) => {\n try {\n res.json({\n root: project.root,\n isGitRepo: project.isGitRepo,\n graphs: await project.listGraphFiles(),\n default: await project.resolveDefaultGraph(),\n });\n } catch (err) {\n handleError(res, err);\n }\n });\n\n router.get('/:filename', async (req, res) => {\n try {\n const content = await project.readGraph(req.params.filename);\n res.type('application/json').send(content);\n } catch (err) {\n handleError(res, err);\n }\n });\n\n router.put('/:filename', async (req, res) => {\n try {\n const graphData = req.body;\n graphData.metadata = graphData.metadata || {};\n graphData.metadata.modified = new Date().toISOString();\n const compact = formatCompactJSON(JSON.stringify(graphData, null, 2), 2);\n await project.writeGraph(req.params.filename, compact);\n const { committed, sha } = await autoCommit(\n project.root,\n saveCommitMessage(req.params.filename),\n [req.params.filename]\n );\n res.json({ ok: true, committed, sha });\n } catch (err) {\n handleError(res, err);\n }\n });\n\n // Version history for one graph \u2014 every commit that touched it, newest\n // first, plus whether the file on disk has changes no version holds yet.\n router.get('/:filename/versions', async (req, res) => {\n try {\n const filename = req.params.filename;\n if (!filename.endsWith('.cascade')) {\n res.status(400).json({ error: `not a .cascade file: ${filename}` });\n return;\n }\n // Resolve for the path-safety check; the git commands want the\n // repo-relative name, not the absolute one.\n project.resolve(filename);\n res.json({\n isGitRepo: project.isGitRepo,\n dirty: await isFileDirty(project.root, filename),\n versions: await listFileVersions(project.root, filename),\n });\n } catch (err) {\n handleError(res, err);\n }\n });\n\n // One past version's contents. Restoring is a client-side act: it loads\n // this into the editor as unsaved work, so saving it forward becomes the\n // next version. Nothing here rewrites history.\n router.get('/:filename/versions/:sha', async (req, res) => {\n try {\n const filename = req.params.filename;\n if (!filename.endsWith('.cascade')) {\n res.status(400).json({ error: `not a .cascade file: ${filename}` });\n return;\n }\n project.resolve(filename);\n if (!/^[0-9a-fA-F]{4,40}$/.test(req.params.sha)) {\n res.status(400).json({ error: `not a commit hash: ${req.params.sha}` });\n return;\n }\n const content = await readFileAtVersion(project.root, filename, req.params.sha);\n res.type('application/json').send(content);\n } catch (err) {\n handleError(res, err);\n }\n });\n\n return router;\n}\n\n/**\n * What a save says in Version History.\n *\n * Every save used to commit \"Update <file>\", so the history was a column of\n * identical rows and the only way to tell one version from another was its\n * position. The time makes each entry legible at a glance, which is what the\n * list is for; the date is already in the commit itself.\n */\nexport function saveCommitMessage(filename: string, at = new Date()): string {\n const time = at.toLocaleTimeString('en-GB', { hour: '2-digit', minute: '2-digit', hour12: false });\n return `Saved ${filename} ${time}`;\n}\n", "/**\n * Asset routes \u2014 upload/serve/delete, scoped to the single ProjectRoot's\n * `assets/` folder (round 32 re-scope; ported from the old multi-project\n * routes/assets.ts, ../<id>/assets/* \u2192 assets/* directly under the\n * project root). Sorts uploads into images/audio/data subfolders by\n * mimetype, same as before.\n */\nimport { Router } from 'express';\nimport multer from 'multer';\nimport path from 'path';\nimport fs from 'fs/promises';\nimport type { ProjectRoot } from '../project.js';\nimport { PathSafetyError, resolveWithinRoot } from '../pathSafety.js';\n\nfunction handleError(res: import('express').Response, err: unknown) {\n if (err instanceof PathSafetyError) {\n res.status(400).json({ error: err.message });\n return;\n }\n res.status(500).json({ error: String(err) });\n}\n\nexport function createAssetsRouter(project: ProjectRoot): Router {\n const router = Router();\n const assetsRoot = project.resolve('assets');\n\n const storage = multer.diskStorage({\n destination: async (_req, file, cb) => {\n let assetType = 'data';\n if (file.mimetype.startsWith('image/')) assetType = 'images';\n else if (file.mimetype.startsWith('audio/')) assetType = 'audio';\n const dir = path.join(assetsRoot, assetType);\n await fs.mkdir(dir, { recursive: true });\n cb(null, dir);\n },\n filename: (_req, file, cb) => cb(null, file.originalname)\n });\n const upload = multer({ storage });\n\n router.post('/', upload.single('file'), (req, res) => {\n if (!req.file) {\n res.status(400).json({ error: 'no file uploaded' });\n return;\n }\n const relativePath = path.relative(assetsRoot, req.file.path);\n res.json({\n id: req.file.filename,\n path: `./assets/${relativePath}`,\n type: req.file.mimetype.startsWith('image/') ? 'image' : req.file.mimetype.startsWith('audio/') ? 'audio' : 'binary',\n size: req.file.size,\n filename: req.file.filename\n });\n });\n\n router.get('/{*assetPath}', async (req, res) => {\n try {\n const rel = (req.params as any).assetPath?.join('/') ?? '';\n const full = resolveWithinRoot(assetsRoot, rel);\n res.sendFile(full);\n } catch (err) {\n if (err instanceof PathSafetyError) {\n res.status(400).json({ error: err.message });\n } else {\n res.status(404).json({ error: 'asset not found' });\n }\n }\n });\n\n router.delete('/{*assetPath}', async (req, res) => {\n try {\n const rel = (req.params as any).assetPath?.join('/') ?? '';\n const full = resolveWithinRoot(assetsRoot, rel);\n await fs.unlink(full);\n res.json({ ok: true });\n } catch (err) {\n handleError(res, err);\n }\n });\n\n return router;\n}\n", "/**\n * Watches a project's node sources and reports which module changed.\n *\n * Studio caches every project module's compiled bundle, so a node edited on\n * disk kept running its previous code until the whole app was reloaded. The\n * invalidation hook for that cache already existed and had no caller; this is\n * the caller.\n *\n * Watching happens on the server because only the server can see the\n * filesystem. The browser-side polling watcher this replaces could not, and\n * was never instantiated.\n */\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport type { ProjectRoot } from './project.js';\n\nexport type NodeChangeListener = (moduleName: string) => void;\n\n/** Sent instead of a module name when the change cannot be attributed to one. */\nexport const ALL_MODULES = '*';\n\n/** Long enough that an editor's write-truncate-write lands as one event,\n * short enough to feel immediate. */\nconst DEBOUNCE_MS = 120;\n\nexport interface NodeWatcher {\n subscribe(listener: NodeChangeListener): () => void;\n close(): void;\n}\n\n/** The changed path's first segment is the module folder. A file directly\n * inside `nodes/` belongs to no module and is ignored. */\nfunction moduleNameFor(relative: string): string | null {\n const segments = relative.split(path.sep).filter(Boolean);\n if (segments.length < 2) return null;\n const name = segments[0];\n if (!name || name.startsWith('.')) return null;\n return name;\n}\n\nexport function createNodeWatcher(project: ProjectRoot): NodeWatcher {\n const listeners = new Set<NodeChangeListener>();\n const watchers: fs.FSWatcher[] = [];\n const pending = new Map<string, NodeJS.Timeout>();\n\n function emit(moduleName: string): void {\n const existing = pending.get(moduleName);\n if (existing) clearTimeout(existing);\n pending.set(\n moduleName,\n setTimeout(() => {\n pending.delete(moduleName);\n for (const listener of listeners) listener(moduleName);\n }, DEBOUNCE_MS),\n );\n }\n\n function watch(directory: string, scope: 'project' | 'shared'): void {\n if (!fs.existsSync(directory)) return;\n try {\n // Recursive watching is supported on macOS and Windows. Where it is\n // not, the watch still reports the top level, so a new module folder\n // is noticed even though edits inside it are not.\n const watcher = fs.watch(directory, { recursive: true }, (_event, filename) => {\n if (!filename) return;\n if (scope === 'shared') {\n // A shared node is reached through a project module that re-exports\n // it, and the two names need not match, so the project module that\n // has to recompile cannot be derived from the changed path. Clearing\n // every module is honest and costs nothing: invalidation only drops\n // cached bundles, and each one recompiles when it is next needed.\n emit(ALL_MODULES);\n return;\n }\n const moduleName = moduleNameFor(String(filename));\n if (moduleName) emit(moduleName);\n });\n watcher.on('error', (error) => console.warn('[node watch] stopped watching', directory, error));\n watchers.push(watcher);\n } catch (error) {\n console.warn('[node watch] could not watch', directory, error);\n }\n }\n\n watch(project.resolve('nodes'), 'project');\n // A shared library reached through the project's `shared/` link is edited\n // just as often, and a project that re-exports one of its nodes has to see\n // that change too. realpath because fs.watch does not follow the link.\n try {\n const sharedNodes = fs.realpathSync(path.join(project.root, 'shared'));\n watch(path.join(sharedNodes, 'nodes'), 'shared');\n } catch {\n // No shared library, which is the common case.\n }\n\n return {\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n close() {\n for (const timer of pending.values()) clearTimeout(timer);\n pending.clear();\n for (const watcher of watchers) watcher.close();\n watchers.length = 0;\n listeners.clear();\n },\n };\n}\n", "/**\n * Node-module routes \u2014 the `nodes/<module-name>/` half of the project\n * model. Scoped to the single ProjectRoot, same reasoning as graph.ts.\n * This is deliberately minimal (list / read / write / scaffold) \u2014 it's\n * the API surface a \"create a new node\" Claude Code skill would call\n * into, not an in-app node editor (that's the part being disabled, per\n * Marcus's \"Claude writes everything\" direction).\n */\nimport { Router } from 'express';\nimport type { ProjectRoot } from '../project.js';\nimport { PathSafetyError } from '../pathSafety.js';\nimport { autoCommit } from '../git.js';\nimport { compileProjectModule, compileEmbedded } from '../compile.js';\nimport { createNodeWatcher, type NodeWatcher } from '../nodeWatch.js';\n\nfunction handleError(res: import('express').Response, err: unknown) {\n if (err instanceof PathSafetyError) {\n res.status(400).json({ error: err.message });\n return;\n }\n const code = (err as NodeJS.ErrnoException)?.code;\n if (code === 'ENOENT') {\n res.status(404).json({ error: 'not found' });\n return;\n }\n console.error('[nodes route] error:', err);\n res.status(500).json({ error: String(err) });\n}\n\nexport function createNodesRouter(project: ProjectRoot): Router {\n const router = Router();\n let watcher: NodeWatcher | null = null;\n\n /**\n * Tells Studio which module changed on disk, so it can drop that module's\n * cached bundle instead of running last night's code until the app is\n * reloaded.\n *\n * Server-Sent Events rather than a socket: the traffic is one-way and\n * tiny, it needs no dependency, and it inherits the Host and Origin\n * boundary that already guards every project route. The watcher starts on\n * the first listener so a headless `cascade run` never opens one.\n */\n router.get('/events', (req, res) => {\n res.set({\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache, no-transform',\n Connection: 'keep-alive',\n // Without this a proxy can hold the stream in a buffer and deliver\n // every event at once when the request finally ends.\n 'X-Accel-Buffering': 'no',\n });\n res.flushHeaders?.();\n res.write('retry: 2000\\n\\n');\n\n watcher ??= createNodeWatcher(project);\n const unsubscribe = watcher.subscribe((moduleName) => {\n res.write(`event: module-changed\\ndata: ${JSON.stringify({ module: moduleName })}\\n\\n`);\n });\n\n // A comment line keeps the connection from being reaped by an idle\n // timeout, and costs one line every half minute.\n const keepAlive = setInterval(() => res.write(': keep-alive\\n\\n'), 30_000);\n\n req.on('close', () => {\n clearInterval(keepAlive);\n unsubscribe();\n });\n });\n\n router.get('/', async (_req, res) => {\n try {\n const modules = await project.listNodeModules();\n const runsOn: Record<string, 'portable' | 'server' | 'browser'> = {};\n const icons: Record<string, string> = {};\n await Promise.all(modules.map(async (name) => {\n runsOn[name] = await project.moduleRunsOn(name);\n const icon = await project.moduleIcon(name);\n if (icon) icons[name] = icon;\n }));\n res.json({ modules, runsOn, icons });\n } catch (err) {\n handleError(res, err);\n }\n });\n\n /** Where one module's work happens. Declared or inferred \u2014 see\n * ProjectRoot.moduleRunsOn. */\n router.get('/:moduleName/runs-on', async (req, res) => {\n try {\n res.json({ module: req.params.moduleName, runsOn: await project.moduleRunsOn(req.params.moduleName) });\n } catch (err) {\n handleError(res, err);\n }\n });\n\n // Registered before the generic {*file} route below so a module literally\n // named \"compiled\" can never shadow this \u2014 Express matches route order.\n // The absolute path of a module's source, so Studio can hand it to an\n // external editor. Declared before the catch-all file route below, which\n // would otherwise claim it.\n router.get('/:moduleName/path', (req, res) => {\n try {\n res.json({ path: project.resolve(`nodes/${req.params.moduleName}/index.ts`) });\n } catch (err) {\n handleError(res, err);\n }\n });\n\n router.get('/:moduleName/compiled', async (req, res) => {\n try {\n const result = await compileProjectModule(project, req.params.moduleName);\n if (!result.ok) {\n res.status(422).json({ error: result.errors.join('\\n') });\n return;\n }\n res.type('application/javascript').send(result.code);\n } catch (err) {\n handleError(res, err);\n }\n });\n\n router.get('/:moduleName/{*file}', async (req, res) => {\n try {\n const rel = (req.params as any).file?.join('/') || 'index.ts';\n const content = await project.readNodeModuleFile(req.params.moduleName, rel);\n res.type('text/plain').send(content);\n } catch (err) {\n handleError(res, err);\n }\n });\n\n router.put('/:moduleName/{*file}', async (req, res) => {\n try {\n const rel = (req.params as any).file?.join('/') || 'index.ts';\n const content = req.body?.content;\n if (typeof content !== 'string') {\n res.status(400).json({ error: 'body must be { content: string }' });\n return;\n }\n await project.writeNodeModuleFile(req.params.moduleName, rel, content);\n const { committed } = await autoCommit(project.root, `Update node ${req.params.moduleName}/${rel}`, [`nodes/${req.params.moduleName}`]);\n res.json({ ok: true, committed });\n } catch (err) {\n handleError(res, err);\n }\n });\n\n // Scaffolds nodes/<moduleName>/index.ts with a minimal stub if it\n // doesn't already exist \u2014 the \"create a new node\" entry point.\n router.post('/', async (req, res) => {\n try {\n const name = String(req.body?.name ?? '');\n if (!name) {\n res.status(400).json({ error: 'body must include { name: string }' });\n return;\n }\n await project.ensureNodeModuleScaffold(name);\n const { committed } = await autoCommit(project.root, `Scaffold node ${name}`, [`nodes/${name}`]);\n res.json({ ok: true, name, committed });\n } catch (err) {\n handleError(res, err);\n }\n });\n\n // Compiles ad hoc code that only lives inline in the .cascade file (no\n // module directory of its own) \u2014 same esbuild pass as project modules,\n // fed as a virtual entry so it can still `import` from real project files.\n router.post('/compile-embedded', async (req, res) => {\n try {\n const code = req.body?.code;\n if (typeof code !== 'string') {\n res.status(400).json({ error: 'body must be { code: string }' });\n return;\n }\n const result = await compileEmbedded(project, code);\n if (!result.ok) {\n res.status(422).json({ error: result.errors.join('\\n') });\n return;\n }\n res.type('application/javascript').send(result.code);\n } catch (err) {\n handleError(res, err);\n }\n });\n\n return router;\n}\n", "import { Router } from 'express';\nimport type { ProjectRoot } from '../project.js';\nimport { PathSafetyError } from '../pathSafety.js';\nimport { compileProjectPanel } from '../compile.js';\n\nfunction handleError(res: import('express').Response, err: unknown): void {\n if (err instanceof PathSafetyError) {\n res.status(400).json({ error: err.message });\n return;\n }\n if ((err as NodeJS.ErrnoException)?.code === 'ENOENT') {\n res.status(404).json({ error: 'not found' });\n return;\n }\n console.error('[panels route] error:', err);\n res.status(500).json({ error: String(err) });\n}\n\nexport function createPanelsRouter(project: ProjectRoot): Router {\n const router = Router();\n\n router.get('/', async (_req, res) => {\n try {\n const names = await project.listPanels();\n res.json({ panels: await Promise.all(names.map((name) => project.panelMeta(name))) });\n } catch (err) {\n handleError(res, err);\n }\n });\n\n router.get('/:name/compiled', async (req, res) => {\n try {\n // Validate and resolve before compilation so path and missing-file errors\n // retain the same 400/404 semantics as the other project routes.\n await project.resolvePanelEntry(req.params.name);\n const result = await compileProjectPanel(project, req.params.name);\n if (!result.ok) {\n res.status(422).json({ error: result.errors.join('\\n') });\n return;\n }\n res.type('application/javascript').send(result.code);\n } catch (err) {\n handleError(res, err);\n }\n });\n\n return router;\n}\n", "/**\n * Manages one persistent Python worker process per project \u2014 replacing a\n * fresh subprocess per stage execution for a project-declared worker, so\n * lazily-loaded models stay warm across calls instead of reloading each time.\n *\n * Protocol: newline-delimited JSON on stdin/stdout, correlated by a\n * per-call incrementing id \u2014 see worker.py's own docstring. The Python\n * side is single-threaded (one request at a time), so no request queue\n * is needed here: writes to stdin queue naturally in the OS pipe buffer,\n * and the id map makes response order irrelevant.\n */\nimport { spawn, type ChildProcessWithoutNullStreams } from 'child_process';\nimport readline from 'readline';\nimport type { ProjectRoot } from './project.js';\n\nconst REQUEST_TIMEOUT_MS = 120_000;\n\ninterface PendingRequest {\n resolve: (result: unknown) => void;\n reject: (err: Error) => void;\n}\n\nexport class PythonWorker {\n private project: ProjectRoot;\n private entrypoint: string;\n private python: string;\n private env: NodeJS.ProcessEnv;\n private proc: ChildProcessWithoutNullStreams | null = null;\n private nextId = 1;\n private pending = new Map<number, PendingRequest>();\n\n constructor(project: ProjectRoot, entrypoint: string, python: string = 'python3', env: NodeJS.ProcessEnv = process.env) {\n this.project = project;\n this.entrypoint = entrypoint;\n this.python = python;\n this.env = env;\n }\n\n private ensureStarted(): ChildProcessWithoutNullStreams {\n if (this.proc && !this.proc.killed) return this.proc;\n\n const scriptPath = this.project.resolve(this.entrypoint);\n const proc = spawn(this.python, [scriptPath], { cwd: this.project.root, env: this.env });\n\n readline.createInterface({ input: proc.stdout }).on('line', (line) => this.handleLine(line));\n proc.stderr.on('data', (chunk) => console.error('[python-worker]', chunk.toString().trimEnd()));\n proc.on('exit', (code) => {\n console.warn(`[python-worker] exited (code ${code}) \u2014 will respawn on next call`);\n this.failAllPending(new Error(`python worker exited (code ${code}) before responding`));\n if (this.proc === proc) this.proc = null;\n });\n\n this.proc = proc;\n return proc;\n }\n\n private handleLine(line: string): void {\n let msg: { id: number; ok: boolean; result?: unknown; error?: string };\n try {\n msg = JSON.parse(line);\n } catch {\n console.error('[python-worker] non-JSON line from worker:', line);\n return;\n }\n const pending = this.pending.get(msg.id);\n if (!pending) return; // already timed out, or an id we don't recognize\n this.pending.delete(msg.id);\n if (msg.ok) pending.resolve(msg.result);\n else pending.reject(new Error(msg.error || 'python worker reported an error'));\n }\n\n private failAllPending(err: Error): void {\n for (const pending of this.pending.values()) pending.reject(err);\n this.pending.clear();\n }\n\n async call(stage: string, args: Record<string, unknown>): Promise<unknown> {\n const proc = this.ensureStarted();\n const id = this.nextId++;\n\n const result = new Promise<unknown>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pending.delete(id);\n reject(new Error(`python worker timed out after ${REQUEST_TIMEOUT_MS}ms on stage \"${stage}\"`));\n }, REQUEST_TIMEOUT_MS);\n this.pending.set(id, {\n resolve: (r) => { clearTimeout(timer); resolve(r); },\n reject: (e) => { clearTimeout(timer); reject(e); },\n });\n });\n\n proc.stdin.write(JSON.stringify({ id, stage, args }) + '\\n');\n return result;\n }\n\n shutdown(): void {\n this.proc?.kill();\n this.proc = null;\n }\n}\n", "import { randomBytes, timingSafeEqual } from 'node:crypto';\nimport { isIP } from 'node:net';\nimport type { NextFunction, Request, Response } from 'express';\n\nexport interface ServerSecurityOptions {\n readonly host: string;\n readonly port: number;\n readonly trustedOrigins: readonly string[];\n readonly trustedHosts: readonly string[];\n readonly sensitiveCapabilities: boolean;\n}\n\nexport interface BrowserCapabilityBoundary {\n readonly guardOrigin: (req: Request, res: Response, next: NextFunction) => void;\n readonly preflight: (req: Request, res: Response) => void;\n readonly issueCapability: (_req: Request, res: Response) => void;\n readonly requireCapability: (req: Request, res: Response, next: NextFunction) => void;\n}\n\nexport interface ProjectRequestBoundary {\n readonly guard: (req: Request, res: Response, next: NextFunction) => void;\n readonly preflight: (req: Request, res: Response) => void;\n}\n\nexport function isLoopbackHost(host: string): boolean {\n const normalized = host.toLowerCase().replace(/^\\[|\\]$/g, '');\n return normalized === '127.0.0.1' || normalized === 'localhost' || normalized === '::1';\n}\n\nexport function allowsSensitiveCapabilities(options: ServerSecurityOptions): boolean {\n return options.sensitiveCapabilities;\n}\n\n/**\n * Protect every project API from browser cross-origin requests and DNS\n * rebinding. Same-origin GET requests do not consistently carry Origin, so an\n * exact Host is always required while Origin is validated whenever present.\n */\nexport function createProjectRequestBoundary(options: ServerSecurityOptions): ProjectRequestBoundary {\n const origins = new Set(options.trustedOrigins.map((origin) => validateOrigin(origin, 'Project')));\n const authorities = allowedAuthorities(options, origins);\n\n return {\n guard(req, res, next) {\n const host = req.get('Host');\n const origin = req.get('Origin');\n if (!host || !authorities.has(host.toLowerCase()) || origin === 'null' || (origin && !origins.has(origin))) {\n res.status(403).json({ ok: false, error: 'Project access denied' });\n return;\n }\n if (origin) setCorsOrigin(res, origin);\n next();\n },\n preflight(req, res) {\n const origin = req.get('Origin');\n if (origin) setCorsOrigin(res, origin);\n res.setHeader('Access-Control-Allow-Methods', 'GET, HEAD, POST, PUT, DELETE, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type');\n res.status(204).end();\n },\n };\n}\n\nexport function createBrowserCapabilityBoundary(\n options: ServerSecurityOptions,\n label: string,\n header: string,\n): BrowserCapabilityBoundary {\n const origins = new Set(options.trustedOrigins.map((origin) => validateOrigin(origin, label)));\n const authorities = allowedAuthorities(options, origins);\n const capability = randomBytes(32).toString('base64url');\n const expectedBytes = Buffer.from(capability);\n\n return {\n guardOrigin(req, res, next) {\n const origin = req.get('Origin');\n const host = req.get('Host');\n if (!host || !authorities.has(host.toLowerCase()) || origin === 'null' || (origin && !origins.has(origin))) {\n res.status(403).json({ ok: false, error: `${label} access denied` });\n return;\n }\n if (origin) setCorsOrigin(res, origin);\n next();\n },\n preflight(_req, res) {\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', `Content-Type, ${header}`);\n res.status(204).end();\n },\n issueCapability(_req, res) {\n res.setHeader('Cache-Control', 'no-store, private');\n res.setHeader('Pragma', 'no-cache');\n res.json({ capability });\n },\n requireCapability(req, res, next) {\n const supplied = req.get(header);\n const suppliedBytes = supplied ? Buffer.from(supplied) : Buffer.alloc(0);\n if (suppliedBytes.length !== expectedBytes.length || !timingSafeEqual(suppliedBytes, expectedBytes)) {\n res.status(403).json({ ok: false, error: `${label} capability required` });\n return;\n }\n next();\n },\n };\n}\n\nfunction allowedAuthorities(options: ServerSecurityOptions, origins: ReadonlySet<string>): Set<string> {\n const authorities = new Set([...origins].map((origin) => new URL(origin).host.toLowerCase()));\n if (isLoopbackHost(options.host)) {\n authorities.add(`127.0.0.1:${options.port}`);\n authorities.add(`localhost:${options.port}`);\n } else if (options.trustedHosts.length === 0) {\n authorities.add(authority(options.host, options.port));\n }\n for (const host of options.trustedHosts) authorities.add(authority(host, options.port));\n return authorities;\n}\n\nexport function authority(host: string, port: number): string {\n const normalized = host.trim().toLowerCase().replace(/^\\[|\\]$/g, '');\n if (!normalized || /[\\s/?#@]/.test(normalized)) throw new Error(`Invalid trusted host: ${host}`);\n if (normalized.includes(':') && isIP(normalized) !== 6) throw new Error(`Invalid trusted host: ${host}`);\n return `${normalized.includes(':') ? `[${normalized}]` : normalized}:${port}`;\n}\n\nfunction setCorsOrigin(res: Response, origin: string): void {\n res.setHeader('Access-Control-Allow-Origin', origin);\n res.setHeader('Vary', 'Origin');\n}\n\nfunction validateOrigin(value: string, label: string): string {\n const url = new URL(value);\n if (!/^https?:$/.test(url.protocol) || url.username || url.password || url.pathname !== '/' || url.search || url.hash) {\n throw new Error(`Invalid trusted ${label.toLowerCase()} origin: ${value}`);\n }\n return url.origin;\n}\n", "import { execFile } from 'node:child_process';\nimport { Router, json, type NextFunction, type Request, type Response } from 'express';\nimport type { ProjectRoot } from '../project.js';\nimport { PythonWorker } from '../pythonWorker.js';\nimport { allowsSensitiveCapabilities, createBrowserCapabilityBoundary, type ServerSecurityOptions } from '../security.js';\nimport { CredentialStore } from '../credentials.js';\nimport { readProjectManifest } from '../projectConfig.js';\nimport { readStageConfig, runProjectStage } from '../stageRunner.js';\n\nconst EXEC_TIMEOUT_MS = 120_000;\nconst MAX_BUFFER = 64 * 1024 * 1024;\nconst BODY_LIMIT = '64mb';\n\ninterface WorkerSlot {\n readonly key: string;\n readonly worker: PythonWorker;\n}\n\n/** Protected project-local Python execution with no assumed project layout. */\nexport function createExecRouter(project: ProjectRoot, security: ServerSecurityOptions): Router {\n const router = Router();\n if (!allowsSensitiveCapabilities(security)) return router.use((_req, res) => res.status(404).end());\n\n const boundary = createBrowserCapabilityBoundary(security, 'Exec', 'X-Cascade-Exec-Capability');\n let workerSlot: WorkerSlot | null = null;\n\n router.use(boundary.guardOrigin);\n router.options('{*path}', boundary.preflight);\n router.get('/capability', boundary.issueCapability);\n router.post('/', boundary.requireCapability, json({ limit: BODY_LIMIT }), async (req, res) => {\n try {\n const request = parseRequest(req.body);\n const credentialEnv = new CredentialStore().environment(readProjectManifest(project.root).credentials);\n if (request.kind === 'stage') {\n const config = readStageConfig(project);\n if (config.worker) {\n const key = `${config.python}\\0${config.worker}\\0${JSON.stringify(credentialEnv)}`;\n if (workerSlot?.key !== key) {\n workerSlot?.worker.shutdown();\n workerSlot = { key, worker: new PythonWorker(project, config.worker, config.python, { ...process.env, ...credentialEnv }) };\n }\n try {\n const result = await workerSlot.worker.call(request.stage, request.args);\n res.json({ ok: true, stdout: JSON.stringify(result), stderr: '' });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n res.status(500).json({ ok: false, error: message, stdout: '', stderr: message });\n }\n return;\n }\n const controller = new AbortController();\n res.once('close', () => { if (!res.writableEnded) controller.abort(); });\n try {\n const result = await runProjectStage(project, request.stage, request.args, {\n env: { ...process.env, ...credentialEnv },\n timeout: EXEC_TIMEOUT_MS,\n signal: controller.signal,\n });\n res.json({ ok: true, stdout: JSON.stringify(result), stderr: '' });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n res.status(500).json({ ok: false, error: message, stdout: '', stderr: message });\n }\n return;\n }\n\n await runPython(res, project, request.python, request.entrypoint, request.args, credentialEnv);\n } catch (error) {\n res.status(400).json({ ok: false, error: error instanceof Error ? error.message : String(error) });\n }\n });\n router.use((error: any, _req: Request, res: Response, next: NextFunction) => {\n if (error?.type === 'entity.too.large' || error?.type === 'entity.parse.failed') {\n res.status(error.status ?? 400).json({ ok: false, error: error.message, type: error.type });\n } else next(error);\n });\n return router;\n}\n\nfunction parseRequest(body: unknown):\n | { kind: 'stage'; stage: string; args: Record<string, unknown> }\n | { kind: 'entrypoint'; entrypoint: string; args: string[]; python: 'python' | 'python3' } {\n if (!body || typeof body !== 'object' || Array.isArray(body)) throw new Error('body must be an object');\n const value = body as Record<string, unknown>;\n if (typeof value.stage === 'string') {\n if (!/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(value.stage)) throw new Error('stage contains unsupported characters');\n if (value.args !== undefined && (!value.args || typeof value.args !== 'object' || Array.isArray(value.args))) {\n throw new Error('stage args must be an object');\n }\n return { kind: 'stage', stage: value.stage, args: (value.args ?? {}) as Record<string, unknown> };\n }\n if (typeof value.entrypoint !== 'string' || !value.entrypoint) {\n throw new Error('body must include either { stage: string } or { entrypoint: string }');\n }\n if (value.args !== undefined && !Array.isArray(value.args)) throw new Error('entrypoint args must be an array');\n const python = value.python === 'python' ? 'python' : 'python3';\n return { kind: 'entrypoint', entrypoint: value.entrypoint, args: (value.args ?? []).map(String), python };\n}\n\nfunction runPython(\n res: Response,\n project: ProjectRoot,\n python: 'python' | 'python3',\n entrypoint: string,\n args: string[],\n credentialEnv: Record<string, string>,\n): Promise<void> {\n const scriptPath = project.resolve(entrypoint);\n return new Promise((resolve) => {\n const child = execFile(\n python,\n [scriptPath, ...args],\n { cwd: project.root, timeout: EXEC_TIMEOUT_MS, maxBuffer: MAX_BUFFER, env: { ...process.env, ...credentialEnv } },\n (error, stdout, stderr) => {\n if (error) {\n res.status(500).json({\n ok: false,\n error: error.message,\n stdout,\n stderr,\n timedOut: (error as { signal?: string }).signal === 'SIGTERM',\n });\n } else {\n res.json({ ok: true, stdout, stderr });\n }\n resolve();\n },\n );\n res.once('close', () => { if (!res.writableEnded) child.kill(); });\n });\n}\n", "import { Router, json, type NextFunction, type Request, type Response } from 'express';\nimport type { ShellService } from '../shell/service.js';\nimport { ShellProcessError, ShellRequestError, type ShellRunResult } from '../shell/types.js';\nimport { allowsSensitiveCapabilities, createBrowserCapabilityBoundary, isLoopbackHost, type ServerSecurityOptions } from '../security.js';\n\nexport type { ServerSecurityOptions } from '../security.js';\nexport { isLoopbackHost } from '../security.js';\n\nexport function createShellRouter(shell: ShellService, options: ServerSecurityOptions): Router {\n const router = Router();\n if (!allowsSensitiveCapabilities(options)) return router.use((_req, res) => res.status(404).end());\n const boundary = createBrowserCapabilityBoundary(options, 'Shell', 'X-Cascade-Shell-Capability');\n router.use(boundary.guardOrigin);\n router.options('{*path}', boundary.preflight);\n router.get('/capability', boundary.issueCapability);\n router.post('/', boundary.requireCapability, json({ limit: '20mb' }), async (req, res) => {\n const controller = new AbortController();\n const cancel = () => controller.abort();\n req.once('aborted', cancel);\n res.once('close', () => { if (!res.writableEnded) cancel(); });\n try {\n const body = parseBody(req.body);\n const result = await shell.run(body.command, body.args, { ...body.options, signal: controller.signal });\n if (result.code !== 0) {\n res.status(500).json(errorPayload(new ShellProcessError('nonzero', result, result.stderr || `Command exited with code ${result.code}`)));\n } else {\n res.json({ ok: true, ...result });\n }\n } catch (error) {\n if (error instanceof ShellRequestError) {\n res.status(error.code === 'COMMAND_NOT_ALLOWED' ? 403 : 400).json({ ok: false, error: error.message, code: error.code });\n } else if (error instanceof ShellProcessError) {\n res.status(error.kind === 'cancelled' ? 499 : 500).json(errorPayload(error));\n } else {\n res.status(500).json({ ok: false, error: 'Shell execution failed' });\n }\n }\n });\n router.use((error: any, _req: Request, res: Response, next: NextFunction) => {\n if (error?.type === 'entity.too.large' || error?.type === 'entity.parse.failed') {\n res.status(error.status ?? 400).json({ ok: false, error: error.message, type: error.type });\n } else next(error);\n });\n return router;\n}\n\nfunction parseBody(body: any) {\n if (!body || typeof body !== 'object' || typeof body.command !== 'string') throw new ShellRequestError('INVALID_REQUEST', 'body must include { command: string }');\n if (body.args !== undefined && !Array.isArray(body.args)) throw new ShellRequestError('INVALID_REQUEST', 'args must be an array');\n return { command: body.command, args: body.args ?? [], options: { cwd: body.cwd, timeout: body.timeout, stdin: body.stdin, env: body.env } };\n}\n\nfunction errorPayload(error: ShellProcessError): { ok: false; error: string; kind: string } & ShellRunResult {\n return { ok: false, error: error.message, kind: error.kind, ...error.result };\n}\n", "import { Router, json } from 'express';\nimport type { ProjectRoot } from '../project.js';\nimport { CredentialStore } from '../credentials.js';\nimport { readProjectManifest, writeProjectManifest } from '../projectConfig.js';\nimport { allowsSensitiveCapabilities, createBrowserCapabilityBoundary, type ServerSecurityOptions } from '../security.js';\n\nexport function createProjectSettingsRouter(project: ProjectRoot, security: ServerSecurityOptions, credentials = new CredentialStore()): Router {\n const router = Router();\n if (!allowsSensitiveCapabilities(security)) return router.use((_req, res) => res.status(404).end());\n const boundary = createBrowserCapabilityBoundary(security, 'Project settings', 'X-Cascade-Project-Capability');\n router.use(boundary.guardOrigin);\n router.options('{*path}', boundary.preflight);\n router.get('/capability', boundary.issueCapability);\n router.get('/', boundary.requireCapability, (_req, res) => {\n try { res.json(publicProjectState(project, credentials)); }\n catch (error) { res.status(500).json({ ok: false, error: message(error) }); }\n });\n router.put('/', boundary.requireCapability, json({ limit: '1mb' }), (req, res) => {\n try {\n writeProjectManifest(project.root, req.body);\n res.json(publicProjectState(project, credentials));\n } catch (error) {\n res.status(400).json({ ok: false, error: message(error) });\n }\n });\n return router;\n}\n\nfunction publicProjectState(project: ProjectRoot, credentials: CredentialStore) {\n const manifest = readProjectManifest(project.root);\n const requiredCredentials = manifest.credentials.map((name) => ({ name, set: credentials.has(name) }));\n return { ok: true, manifest, requiredCredentials, missingCredentials: requiredCredentials.filter((item) => !item.set).map((item) => item.name) };\n}\n\nfunction message(error: unknown): string { return error instanceof Error ? error.message : String(error); }\n", "import { Router, json } from 'express';\nimport type { ProjectRoot } from '../project.js';\nimport { CredentialStore, secretValue } from '../credentials.js';\nimport { readProjectManifest } from '../projectConfig.js';\nimport { allowsSensitiveCapabilities, createBrowserCapabilityBoundary, type ServerSecurityOptions } from '../security.js';\n\nconst ALLOWED_METHODS = new Set(['GET', 'POST', 'PUT', 'PATCH', 'DELETE']);\nconst BLOCKED_HEADER = /^(?:authorization|cookie|host|origin|referer|proxy-|sec-)/i;\n\nexport function createNetRouter(project: ProjectRoot, security: ServerSecurityOptions, credentials = new CredentialStore()): Router {\n const router = Router();\n if (!allowsSensitiveCapabilities(security)) return router.use((_req, res) => res.status(404).end());\n const boundary = createBrowserCapabilityBoundary(security, 'Authorized fetch', 'X-Cascade-Net-Capability');\n router.use(boundary.guardOrigin);\n router.options('{*path}', boundary.preflight);\n router.get('/capability', boundary.issueCapability);\n router.post('/', boundary.requireCapability, json({ limit: '16mb' }), async (req, res) => {\n try {\n res.json(await authorizedProxyRequest(project, credentials, req.body));\n } catch (error) {\n const status = typeof (error as any)?.status === 'number' ? (error as any).status : 400;\n res.status(status).json({ ok: false, error: error instanceof Error ? error.message : String(error) });\n }\n });\n return router;\n}\n\nexport async function authorizedProxyRequest(\n project: ProjectRoot,\n credentials: CredentialStore,\n input: unknown,\n fetcher: typeof fetch = fetch,\n) {\n const request = parseRequest(input);\n const manifest = readProjectManifest(project.root);\n if (!manifest.credentials.includes(request.credential)) throw statusError(403, `Credential ${JSON.stringify(request.credential)} is not declared in cascade.json`);\n const definition = credentials.get(request.credential);\n if (!definition) throw statusError(424, `Credential ${JSON.stringify(request.credential)} is not set`);\n const secret = secretValue(definition);\n if (!secret || !definition.header || definition.hosts.length === 0) throw statusError(400, `Credential ${JSON.stringify(request.credential)} needs field/header/hosts metadata for browser proxy use`);\n const url = new URL(request.url);\n if (url.protocol !== 'https:' || url.username || url.password || !definition.hosts.includes(url.hostname.toLowerCase())) {\n throw statusError(403, `Credential ${JSON.stringify(request.credential)} is not authorized for ${url.hostname}`);\n }\n const headers = new Headers(request.headers);\n for (const name of [...headers.keys()]) if (BLOCKED_HEADER.test(name)) headers.delete(name);\n headers.set(definition.header, definition.scheme ? `${definition.scheme} ${secret}` : secret);\n const response = await fetcher(url, { method: request.method, headers, body: request.body, redirect: 'manual' });\n const body = await response.text();\n return { ok: true as const, status: response.status, statusText: response.statusText,\n headers: { 'content-type': response.headers.get('content-type') ?? 'text/plain' }, body };\n}\n\nfunction parseRequest(input: unknown): { credential: string; url: string; method: string; headers: Record<string, string>; body?: string } {\n if (!input || typeof input !== 'object' || Array.isArray(input)) throw new Error('body must be an object');\n const value = input as Record<string, unknown>;\n if (typeof value.credential !== 'string' || !/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(value.credential)) throw new Error('credential is invalid');\n if (typeof value.url !== 'string') throw new Error('url is required');\n const method = typeof value.method === 'string' ? value.method.toUpperCase() : 'GET';\n if (!ALLOWED_METHODS.has(method)) throw new Error('method is not supported');\n if (value.body !== undefined && typeof value.body !== 'string') throw new Error('body must be a string');\n const headers = value.headers === undefined ? {} : value.headers;\n if (!headers || typeof headers !== 'object' || Array.isArray(headers) || Object.values(headers).some((item) => typeof item !== 'string')) throw new Error('headers must be an object of strings');\n return { credential: value.credential, url: value.url, method, headers: headers as Record<string, string>, ...(typeof value.body === 'string' ? { body: value.body } : {}) };\n}\n\nfunction statusError(status: number, message: string): Error { return Object.assign(new Error(message), { status }); }\n", "/**\n * Media route \u2014 serves any file inside the project root to the browser, and\n * for images does the resize/re-encode on the way out.\n *\n * This exists because node image outputs were unreachable: a node emits a\n * project-relative path like `.cascade-cache/render-preview.preview.png`, the\n * Viewer turned it into `/.cascade-cache/\u2026`, and the only static mount is the\n * built UI \u2014 so every image output resolved to the app's own index.html and\n * rendered as a broken image.\n *\n * Encoding matters here because the pipeline's outputs are large: a 1400\u00D71867\n * plot preview is ~1.4 MB of PNG, and a super-res pass is several times that.\n * WebP at a display width is one to two orders of magnitude smaller, which is\n * the difference between a preview that updates as you work and one that\n * doesn't. The full-resolution original stays one request away (`raw=1`), and\n * SVG streams untouched \u2014 plotter output must never be re-encoded.\n *\n * A .npy float field is rendered to greyscale rather than streamed, so the\n * mask/signal/height stages can be opened and zoomed like any other stage.\n * `raw=1` still gets the array itself.\n */\nimport express, { Router } from 'express';\nimport crypto from 'crypto';\nimport fs from 'fs';\nimport fssync from 'fs';\nimport path from 'path';\nimport sharp from 'sharp';\nimport type { ProjectRoot } from '../project.js';\nimport { PathSafetyError } from '../pathSafety.js';\n\n/** Formats sharp can decode and we're willing to transform. */\nconst RASTER = new Set(['.png', '.jpg', '.jpeg', '.webp', '.tif', '.tiff', '.avif', '.gif']);\n\n/**\n * A .npy float array \u2014 a mask, a signal, a density or height field. Nine of the\n * many numeric stages emit one, and none of them could be looked at: the array\n * isn't an image, so the viewer had nothing to show and those stages were\n * effectively uninspectable. Rendering the array to greyscale here makes every\n * stage of a pipeline something you can open and zoom into, which is the whole\n * point of a node graph you can step through.\n *\n * Minimal .npy v1/v2 reader: magic \\x93NUMPY, version, header length, then a\n * Python-dict header giving dtype, order and shape. Only the C-contiguous\n * numeric cases the pipeline actually produces are handled; anything else is\n * reported rather than guessed at.\n */\ninterface NpyArray {\n data: Float64Array;\n width: number;\n height: number;\n}\n\nfunction readNpy(buffer: Buffer): NpyArray {\n if (buffer.length < 10 || buffer.toString('latin1', 0, 6) !== '\\x93NUMPY') {\n throw new Error('not a .npy file');\n }\n const major = buffer[6];\n const headerLength = major >= 2 ? buffer.readUInt32LE(8) : buffer.readUInt16LE(8);\n const headerStart = major >= 2 ? 12 : 10;\n const header = buffer.toString('latin1', headerStart, headerStart + headerLength);\n\n const descr = header.match(/'descr':\\s*'([^']+)'/)?.[1];\n const fortran = /'fortran_order':\\s*True/.test(header);\n const shape = (header.match(/'shape':\\s*\\(([^)]*)\\)/)?.[1] ?? '')\n .split(',')\n .map(part => part.trim())\n .filter(Boolean)\n .map(Number);\n\n if (!descr) throw new Error('.npy header has no dtype');\n if (fortran) throw new Error('.npy is Fortran-ordered; not supported');\n if (shape.length < 2) throw new Error(`.npy is ${shape.length}-dimensional; expected an image-shaped array`);\n\n const height = shape[0];\n const width = shape[1];\n // A trailing channel axis (H, W, C) is flattened by taking the first channel \u2014\n // enough to see the field, and none of these stages emit one today.\n const stride = shape.length > 2 ? shape.slice(2).reduce((a, b) => a * b, 1) : 1;\n const count = height * width * stride;\n\n const body = buffer.subarray(headerStart + headerLength);\n const readers: Record<string, (offset: number) => number> = {\n '<f4': o => body.readFloatLE(o),\n '<f8': o => body.readDoubleLE(o),\n '|u1': o => body.readUInt8(o),\n '<u1': o => body.readUInt8(o),\n '|i1': o => body.readInt8(o),\n '<i2': o => body.readInt16LE(o),\n '<u2': o => body.readUInt16LE(o),\n '<i4': o => body.readInt32LE(o),\n '<u4': o => body.readUInt32LE(o),\n '|b1': o => body.readUInt8(o),\n };\n const sizes: Record<string, number> = {\n '<f4': 4, '<f8': 8, '|u1': 1, '<u1': 1, '|i1': 1,\n '<i2': 2, '<u2': 2, '<i4': 4, '<u4': 4, '|b1': 1,\n };\n const read = readers[descr];\n const itemSize = sizes[descr];\n if (!read || !itemSize) throw new Error(`.npy dtype ${descr} not supported`);\n\n const data = new Float64Array(height * width);\n for (let i = 0; i < height * width; i++) {\n data[i] = read(i * stride * itemSize);\n }\n if (count * itemSize > body.length) throw new Error('.npy body is shorter than its shape');\n return { data, width, height };\n}\n\n/** Map a float field onto 0-255. Uses the array's own range rather than\n * assuming 0..1, so a height field in metres and a mask in booleans both come\n * out legible. */\nfunction fieldToGrey(array: NpyArray): { pixels: Buffer; min: number; max: number } {\n let min = Infinity;\n let max = -Infinity;\n for (const value of array.data) {\n if (!Number.isFinite(value)) continue;\n if (value < min) min = value;\n if (value > max) max = value;\n }\n if (!Number.isFinite(min) || !Number.isFinite(max)) { min = 0; max = 1; }\n const span = max - min || 1;\n const pixels = Buffer.allocUnsafe(array.data.length);\n for (let i = 0; i < array.data.length; i++) {\n const value = array.data[i];\n pixels[i] = Number.isFinite(value) ? Math.round(((value - min) / span) * 255) : 0;\n }\n return { pixels, min, max };\n}\n\n/** Derived data only \u2014 see the PUT route. */\nconst CACHE_DIR = '.cascade-cache';\n\n/** `.cascade-cache/webgl-tone.png` -> `.cascade-cache/webgl-tone.<hash>.png` */\nfunction contentAddressed(rel: string, body: Buffer): string {\n const hash = crypto.createHash('sha1').update(body).digest('hex').slice(0, 12);\n const dir = path.posix.dirname(rel);\n const name = path.posix.basename(rel);\n const [stem, ...rest] = name.split('.');\n const tail = rest.length ? `.${rest.join('.')}` : '';\n return path.posix.join(dir, `${stem}.${hash}${tail}`);\n}\n\nconst MIME: Record<string, string> = {\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.webp': 'image/webp',\n '.gif': 'image/gif',\n '.tif': 'image/tiff',\n '.tiff': 'image/tiff',\n '.avif': 'image/avif',\n '.svg': 'image/svg+xml',\n '.json': 'application/json',\n '.txt': 'text/plain',\n '.npy': 'application/octet-stream',\n};\n\nfunction clampInt(value: unknown, min: number, max: number): number | null {\n const n = Number(value);\n if (!Number.isFinite(n)) return null;\n return Math.min(max, Math.max(min, Math.round(n)));\n}\n\nexport function createMediaRouter(project: ProjectRoot): Router {\n const router = Router();\n\n /**\n * Browser -> project. The other half of the interop: a node that runs in the\n * page (WebGL, canvas, anything with pixels in the browser) writes its result\n * into the project and gets back a project-relative path \u2014 the same kind of\n * string a Python node emits. From there the two are interchangeable: either\n * kind can consume either kind's output, and a graph can mix them freely.\n *\n * Confined to the cache directory on purpose. A node's output is derived data\n * that a re-cook can reproduce, so it does not belong beside the source\n * material, and the project's own files are not writable through this route.\n */\n router.put('/{*mediaPath}', express.raw({ type: '*/*', limit: '512mb' }), async (req, res) => {\n const rel = (req.params as any).mediaPath?.join('/') ?? '';\n if (!rel.startsWith(CACHE_DIR + '/')) {\n res.status(400).json({ error: `writes are confined to ${CACHE_DIR}/ \u2014 got ${rel}` });\n return;\n }\n if (!Buffer.isBuffer(req.body) || req.body.length === 0) {\n res.status(400).json({ error: 'empty body' });\n return;\n }\n try {\n // Content-address the filename, the way the Python side keys its outputs.\n // Without it a browser node writing to one fixed name overwrites its own\n // result for a different input image, and switching back silently yields\n // the wrong pixels \u2014 exactly the bug the server-side cache had. Hashing\n // the body gets there without the node needing to know its own cache key:\n // same pixels, same file; different pixels, different file.\n const target = req.query.exact === '1' ? rel : contentAddressed(rel, req.body);\n const full = project.resolve(target);\n await fs.promises.mkdir(path.dirname(full), { recursive: true });\n await fs.promises.writeFile(full, req.body);\n res.json({ ok: true, path: target, bytes: req.body.length });\n } catch (err) {\n res.status(err instanceof PathSafetyError ? 400 : 500).json({ error: String(err) });\n }\n });\n\n router.get('/{*mediaPath}', async (req, res) => {\n let full: string;\n const rel = (req.params as any).mediaPath?.join('/') ?? '';\n try {\n full = project.resolveMedia(rel);\n } catch (err) {\n res.status(err instanceof PathSafetyError ? 400 : 500).json({ error: String(err) });\n return;\n }\n\n let stat: fssync.Stats;\n try {\n stat = await fs.promises.stat(full);\n if (!stat.isFile()) throw new Error('not a file');\n } catch {\n res.status(404).json({ error: `no such file: ${rel}` });\n return;\n }\n\n const ext = path.extname(full).toLowerCase();\n const width = clampInt(req.query.w, 1, 20000);\n const quality = clampInt(req.query.q, 1, 100) ?? 82;\n const requested = String(req.query.fmt ?? '').toLowerCase();\n const raw = req.query.raw === '1' || req.query.raw === 'true';\n\n // The transform is fully described by the file's identity plus the query,\n // so a repeat view of an unchanged render is a 304 rather than a re-encode.\n const etag = `W/\"${stat.size.toString(16)}-${stat.mtimeMs.toString(16)}-${width ?? 'full'}-${requested || 'auto'}-${quality}-${raw ? 'raw' : 'enc'}\"`;\n res.setHeader('ETag', etag);\n res.setHeader('Cache-Control', 'private, max-age=0, must-revalidate');\n if (req.headers['if-none-match'] === etag) {\n res.status(304).end();\n return;\n }\n\n // A float field becomes a picture of itself. Its value range goes in a\n // header so the viewer can say what the greys mean.\n if (!raw && ext === '.npy') {\n try {\n const array = readNpy(await fs.promises.readFile(full));\n const { pixels, min, max } = fieldToGrey(array);\n res.setHeader('X-Field-Shape', `${array.height}x${array.width}`);\n res.setHeader('X-Field-Range', `${min}:${max}`);\n let pipeline = sharp(pixels, {\n raw: { width: array.width, height: array.height, channels: 1 },\n });\n if (width) pipeline = pipeline.resize({ width, withoutEnlargement: true });\n if (requested === 'png') {\n res.type('image/png');\n pipeline = pipeline.png({ compressionLevel: 9 });\n } else {\n res.type('image/webp');\n pipeline = pipeline.webp({ quality, effort: 4 });\n }\n pipeline.on('error', (err) => {\n console.error('[media] field encode failed:', rel, err);\n if (!res.headersSent) res.status(500).json({ error: String(err) });\n else res.end();\n });\n pipeline.pipe(res);\n } catch (err) {\n console.error('[media] field render failed:', rel, err);\n res.status(422).json({ error: String(err instanceof Error ? err.message : err) });\n }\n return;\n }\n\n // Anything we can't or shouldn't transform streams through byte for byte.\n // SVG is the important one: it's the plotter deliverable.\n if (raw || !RASTER.has(ext)) {\n res.type(MIME[ext] ?? 'application/octet-stream');\n res.setHeader('Content-Length', String(stat.size));\n fs.createReadStream(full).pipe(res);\n return;\n }\n\n // Default to WebP unless the caller asked for something specific. Animated\n // GIFs are left alone \u2014 a still WebP of a frame would be a silent downgrade.\n let format = requested;\n if (!format) format = ext === '.gif' ? 'gif' : 'webp';\n if (format === 'gif') {\n res.type('image/gif');\n res.setHeader('Content-Length', String(stat.size));\n fs.createReadStream(full).pipe(res);\n return;\n }\n\n try {\n // failOn: 'none' so a slightly malformed render still previews rather\n // than showing nothing at all.\n let pipeline = sharp(full, { failOn: 'none' }).rotate();\n if (width) {\n // withoutEnlargement: asking for a width above the original returns the\n // original size instead of an upscaled blur.\n pipeline = pipeline.resize({ width, withoutEnlargement: true });\n }\n switch (format) {\n case 'png':\n pipeline = pipeline.png({ compressionLevel: 9 });\n res.type('image/png');\n break;\n case 'jpeg':\n case 'jpg':\n pipeline = pipeline.jpeg({ quality, mozjpeg: true });\n res.type('image/jpeg');\n break;\n case 'avif':\n pipeline = pipeline.avif({ quality });\n res.type('image/avif');\n break;\n default:\n // effort 4 is the useful middle of libvips' 0\u20136: most of the size\n // win, a fraction of the time of effort 6 \u2014 this runs per preview.\n pipeline = pipeline.webp({ quality, effort: 4 });\n res.type('image/webp');\n }\n // Streamed, so a large render starts arriving before it finishes encoding.\n pipeline.on('error', (err) => {\n console.error('[media] encode failed:', rel, err);\n if (!res.headersSent) res.status(500).json({ error: String(err) });\n else res.end();\n });\n pipeline.pipe(res);\n } catch (err) {\n console.error('[media] error:', rel, err);\n if (!res.headersSent) res.status(500).json({ error: String(err) });\n }\n });\n\n return router;\n}\n", "/**\n * Identifies the build the server is currently serving.\n *\n * A Studio tab left open across a rebuild keeps running the code it loaded,\n * and the way that surfaced was File > Save quietly downloading a file\n * instead of writing to the project \u2014 which reads as a missing feature\n * rather than a stale page. Studio can only notice if it can ask what is\n * being served now and compare it with what it loaded.\n *\n * The id comes from `index.html` rather than the package version, because it\n * is the file that names the hashed asset bundles: a rebuild changes it, and\n * a version bump without a rebuild does not change what the browser runs.\n */\nimport fs from 'node:fs';\nimport { createHash } from 'node:crypto';\n\nexport function buildId(distDir: string): string | null {\n try {\n const contents = fs.readFileSync(`${distDir}/index.html`);\n return createHash('sha256').update(contents).digest('hex').slice(0, 16);\n } catch {\n // Running API-only against no build at all, which the server already warns\n // about at startup. No id is honest here; a fabricated one would make\n // Studio claim it was up to date.\n return null;\n }\n}\n", "import express from 'express';\nimport { createServer } from 'http';\nimport path from 'path';\nimport fs from 'fs';\nimport { fileURLToPath } from 'url';\nimport { createGraphRouter } from './routes/graph.js';\nimport { createAssetsRouter } from './routes/assets.js';\nimport { createNodesRouter } from './routes/nodes.js';\nimport { createPanelsRouter } from './routes/panels.js';\nimport { createExecRouter } from './routes/exec.js';\nimport { createShellRouter } from './routes/shell.js';\nimport { createProjectSettingsRouter } from './routes/projectSettings.js';\nimport { createNetRouter } from './routes/net.js';\nimport { authority, createProjectRequestBoundary, isLoopbackHost, type ServerSecurityOptions } from './security.js';\nimport { createMediaRouter } from './routes/media.js';\nimport { ProjectRoot } from './project.js';\nimport { buildId } from './build.js';\n\nexport { createDirectShellCapability } from './shell/service.js';\nexport type { ShellCapability, ShellRunOptions, ShellRunResult } from './shell/types.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n// server/src/index.ts -> server/src -> server -> repo root -> dist. Resolved\n// relative to THIS file's install location, not the caller's CWD, so\n// `cascade` works correctly when symlinked onto PATH and run from any\n// project directory.\nconst CASCADE_DIST = path.resolve(__dirname, '..', '..', 'dist');\n\nexport interface StartServerOptions {\n readonly port?: number;\n readonly host?: string;\n readonly trustedHosts?: readonly string[];\n readonly trustedOrigins?: readonly string[];\n /** @deprecated Use trustedOrigins. */\n readonly trustedShellOrigins?: readonly string[];\n}\n\nexport function startServer(project: ProjectRoot, opts: StartServerOptions = {}) {\n const app = express();\n const PORT = opts.port ?? (process.env.PORT ? parseInt(process.env.PORT, 10) : 3030);\n const HOST = opts.host ?? '127.0.0.1';\n const trustedHosts = Object.freeze([...(opts.trustedHosts ?? [])]);\n const defaultOrigins = [\n ...(isLoopbackHost(HOST) ? [`http://127.0.0.1:${PORT}`, `http://localhost:${PORT}`] : []),\n ...trustedHosts.map((host) => `http://${authority(host, PORT)}`),\n ];\n const security: ServerSecurityOptions = Object.freeze({\n host: HOST,\n port: PORT,\n trustedHosts,\n sensitiveCapabilities: isLoopbackHost(HOST) || trustedHosts.length > 0,\n trustedOrigins: Object.freeze([...(opts.trustedOrigins ?? opts.trustedShellOrigins ?? defaultOrigins)]),\n });\n\n // Process endpoints own their authentication and bounded parsers, so they\n // must run before the broad project parsers below. Each router terminates\n // its protected prefix.\n app.use('/api/shell', createShellRouter(project.shell, security));\n app.use('/api/exec', createExecRouter(project, security));\n app.use('/api/net', createNetRouter(project, security));\n app.use('/api/project', createProjectSettingsRouter(project, security));\n\n const projectBoundary = createProjectRequestBoundary(security);\n app.use('/api', projectBoundary.guard);\n app.options('/api/{*splat}', projectBoundary.preflight);\n // Project graphs and assets may carry large media-derived values. Process\n // routes above use smaller independent limits.\n app.use(express.json({ limit: '512mb' }));\n app.use(express.urlencoded({ extended: true, limit: '512mb' }));\n\n // Body-parser failures must stay JSON. The default handler renders an HTML\n // error page, and every caller here does res.json() on the response \u2014 so an\n // oversized or malformed body arrived as a parse error about a '<' character\n // rather than as what actually went wrong.\n app.use((err: any, _req: express.Request, res: express.Response, next: express.NextFunction) => {\n if (err && (err.type === 'entity.too.large' || err.type === 'entity.parse.failed')) {\n res.status(err.status ?? 400).json({ ok: false, error: err.message, type: err.type });\n return;\n }\n next(err);\n });\n\n app.use('/api/graph', createGraphRouter(project));\n app.use('/api/assets', createAssetsRouter(project));\n app.use('/api/nodes', createNodesRouter(project));\n app.use('/api/panels', createPanelsRouter(project));\n app.use('/api/media', createMediaRouter(project));\n\n app.get('/health', (_req, res) => {\n res.json({ status: 'ok', version: '2.0', projectRoot: project.root, isGitRepo: project.isGitRepo });\n });\n\n // What Studio compares against the build it loaded. Deliberately outside the\n // project boundary and unauthenticated: it is one hash of a file already\n // served to anyone who can load the page, and a stale tab has to be able to\n // ask even when nothing else about its session is still valid.\n app.get('/api/build', (_req, res) => {\n res.json({ id: buildId(CASCADE_DIST) });\n });\n\n // Serves the built Cascade UI itself \u2014 \"cascade .\" is meant to be one\n // self-contained command, not \"run the server, then separately go start\n // the frontend dev server too.\" Falls through to the API routes above\n // (registered first) for anything under /api or /health.\n if (fs.existsSync(CASCADE_DIST)) {\n // Asset filenames carry a content hash, so a given URL's bytes never\n // change and it can be cached hard. index.html is the one file with a\n // stable URL, and it is what names the current hashes \u2014 cache that and a\n // reload can hand back the previous build's bundle. So: never store it.\n app.use(express.static(CASCADE_DIST, {\n setHeaders(res, filePath) {\n res.setHeader(\n 'Cache-Control',\n filePath.endsWith('index.html') ? 'no-store' : 'public, max-age=31536000, immutable',\n );\n },\n }));\n app.get('/{*splat}', (req, res, next) => {\n if (req.path.startsWith('/api') || req.path === '/health') return next();\n res.setHeader('Cache-Control', 'no-store');\n res.sendFile(path.join(CASCADE_DIST, 'index.html'));\n });\n } else {\n console.warn(`[cascade-server] no build found at ${CASCADE_DIST} \u2014 run \"npm run build\" in the Cascade repo first. API-only for now.`);\n }\n\n const server = createServer(app);\n\n server.listen(PORT, HOST, () => {\n console.log(`\uD83D\uDE80 Cascade running on http://${HOST}:${PORT}`);\n console.log(`\uD83D\uDCC1 Project: ${project.root}${project.isGitRepo ? ' (git)' : ' (not a git repo yet)'}`);\n if (trustedHosts.length > 0) console.log(`\uD83D\uDD10 Trusted Studio URL: http://${authority(trustedHosts[0], PORT)} (all reachable VPN/interface peers are trusted)`);\n });\n\n return server;\n}\n", "import fs from 'node:fs';\nimport path from 'node:path';\n\nconst PROJECT_NAME = /^[a-z0-9][a-z0-9-]{0,63}$/;\nconst NODE_NAME = /^[A-Z][A-Za-z0-9]{0,63}$/;\n\nexport function createProject(projectsRoot: string, name: string): string {\n if (!PROJECT_NAME.test(name)) {\n throw new Error('Project names use lowercase letters, numbers, and hyphens (maximum 64 characters).');\n }\n\n const root = path.resolve(projectsRoot);\n const directory = path.resolve(root, name);\n if (path.dirname(directory) !== root) throw new Error('Project path escapes the configured projects directory.');\n if (fs.existsSync(directory)) throw new Error(`Already exists: ${directory}`);\n\n fs.mkdirSync(path.join(directory, 'nodes'), { recursive: true });\n fs.mkdirSync(path.join(directory, 'assets'));\n writeJson(path.join(directory, 'cascade.json'), { name });\n writeJson(path.join(directory, 'index.cascade'), {\n name,\n version: '0.2',\n viewport: { x: 0, y: 0, zoom: 1 },\n nodes: [],\n connections: [],\n annotations: [],\n });\n writeJson(path.join(directory, 'package.json'), {\n name,\n private: true,\n type: 'module',\n scripts: {\n check: 'tsc --noEmit',\n validate: 'cascade validate index.cascade',\n 'check:graph': 'cascade check index.cascade',\n inspect: 'cascade inspect index.cascade',\n run: 'cascade run index.cascade',\n },\n // Aliased, not renamed: the package publishes as `@field/cascade` because\n // the bare name belongs to somebody else on npm \u2014 and a scaffolded project\n // asking for `cascade` would silently install that stranger's package.\n // The alias keeps every `cascade/contracts` import in a project working.\n devDependencies: { cascade: 'npm:@field/cascade@^0.2.0', typescript: '^6.0.0' },\n });\n writeJson(path.join(directory, 'tsconfig.json'), {\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'Bundler',\n strict: true,\n noEmit: true,\n },\n include: ['nodes/**/*.ts'],\n });\n fs.writeFileSync(path.join(directory, '.gitignore'), '.cascade-cache/\\nrenders/\\nnode_modules/\\n');\n fs.writeFileSync(path.join(directory, 'AGENTS.md'), `# Cascade project\n\nRead \\`node_modules/cascade/AGENTS.md\\` before editing graphs or nodes. Prefer deterministic node definitions.\n\n## Common commands\n\n- \\`npm run check\\` \u2014 type-check custom nodes.\n- \\`npm run check:graph\\` \u2014 statically check the graph and node definitions.\n- \\`npm run validate\\` \u2014 validate \\`index.cascade\\`.\n- \\`npm run run\\` \u2014 execute headlessly without Studio.\n- \\`cascade .\\` \u2014 launch local Studio on loopback.\n- \\`cascade . --host KURO --port 3030\\` \u2014 launch for \\`http://KURO:3030\\` on a trusted VPN/LAN.\n\nDo not start another Cascade process on an occupied port. Remote access requires\nboth the explicit bind address and the exact trusted browser hostname.\n`);\n return directory;\n}\n\nexport function createNode(projectRoot: string, name: string): string {\n if (!NODE_NAME.test(name)) {\n throw new Error('Node names start with an uppercase letter and contain only letters or numbers.');\n }\n const directory = path.resolve(projectRoot, 'nodes', name);\n if (fs.existsSync(directory)) throw new Error(`Already exists: ${directory}`);\n fs.mkdirSync(directory, { recursive: true });\n fs.writeFileSync(path.join(directory, 'index.ts'), nodeSource(name));\n return directory;\n}\n\nfunction writeJson(file: string, value: unknown): void {\n fs.writeFileSync(file, `${JSON.stringify(value, null, 2)}\\n`);\n}\n\nfunction nodeSource(name: string): string {\n return `import type { NodeDefinition, NodeExecutionContext } from 'cascade/contracts';\n\nexport const definition = {\n apiVersion: 1,\n label: '${name}',\n runsOn: 'portable',\n inputs: {\n value: { kind: 'data', type: 'float', default: 0 }\n },\n outputs: {\n result: { kind: 'data', type: 'float' }\n }\n} as const satisfies NodeDefinition;\n\nexport function execute(context: NodeExecutionContext<typeof definition>) {\n context.outputs.result.set(context.inputs.value);\n}\n`;\n}\n", "import fs from 'node:fs';\nimport path from 'node:path';\nimport { execFile } from 'node:child_process';\nimport { loadConfig, saveConfig, configPath } from './config.js';\nimport { startServer } from './index.js';\nimport { ProjectRoot } from './project.js';\nimport { createNode, createProject } from './projectTemplate.js';\nimport { authority, isLoopbackHost } from './security.js';\n\nexport interface StudioCliArgs {\n readonly positional: string[];\n readonly noOpen: boolean;\n readonly host?: string;\n readonly port?: number;\n readonly trustedHosts: string[];\n}\n\nexport function parseStudioArgs(args: readonly string[]): StudioCliArgs {\n const positional: string[] = [];\n const trustedHosts: string[] = [];\n let noOpen = false;\n let host: string | undefined;\n let port: number | undefined;\n\n for (let index = 0; index < args.length; index++) {\n const argument = args[index];\n if (argument === '--no-open') {\n noOpen = true;\n continue;\n }\n const [name, inlineValue] = argument.startsWith('--') ? argument.split('=', 2) : [argument, undefined];\n if (name === '--host' || name === '--port' || name === '--trusted-host') {\n const value = inlineValue ?? args[++index];\n if (!value || value.startsWith('--')) throw new Error(`${name} requires a value`);\n if (name === '--host') host = value;\n else if (name === '--trusted-host') {\n authority(value, 1);\n trustedHosts.push(value);\n } else {\n port = Number(value);\n if (!Number.isInteger(port) || port < 1 || port > 65_535) {\n throw new Error('--port must be an integer between 1 and 65535');\n }\n }\n continue;\n }\n if (argument.startsWith('-')) throw new Error(`unknown option: ${argument}`);\n positional.push(argument);\n }\n\n if (trustedHosts.length > 0 && (!host || isLoopbackHost(host))) {\n throw new Error('--trusted-host requires an explicit non-loopback --host bind address');\n }\n if (host && !isLoopbackHost(host)) {\n if (host === '0.0.0.0' || host === '::' || host === '[::]') {\n throw new Error('remote Studio must bind a specific hostname or VPN/interface address, not a wildcard address');\n }\n if (trustedHosts.length === 0) trustedHosts.push(host);\n }\n\n return {\n positional,\n noOpen,\n ...(host === undefined ? {} : { host }),\n ...(port === undefined ? {} : { port }),\n trustedHosts,\n };\n}\n\n/** Run Studio/project commands without reading process.argv or exiting. */\nexport async function runStudioCli(args: readonly string[]): Promise<void> {\n const { noOpen, positional, host, port, trustedHosts } = parseStudioArgs(args);\n const config = loadConfig();\n\n if (positional[0] === 'projects') {\n if (positional[1]) {\n saveConfig({ projectsRoot: path.resolve(positional[1].replace(/^~(?=\\/|$)/, process.env.HOME ?? '~')) });\n console.log(`[cascade] projects root set to ${loadConfig().projectsRoot} (${configPath()})`);\n } else console.log(loadConfig().projectsRoot);\n return;\n }\n\n if (positional[0] === 'new') {\n if (!positional[1]) throw new Error('usage: cascade new <name>');\n const directory = createProject(config.projectsRoot, positional[1]);\n console.log(`[cascade] created ${directory}`);\n positional[0] = directory;\n }\n\n if (positional[0] === 'node') {\n if (!positional[1]) throw new Error('usage: cascade node <Name> [project-directory]');\n const project = ProjectRoot.fromArg(positional[2] ?? '.');\n const directory = createNode(project.root, positional[1]);\n console.log(`[cascade] created project.${positional[1]} at ${directory}`);\n return;\n }\n\n let target = positional[0] ?? '.';\n if (!fs.existsSync(path.resolve(target))) {\n const projectTarget = path.resolve(config.projectsRoot, target);\n if (fs.existsSync(projectTarget)) target = projectTarget;\n }\n const project = ProjectRoot.fromArg(target);\n const server = startServer(project, { host, port, trustedHosts });\n\n server.on('listening', async () => {\n const defaultGraph = await project.resolveDefaultGraph();\n console.log(defaultGraph\n ? `\uD83D\uDCC4 Opening ${defaultGraph}`\n : '\uD83D\uDCC4 No default graph (name one explicitly, or add index.cascade) \u2014 starting empty');\n const address = server.address();\n const port = typeof address === 'object' && address ? address.port : 3030;\n const browserHost = trustedHosts[0] ?? (host && !isLoopbackHost(host) ? host : 'localhost');\n const url = `http://${authority(browserHost, port)}`;\n if (!noOpen) {\n const opener = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open';\n execFile(opener, [url], (error) => {\n if (error) console.warn(`[cascade] couldn't auto-open a browser (${error.message}) \u2014 open ${url} yourself.`);\n });\n }\n });\n}\n", "/**\n * Utilities for handling node type names and package paths\n */\n\nimport type { Node } from '@/nodes/Node';\nimport type { Graph } from '@/nodes/Graph';\n\n// Node function type - receives the node instance and graph\nexport type NodeFunction = (node: Node, graph: Graph) => void | Promise<void>;\n\n// Type for class-based node constructors\nexport type NodeClass = new (id: string, graph: Graph) => Node;\n\n// Class-based node registries (populated by library modules)\nconst nodeClassRegistries: Map<string, Record<string, NodeClass>> = new Map();\n\n// Source code registry for stdlib nodes (populated by library modules)\nconst nodeSourceRegistry: Map<string, string> = new Map();\n\n// Node metadata registry (type -> { name, icon, description, etc. })\nexport interface NodeMetadata {\n type: string;\n name: string;\n icon?: string;\n description?: string;\n category?: string;\n}\nconst nodeMetadataRegistry: Map<string, NodeMetadata> = new Map();\n\n/**\n * Register node metadata (display name, icon, etc.)\n * Called by library modules during initialization\n */\nexport function registerNodeMetadata(metadata: NodeMetadata): void {\n nodeMetadataRegistry.set(metadata.type, metadata);\n}\n\n/**\n * Get node metadata for a given type\n * Returns null if no metadata is registered\n */\nexport function getNodeMetadata(type: string): NodeMetadata | null {\n // Try full type first\n if (nodeMetadataRegistry.has(type)) {\n return nodeMetadataRegistry.get(type) || null;\n }\n\n // Try short type name\n const shortType = packagePathToType(type);\n if (nodeMetadataRegistry.has(shortType)) {\n return nodeMetadataRegistry.get(shortType) || null;\n }\n\n return null;\n}\n\n/**\n * Get display name for a node type (for generating IDs)\n * Falls back to short type if no metadata exists\n */\nexport function getNodeDisplayName(type: string): string {\n const metadata = getNodeMetadata(type);\n if (metadata?.name) {\n return metadata.name;\n }\n return packagePathToType(type);\n}\n\n/**\n * Register source code for a node type\n * Called by library modules during initialization\n */\nexport function registerNodeSource(type: string, source: string): void {\n nodeSourceRegistry.set(type, source);\n}\n\n/**\n * Get source code for a node type\n * Returns null if no source is registered (custom nodes)\n */\nexport function getNodeSource(type: string): string | null {\n // Try full package path first\n if (nodeSourceRegistry.has(type)) {\n return nodeSourceRegistry.get(type) || null;\n }\n\n // Try short type name\n const shortType = packagePathToType(type);\n if (nodeSourceRegistry.has(shortType)) {\n return nodeSourceRegistry.get(shortType) || null;\n }\n\n return null;\n}\n\n/**\n * Register node classes from a library\n * Called by library modules during initialization\n */\nexport function registerNodeClasses(libraryId: string, classes: Record<string, NodeClass>): void {\n nodeClassRegistries.set(libraryId, classes);\n}\n\n/**\n * Convert a short type name to a full package path\n * e.g., \"Color\" -> \"cascade.image.Color\", \"Timer\" -> \"cascade.core.Timer\"\n */\nexport function typeToPackagePath(type: string): string {\n // Check if it's already a package path\n if (type.includes('.')) {\n return type;\n }\n\n // Find which library contains this node type by checking registries\n for (const [libraryId, classes] of nodeClassRegistries) {\n if (type in classes) {\n return `cascade.${libraryId}.${type}`;\n }\n }\n\n // If not found in any library, assume it's a custom node\n // Return as-is (custom nodes don't have package paths)\n return type;\n}\n\n/**\n * Convert a full package path to a short type name\n * e.g., \"cascade.image.Color\" -> \"Color\", \"cascade.core.Timer\" -> \"Timer\"\n */\nexport function packagePathToType(packagePath: string): string {\n // If it doesn't contain dots, it's already a short type\n if (!packagePath.includes('.')) {\n return packagePath;\n }\n\n // Extract the last part after the last dot\n const parts = packagePath.split('.');\n return parts[parts.length - 1];\n}\n\n/**\n * Check if a node type is from a standard library (has a package path)\n */\nexport function isStandardLibraryNode(type: string): boolean {\n return type.includes('.') && type.startsWith('cascade.');\n}\n\n/**\n * Get the library ID from a package path\n * e.g., \"cascade.image.Color\" -> \"image\"\n */\nexport function getLibraryIdFromType(type: string): string | null {\n if (!type.includes('.')) {\n return null;\n }\n\n const parts = type.split('.');\n if (parts.length >= 2 && parts[0] === 'cascade') {\n return parts[1];\n }\n\n return null;\n}\n\n/**\n * Get node class for a given type (class-based nodes)\n * Returns null if no class is available (custom nodes)\n */\nexport function getNodeClass(type: string): NodeClass | null {\n const libraryId = getLibraryIdFromType(type);\n const nodeType = packagePathToType(type);\n\n if (!libraryId) {\n return null;\n }\n\n const registry = nodeClassRegistries.get(libraryId);\n if (registry && registry[nodeType]) {\n return registry[nodeType];\n }\n\n return null;\n}\n\n/**\n * Compile a custom node from code string\n * Used for embedded and project nodes that aren't part of stdlib\n *\n * The compiled function receives the Computation instance as `node`\n * and can use all Node methods: in(), out(), defineProp(), etc.\n */\nexport function compileCustomNode(code: string): NodeFunction {\n const wrappedCode = `return (async function(node, graph) {\\n${code}\\n})(node, graph);`;\n const fn = new Function('node', 'graph', wrappedCode);\n return fn as NodeFunction;\n}\n", "/**\n * Utilities for handling color formats in Cascade\n * Colors are stored internally as normalized float objects (0.0-1.0 range)\n */\n\nexport interface ColorObject {\n r: number; // red channel (0.0-1.0)\n g: number; // green channel (0.0-1.0)\n b: number; // blue channel (0.0-1.0)\n a?: number; // alpha channel (0.0-1.0, defaults to 1.0)\n}\n\nexport interface NormalizedColor extends ColorObject {\n a: number;\n}\n\n/**\n * Color input can be in multiple formats:\n * - Object: { r, g, b, a? } (0.0-1.0 normalized or 0-255 integer)\n * - Array: [r, g, b, a?] (0.0-1.0 normalized or 0-255 integer)\n * - String: rgb(r,g,b) or #hex (for backward compatibility)\n */\nexport type ColorInput = ColorObject | number[] | string;\n\n/**\n * Normalize a color value to internal format (normalized float object)\n */\nexport function normalizeColor(input: ColorInput): NormalizedColor {\n // Already a color object - check if normalized\n if (typeof input === 'object' && !Array.isArray(input) && 'r' in input && 'g' in input && 'b' in input) {\n const obj = input as ColorObject;\n // Check if values are normalized (<= 1.0) or integer (0-255)\n const isNormalized = obj.r <= 1.0 && obj.g <= 1.0 && obj.b <= 1.0;\n \n return {\n r: isNormalized ? obj.r : obj.r / 255,\n g: isNormalized ? obj.g : obj.g / 255,\n b: isNormalized ? obj.b : obj.b / 255,\n a: obj.a !== undefined \n ? (isNormalized ? obj.a : obj.a / 255)\n : 1.0\n };\n }\n \n // Array input\n if (Array.isArray(input)) {\n const isNormalized = input.every(v => v <= 1.0);\n return {\n r: isNormalized ? input[0] : input[0] / 255,\n g: isNormalized ? input[1] : input[1] / 255,\n b: isNormalized ? input[2] : input[2] / 255,\n a: input[3] !== undefined \n ? (isNormalized ? input[3] : input[3] / 255)\n : 1.0\n };\n }\n \n // String input (rgb(r,g,b) or #hex) - for backward compatibility\n if (typeof input === 'string') {\n // Try rgb format\n const rgbMatch = input.match(/rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)/);\n if (rgbMatch) {\n return {\n r: parseInt(rgbMatch[1], 10) / 255,\n g: parseInt(rgbMatch[2], 10) / 255,\n b: parseInt(rgbMatch[3], 10) / 255,\n a: 1.0\n };\n }\n \n // Try hex format\n const hex = input.replace('#', '');\n if (hex.length === 3 || hex.length === 6) {\n const expanded = hex.length === 3 \n ? hex.split('').map(c => c + c).join('')\n : hex;\n const result = /^([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(expanded);\n if (result) {\n return {\n r: parseInt(result[1], 16) / 255,\n g: parseInt(result[2], 16) / 255,\n b: parseInt(result[3], 16) / 255,\n a: 1.0\n };\n }\n }\n }\n \n // Fallback to black\n return { r: 0, g: 0, b: 0, a: 1.0 };\n}\n\n/**\n * Convert color object to CSS string (for canvas operations)\n */\nexport function colorToCss(color: ColorObject): string {\n const r = Math.round(color.r * 255);\n const g = Math.round(color.g * 255);\n const b = Math.round(color.b * 255);\n const a = color.a !== undefined ? color.a : 1.0;\n \n if (a < 1.0) {\n return `rgba(${r},${g},${b},${a})`;\n }\n return `rgb(${r},${g},${b})`;\n}\n\n/**\n * Convert color object to hex string\n */\nexport function colorToHex(color: ColorObject): string {\n const r = Math.round(color.r * 255).toString(16).padStart(2, '0');\n const g = Math.round(color.g * 255).toString(16).padStart(2, '0');\n const b = Math.round(color.b * 255).toString(16).padStart(2, '0');\n return `#${r}${g}${b}`.toUpperCase();\n}\n\n/**\n * Check if a value looks like a color (for detection during serialization)\n */\nexport function isColorValue(value: any): boolean {\n if (typeof value === 'string') {\n return value.startsWith('#') || value.startsWith('rgb(');\n }\n if (typeof value === 'object' && value !== null) {\n // Check if it's a color object\n if ('r' in value && 'g' in value && 'b' in value) {\n return true;\n }\n // Check if it's a color array\n if (Array.isArray(value) && (value.length === 3 || value.length === 4)) {\n return value.every(v => typeof v === 'number');\n }\n }\n return false;\n}\n\n/**\n * Legacy functions for backward compatibility (kept for ColorPicker)\n */\nexport function hexToRgb(hex: string): string {\n const color = normalizeColor(hex);\n return colorToCss(color);\n}\n\nexport function rgbToHex(rgb: string): string {\n const color = normalizeColor(rgb);\n return colorToHex(color);\n}\n\nexport function isHexColor(value: string): boolean {\n return /^#?[0-9a-fA-F]{3,6}$/.test(value);\n}\n\nexport function isRgbColor(value: string): boolean {\n return /^rgb\\s*\\(\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*\\d+\\s*\\)$/.test(value);\n}\n\nexport function normalizeColorToRgb(color: string): string {\n const normalized = normalizeColor(color);\n return colorToCss(normalized);\n}\n", "/**\n * Expression Engine for Cascade\n *\n * Evaluates TypeScript expressions in parameter fields with access to:\n * - Channel functions: ch(), chs(), chv()\n * - Time variables: time, frame, fps\n * - Math utilities: fit(), clamp(), lerp(), noise(), etc.\n * - Node queries: opexist(), opinput()\n */\n\nimport type { Node } from '../../nodes/Node.js';\nimport type { Graph } from '../../nodes/Graph.js';\n\n/**\n * Expression context passed to evaluated expressions\n */\nexport interface ExpressionContext {\n // Time globals\n time: number;\n frame: number;\n fps: number;\n\n // Current node reference\n self: Node;\n\n // Channel functions\n ch: (path: string) => number;\n chs: (path: string) => string;\n chv: (path: string) => number[];\n\n // Node queries\n opexist: (path: string) => 0 | 1;\n opinput: (index: number) => Node | null;\n\n // Math utilities\n fit: (value: number, oldMin: number, oldMax: number, newMin: number, newMax: number) => number;\n fit01: (value: number, newMin: number, newMax: number) => number;\n clamp: (value: number, min: number, max: number) => number;\n lerp: (a: number, b: number, t: number) => number;\n smooth: (value: number, min: number, max: number) => number;\n\n // Noise functions\n noise: (...coords: number[]) => number;\n random: (seed: number) => number;\n\n // String utilities\n padzero: (digits: number, value: number) => string;\n\n // Math object (standard JS Math)\n Math: typeof Math;\n}\n\n/**\n * Compiled expression ready for evaluation\n */\nexport interface CompiledExpression {\n source: string;\n evaluate: (context: ExpressionContext) => unknown;\n dependencies: string[]; // Referenced paths for dirty tracking\n isTimeDependent: boolean; // True if uses time/frame/fps\n error?: string;\n}\n\n/**\n * Warning about a broken path in an expression\n */\nexport interface PathWarning {\n nodeId: string; // ID of the node with the broken expression\n nodePath: string; // Full path of the node (e.g., \"/effects/blur1\")\n propName: string; // Name of the parameter with the expression\n expression: string; // The full expression text\n brokenPath: string; // The specific path that couldn't be resolved\n}\n\n/**\n * Expression Engine - compiles and evaluates TypeScript expressions\n */\nexport class ExpressionEngine {\n private compiledCache: Map<string, CompiledExpression> = new Map();\n private graph: Graph | null = null;\n\n // Time state\n private _frame: number = 1;\n private _fps: number = 30;\n\n /**\n * Set the graph reference for node lookups\n */\n setGraph(graph: Graph): void {\n this.graph = graph;\n }\n\n /**\n * Set current frame\n */\n setFrame(frame: number): void {\n this._frame = Math.max(1, Math.floor(frame));\n }\n\n /**\n * Set FPS\n */\n setFps(fps: number): void {\n this._fps = Math.max(1, fps);\n }\n\n /**\n * Get current time in seconds\n */\n get time(): number {\n return this._frame / this._fps;\n }\n\n /**\n * Get current frame\n */\n get frame(): number {\n return this._frame;\n }\n\n /**\n * Get FPS\n */\n get fps(): number {\n return this._fps;\n }\n\n /**\n * Compile an expression string into a reusable function\n */\n compile(expression: string): CompiledExpression {\n // Check cache\n const cached = this.compiledCache.get(expression);\n if (cached) return cached;\n\n // Extract dependencies (paths referenced in ch/chs/chv calls)\n const dependencies = this.extractDependencies(expression);\n\n // Check for time references\n const isTimeDependent = this.hasTimeReference(expression);\n\n try {\n // Create evaluation function\n // The expression is wrapped to return its value\n const fnBody = `\n with (context) {\n return (${expression});\n }\n `;\n\n const evaluator = new Function('context', fnBody) as (context: ExpressionContext) => unknown;\n\n const compiled: CompiledExpression = {\n source: expression,\n evaluate: evaluator,\n dependencies,\n isTimeDependent\n };\n\n this.compiledCache.set(expression, compiled);\n return compiled;\n } catch (err) {\n const compiled: CompiledExpression = {\n source: expression,\n evaluate: () => undefined,\n dependencies,\n isTimeDependent,\n error: err instanceof Error ? err.message : String(err)\n };\n return compiled;\n }\n }\n\n /**\n * Evaluate an expression in the context of a node\n */\n evaluate(expression: string, node: Node): { value: unknown; error?: string } {\n const compiled = this.compile(expression);\n\n if (compiled.error) {\n return { value: undefined, error: compiled.error };\n }\n\n try {\n const context = this.createContext(node);\n const value = compiled.evaluate(context);\n return { value };\n } catch (err) {\n return {\n value: undefined,\n error: err instanceof Error ? err.message : String(err)\n };\n }\n }\n\n /**\n * Create the expression context for a node\n */\n private createContext(node: Node): ExpressionContext {\n const self = this;\n\n return {\n // Time globals\n time: this.time,\n frame: this._frame,\n fps: this._fps,\n\n // Current node\n self: node,\n\n // Channel functions\n ch: (path: string) => self.ch(node, path),\n chs: (path: string) => self.chs(node, path),\n chv: (path: string) => self.chv(node, path),\n\n // Node queries\n opexist: (path: string) => self.opexist(node, path),\n opinput: (index: number) => self.opinput(node, index),\n\n // Math utilities\n fit: this.fit,\n fit01: this.fit01,\n clamp: this.clamp,\n lerp: this.lerp,\n smooth: this.smooth,\n\n // Noise functions\n noise: this.noise,\n random: this.random,\n\n // String utilities\n padzero: this.padzero,\n\n // Standard Math\n Math\n };\n }\n\n // ============ Channel Functions ============\n\n /**\n * Get parameter value as number\n */\n private ch(node: Node, path: string): number {\n const resolved = this.resolvePath(node, path);\n if (!resolved) return 0;\n\n const value = resolved.value;\n if (typeof value === 'number') return value;\n if (typeof value === 'string') return parseFloat(value) || 0;\n if (typeof value === 'boolean') return value ? 1 : 0;\n return 0;\n }\n\n /**\n * Get parameter value as string\n */\n private chs(node: Node, path: string): string {\n const resolved = this.resolvePath(node, path);\n if (!resolved) return '';\n return String(resolved.value ?? '');\n }\n\n /**\n * Get parameter value as vector (array of numbers)\n */\n private chv(node: Node, path: string): number[] {\n const resolved = this.resolvePath(node, path);\n if (!resolved) return [];\n\n const value = resolved.value;\n if (Array.isArray(value)) {\n return value.map(v => typeof v === 'number' ? v : parseFloat(v) || 0);\n }\n if (typeof value === 'number') return [value];\n return [];\n }\n\n /**\n * Resolve a path to get the parameter value\n */\n private resolvePath(fromNode: Node, path: string): { value: any } | null {\n // Parse path: could be node path or node/param path\n const lastSlash = path.lastIndexOf('/');\n\n if (lastSlash === -1 || path.startsWith('./')) {\n // Relative to current node - it's a param name\n const paramName = path.replace('./', '');\n const prop = fromNode.props[paramName];\n return prop ? { value: prop.value } : null;\n }\n\n // Try to resolve as node/param\n const nodePath = path.substring(0, lastSlash) || '.';\n const paramName = path.substring(lastSlash + 1);\n\n const targetNode = fromNode.node(nodePath);\n if (!targetNode) return null;\n\n const prop = targetNode.props[paramName];\n return prop ? { value: prop.value } : null;\n }\n\n /**\n * Validate a path from a node (public for validation)\n * Returns true if the path resolves to a valid target\n */\n validatePath(fromNode: Node, path: string): boolean {\n return this.resolvePath(fromNode, path) !== null;\n }\n\n /**\n * Validate all expression paths in the graph\n * Returns list of broken paths with their locations\n */\n validateAllPaths(): PathWarning[] {\n if (!this.graph) return [];\n\n const warnings: PathWarning[] = [];\n\n for (const node of this.graph.nodes) {\n for (const [propKey, prop] of Object.entries(node.props)) {\n if (!prop.expression) continue;\n\n // Extract paths from expression\n const paths = this.extractDependencies(prop.expression);\n\n for (const path of paths) {\n if (!this.validatePath(node, path)) {\n warnings.push({\n nodeId: node.id,\n nodePath: node.path(),\n propName: propKey,\n expression: prop.expression,\n brokenPath: path\n });\n }\n }\n }\n }\n\n return warnings;\n }\n\n // ============ Node Queries ============\n\n /**\n * Check if a node exists at path (returns 0 or 1)\n */\n private opexist(node: Node, path: string): 0 | 1 {\n return node.node(path) ? 1 : 0;\n }\n\n /**\n * Get input node by index\n */\n private opinput(node: Node, index: number): Node | null {\n if (!this.graph) return null;\n\n const inputPort = node.inputs[index];\n if (!inputPort || inputPort.connections.length === 0) return null;\n\n const conn = inputPort.connections[0];\n return this.graph.getNode(conn.from.nodeId);\n }\n\n // ============ Math Utilities ============\n\n /**\n * Remap value from one range to another\n */\n private fit(value: number, oldMin: number, oldMax: number, newMin: number, newMax: number): number {\n if (oldMax === oldMin) return newMin;\n const t = (value - oldMin) / (oldMax - oldMin);\n return newMin + t * (newMax - newMin);\n }\n\n /**\n * Remap value from 0-1 to new range\n */\n private fit01(value: number, newMin: number, newMax: number): number {\n return newMin + value * (newMax - newMin);\n }\n\n /**\n * Clamp value to range\n */\n private clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n }\n\n /**\n * Linear interpolation\n */\n private lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n }\n\n /**\n * Smooth hermite interpolation (smoothstep)\n */\n private smooth(value: number, min: number, max: number): number {\n if (value <= min) return 0;\n if (value >= max) return 1;\n const t = (value - min) / (max - min);\n return t * t * (3 - 2 * t);\n }\n\n // ============ Noise Functions ============\n\n /**\n * Perlin-like noise function (-1 to 1)\n * Simple implementation using sine waves\n */\n private noise(...coords: number[]): number {\n if (coords.length === 0) return 0;\n\n // Simple noise using sine waves (not true Perlin, but deterministic)\n let result = 0;\n const frequencies = [1, 2.3, 4.7, 8.1];\n const amplitudes = [1, 0.5, 0.25, 0.125];\n\n for (let i = 0; i < frequencies.length; i++) {\n let sum = 0;\n for (let j = 0; j < coords.length; j++) {\n sum += Math.sin(coords[j] * frequencies[i] * (j + 1) * 1.7 + j * 3.14159);\n }\n result += sum * amplitudes[i];\n }\n\n // Normalize to -1 to 1 range\n return Math.sin(result * 0.5);\n }\n\n /**\n * Deterministic random based on seed (0 to 1)\n */\n private random(seed: number): number {\n // Simple hash function for deterministic randomness\n const x = Math.sin(seed * 12.9898) * 43758.5453;\n return x - Math.floor(x);\n }\n\n // ============ String Utilities ============\n\n /**\n * Zero-pad a number to specified digits\n */\n private padzero(digits: number, value: number): string {\n return String(Math.floor(value)).padStart(digits, '0');\n }\n\n // ============ Dependency Extraction ============\n\n /**\n * Extract path dependencies from an expression\n */\n private extractDependencies(expression: string): string[] {\n const deps: string[] = [];\n const pattern = /\\b(?:ch|chs|chv)\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g;\n\n let match;\n while ((match = pattern.exec(expression)) !== null) {\n deps.push(match[1]);\n }\n\n return deps;\n }\n\n /**\n * Check if an expression references time variables\n */\n hasTimeReference(expression: string): boolean {\n return /\\b(time|frame|fps)\\b/.test(expression);\n }\n\n /**\n * Clear the compiled expression cache\n */\n clearCache(): void {\n this.compiledCache.clear();\n }\n}\n\n// Global singleton instance\nexport const expressionEngine = new ExpressionEngine();\n", "import type { InputPort, OutputPort, PortOptions, PortType, Prop, NodeParameter, ParamOptions, DataType } from '../types/node.types.js';\nimport type { Graph } from './Graph.js';\nimport { typeToPackagePath, isStandardLibraryNode } from '../utils/nodeTypeUtils.js';\nimport { normalizeColor, isColorValue } from '../utils/colorUtils.js';\nimport { expressionEngine } from '../engine/expressions/index.js';\n\nexport type CookState = 'clean' | 'stale' | 'queued' | 'cooking' | 'error';\n\n/**\n * Node - Unified base class for all graph elements\n *\n * Subclasses override behavior as needed (e.g., Annotation overrides execute()).\n */\n/** Best guess at a parameter's type from its default, so a node that doesn't\n * declare one still gets the right editor. */\nfunction inferParamType(value: unknown): DataType {\n if (typeof value === 'number') return Number.isInteger(value) ? 'int' : 'float';\n if (typeof value === 'boolean') return 'bool';\n if (typeof value === 'string') return 'string';\n if (Array.isArray(value) && value.every(v => typeof v === 'number')) {\n if (value.length === 2) return 'vec2';\n if (value.length === 3) return 'vec3';\n if (value.length === 4) return 'vec4';\n }\n return 'any';\n}\n\nexport class Node {\n // Static callback for UI reactivity (set by editor, not required for headless)\n static onPropParamsChanged?: (nodeId: string) => void;\n\n id: string;\n type: string;\n position: { x: number; y: number };\n\n // Ports - available to all nodes\n inputs: InputPort[] = [];\n outputs: OutputPort[] = [];\n\n // Props system\n props: Record<string, Prop> = {};\n protected propWatchers: Map<string, Function[]> = new Map();\n\n // Actions system - button-triggered callbacks\n actions: Record<string, {\n label: string;\n icon?: string;\n callback: () => void | Promise<void>;\n condition?: () => boolean;\n }> = {};\n\n // Variadic inputs\n /** The node's own values \u2014 see param(). Distinct from `props`, which is the\n * older image-node control system. */\n parameters: NodeParameter[] = [];\n protected parametersUsedDuringSetup: Set<string> = new Set();\n\n variadic: boolean = false;\n protected variadicDefault: any = null;\n private variadicOptions: PortOptions = {};\n\n // Visual\n preview: HTMLCanvasElement | HTMLImageElement | null = null;\n\n // Metadata\n comment: string = '';\n error: Error | null = null;\n warning: string | null = null;\n\n // Computation-specific\n code: string = '';\n bypass: boolean = false;\n cook: boolean = false;\n\n // Path system - hierarchical node organization\n parent: Node | null = null;\n protected _children: Node[] = [];\n\n // Execution state\n protected hasExecuted: boolean = false;\n protected lastInputHash: string = '';\n cookState: CookState = 'stale';\n private cookGeneration = 0;\n private stagedOutputs: Map<OutputPort, unknown> | null = null;\n executionTimeout: number = 30000;\n\n // Cook info - performance tracking\n cookInfo: {\n lastCookTime: number; // Duration of last execution (ms)\n totalCookTime: number; // Cumulative cook time\n cookCount: number; // Number of times cooked\n averageCookTime: number; // Average cook time\n lastCookTimestamp: number; // When last cooked (Date.now())\n peakMemory: number; // Peak memory during cook (if measurable)\n } = {\n lastCookTime: 0,\n totalCookTime: 0,\n cookCount: 0,\n averageCookTime: 0,\n lastCookTimestamp: 0,\n peakMemory: 0\n };\n\n // Time dependency tracking (for expression engine)\n isTimeDependent: boolean = false;\n\n // Lifecycle hooks\n onSetup?: () => void | Promise<void>;\n onUpdate?: () => void | Promise<void>;\n onRender?: () => void | Promise<void>;\n onReady?: () => void;\n onDestroy?: () => void;\n\n // Node function (for custom nodes compiled from code)\n private nodeFunction?: Function;\n\n // Graph reference\n protected graph: Graph;\n\n // Port tracking for cleanup\n protected portsUsedDuringSetup: Set<string> = new Set();\n\n // Port index map for O(1) lookups (portId -> port)\n private _portMap: Map<string, InputPort | OutputPort> = new Map();\n\n constructor(id: string, type: string, graph: Graph) {\n this.id = id;\n this.type = type;\n this.graph = graph;\n this.position = { x: 0, y: 0 };\n\n // Call setup for class-based nodes (subclasses)\n if (this.constructor !== Node) {\n this.setup();\n // Schedule onReady call after constructor completes\n queueMicrotask(() => {\n if (this.onReady) {\n try {\n this.onReady();\n } catch (err) {\n console.error(`Error in onReady for node ${this.id}:`, err);\n }\n }\n });\n }\n }\n\n // ============ Port Creation ============\n\n in<T>(name: string, defaultValue?: T, options: PortOptions = {}): InputPort<T> {\n const portType: PortType = name === 'trigger' ? 'trigger' : 'param';\n\n const existingPort = this.inputs.find(p => p.name === name);\n if (existingPort) {\n this.portsUsedDuringSetup.add(`input_${name}`);\n if (options.type) existingPort.dataType = options.type;\n if (defaultValue !== undefined && existingPort.defaultValue !== defaultValue) {\n existingPort.defaultValue = defaultValue as T;\n if (existingPort.value === undefined || existingPort.value === existingPort.defaultValue) {\n existingPort.value = defaultValue as T;\n }\n }\n existingPort.options = Object.assign(existingPort.options ?? {}, options);\n return existingPort as InputPort<T>;\n }\n\n const portIndex = this.inputs.length;\n const port: InputPort<T> = {\n id: `${this.id}_in_${portIndex}`,\n name,\n portType,\n dataType: options.type || 'any',\n value: defaultValue as T,\n defaultValue: defaultValue as T,\n options,\n connections: []\n };\n\n this.inputs.push(port as InputPort);\n this._portMap.set(port.id, port as InputPort);\n this.portsUsedDuringSetup.add(`input_${name}`);\n return port;\n }\n\n /**\n * Declare an output port. Takes the same `options` as `in()` \u2014 an output that\n * cannot state its type is a hole in the type system: the connection check\n * only ever sees `any` on one side, and the port draws in the neutral colour\n * whatever it actually carries.\n */\n out<T>(name: string, portType: PortType = 'param', options: PortOptions = {}): OutputPort<T> {\n const existingPort = this.outputs.find(p => p.name === name);\n if (existingPort) {\n this.portsUsedDuringSetup.add(`output_${name}`);\n if (existingPort.portType !== portType) existingPort.portType = portType;\n if (options.type) existingPort.dataType = options.type;\n existingPort.options = { ...(existingPort.options ?? {}), ...options };\n return existingPort as OutputPort<T>;\n }\n\n const portIndex = this.outputs.length;\n const port: OutputPort<T> = {\n id: `${this.id}_out_${portIndex}`,\n name,\n portType,\n dataType: options.type || 'any',\n value: undefined as T,\n connections: [],\n options,\n\n setValue: (value: T) => this.setOutputValue(port, value),\n\n trigger: (props?: any) => {\n port.connections.forEach(conn => {\n const targetNode = this.graph.getNode(conn.to.nodeId);\n if (targetNode) {\n // O(1) port lookup via index map\n const targetPort = targetNode.getInputPortById(conn.to.portId);\n if (targetPort && targetPort.onTrigger) targetPort.onTrigger(props);\n }\n });\n }\n };\n\n this.outputs.push(port as OutputPort);\n this._portMap.set(port.id, port as OutputPort);\n this.portsUsedDuringSetup.add(`output_${name}`);\n return port;\n }\n\n // ============ Port Access ============\n\n getInputPort(index: number): InputPort | null {\n return index >= 0 && index < this.inputs.length ? this.inputs[index] : null;\n }\n\n getOutputPort(index: number): OutputPort | null {\n return index >= 0 && index < this.outputs.length ? this.outputs[index] : null;\n }\n\n /** Update the element id and every derived port id as one operation. */\n renameId(newId: string): ReadonlyMap<string, string> {\n const oldId = this.id;\n const renamed = new Map<string, string>();\n this.id = newId;\n this._portMap.clear();\n for (const port of [...this.inputs, ...this.outputs]) {\n const oldPortId = port.id;\n port.id = oldPortId.startsWith(`${oldId}_`)\n ? `${newId}${oldPortId.slice(oldId.length)}`\n : oldPortId;\n renamed.set(oldPortId, port.id);\n this._portMap.set(port.id, port);\n }\n return renamed;\n }\n\n getPort(portId: string): InputPort | OutputPort | null {\n return this._portMap.get(portId) || null;\n }\n\n getInputPortById(portId: string): InputPort | null {\n const port = this._portMap.get(portId);\n return port && 'defaultValue' in port ? port as InputPort : null;\n }\n\n private setOutputValue<T>(port: OutputPort<T>, value: T): void {\n if (this.stagedOutputs) {\n this.stagedOutputs.set(port as OutputPort, value);\n return;\n }\n this.commitOutputValue(port, value);\n }\n\n private commitOutputValue<T>(port: OutputPort<T>, value: T): void {\n port.value = value;\n for (const connection of port.connections) {\n const targetNode = this.graph.getNode(connection.to.nodeId);\n const targetPort = targetNode?.getInputPortById(connection.to.portId);\n if (!targetPort) continue;\n targetPort.value = value;\n targetPort.onChange?.(value);\n }\n }\n\n // ============ Props System ============\n\n /**\n * Add a parameter to this node\n * Short alias for defineProp - use in setup()\n */\n addParm<T>(name: string, config: Prop<T>): void {\n this.props[name] = config as Prop;\n // Dynamic nodes redeclare their shape inside execute(). That declaration\n // is part of the current cook, not a new authored change; rescheduling it\n // would create an endless generation loop.\n if (this.cookState !== 'cooking') this.markDirty();\n }\n\n /**\n * Define a parameter on this node\n * @deprecated Use addParm() instead\n */\n defineProp<T>(name: string, config: Prop<T>): void {\n this.addParm(name, config);\n }\n\n /**\n * Add an action button to this node\n * Actions appear in the Inspector and can be triggered by keyboard shortcuts\n */\n addAction(name: string, config: {\n label: string;\n icon?: string;\n callback: () => void | Promise<void>;\n condition?: () => boolean;\n }): void {\n this.actions[name] = config;\n }\n\n /**\n * Execute an action by name\n */\n async executeAction(name: string): Promise<void> {\n const action = this.actions[name];\n if (!action) return;\n if (action.condition && !action.condition()) return;\n await action.callback();\n }\n\n updateProp(name: string, value: any): void {\n if (!this.props[name]) return;\n\n const newValue = Array.isArray(value) ? [...value] : value;\n this.props[name] = { ...this.props[name], value: newValue };\n\n if (this.props[name].onChange) {\n try {\n this.props[name].onChange!(this.props[name], this as any);\n } catch (err) {\n console.error(`Error in prop onChange for ${name}:`, err);\n }\n }\n\n const watchers = this.propWatchers.get(name);\n if (watchers) {\n watchers.forEach(cb => {\n try { cb(newValue, this.props[name]); }\n catch (err) { console.error(`Error in prop watcher for ${name}:`, err); }\n });\n }\n\n this.props = { ...this.props };\n this.markDirty();\n // Trigger UI reactivity if callback is set (editor sets this)\n Node.onPropParamsChanged?.(this.id);\n }\n\n /**\n * Update prop params (e.g., min, max) and trigger UI reactivity\n */\n updatePropParams(name: string, params: Partial<Prop['params']>): void {\n if (!this.props[name]) return;\n\n this.props[name] = {\n ...this.props[name],\n params: { ...this.props[name].params, ...params }\n };\n this.props = { ...this.props };\n // Trigger UI reactivity if callback is set (editor sets this)\n Node.onPropParamsChanged?.(this.id);\n }\n\n watchProp(name: string, callback: Function): void {\n if (!this.propWatchers.has(name)) this.propWatchers.set(name, []);\n this.propWatchers.get(name)!.push(callback);\n }\n\n // ============ Parm API (HOM-style wrappers) ============\n\n /**\n * Get a parameter wrapper object for HOM-style access\n */\n parm(name: string): {\n name: () => string;\n path: () => string;\n node: () => Node;\n eval: () => any;\n evalAsFloat: () => number;\n evalAsInt: () => number;\n evalAsString: () => string;\n rawValue: () => any;\n set: (value: any) => void;\n parmType: () => string;\n // Expression support\n expression: () => string | null;\n setExpression: (expr: string) => void;\n deleteExpression: () => void;\n hasExpression: () => boolean;\n expressionError: () => string | null;\n } | null {\n const prop = this.props[name];\n if (!prop) return null;\n\n const self = this;\n return {\n name: () => name,\n path: () => `${self.path()}/${name}`,\n node: () => self,\n eval: () => prop.value,\n evalAsFloat: () => parseFloat(prop.value) || 0,\n evalAsInt: () => parseInt(prop.value, 10) || 0,\n evalAsString: () => String(prop.value ?? ''),\n rawValue: () => prop.value,\n set: (value: any) => self.updateProp(name, value),\n parmType: () => prop.type || 'any',\n // Expression support\n expression: () => prop.expression ?? null,\n setExpression: (expr: string) => {\n self.props[name] = { ...self.props[name], expression: expr };\n // Update time dependency based on all expressions\n self.updateTimeDependent();\n self.markDirty();\n },\n deleteExpression: () => {\n const { expression: _, expressionError: __, ...rest } = self.props[name];\n self.props[name] = rest as any;\n // Re-check time dependency\n self.updateTimeDependent();\n self.markDirty();\n },\n hasExpression: () => !!prop.expression,\n expressionError: () => prop.expressionError ?? null\n };\n }\n\n /**\n * Evaluate a parameter value directly (shorthand for props access)\n * If the prop has an expression, evaluates it; otherwise returns the raw value\n */\n evalParm(name: string): any {\n const prop = this.props[name];\n if (!prop) return undefined;\n\n // If prop has an expression, evaluate it\n if (prop.expression) {\n return this.evaluateExpression(name);\n }\n\n return prop.value;\n }\n\n /**\n * Set a parameter value (shorthand for updateProp)\n */\n setParm(name: string, value: any): void {\n this.updateProp(name, value);\n }\n\n /**\n * Evaluate an expression for a parameter\n * Returns the evaluated value or the raw value if evaluation fails\n */\n evaluateExpression(name: string): any {\n const prop = this.props[name];\n if (!prop?.expression) return prop?.value;\n\n // Initialize expression engine with graph if needed\n expressionEngine.setGraph(this.graph);\n\n const result = expressionEngine.evaluate(prop.expression, this);\n\n if (result.error) {\n // Store error for UI display\n this.props[name] = { ...this.props[name], expressionError: result.error };\n // Return raw value as fallback\n return prop.value;\n }\n\n // Clear any previous error\n if (prop.expressionError) {\n const { expressionError: _, ...rest } = this.props[name];\n this.props[name] = rest as any;\n }\n\n return result.value;\n }\n\n /**\n * Evaluate all expressions on this node and update values\n * Called during execution to get current expression values\n */\n evaluateAllExpressions(): void {\n for (const [name, prop] of Object.entries(this.props)) {\n if (prop.expression) {\n const evaluated = this.evaluateExpression(name);\n // Update the value with evaluated result (for downstream nodes)\n if (evaluated !== undefined) {\n this.props[name] = { ...this.props[name], value: evaluated };\n }\n }\n }\n\n // Update time dependency flag based on all expressions\n this.updateTimeDependent();\n }\n\n // ============ Parameters ============\n\n /**\n * A value that belongs to the node \u2014 not a pin.\n *\n * Cascade only had inputs and outputs, so every setting a node had was\n * declared as an input port that nobody ever wired. That reads wrong in the\n * graph (density-blend showed twenty input pins when it has four real inputs\n * and sixteen settings) and it reads wrong in the Inspector, where a crop\n * fraction and an incoming image sat in the same list.\n *\n * So: inputs are edges from other nodes, parameters are the node's own\n * values, outputs are edges out.\n *\n * A parameter can be PROMOTED to an input pin when you want it driven from\n * upstream rather than typed \u2014 a signal's weight computed by another node,\n * say. Promotion is per parameter and off by default: making every setting a\n * pin is how the two got conflated in the first place.\n */\n param<T = any>(name: string, defaultValue?: T, options: ParamOptions = {}): NodeParameter<T> {\n let parameter = this.parameters.find(p => p.name === name) as NodeParameter<T> | undefined;\n\n if (!parameter) {\n parameter = {\n name,\n value: defaultValue as T,\n defaultValue: defaultValue as T,\n dataType: options.type || inferParamType(defaultValue),\n promoted: false,\n options,\n };\n this.parameters.push(parameter as NodeParameter);\n } else {\n // Re-declaring must not reset a value someone set. Only the metadata is\n // refreshed, so editing a node's code doesn't wipe its settings.\n if (options.type) parameter.dataType = options.type;\n parameter.defaultValue = defaultValue as T;\n Object.assign(parameter.options, options);\n }\n this.parametersUsedDuringSetup.add(name);\n\n // A promoted parameter reads from its pin whenever something is connected,\n // and falls back to its own value when nothing is.\n if (parameter.promoted) {\n const port = this.in(name, parameter.value, {\n ...parameter.options,\n type: parameter.dataType,\n promoted: true,\n } as PortOptions);\n (port as any).fromParameter = name;\n if (port.connections.length > 0 && port.value !== undefined && port.value !== null) {\n return { ...parameter, value: port.value as T };\n }\n }\n\n return parameter;\n }\n\n /** Turn a parameter into an input pin, or back. */\n setParameterPromoted(name: string, promoted: boolean): void {\n const parameter = this.parameters.find(p => p.name === name);\n if (!parameter || parameter.promoted === promoted) return;\n parameter.promoted = promoted;\n\n if (promoted) {\n const port = this.in(name, parameter.value, {\n ...parameter.options,\n type: parameter.dataType,\n promoted: true,\n } as PortOptions);\n (port as any).fromParameter = name;\n } else {\n const index = this.inputs.findIndex(p => p.name === name);\n if (index >= 0) {\n // Drop the wires first: a pin that no longer exists must not leave\n // dangling connections behind it.\n [...this.inputs[index].connections].forEach(conn => this.graph?.disconnect(conn.id));\n this.inputs.splice(index, 1);\n }\n }\n this.markDirty();\n }\n\n setParameter(name: string, value: any): void {\n const parameter = this.parameters.find(p => p.name === name);\n if (!parameter) return;\n parameter.value = value;\n this.markDirty();\n }\n\n // ============ Variadic Inputs ============\n\n setVariadic(defaultValue: any = null, options: PortOptions = {}): void {\n this.variadic = true;\n this.variadicDefault = defaultValue;\n this.variadicOptions = options;\n this.syncVariadicPorts();\n }\n\n getVariadicInputs(): InputPort[] {\n return this.inputs.filter(p => p.variadic && !p.options.hidden);\n }\n\n syncVariadicPorts(): void {\n if (!this.variadic) return;\n\n const existingPorts = this.inputs.filter(p => p.variadic);\n const usedCount = existingPorts.filter(p =>\n p.connections.length > 0 || (p.value !== null && p.value !== this.variadicDefault)\n ).length;\n\n for (let i = 0; i < usedCount + 1; i++) {\n const port = this.in(`input_${i}`, this.variadicDefault, {\n ...this.variadicOptions,\n hidden: false,\n });\n port.variadic = true;\n if (!port.onChange) {\n port.onChange = () => this.onUpdate?.();\n }\n }\n\n for (let i = usedCount + 1; i < existingPorts.length; i++) {\n if (existingPorts[i]) existingPorts[i].options.hidden = true;\n }\n }\n\n // ============ Path System ============\n\n /**\n * Get the full path of this node from the root\n * e.g., \"/effects/blur1\"\n */\n path(): string {\n const segments: string[] = [this.id];\n let current: Node | null = this.parent;\n while (current) {\n segments.unshift(current.id);\n current = current.parent;\n }\n return '/' + segments.join('/');\n }\n\n /**\n * Get child nodes (for subnet types)\n * Override in SubnetNode to return actual children\n */\n children(): Node[] {\n return this._children;\n }\n\n /**\n * Check if this node is a network (can contain children)\n * Override in SubnetNode to return true\n */\n isNetwork(): boolean {\n return false;\n }\n\n /**\n * Find a node by relative path from this node\n * Supports: \"child\", \"../sibling\", \"./self\", \"../../parent/child\"\n */\n node(relativePath: string): Node | null {\n if (!relativePath) return null;\n\n // Absolute path - resolve from root via graph\n if (relativePath.startsWith('/')) {\n return this.graph.nodeByPath(relativePath);\n }\n\n const segments = relativePath.split('/').filter(s => s.length > 0);\n let current: Node | null = this;\n\n for (const segment of segments) {\n if (!current) return null;\n\n if (segment === '.') {\n continue; // Stay at current\n }\n if (segment === '..') {\n current = current.parent; // Go up\n continue;\n }\n\n // Try as child node\n if (current.isNetwork()) {\n const child = current.children().find(c => c.id === segment);\n if (child) {\n current = child;\n continue;\n }\n }\n\n return null; // Segment not found\n }\n\n return current;\n }\n\n /**\n * Compute relative path from this node to another node\n */\n relativePathTo(other: Node): string {\n const thisPath = this.path().split('/').filter(s => s);\n const otherPath = other.path().split('/').filter(s => s);\n\n // Find common ancestor\n let commonLength = 0;\n while (\n commonLength < thisPath.length &&\n commonLength < otherPath.length &&\n thisPath[commonLength] === otherPath[commonLength]\n ) {\n commonLength++;\n }\n\n // Build relative path: go up from this, then down to other\n const ups = thisPath.length - commonLength;\n const downs = otherPath.slice(commonLength);\n\n const parts: string[] = [];\n for (let i = 0; i < ups; i++) {\n parts.push('..');\n }\n parts.push(...downs);\n\n return parts.join('/') || '.';\n }\n\n /**\n * Get nodes connected to this node's inputs\n */\n inputNodes(): Node[] {\n const nodes: Node[] = [];\n for (const input of this.inputs) {\n for (const conn of input.connections) {\n const node = this.graph.getNode(conn.from.nodeId);\n if (node && !nodes.includes(node)) {\n nodes.push(node);\n }\n }\n }\n return nodes;\n }\n\n /**\n * Get nodes connected to this node's outputs\n */\n outputNodes(): Node[] {\n const nodes: Node[] = [];\n for (const output of this.outputs) {\n for (const conn of output.connections) {\n const node = this.graph.getNode(conn.to.nodeId);\n if (node && !nodes.includes(node)) {\n nodes.push(node);\n }\n }\n }\n return nodes;\n }\n\n // ============ Pattern Matching (Globbing) ============\n\n /**\n * Convert a glob pattern to a regular expression\n * Supports: * (any chars), ? (single char), [abc] (char set), [!abc] (negated set)\n */\n private globToRegex(pattern: string): RegExp {\n let regex = '';\n let i = 0;\n while (i < pattern.length) {\n const char = pattern[i];\n switch (char) {\n case '*':\n regex += '.*';\n break;\n case '?':\n regex += '.';\n break;\n case '[':\n // Character class\n let j = i + 1;\n let classContent = '';\n if (pattern[j] === '!') {\n classContent = '^';\n j++;\n }\n while (j < pattern.length && pattern[j] !== ']') {\n classContent += pattern[j];\n j++;\n }\n regex += '[' + classContent + ']';\n i = j;\n break;\n case '.':\n case '+':\n case '^':\n case '$':\n case '(':\n case ')':\n case '{':\n case '}':\n case '|':\n case '\\\\':\n regex += '\\\\' + char;\n break;\n default:\n regex += char;\n }\n i++;\n }\n return new RegExp('^' + regex + '$');\n }\n\n /**\n * Match direct children against a pattern\n * Pattern syntax:\n * * - match any characters\n * ? - match single character\n * [abc] - match character set\n * [!abc] - exclude character set\n * ^pattern - exclude matches (use with space: \"* ^backup*\")\n */\n glob(pattern: string): Node[] {\n const children = this.children();\n if (!pattern || pattern === '*') {\n return [...children];\n }\n\n // Handle exclusion patterns (e.g., \"* ^backup*\")\n const parts = pattern.split(/\\s+/);\n const includePatterns: RegExp[] = [];\n const excludePatterns: RegExp[] = [];\n\n for (const part of parts) {\n if (part.startsWith('^')) {\n excludePatterns.push(this.globToRegex(part.slice(1)));\n } else {\n includePatterns.push(this.globToRegex(part));\n }\n }\n\n return children.filter(child => {\n // Must match at least one include pattern\n const included = includePatterns.length === 0 ||\n includePatterns.some(regex => regex.test(child.id));\n\n // Must not match any exclude pattern\n const excluded = excludePatterns.some(regex => regex.test(child.id));\n\n return included && !excluded;\n });\n }\n\n /**\n * Recursively match all descendants against a pattern\n * Pattern syntax same as glob(), plus:\n * ** - match at any depth (prefix with **\\/ to find nodes at any level)\n */\n recursiveGlob(pattern: string): Node[] {\n const results: Node[] = [];\n\n // Handle ** prefix for any-depth matching\n const isAnyDepth = pattern.startsWith('**/');\n const searchPattern = isAnyDepth ? pattern.slice(3) : pattern;\n\n const search = (node: Node, depth: number) => {\n const children = node.children();\n\n for (const child of children) {\n // For any-depth pattern, check all nodes at all levels\n if (isAnyDepth) {\n if (this.globToRegex(searchPattern).test(child.id)) {\n results.push(child);\n }\n } else if (depth === 0) {\n // For regular pattern, only match at target depth\n if (this.globToRegex(searchPattern).test(child.id)) {\n results.push(child);\n }\n }\n\n // Recurse into children (if network)\n if (child.isNetwork()) {\n search(child, isAnyDepth ? depth : depth - 1);\n }\n }\n };\n\n // If pattern is just \"**\", return all descendants\n if (pattern === '**') {\n const collectAll = (node: Node) => {\n for (const child of node.children()) {\n results.push(child);\n if (child.isNetwork()) {\n collectAll(child);\n }\n }\n };\n collectAll(this);\n return results;\n }\n\n // Count depth for non-any-depth patterns (e.g., \"a/b/c\" = depth 2)\n const pathDepth = isAnyDepth ? 0 : (pattern.split('/').length - 1);\n search(this, pathDepth);\n\n return results;\n }\n\n // ============ Behavior Toggles ============\n\n setBypass(value: boolean): void {\n this.bypass = value;\n this.markDirty();\n }\n\n setCook(value: boolean): void {\n // Exclusive per network: setting cook on one node clears it from siblings\n if (value && this.parent) {\n this.parent.children()\n .filter(n => n !== this && n.cook)\n .forEach(n => n.setCook(false));\n }\n\n this.cook = value;\n if (value) this.graph.cookingNodes.add(this);\n else this.graph.cookingNodes.delete(this);\n this.markDirty();\n }\n\n /**\n * Set time dependency flag (called by expression compiler)\n * Time-dependent nodes are marked dirty on each frame\n */\n setTimeDependent(value: boolean): void {\n this.isTimeDependent = value;\n }\n\n /**\n * Check all expressions and update time dependency flag\n */\n updateTimeDependent(): void {\n const hasTimeRef = Object.values(this.props).some(prop =>\n prop.expression && expressionEngine.hasTimeReference(prop.expression)\n );\n this.setTimeDependent(hasTimeRef);\n }\n\n shouldExecute(): boolean {\n if (this.bypass) return false;\n if (this.graph.cookingNodes.size > 0) {\n return this.cook || this.graph.isDownstreamOfCooking(this);\n }\n return true;\n }\n\n executeBypass(): void {\n this.inputs.forEach(input => {\n if (input.portType === 'param') {\n const matchingOutput = this.outputs.find(out => out.name === input.name || this.outputs.length === 1);\n if (matchingOutput) matchingOutput.setValue(input.value);\n }\n });\n }\n\n // ============ Dirty Tracking ============\n\n markDirty(): void {\n this.graph.scheduler.markStale(this);\n }\n\n /** @internal Scheduler-owned invalidation primitive. */\n invalidateCook(): void {\n this.cookGeneration++;\n this.setCookState('stale');\n }\n\n /** @internal Scheduler-owned state transition. */\n setCookState(state: CookState): void {\n if (this.cookState === state) return;\n this.cookState = state;\n this.graph.scheduler.notifyNodeStateChange();\n }\n\n /**\n * Calculate a lightweight fingerprint for an input value\n * Avoids expensive JSON.stringify on large objects like ImageBuffers\n */\n private getValueFingerprint(value: any): string {\n if (value === null || value === undefined) return 'null';\n if (typeof value !== 'object') return String(value);\n\n // For typed arrays (ImageBuffer channels), use length + sample values\n if (ArrayBuffer.isView(value)) {\n const arr = value as Float32Array;\n const len = arr.length;\n if (len === 0) return 'empty';\n // Sample first, middle, last values for quick fingerprint\n return `f32[${len}]:${arr[0]?.toFixed(4)},${arr[Math.floor(len/2)]?.toFixed(4)},${arr[len-1]?.toFixed(4)}`;\n }\n\n // For ImageBuffer-like objects, use dimensions\n if (value.width !== undefined && value.height !== undefined) {\n const channelCount = value.channelCount || value.channels?.length || 0;\n return `img:${value.width}x${value.height}x${channelCount}`;\n }\n\n // For HTMLCanvasElement/HTMLImageElement, use dimensions\n if ((typeof HTMLCanvasElement !== 'undefined' && value instanceof HTMLCanvasElement) ||\n (typeof HTMLImageElement !== 'undefined' && value instanceof HTMLImageElement)) {\n return `el:${value.width}x${value.height}`;\n }\n\n // For small objects, use JSON (but with a size limit)\n try {\n const json = JSON.stringify(value);\n if (json.length < 500) return json;\n return `obj:${json.length}:${json.slice(0, 100)}`;\n } catch {\n return `obj:${typeof value}`;\n }\n }\n\n private calculateInputHash(): string {\n return this.inputs.map(input => this.getValueFingerprint(input.value)).join('|');\n }\n\n get isDirty(): boolean {\n if (!this.hasExecuted || this.cookState !== 'clean') return true;\n return this.calculateInputHash() !== this.lastInputHash;\n }\n\n /**\n * Mark all downstream nodes as dirty (lazy propagation)\n */\n markDownstreamDirty(): void {\n this.graph.scheduler.markDownstreamStale(this);\n }\n\n /**\n * Request this node's output - triggers lazy evaluation\n * Executes dirty upstream dependencies first, then this node\n */\n async requestOutput(): Promise<void> {\n if (!this.isDirty) return;\n if (this.cookState === 'clean') this.markDirty();\n await this.graph.scheduler.flush();\n }\n\n // ============ Lifecycle ============\n\n protected setup(): void {\n // Override in subclasses\n }\n\n setFunction(fn: Function): void {\n this.nodeFunction = fn;\n // Reset execution state so the new function runs as initialization\n this.hasExecuted = false;\n this.markDirty();\n }\n\n async execute(): Promise<void> {\n // Check if this node has any execution logic\n const hasExecution = !!this.nodeFunction || this.onCook !== Node.prototype.onCook;\n\n if (!hasExecution) {\n this.hasExecuted = true;\n this.setCookState('clean');\n return;\n }\n\n const needsInitialization = !this.hasExecuted;\n\n if (!this.shouldExecute() && !needsInitialization && !this.isDirty) {\n this.executeBypass();\n this.setCookState('clean');\n return;\n }\n\n if (!needsInitialization && !this.isDirty) {\n return;\n }\n\n // Evaluate all expressions before execution\n this.evaluateAllExpressions();\n\n // Track cook time\n const startTime = performance.now();\n const startMemory = (performance as any).memory?.usedJSHeapSize ?? 0;\n const generation = this.cookGeneration;\n this.stagedOutputs = new Map();\n this.setCookState('cooking');\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n try {\n // Single entry point: onCook() handles both code-based and class-based nodes\n await Promise.race([\n Promise.resolve(this.onCook()),\n new Promise<never>((_, reject) => {\n timeoutId = setTimeout(\n () => reject(new Error(`Node execution timeout after ${this.executionTimeout}ms`)),\n this.executionTimeout\n );\n })\n ]);\n\n if (generation === this.cookGeneration) {\n await this.callLifecycleHooks(needsInitialization);\n for (const [port, value] of this.stagedOutputs) {\n this.commitOutputValue(port, value);\n }\n this.error = null;\n this.hasExecuted = true;\n this.lastInputHash = this.calculateInputHash();\n this.setCookState('clean');\n } else {\n this.setCookState('stale');\n }\n\n // Update cook info on success\n this.updateCookInfo(startTime, startMemory);\n } catch (err: any) {\n if (generation === this.cookGeneration) {\n this.error = err as Error;\n this.setCookState('error');\n } else {\n this.setCookState('stale');\n }\n // Still update cook info on error\n this.updateCookInfo(startTime, startMemory);\n if (!err.message?.includes('timeout')) {\n console.error(`Error executing node ${this.id}:`, err);\n }\n } finally {\n if (timeoutId !== undefined) clearTimeout(timeoutId);\n this.stagedOutputs = null;\n }\n }\n\n /**\n * Override this method in class-based nodes to implement cooking logic.\n * Base implementation calls nodeFunction if set (for code-based nodes).\n * Cook timing is handled automatically by execute().\n */\n protected onCook(): void | Promise<void> {\n // Base implementation calls nodeFunction for code-based nodes\n if (this.nodeFunction) {\n return this.nodeFunction(this, this.graph);\n }\n }\n\n /**\n * Update cook info after execution\n * Protected so subclasses can call it for manual cook tracking\n */\n protected updateCookInfo(startTime: number, startMemory: number = 0): void {\n const endTime = performance.now();\n const cookTime = endTime - startTime;\n\n this.cookInfo.lastCookTime = cookTime;\n this.cookInfo.totalCookTime += cookTime;\n this.cookInfo.cookCount++;\n this.cookInfo.averageCookTime = this.cookInfo.totalCookTime / this.cookInfo.cookCount;\n this.cookInfo.lastCookTimestamp = Date.now();\n\n // Track memory if available (Chrome only)\n const endMemory = (performance as any).memory?.usedJSHeapSize ?? 0;\n if (startMemory && endMemory) {\n const memoryUsed = endMemory - startMemory;\n if (memoryUsed > this.cookInfo.peakMemory) {\n this.cookInfo.peakMemory = memoryUsed;\n }\n }\n }\n\n /**\n * Start cook timing - returns start time to pass to endCook()\n * Use for class-based nodes that don't go through execute()\n */\n protected startCook(): number {\n return performance.now();\n }\n\n /**\n * End cook timing - call with the value returned from startCook()\n */\n protected endCook(startTime: number): void {\n this.updateCookInfo(startTime, 0);\n }\n\n /**\n * Reset cook statistics\n */\n resetCookInfo(): void {\n this.cookInfo = {\n lastCookTime: 0,\n totalCookTime: 0,\n cookCount: 0,\n averageCookTime: 0,\n lastCookTimestamp: 0,\n peakMemory: 0\n };\n }\n\n private async callLifecycleHooks(isFirstRun: boolean): Promise<void> {\n const isBrowserAPIError = (err: any): boolean => {\n const msg = err?.message || String(err);\n return msg.includes('document is not defined') || msg.includes('window is not defined') ||\n msg.includes('HTMLCanvasElement') || msg.includes('HTMLImageElement');\n };\n\n if (isFirstRun && this.onSetup) {\n try { await this.onSetup(); }\n catch (err: any) { if (!isBrowserAPIError(err)) console.error(`Error in onSetup for ${this.id}:`, err); }\n }\n\n if (this.onUpdate) {\n try { await this.onUpdate(); }\n catch (err: any) { if (!isBrowserAPIError(err)) console.error(`Error in onUpdate for ${this.id}:`, err); }\n }\n\n if (this.onRender) {\n try { await this.onRender(); }\n catch (err: any) { if (!isBrowserAPIError(err)) console.error(`Error in onRender for ${this.id}:`, err); }\n }\n\n if (isFirstRun && this.onReady) {\n try { this.onReady(); }\n catch (err: any) { if (!isBrowserAPIError(err)) console.error(`Error in onReady for ${this.id}:`, err); }\n }\n }\n\n // ============ Rename ============\n\n rename(newId: string): string {\n if (!newId?.trim()) return this.id;\n const sanitizedId = newId.trim().replace(/\\s+/g, '');\n if (!sanitizedId) return this.id;\n const uniqueId = this.graph.generateUniqueNodeId(sanitizedId, this.id);\n if (this.graph.renameElement(this.id, uniqueId)) this.markDirty();\n return this.id;\n }\n\n protected isPreviewValue(value: unknown): value is HTMLCanvasElement | HTMLImageElement {\n return (typeof HTMLCanvasElement !== 'undefined' && value instanceof HTMLCanvasElement) ||\n (typeof HTMLImageElement !== 'undefined' && value instanceof HTMLImageElement);\n }\n\n // ============ Package Manager ============\n\n async require(packageName: string, version?: string): Promise<any> {\n if (!this.graph.packageManager) throw new Error('PackageManager not initialized');\n return this.graph.packageManager.load(packageName, version);\n }\n\n get assets() {\n return this.graph.assetManager;\n }\n\n // ============ Utilities ============\n\n log(...args: any[]): void {\n console.log(`[${this.id}]`, ...args);\n }\n\n resetPortTracking(): void {\n this.portsUsedDuringSetup.clear();\n }\n\n // ============ State Preservation ============\n\n preserveState() {\n return {\n inputs: this.inputs.map(p => ({ id: p.id, name: p.name, value: p.value, connections: p.connections.map(c => c.id) })),\n outputs: this.outputs.map(p => ({ id: p.id, name: p.name, value: p.value, connections: p.connections.map(c => c.id) })),\n props: Object.fromEntries(Object.entries(this.props).map(([k, p]) => [k, p.value])),\n bypass: this.bypass,\n cook: this.cook\n };\n }\n\n restoreState(state: any): void {\n state.inputs?.forEach((s: any) => {\n const port = this.inputs.find(p => p.id === s.id || p.name === s.name);\n if (port) port.value = s.value;\n });\n state.outputs?.forEach((s: any) => {\n const port = this.outputs.find(p => p.id === s.id || p.name === s.name);\n if (port) port.value = s.value;\n });\n if (state.props) {\n Object.entries(state.props).forEach(([k, v]) => {\n if (this.props[k]) this.props[k].value = v;\n });\n }\n if (state.bypass !== undefined) this.setBypass(state.bypass);\n if (state.cook !== undefined) this.setCook(state.cook);\n }\n\n // ============ Port Cleanup ============\n\n cleanupUnusedPorts(): void {\n const used = this.portsUsedDuringSetup;\n\n this.inputs = this.inputs.filter(port => {\n if (!used.has(`input_${port.name}`)) {\n port.connections.forEach(c => this.graph.disconnect(c.id));\n this._portMap.delete(port.id);\n return false;\n }\n return true;\n });\n\n this.outputs = this.outputs.filter(port => {\n if (!used.has(`output_${port.name}`)) {\n port.connections.forEach(c => this.graph.disconnect(c.id));\n this._portMap.delete(port.id);\n return false;\n }\n return true;\n });\n\n this.portsUsedDuringSetup.clear();\n }\n\n // ============ Serialization ============\n\n toJSON() {\n const fullType = typeToPackagePath(this.type);\n const result: any = {\n id: this.id,\n type: fullType,\n position: [this.position.x, this.position.y]\n };\n\n if (!isStandardLibraryNode(fullType) && this.code) {\n result.code = this.code;\n }\n\n if (this.comment?.trim()) result.comment = this.comment;\n\n const props = Object.fromEntries(\n Object.entries(this.props).map(([k, p]) => {\n let v = p.value;\n if (p.type === 'color' && isColorValue(v)) {\n const n = normalizeColor(v as any);\n v = [n.r, n.g, n.b, n.a ?? 1.0];\n }\n // Include expression if present\n if (p.expression) {\n return [k, { value: v, expression: p.expression }];\n }\n return [k, v];\n })\n );\n if (Object.keys(props).length > 0) result.props = props;\n\n if (this.bypass) result.bypass = true;\n if (this.cook) result.cook = true;\n\n return result;\n }\n}\n", "import { Node } from '../Node.js';\nimport type { Graph } from '../Graph.js';\nimport type { OutputPort } from '../../types/node.types.js';\n\n/**\n * Annotation style configuration\n */\nexport interface AnnotationStyle {\n fontSize?: number;\n fontWeight?: 'normal' | 'bold' | '600' | '700';\n fontStyle?: 'normal' | 'italic';\n textAlign?: 'left' | 'center' | 'right';\n color?: string;\n backgroundColor?: string;\n padding?: number;\n borderRadius?: number;\n borderLeft?: string;\n strokeWidth?: number;\n strokeColor?: string;\n}\n\n/**\n * Base class for all annotation types\n *\n * Annotations are visual elements on the canvas that don't execute code.\n * They can optionally have ports for data flow visualization.\n */\nexport class Annotation extends Node {\n // Marker property for reliable type checking (survives HMR and serialization)\n readonly isAnnotation: true = true;\n\n // Annotation-specific properties\n size?: { width: number; height: number };\n style?: AnnotationStyle;\n caption?: string;\n containedElements?: string[];\n\n constructor(id: string, type: string, graph: Graph) {\n super(id, type, graph);\n }\n\n /**\n * Annotations always have exactly one output at index 0\n */\n getOutput(): OutputPort | null {\n return this.getOutputPort(0);\n }\n\n /**\n * Annotations don't execute - override to no-op\n */\n async execute(): Promise<void> {\n // Annotations are visual-only, no execution needed\n }\n}\n", "import { Annotation } from './Annotation.js';\nimport type { Graph } from '../Graph.js';\n\nexport class ImageAnnotation extends Annotation {\n src?: string;\n\n constructor(id: string, graph: Graph) {\n super(id, 'Image', graph);\n }\n}\n", "import { Annotation } from './Annotation.js';\nimport type { Graph } from '../Graph.js';\n\nexport class TextAnnotation extends Annotation {\n content?: string;\n\n constructor(id: string, graph: Graph) {\n super(id, 'Text', graph);\n }\n}\n", "import { Annotation } from './Annotation.js';\nimport type { Graph } from '../Graph.js';\n\nexport class GroupAnnotation extends Annotation {\n constructor(id: string, graph: Graph) {\n super(id, 'Group', graph);\n }\n}\n", "import { Annotation } from './Annotation.js';\nimport type { Graph } from '../Graph.js';\n\nexport class LineAnnotation extends Annotation {\n endPosition?: { x: number; y: number };\n\n constructor(id: string, graph: Graph) {\n super(id, 'Line', graph);\n }\n}\n", "import { Annotation } from './Annotation.js';\nimport type { Graph } from '../Graph.js';\n\nexport class PolylineAnnotation extends Annotation {\n points?: { x: number; y: number }[];\n\n constructor(id: string, graph: Graph) {\n super(id, 'Polyline', graph);\n }\n}\n", "export type AssetType = 'image' | 'audio' | 'video' | 'json' | 'text' | 'binary';\n\nexport interface Asset {\n id: string;\n path: string;\n type: AssetType;\n data: any;\n size: number;\n metadata: Record<string, any>;\n}\n\n/**\n * Interface for environment-specific asset loaders\n */\nexport interface AssetLoader {\n loadImage(path: string): Promise<any>;\n loadJSON(path: string): Promise<any>;\n loadText(path: string): Promise<string>;\n loadBinary(path: string): Promise<ArrayBuffer>;\n}\n\n/**\n * Browser-based asset loader (uses Image, fetch)\n */\nexport class BrowserAssetLoader implements AssetLoader {\n async loadImage(path: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n if (typeof Image === 'undefined') {\n reject(new Error('Image API not available (not in browser environment)'));\n return;\n }\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = () => reject(new Error(`Failed to load image: ${path}`));\n img.src = path;\n });\n }\n\n async loadJSON(path: string): Promise<any> {\n if (typeof fetch === 'undefined') {\n throw new Error('fetch API not available (not in browser environment)');\n }\n const response = await fetch(path);\n if (!response.ok) {\n throw new Error(`Failed to load JSON: ${path} - ${response.statusText}`);\n }\n return response.json();\n }\n\n async loadText(path: string): Promise<string> {\n if (typeof fetch === 'undefined') {\n throw new Error('fetch API not available (not in browser environment)');\n }\n const response = await fetch(path);\n if (!response.ok) {\n throw new Error(`Failed to load text: ${path} - ${response.statusText}`);\n }\n return response.text();\n }\n\n async loadBinary(path: string): Promise<ArrayBuffer> {\n if (typeof fetch === 'undefined') {\n throw new Error('fetch API not available (not in browser environment)');\n }\n const response = await fetch(path);\n if (!response.ok) {\n throw new Error(`Failed to load binary: ${path} - ${response.statusText}`);\n }\n return response.arrayBuffer();\n }\n}\n\nexport class AssetManager {\n cache = new Map<string, Asset>(); // Made public for drag-drop access\n private projectRoot: string;\n private loader: AssetLoader;\n \n constructor(projectRoot: string = '', loader?: AssetLoader) {\n this.projectRoot = projectRoot;\n this.loader = loader ?? new BrowserAssetLoader();\n }\n \n async load(path: string): Promise<Asset> {\n if (this.cache.has(path)) {\n return this.cache.get(path)!;\n }\n \n const absolutePath = this.resolve(path);\n const type = this.getAssetType(path);\n \n let data: any;\n \n switch (type) {\n case 'image':\n data = await this.loader.loadImage(absolutePath);\n break;\n case 'json':\n data = await this.loader.loadJSON(absolutePath);\n break;\n case 'text':\n data = await this.loader.loadText(absolutePath);\n break;\n default:\n throw new Error(`Unsupported asset type: ${type}`);\n }\n \n const asset: Asset = {\n id: this.generateId(path),\n path,\n type,\n data,\n size: 0,\n metadata: {}\n };\n \n this.cache.set(path, asset);\n return asset;\n }\n \n private resolve(path: string): string {\n if (path.startsWith('http://') || path.startsWith('https://')) {\n return path;\n }\n if (path.startsWith('/')) {\n return path;\n }\n return `${this.projectRoot}${path}`;\n }\n \n private getAssetType(path: string): AssetType {\n const ext = path.split('.').pop()?.toLowerCase();\n \n if (['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg'].includes(ext || '')) return 'image';\n if (['mp3', 'wav', 'ogg', 'm4a'].includes(ext || '')) return 'audio';\n if (['mp4', 'webm', 'mov'].includes(ext || '')) return 'video';\n if (ext === 'json') return 'json';\n if (['txt', 'md', 'csv'].includes(ext || '')) return 'text';\n \n return 'binary';\n }\n \n private generateId(path: string): string {\n return path.replace(/[^a-zA-Z0-9]/g, '_');\n }\n \n getAsset(path: string): Asset | undefined {\n return this.cache.get(path);\n }\n \n clearCache() {\n this.cache.clear();\n }\n \n removeAsset(path: string) {\n this.cache.delete(path);\n }\n \n /**\n * Reload an asset from its path (useful for hot reload)\n */\n async reloadAsset(path: string): Promise<Asset> {\n // Remove from cache first\n this.cache.delete(path);\n // Reload\n return this.load(path);\n }\n \n /**\n * Reload all cached assets (useful for hot reload)\n */\n async reloadAll(): Promise<void> {\n const paths = Array.from(this.cache.keys());\n this.cache.clear();\n await Promise.all(paths.map(path => this.load(path).catch(err => {\n console.warn(`Failed to reload asset ${path}:`, err);\n })));\n }\n\n list(): Asset[] {\n return Array.from(this.cache.values());\n }\n}\n", "export interface PackageInfo {\n name: string;\n version: string;\n description?: string;\n keywords?: string[];\n author?: {\n name: string;\n email?: string;\n };\n homepage?: string;\n repository?: {\n url: string;\n };\n}\n\n// Internal interface for NPM API response structure\ninterface NpmSearchPackage {\n name: string;\n version: string;\n description?: string;\n keywords?: string[];\n author?: {\n name: string;\n email?: string;\n };\n links?: {\n homepage?: string;\n repository?: string;\n };\n}\n\nexport interface SearchResult {\n package: NpmSearchPackage;\n score: {\n final: number;\n detail: {\n quality: number;\n popularity: number;\n maintenance: number;\n };\n };\n searchScore: number;\n}\n\nexport class PackageManager {\n private cache = new Map<string, any>();\n private loadingPromises = new Map<string, Promise<any>>();\n private cdnBaseUrl = 'https://esm.sh';\n\n /**\n * Load an NPM package from CDN\n * @param packageName Package name (e.g., 'three', 'lodash', '@tensorflow/tfjs')\n * @param version Optional version (defaults to 'latest')\n * @returns The loaded module\n */\n async load(packageName: string, version: string = 'latest'): Promise<any> {\n const key = `${packageName}@${version}`;\n\n // Check cache first\n if (this.cache.has(key)) {\n return this.cache.get(key);\n }\n\n // If already loading, return the existing promise\n if (this.loadingPromises.has(key)) {\n return this.loadingPromises.get(key)!;\n }\n\n // Start loading\n const loadPromise = this.loadPackage(key, packageName, version);\n this.loadingPromises.set(key, loadPromise);\n\n try {\n const module = await loadPromise;\n this.cache.set(key, module);\n return module;\n } catch (error) {\n this.loadingPromises.delete(key);\n throw error;\n }\n }\n\n private async loadPackage(key: string, packageName: string, version: string): Promise<any> {\n // Construct CDN URL\n // esm.sh format: https://esm.sh/package@version\n const versionPart = version === 'latest' ? '' : `@${version}`;\n const url = `${this.cdnBaseUrl}/${packageName}${versionPart}`;\n\n try {\n // Use dynamic import to load the module\n const module = await import(/* @vite-ignore */ url);\n \n // Handle different export formats\n // Some packages export as default, others as named exports\n if (module.default && typeof module.default === 'object') {\n return module.default;\n }\n \n // If module has a default export that's a function/class, return it\n if (module.default !== undefined) {\n return module.default;\n }\n \n // Otherwise return the whole module\n return module;\n } catch (error: any) {\n throw new Error(\n `Failed to load package ${key}: ${error.message || 'Unknown error'}\\n` +\n `URL: ${url}`\n );\n }\n }\n\n /**\n * Search for packages in the NPM registry\n * @param query Search query\n * @param limit Maximum number of results (default: 20)\n * @returns Array of package search results\n */\n async search(query: string, limit: number = 20): Promise<PackageInfo[]> {\n try {\n // Use CORS proxy or direct API call\n // npm registry supports CORS, but we'll handle errors gracefully\n const url = `https://registry.npmjs.org/-/v1/search?text=${encodeURIComponent(query)}&size=${limit}`;\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Accept': 'application/json'\n }\n });\n \n if (!response.ok) {\n // If CORS fails, try alternative approach or return empty results\n if (response.status === 0 || response.status === 403 || response.status === 404) {\n console.warn('NPM registry search may be blocked by CORS. Using fallback.');\n return [];\n }\n throw new Error(`Search failed: ${response.statusText}`);\n }\n\n const data = await response.json();\n \n // Extract package info from search results\n return data.objects?.map((result: SearchResult) => ({\n name: result.package.name,\n version: result.package.version,\n description: result.package.description,\n keywords: result.package.keywords || [],\n author: result.package.author,\n homepage: result.package.links?.homepage,\n repository: result.package.links?.repository\n ? { url: result.package.links.repository }\n : undefined\n })) || [];\n } catch (error: any) {\n // If it's a CORS or network error, return empty array instead of throwing\n if (error.message?.includes('CORS') || error.message?.includes('Failed to fetch')) {\n console.warn('NPM registry search unavailable:', error.message);\n return [];\n }\n throw new Error(`Failed to search packages: ${error.message || 'Unknown error'}`);\n }\n }\n\n /**\n * Get package information from NPM registry\n * @param packageName Package name\n * @returns Package metadata\n */\n async getPackageInfo(packageName: string): Promise<PackageInfo | null> {\n try {\n const url = `https://registry.npmjs.org/${encodeURIComponent(packageName)}`;\n const response = await fetch(url);\n \n if (!response.ok) {\n if (response.status === 404) {\n return null;\n }\n throw new Error(`Failed to fetch package info: ${response.statusText}`);\n }\n\n const data = await response.json();\n const latestVersion = data['dist-tags']?.latest || Object.keys(data.versions).pop();\n const versionData = data.versions[latestVersion];\n\n return {\n name: data.name,\n version: latestVersion,\n description: versionData.description,\n keywords: versionData.keywords || [],\n author: versionData.author,\n homepage: data.homepage || versionData.homepage,\n repository: versionData.repository\n };\n } catch (error: any) {\n throw new Error(`Failed to get package info: ${error.message || 'Unknown error'}`);\n }\n }\n\n /**\n * Clear the package cache\n */\n clearCache() {\n this.cache.clear();\n this.loadingPromises.clear();\n }\n\n /**\n * Remove a specific package from cache\n */\n removeFromCache(packageName: string, version?: string) {\n if (version) {\n const key = `${packageName}@${version}`;\n this.cache.delete(key);\n this.loadingPromises.delete(key);\n } else {\n // Remove all versions of this package\n for (const key of this.cache.keys()) {\n if (key.startsWith(`${packageName}@`)) {\n this.cache.delete(key);\n this.loadingPromises.delete(key);\n }\n }\n }\n }\n\n /**\n * Get list of cached packages\n */\n getCachedPackages(): string[] {\n return Array.from(this.cache.keys());\n }\n}\n\n", "/**\n * ModuleResolver - Resolves module paths to source code\n *\n * Handles three source types:\n * 1. stdlib (cascade.*) - Standard library templates\n * 2. embedded (local.*) - Code stored in .cascade file\n * 3. project (<alias>.*) - External files in project packages\n */\n\nimport type {\n NodeSource,\n StdlibSource,\n EmbeddedSource,\n ProjectSource,\n ProjectPackage,\n EmbeddedModule,\n ExternalModule,\n FileStatus,\n CodeVersion\n} from '../types/node.types.js';\nimport { getNodeClass } from '../utils/nodeTypeUtils.js';\n\nexport interface ModuleResolution {\n source: NodeSource;\n code: string;\n displayPath: string; // Human-readable path for UI\n editable: boolean;\n}\n\nexport interface ResolverConfig {\n projectPackages: ProjectPackage[];\n embeddedModules: Map<string, EmbeddedModule>;\n externalModules: Map<string, ExternalModule>;\n basePath?: string; // Base path for resolving relative paths\n}\n\nexport class ModuleResolver {\n private config: ResolverConfig;\n private fileReadFn?: (path: string) => Promise<string | null>;\n private fileExistsFn?: (path: string) => Promise<boolean>;\n\n constructor(config: ResolverConfig) {\n this.config = config;\n }\n\n /**\n * Set file system functions for reading external files\n * These are injected to allow different implementations (browser vs Node.js)\n */\n setFileSystemFunctions(\n readFn: (path: string) => Promise<string | null>,\n existsFn: (path: string) => Promise<boolean>\n ): void {\n this.fileReadFn = readFn;\n this.fileExistsFn = existsFn;\n }\n\n /**\n * Resolve a module path to its source code and metadata\n */\n async resolve(modulePath: string): Promise<ModuleResolution | null> {\n // 1. Check if it's a standard library module (cascade.*)\n if (modulePath.startsWith('cascade.')) {\n return this.resolveStdlib(modulePath);\n }\n\n // 2. Check if it's an embedded module (local.*)\n if (modulePath.startsWith('local.')) {\n return this.resolveEmbedded(modulePath);\n }\n\n // 3. Check project packages\n for (const pkg of this.config.projectPackages) {\n if (modulePath.startsWith(`${pkg.alias}.`)) {\n return this.resolveProject(modulePath, pkg);\n }\n }\n\n // 4. Fallback: check if it's in embedded modules by exact match\n if (this.config.embeddedModules.has(modulePath)) {\n return this.resolveEmbedded(modulePath);\n }\n\n return null;\n }\n\n /**\n * Resolve a standard library module\n * Class-based stdlib nodes don't have editable code\n */\n private resolveStdlib(modulePath: string): ModuleResolution | null {\n // Check if the node class exists\n const NodeClass = getNodeClass(modulePath);\n if (!NodeClass) {\n return null;\n }\n\n const source: StdlibSource = {\n type: 'stdlib',\n module: modulePath\n };\n\n // Extract library and type for display path\n const parts = modulePath.split('.');\n const displayPath = `<cascade>/${parts.slice(1).join('/')}.ts`;\n\n return {\n source,\n code: '', // Class-based nodes don't have editable code\n displayPath,\n editable: false\n };\n }\n\n /**\n * Resolve an embedded module\n */\n private resolveEmbedded(modulePath: string): ModuleResolution | null {\n const embedded = this.config.embeddedModules.get(modulePath);\n if (!embedded) {\n return null;\n }\n\n const source: EmbeddedSource = {\n type: 'embedded',\n module: modulePath,\n code: embedded.code,\n history: embedded.history || []\n };\n\n return {\n source,\n code: embedded.code,\n displayPath: '<embedded>',\n editable: true\n };\n }\n\n /**\n * Resolve a project module from an external file\n */\n private async resolveProject(\n modulePath: string,\n pkg: ProjectPackage\n ): Promise<ModuleResolution | null> {\n // Convert module path to file path\n // e.g., 'myproject.filters.Blur' with alias 'myproject' and path './src'\n // becomes './src/filters/Blur.ts'\n const relativeParts = modulePath.replace(`${pkg.alias}.`, '').split('.');\n const filePath = `${pkg.path}/${relativeParts.join('/')}.ts`;\n\n // Check for cached external module\n const external = this.config.externalModules.get(modulePath);\n let code: string | null = null;\n let status: FileStatus = 'synced';\n\n // Try to read the file\n if (this.fileReadFn && this.fileExistsFn) {\n const fullPath = this.resolvePath(filePath);\n const exists = await this.fileExistsFn(fullPath);\n\n if (exists) {\n code = await this.fileReadFn(fullPath);\n if (code !== null) {\n // Check if external file was modified\n if (external && external.cachedCode !== code) {\n status = 'modified-external';\n }\n }\n } else {\n status = 'missing';\n // Use cached code if available\n code = external?.cachedCode || null;\n }\n } else if (external) {\n // No file system access, use cached code\n code = external.cachedCode;\n }\n\n if (code === null) {\n return null;\n }\n\n const source: ProjectSource = {\n type: 'project',\n module: modulePath,\n file: filePath,\n cachedCode: code,\n lastSync: new Date().toISOString(),\n status\n };\n\n return {\n source,\n code,\n displayPath: filePath,\n editable: true\n };\n }\n\n /**\n * Resolve a relative path to an absolute path\n */\n private resolvePath(relativePath: string): string {\n if (!this.config.basePath) {\n return relativePath;\n }\n // Simple path joining - in browser this would be different\n if (relativePath.startsWith('./')) {\n return `${this.config.basePath}/${relativePath.slice(2)}`;\n }\n if (relativePath.startsWith('/')) {\n return relativePath;\n }\n return `${this.config.basePath}/${relativePath}`;\n }\n\n /**\n * Determine the source type for a given module path\n */\n getSourceType(modulePath: string): 'stdlib' | 'embedded' | 'project' | null {\n if (modulePath.startsWith('cascade.')) {\n return 'stdlib';\n }\n if (modulePath.startsWith('local.')) {\n return 'embedded';\n }\n for (const pkg of this.config.projectPackages) {\n if (modulePath.startsWith(`${pkg.alias}.`)) {\n return 'project';\n }\n }\n if (this.config.embeddedModules.has(modulePath)) {\n return 'embedded';\n }\n return null;\n }\n\n /**\n * Create a new embedded module with the given code\n * Use this when creating custom nodes from scratch\n */\n createEmbeddedModule(\n modulePath: string,\n code: string,\n author: 'user' | 'ai' = 'user'\n ): { modulePath: string; module: EmbeddedModule } {\n const now = new Date().toISOString();\n const initialVersion: CodeVersion = {\n code,\n timestamp: now,\n author\n };\n\n const module: EmbeddedModule = {\n code,\n history: [initialVersion],\n created: now,\n modified: now\n };\n\n // Add to embedded modules\n this.config.embeddedModules.set(modulePath, module);\n\n return { modulePath, module };\n }\n\n /**\n * Create a new embedded module from stdlib (duplicate)\n */\n duplicateToEmbedded(\n stdlibPath: string,\n newName?: string\n ): { modulePath: string; module: EmbeddedModule } | null {\n const resolution = this.resolveStdlib(stdlibPath);\n if (!resolution) {\n return null;\n }\n\n // Generate module name\n const typeName = stdlibPath.split('.').pop() || 'Custom';\n const baseName = newName || typeName;\n let modulePath = `local.${baseName}`;\n\n // Ensure unique name\n let counter = 1;\n while (this.config.embeddedModules.has(modulePath)) {\n modulePath = `local.${baseName}${counter}`;\n counter++;\n }\n\n const now = new Date().toISOString();\n const initialVersion: CodeVersion = {\n code: resolution.code,\n timestamp: now,\n author: 'user'\n };\n\n const module: EmbeddedModule = {\n code: resolution.code,\n history: [initialVersion],\n created: now,\n modified: now\n };\n\n // Add to embedded modules\n this.config.embeddedModules.set(modulePath, module);\n\n return { modulePath, module };\n }\n\n /**\n * Create an external file from an embedded module (extract)\n */\n async extractToProject(\n embeddedPath: string,\n pkg: ProjectPackage,\n fileName: string\n ): Promise<{ modulePath: string; filePath: string } | null> {\n const embedded = this.config.embeddedModules.get(embeddedPath);\n if (!embedded) {\n return null;\n }\n\n // Build the file path and module path\n const filePath = `${pkg.path}/${fileName}.ts`;\n const modulePath = `${pkg.alias}.${fileName.replace(/\\//g, '.')}`;\n\n // Store as external module\n const external: ExternalModule = {\n file: filePath,\n cachedCode: embedded.code,\n lastSync: new Date().toISOString()\n };\n this.config.externalModules.set(modulePath, external);\n\n // Note: Actual file writing would be handled by the caller\n // This just updates the resolver's state\n\n return { modulePath, filePath };\n }\n\n /**\n * Update embedded module code and record in history\n */\n updateEmbeddedCode(\n modulePath: string,\n newCode: string,\n author: 'user' | 'ai' = 'user',\n prompt?: string\n ): boolean {\n const embedded = this.config.embeddedModules.get(modulePath);\n if (!embedded) {\n return false;\n }\n\n const now = new Date().toISOString();\n const version: CodeVersion = {\n code: newCode,\n timestamp: now,\n author,\n prompt\n };\n\n embedded.history.push(version);\n embedded.code = newCode;\n embedded.modified = now;\n\n return true;\n }\n\n /**\n * Restore embedded module to a previous version\n */\n restoreVersion(modulePath: string, versionIndex: number): boolean {\n const embedded = this.config.embeddedModules.get(modulePath);\n if (!embedded || versionIndex < 0 || versionIndex >= embedded.history.length) {\n return false;\n }\n\n const version = embedded.history[versionIndex];\n embedded.code = version.code;\n embedded.modified = new Date().toISOString();\n\n // Add restoration as a new history entry\n embedded.history.push({\n code: version.code,\n timestamp: embedded.modified,\n author: 'user'\n });\n\n return true;\n }\n\n /**\n * Get all registered project packages\n */\n getProjectPackages(): ProjectPackage[] {\n return [...this.config.projectPackages];\n }\n\n /**\n * Add a project package\n */\n addProjectPackage(pkg: ProjectPackage): void {\n // Check for duplicate alias\n const existing = this.config.projectPackages.find(p => p.alias === pkg.alias);\n if (existing) {\n existing.path = pkg.path;\n } else {\n this.config.projectPackages.push(pkg);\n }\n }\n\n /**\n * Remove a project package\n */\n removeProjectPackage(alias: string): boolean {\n const index = this.config.projectPackages.findIndex(p => p.alias === alias);\n if (index >= 0) {\n this.config.projectPackages.splice(index, 1);\n return true;\n }\n return false;\n }\n\n /**\n * Sync an external module with its file\n */\n async syncExternalModule(modulePath: string): Promise<FileStatus> {\n const external = this.config.externalModules.get(modulePath);\n if (!external || !this.fileReadFn || !this.fileExistsFn) {\n return 'missing';\n }\n\n const fullPath = this.resolvePath(external.file);\n const exists = await this.fileExistsFn(fullPath);\n\n if (!exists) {\n return 'missing';\n }\n\n const code = await this.fileReadFn(fullPath);\n if (code === null) {\n return 'missing';\n }\n\n external.cachedCode = code;\n external.lastSync = new Date().toISOString();\n\n return 'synced';\n }\n\n /**\n * Export configuration for serialization\n */\n exportConfig(): {\n projectPackages: ProjectPackage[];\n embeddedModules: Record<string, EmbeddedModule>;\n externalModules: Record<string, ExternalModule>;\n } {\n return {\n projectPackages: [...this.config.projectPackages],\n embeddedModules: Object.fromEntries(this.config.embeddedModules),\n externalModules: Object.fromEntries(this.config.externalModules)\n };\n }\n\n /**\n * Import configuration from deserialization\n */\n importConfig(config: {\n projectPackages?: ProjectPackage[];\n embeddedModules?: Record<string, EmbeddedModule>;\n externalModules?: Record<string, ExternalModule>;\n }): void {\n if (config.projectPackages) {\n this.config.projectPackages = [...config.projectPackages];\n }\n if (config.embeddedModules) {\n this.config.embeddedModules = new Map(Object.entries(config.embeddedModules));\n }\n if (config.externalModules) {\n this.config.externalModules = new Map(Object.entries(config.externalModules));\n }\n }\n}\n\n/**\n * Create a ModuleResolver with empty configuration\n */\nexport function createModuleResolver(basePath?: string): ModuleResolver {\n return new ModuleResolver({\n projectPackages: [],\n embeddedModules: new Map(),\n externalModules: new Map(),\n basePath\n });\n}\n", "import type { Graph } from '../nodes/Graph.js';\nimport type { Node } from '../nodes/Node.js';\nimport type { Connection } from '../types/node.types.js';\n\nexport interface ValidationError {\n type: 'cycle' | 'invalid_connection' | 'orphaned_node' | 'invalid_entry_point';\n message: string;\n nodeIds?: string[];\n connectionId?: string;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: ValidationError[];\n warnings: ValidationError[];\n}\n\n/**\n * Graph validator for detecting cycles, invalid connections, and other graph problems\n */\nexport class GraphValidator {\n /**\n * Detect cycles in the graph using DFS\n * Returns array of node IDs involved in cycles\n */\n static detectCycles(graph: Graph): string[][] {\n const cycles: string[][] = [];\n const visited = new Set<string>();\n const recStack = new Set<string>();\n const path: string[] = [];\n\n const dfs = (nodeId: string): boolean => {\n if (recStack.has(nodeId)) {\n // Found a cycle - extract the cycle path\n const cycleStart = path.indexOf(nodeId);\n if (cycleStart !== -1) {\n cycles.push([...path.slice(cycleStart), nodeId]);\n }\n return true;\n }\n\n if (visited.has(nodeId)) {\n return false;\n }\n\n visited.add(nodeId);\n recStack.add(nodeId);\n path.push(nodeId);\n\n const node = graph.getNode(nodeId);\n if (node) {\n // Check all downstream nodes (outputs -> inputs)\n for (const output of node.outputs) {\n for (const conn of output.connections) {\n dfs(conn.to.nodeId);\n }\n }\n }\n\n recStack.delete(nodeId);\n path.pop();\n return false;\n };\n\n // Check all nodes (filter elements by type)\n const nodes = graph.nodes;\n for (const node of nodes) {\n if (!visited.has(node.id)) {\n dfs(node.id);\n }\n }\n\n return cycles;\n }\n\n /**\n * Check if adding a connection would create a cycle\n */\n static wouldCreateCycle(\n graph: Graph,\n fromNodeId: string,\n toNodeId: string\n ): boolean {\n // If connecting to the same node, it's a self-loop (cycle)\n if (fromNodeId === toNodeId) {\n return true;\n }\n\n // Check if there's already a path from toNode to fromNode\n // If so, adding this connection would create a cycle\n const visited = new Set<string>();\n \n const hasPath = (startId: string, targetId: string): boolean => {\n if (startId === targetId) return true;\n if (visited.has(startId)) return false;\n \n visited.add(startId);\n const node = graph.getNode(startId);\n if (!node) return false;\n\n for (const output of node.outputs) {\n for (const conn of output.connections) {\n if (hasPath(conn.to.nodeId, targetId)) {\n return true;\n }\n }\n }\n return false;\n };\n\n return hasPath(toNodeId, fromNodeId);\n }\n\n /**\n * Perform topological sort of nodes\n * Returns sorted node IDs, or throws if cycles exist\n */\n static topologicalSort(graph: Graph): string[] {\n const cycles = this.detectCycles(graph);\n if (cycles.length > 0) {\n throw new Error(\n `Graph contains cycles: ${cycles.map(c => c.join(' -> ')).join(', ')}`\n );\n }\n\n const sorted: string[] = [];\n const visited = new Set<string>();\n const tempMark = new Set<string>();\n\n const visit = (nodeId: string) => {\n if (tempMark.has(nodeId)) {\n throw new Error(`Cycle detected involving node ${nodeId}`);\n }\n if (visited.has(nodeId)) {\n return;\n }\n\n tempMark.add(nodeId);\n const node = graph.getNode(nodeId);\n if (node) {\n // Visit all upstream nodes first\n for (const input of node.inputs) {\n for (const conn of input.connections) {\n visit(conn.from.nodeId);\n }\n }\n }\n\n tempMark.delete(nodeId);\n visited.add(nodeId);\n sorted.push(nodeId);\n };\n\n // Visit all nodes (filter elements by type)\n const nodes = graph.nodes;\n for (const node of nodes) {\n if (!visited.has(node.id)) {\n visit(node.id);\n }\n }\n\n return sorted;\n }\n\n /**\n * Validate a connection before it's added\n */\n static validateConnection(\n graph: Graph,\n fromNodeId: string,\n toNodeId: string,\n fromPortId: string,\n toPortId: string\n ): ValidationError | null {\n const fromNode = graph.getNode(fromNodeId);\n const toNode = graph.getNode(toNodeId);\n\n if (!fromNode || !toNode) {\n return {\n type: 'invalid_connection',\n message: `Invalid connection: node not found`,\n nodeIds: [fromNodeId, toNodeId]\n };\n }\n\n const fromPort = fromNode.outputs.find(p => p.id === fromPortId);\n const toPort = toNode.inputs.find(p => p.id === toPortId);\n\n if (!fromPort || !toPort) {\n return {\n type: 'invalid_connection',\n message: `Invalid connection: port not found`,\n nodeIds: [fromNodeId, toNodeId]\n };\n }\n\n // Check port types match\n if (fromPort.portType !== toPort.portType) {\n return {\n type: 'invalid_connection',\n message: `Port type mismatch: cannot connect ${fromPort.portType} to ${toPort.portType}`,\n nodeIds: [fromNodeId, toNodeId]\n };\n }\n\n // Check for cycles\n if (this.wouldCreateCycle(graph, fromNodeId, toNodeId)) {\n return {\n type: 'cycle',\n message: `Connection would create a cycle: ${fromNodeId} -> ${toNodeId}`,\n nodeIds: [fromNodeId, toNodeId]\n };\n }\n\n return null;\n }\n\n /**\n * Validate the entire graph\n */\n static validateGraph(graph: Graph): ValidationResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationError[] = [];\n\n // Check for cycles\n const cycles = this.detectCycles(graph);\n if (cycles.length > 0) {\n cycles.forEach(cycle => {\n errors.push({\n type: 'cycle',\n message: `Cycle detected: ${cycle.join(' -> ')}`,\n nodeIds: cycle\n });\n });\n }\n\n // Validate all connections\n for (const conn of graph.connections) {\n const fromNode = graph.getNode(conn.from.nodeId);\n const toNode = graph.getNode(conn.to.nodeId);\n\n if (!fromNode || !toNode) {\n errors.push({\n type: 'invalid_connection',\n message: `Connection references non-existent node`,\n connectionId: conn.id,\n nodeIds: [conn.from.nodeId, conn.to.nodeId]\n });\n continue;\n }\n\n const fromPort = fromNode.outputs.find(p => p.id === conn.from.portId);\n const toPort = toNode.inputs.find(p => p.id === conn.to.portId);\n\n if (!fromPort || !toPort) {\n errors.push({\n type: 'invalid_connection',\n message: `Connection references non-existent port`,\n connectionId: conn.id,\n nodeIds: [conn.from.nodeId, conn.to.nodeId]\n });\n continue;\n }\n\n // Check port types match\n if (fromPort.portType !== toPort.portType) {\n errors.push({\n type: 'invalid_connection',\n message: `Port type mismatch in connection`,\n connectionId: conn.id,\n nodeIds: [conn.from.nodeId, conn.to.nodeId]\n });\n }\n }\n\n // Check for orphaned nodes (nodes with no connections)\n // Entry point nodes (nodes with no input connections) are not considered orphaned\n const connectedNodes = new Set<string>();\n for (const conn of graph.connections) {\n connectedNodes.add(conn.from.nodeId);\n connectedNodes.add(conn.to.nodeId);\n }\n\n const nodes = graph.nodes;\n const orphanedNodes = nodes.filter(n => {\n // A node is orphaned if it has no connections AND is not an entry point\n const hasNoConnections = !connectedNodes.has(n.id);\n const isEntryPoint = n.inputs.every(p => p.connections.length === 0);\n return hasNoConnections && !isEntryPoint;\n });\n \n if (orphanedNodes.length > 0) {\n warnings.push({\n type: 'orphaned_node',\n message: `Found ${orphanedNodes.length} orphaned node(s) with no connections`,\n nodeIds: orphanedNodes.map(n => n.id)\n });\n }\n\n // Check entry points exist\n const entryPoints = nodes.filter(\n node => node.inputs.every(p => p.connections.length === 0)\n );\n if (entryPoints.length === 0 && nodes.length > 0) {\n warnings.push({\n type: 'invalid_entry_point',\n message: 'No entry points found (all nodes have input connections)'\n });\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n };\n }\n}\n\n", "/**\n * Loads a node module's compiled ES module from the Cascade server and\n * hands back its `execute(node, graph)` export. The browser can't strip\n * TypeScript or resolve imports itself, so this always round-trips\n * through the server's esbuild pass (server/src/compile.ts) \u2014 replacing\n * the old `new Function('node','graph', code)` sandbox, which needed no\n * server but also couldn't do real imports at all.\n *\n * Project-sourced nodes use the `project.<folderName>` module-path\n * convention (see Graph.ts's fromJSON) so the flat single-project model\n * (`nodes/<folderName>/index.ts`, no package/alias indirection) still\n * satisfies the legacy \"module path must contain a dot\" check elsewhere\n * in this codebase, while staying a direct, unambiguous folder lookup.\n */\n\nexport type NodeModuleExecute = (node: unknown, graph: unknown) => unknown | Promise<unknown>;\n\ninterface LoadedModule {\n execute: NodeModuleExecute;\n}\n\nconst moduleCache = new Map<string, Promise<LoadedModule>>();\n\n/**\n * A compiler the host can inject so a module can be built without a server.\n *\n * The browser has no choice but to ask the server, but a headless run has no\n * server to ask \u2014 and asking anyway is what made `cascade run` fail on every\n * project graph with \"Failed to parse URL from /api/nodes/...\". The CLI sets\n * this to the same esbuild pass the server uses, so both hosts compile a module\n * identically and only the transport differs.\n */\nexport type ProjectModuleCompiler = (folderName: string) => Promise<string>;\n\nlet projectCompiler: ProjectModuleCompiler | null = null;\n\nexport function setProjectModuleCompiler(compiler: ProjectModuleCompiler | null): void {\n projectCompiler = compiler;\n moduleCache.clear();\n}\n\nasync function importCompiledCode(code: string): Promise<LoadedModule> {\n // A blob URL is the browser's route and the only one it has. Node defines\n // createObjectURL but its ESM loader refuses the blob: scheme, so testing for\n // the function is not enough \u2014 the branch has to be on the environment. Node\n // imports the same code as a data URL, which both environments accept.\n const inBrowser = typeof document !== 'undefined';\n const url = inBrowser\n ? URL.createObjectURL(new Blob([code], { type: 'text/javascript' }))\n : `data:text/javascript;base64,${Buffer.from(code, 'utf-8').toString('base64')}`;\n try {\n const mod = await import(/* @vite-ignore */ url);\n if (typeof mod.execute !== 'function') {\n throw new Error('node module has no execute(node, graph) export');\n }\n return { execute: mod.execute };\n } finally {\n if (url.startsWith('blob:')) URL.revokeObjectURL(url);\n }\n}\n\n/** `modulePath` is the full `project.<folderName>` string stored on the node. */\nexport function loadProjectModule(modulePath: string): Promise<LoadedModule> {\n const folderName = modulePath.replace(/^project\\./, '');\n const cacheKey = `project:${folderName}`;\n let cached = moduleCache.get(cacheKey);\n if (!cached) {\n cached = projectCompiler\n ? projectCompiler(folderName).then(importCompiledCode)\n : fetch(`/api/nodes/${encodeURIComponent(folderName)}/compiled`).then(async (res) => {\n if (!res.ok) throw new Error(await res.text());\n return importCompiledCode(await res.text());\n });\n moduleCache.set(cacheKey, cached);\n }\n return cached;\n}\n\n/** A compiler for code that lives inline in the .cascade file rather than in a\n * module directory. Injected for the same reason as the one above. */\nexport type EmbeddedCompiler = (code: string) => Promise<string>;\n\nlet embeddedCompiler: EmbeddedCompiler | null = null;\n\nexport function setEmbeddedCompiler(compiler: EmbeddedCompiler | null): void {\n embeddedCompiler = compiler;\n moduleCache.clear();\n}\n\nexport function loadEmbeddedModule(code: string): Promise<LoadedModule> {\n const cacheKey = `embedded:${hashCode(code)}`;\n let cached = moduleCache.get(cacheKey);\n if (!cached) {\n if (embeddedCompiler) {\n cached = embeddedCompiler(code).then(importCompiledCode);\n moduleCache.set(cacheKey, cached);\n return cached;\n }\n cached = fetch('/api/nodes/compile-embedded', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ code }),\n }).then(async (res) => {\n if (!res.ok) throw new Error(await res.text());\n return importCompiledCode(await res.text());\n });\n moduleCache.set(cacheKey, cached);\n }\n return cached;\n}\n\n/** Called when the file-watcher reports a project module's file changed, so the next execute() recompiles instead of reusing a stale bundle. */\nexport function invalidateProjectModule(folderName: string): void {\n moduleCache.delete(`project:${folderName}`);\n}\n\nfunction hashCode(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = (hash * 31 + str.charCodeAt(i)) | 0;\n }\n return hash.toString(36);\n}\n", "import type { Vec4 } from \"./values.js\";\n\n/**\n * Colour is a four-component vector, always. Marcus ruled on that 2026-09-04:\n * *\"colour should only be a 4 component vector; when a hex/string value is\n * needed we should use conversions with a .toHex and .toString methods.\"*\n *\n * So `Cd` is `vec4`, a `color` prop is `vec4`, and there is no second\n * representation anywhere in the system. Hex and CSS are *spellings* produced at\n * the edge by the code that has to emit text, which today is the SVG writer and\n * tomorrow is a canvas host or a project reading a palette out of JSON.\n *\n * ## Why a namespace object rather than methods on a colour\n *\n * `.toHex()` on a colour would need a colour to be an object, and a colour is a\n * `Vec4` \u2014 a plain readonly array of four numbers. That is not an accident of\n * this file: it is what makes a colour a value the graph can carry, serialize as\n * `[1, 0.5, 0, 1]`, store in a `vec4` port, and share with an attribute's flat\n * `Float64Array` without a conversion. Giving it methods means giving it a\n * prototype, and then a colour that survives a round trip through JSON is no\n * longer a colour. So the operations live beside the type instead of on it, the\n * way `Math` and `JSON` do, and `Color` is both the type and the namespace, the\n * way `Array` is.\n *\n * Components are unit-range `[0, 1]` for red, green, blue and alpha, in that\n * order. Everything here clamps rather than throwing on an out-of-range\n * component, because a colour arriving slightly outside the range is arithmetic\n * rather than an authoring error; a malformed hex *string* is an authoring error\n * and `fromHex` says so.\n */\nexport type Color = Vec4;\n\nconst HEX = /^#(?:[0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;\n\nfunction clamp(value: number): number {\n return !Number.isFinite(value) ? 0 : value < 0 ? 0 : value > 1 ? 1 : value;\n}\n\nfunction byte(value: number): number {\n return Math.round(clamp(value) * 255);\n}\n\nfunction pair(value: number): string {\n return byte(value).toString(16).padStart(2, \"0\");\n}\n\n/** `0.5` rather than `0.50000000000000001`, and `1` rather than `1.000`. */\nfunction unit(value: number): string {\n return String(Number(clamp(value).toFixed(4)));\n}\n\nfunction expand(digits: string): readonly number[] {\n const wide =\n digits.length <= 4\n ? [...digits].map((digit) => `${digit}${digit}`)\n : (digits.match(/../g) ?? []);\n return wide.map((component) => Number.parseInt(component, 16) / 255);\n}\n\nexport const Color = Object.freeze({\n /**\n * `#rgb`, `#rgba`, `#rrggbb` or `#rrggbbaa` to a colour. Alpha defaults to 1\n * when the string carries none. The three- and four-digit shorthands are\n * accepted because CSS accepts them and hand-written palettes use them;\n * anything else throws, since a colour that silently parses to black is the\n * failure this whole ruling exists to remove.\n */\n fromHex(value: string): Color {\n if (!HEX.test(value))\n throw new TypeError(\n `color/invalid-hex: ${value} is not #rgb, #rgba, #rrggbb or #rrggbbaa`,\n );\n const components = expand(value.slice(1));\n return [\n components[0]!,\n components[1]!,\n components[2]!,\n components[3] ?? 1,\n ] as const;\n },\n\n /** Whether `fromHex` would accept this string. */\n isHex(value: unknown): value is string {\n return typeof value === \"string\" && HEX.test(value);\n },\n\n /**\n * `#rrggbb`, or `#rrggbbaa` with `includeAlpha`. The default drops alpha\n * because eight-digit hex is CSS Color 4 and plotter and vector-editor\n * software of the kind this library exists to feed does not read it. Callers\n * that need the alpha to survive emit it as a separate opacity, which is what\n * the SVG writer does.\n */\n toHex(color: Color, includeAlpha = false): string {\n return `#${pair(color[0])}${pair(color[1])}${pair(color[2])}${\n includeAlpha ? pair(color[3]) : \"\"\n }`;\n },\n\n /**\n * A CSS colour: `rgb(255, 128, 0)`, or `rgba(255, 128, 0, 0.5)` when alpha is\n * below 1. The legacy comma forms rather than the modern space-separated\n * ones, for the same compatibility reason `toHex` drops alpha by default.\n */\n toString(color: Color): string {\n const channels = `${byte(color[0])}, ${byte(color[1])}, ${byte(color[2])}`;\n return clamp(color[3]) >= 1\n ? `rgb(${channels})`\n : `rgba(${channels}, ${unit(color[3])})`;\n },\n\n /** Alpha on its own, for a renderer that carries opacity separately. */\n alpha(color: Color): number {\n return clamp(color[3]);\n },\n\n /** The same colour at full alpha. */\n opaque(color: Color): Color {\n return [clamp(color[0]), clamp(color[1]), clamp(color[2]), 1] as const;\n },\n\n /**\n * Four unit components from anything indexable, clamping and defaulting a\n * missing alpha to 1. The reader for a `Cd` attribute's flat array, and the\n * one place that decides what an under-sized colour means.\n */\n fromComponents(\n components: ArrayLike<number>,\n offset = 0,\n size = 4,\n ): Color {\n const at = (component: number) =>\n component < size ? clamp(components[offset + component] ?? 0) : 0;\n return [at(0), at(1), at(2), size < 4 ? 1 : at(3)] as const;\n },\n});\n", "/**\n * The `geometry` core type: one attribute table with four addressing levels.\n *\n * Houdini's model without the pointers. A geometry holds points, vertices,\n * primitives and one detail record, and every named attribute lives at one of\n * those levels as a flat parallel array. The value of the type is the number of\n * operations that understand it, so it is deliberately one type rather than a\n * family of them: a point cloud is a geometry whose primitive count is zero,\n * and a bundle of strokes is a geometry whose points are covered by primitives.\n * There is nothing to convert between the two.\n *\n * Three forms live here:\n *\n * `Geometry` is the in-memory form over typed arrays. Struct-of-arrays rather\n * than array-of-structs, because the runtime's clone path copies nested plain\n * arrays element by element and passes typed arrays through by reference, and\n * because copy-on-write needs a granularity to share at.\n *\n * `GeometryJson` is the plain-array interchange form, for `.cascade` document\n * literals and the Python bridge. Verbose on purpose and JSON-safe. It is\n * lossless in both directions, including f64 precision, because JSON numbers\n * are doubles and JavaScript prints the shortest round-trippable form.\n *\n * `GeometryFileRef` is the out-of-band form, following `ImageRef`: a path plus\n * the metadata a consumer needs before it opens the file. It exists from day\n * one because it is already in production and undeclared, as the Python\n * stipple stage returns an `.npy` path on a `points`-typed port and the next\n * stage reads it back. Resolving a ref into a `Geometry` needs host IO and so\n * belongs to a host capability, exactly as reading `ImageRef` pixels does;\n * neither contracts nor the runtime does it.\n *\n * ## Immutability\n *\n * A `Geometry` is frozen and every operation returns a new one, sharing the\n * typed arrays it did not touch. `freezeGeometry` freezes the plain objects\n * that hold the structure, and it cannot freeze the arrays themselves:\n * `Object.freeze` on a non-empty typed array throws, because a typed array's\n * elements are not configurable properties.\n *\n * So the copy-on-write guarantee is a convention this module keeps and the\n * language cannot enforce, and there is one live interaction worth knowing\n * about. `cloneValue` in `packages/runtime/src/runtime.ts`, the deep clone\n * behind `snapshot`, returns any non-array object whose prototype is neither\n * `Object.prototype` nor `null` by reference, uncloned and unfrozen. A\n * `Geometry` is a plain object, so a snapshot of one is a fresh outer graph\n * whose typed arrays are still the originals, shared with the value the node\n * emitted. That makes emitting a geometry very cheap and it means the\n * \"inspection and output values are immutable snapshots\" guarantee in\n * ARCHITECTURE.md holds for the structure and not for the sample data. Nothing\n * here relies on the runtime changing: operations never write into an input's\n * array, and node code should reach for the read helpers and the builder rather\n * than an attribute's `data` directly. Do not write into an array you did not\n * allocate.\n */\n\n/** Position attribute name, by convention rather than by privilege. */\nexport const POSITION_ATTRIBUTE = \"P\";\n\nexport const ATTRIBUTE_LEVELS = [\n \"point\",\n \"vertex\",\n \"primitive\",\n \"detail\",\n] as const;\n\n/** Where an attribute lives. `detail` holds one value per name, not an array. */\nexport type AttributeLevel = (typeof ATTRIBUTE_LEVELS)[number];\n\n/** The three levels that are indexed by element number. */\nexport type ElementLevel = \"point\" | \"vertex\" | \"primitive\";\n\n/**\n * How an attribute's values are stored. `f64` is the default for positions,\n * because the existing Python bridge already writes points as float64 `.npy`\n * and emits full-precision doubles in JSON, while it explicitly casts raster\n * fields to float32. Narrowing positions to f32 would save 1.4 MB on a\n * 170,000-vertex cook and add a lossy step to a boundary that is lossless\n * today.\n */\nexport type AttributeStorage = \"f32\" | \"f64\" | \"i32\" | \"u8\";\n\nexport type AttributeArray =\n Float64Array | Float32Array | Int32Array | Uint8Array;\n\n/**\n * One numeric attribute: a component count and a flat parallel array of\n * `size * elementCount` values, indexed by element number at its level.\n */\nexport interface Attribute {\n readonly storage: AttributeStorage;\n /** Components per element. `P` is 2 or 3, `Cd` is 4, `width` is 1. */\n readonly size: number;\n readonly data: AttributeArray;\n}\n\n/**\n * String attributes are a separate shape because a typed array cannot hold\n * strings, and because Houdini's string attributes are indices into a table\n * rather than per-element strings. The table is usually tiny: `cloud-plots`\n * carries tags like `FORM_04` that repeat across a whole set.\n */\nexport interface StringAttribute {\n readonly storage: \"string\";\n readonly size: 1;\n readonly table: readonly string[];\n /** Index into `table`, or -1 for the empty string. */\n readonly data: Int32Array;\n}\n\nexport type AnyAttribute = Attribute | StringAttribute;\nexport type AttributeSet = Readonly<Record<string, AnyAttribute>>;\n\n/** A detail value. One per name, for bounds, a seed, a page size, a name. */\nexport type DetailValue = number | string | readonly number[];\nexport type DetailSet = Readonly<Record<string, DetailValue>>;\n\nexport const PRIMITIVE_KINDS = [\"poly\", \"bezier\", \"mesh\", \"packed\"] as const;\n\n/**\n * Primitive kinds. A kind does not change what a primitive is made of: every\n * primitive is a run of vertices over the same point list. It selects **how\n * that run is interpolated**, which is why curves need no second geometry type\n * and no parallel container, and why an operation that only reads positions\n * keeps working when a curve arrives.\n *\n * Marcus, 2026-09-04, ruling on the plan's open question about curves:\n * *\"No, we want curves + polylines; very similar but different\n * interpolations.\"*\n *\n * `poly` \u2014 the run is interpolated linearly. Vertex count is the point count of\n * the outline, and `closed` adds the segment from the last vertex back to the\n * first without repeating a vertex.\n *\n * `bezier` \u2014 the run is a chain of cubic B\u00E9zier segments in SVG's own order:\n * anchor, handle, handle, anchor, handle, handle, anchor, and so on. An open\n * primitive therefore has `3n + 1` vertices for `n` segments; a closed one has\n * `3n`, its final two handles belonging to the segment that returns to the\n * first anchor. This is the form a print or plotter pipeline actually wants,\n * and it is affine-invariant, so `Transform` and `CopyToPoints` are exactly\n * right on a curve without knowing it is one.\n *\n * `mesh` and `packed` are declared and unused, so that adding them later is a\n * new case in a switch rather than a change to the document format. The list is\n * deliberately open-ended rather than a closed pair: a volume is a primitive\n * kind in Houdini and will be one here, which is the direction the plan records.\n *\n * Operations that measure along a primitive (arc length, resampling) are\n * linear-only today and must refuse a `bezier` rather than read its handles as\n * vertices, which would produce a subtly wrong shape instead of an error.\n */\nexport type PrimitiveKind = (typeof PRIMITIVE_KINDS)[number];\n\n/** Vertices per cubic B\u00E9zier segment after the first anchor. */\nexport const BEZIER_STRIDE = 3;\n\n/**\n * Primitive topology, CSR-style: `vertexPoints` is the flat vertex-to-point\n * table and `offsets` slices it per primitive. Vertex `v` of primitive `i` is\n * `vertexPoints[offsets[i] + v]`, and `offsets` has `primitiveCount + 1`\n * entries so the last primitive's extent needs no special case. A geometry\n * with no primitives still has a one-entry `offsets` of `[0]`.\n *\n * Keeping vertices as their own addressable level is what makes a per-corner\n * value possible at all: two primitives meeting at a corner share one point and\n * have two vertices, so a discontinuity across the seam is a vertex attribute\n * while the shared position stays a point attribute.\n */\nexport interface Topology {\n readonly vertexPoints: Int32Array;\n readonly offsets: Int32Array;\n /** Index into `PRIMITIVE_KINDS`, one per primitive. */\n readonly kinds: Uint8Array;\n /**\n * 1 when the primitive's last vertex connects back to its first. Separate\n * from `kinds` because open and closed polygons are the same kind of thing\n * and every 2D operation cares about the difference.\n */\n readonly closed: Uint8Array;\n}\n\n/**\n * A named subset at one level, as a bitmask rather than an index list because\n * membership is tested far more often than it is enumerated.\n */\nexport type Groups = Readonly<Record<string, Uint8Array>>;\n\nexport interface Geometry {\n readonly kind: \"geometry\";\n readonly pointCount: number;\n readonly vertexCount: number;\n readonly primitiveCount: number;\n readonly topology: Topology;\n /** Always contains `P` with a `size` of 2 or 3. */\n readonly point: AttributeSet;\n readonly vertex: AttributeSet;\n readonly primitive: AttributeSet;\n readonly detail: DetailSet;\n readonly pointGroups: Groups;\n readonly primitiveGroups: Groups;\n}\n\n/** The plain-array attribute forms used by `GeometryJson`. */\nexport interface NumericAttributeJson {\n readonly storage: AttributeStorage;\n readonly size: number;\n readonly data: readonly number[];\n}\nexport interface StringAttributeJson {\n readonly storage: \"string\";\n readonly size?: 1;\n readonly table: readonly string[];\n readonly data: readonly number[];\n}\nexport type AttributeJson = NumericAttributeJson | StringAttributeJson;\nexport type AttributeSetJson = Readonly<Record<string, AttributeJson>>;\n\nexport interface TopologyJson {\n readonly vertexPoints: readonly number[];\n readonly offsets: readonly number[];\n /** Omitted when every primitive is a `poly`. */\n readonly kinds?: readonly number[];\n /** Omitted when no primitive is closed. */\n readonly closed?: readonly number[];\n}\n\n/**\n * The wire and document form. Plain arrays, JSON-safe, lossless. Verbose by\n * design: a `.cascade` literal is authored by hand or by a small generator, and\n * human-readable beats compact at that size. Groups are index lists here rather\n * than masks, because a mask spelled out as JSON is mostly zeroes. Bulk\n * geometry belongs in a `GeometryFileRef` instead.\n */\nexport interface GeometryJson {\n readonly kind: \"geometry\";\n /** Required, because a geometry may carry points that no attribute sizes. */\n readonly pointCount: number;\n readonly point?: AttributeSetJson;\n readonly vertex?: AttributeSetJson;\n readonly primitive?: AttributeSetJson;\n readonly detail?: Readonly<Record<string, DetailValue>>;\n readonly topology?: TopologyJson;\n readonly pointGroups?: Readonly<Record<string, readonly number[]>>;\n readonly primitiveGroups?: Readonly<Record<string, readonly number[]>>;\n}\n\n/**\n * An out-of-band geometry, referenced the way `ImageRef` references pixels.\n * `attribute` describes what a bare array file carries, and it is never\n * inferred: a three-component `.npy` means `(x, y, radius)` in `cloud-plots`\n * and would mean `(x, y, z)` under a 3D reading, and nothing in the file\n * distinguishes them.\n */\nexport interface GeometryFileRef {\n readonly kind: \"geometry-file\";\n readonly path: string;\n readonly format: \"npy\" | \"json\";\n readonly attribute?: {\n readonly level: ElementLevel;\n readonly name: string;\n readonly size: number;\n readonly storage: AttributeStorage;\n };\n readonly pointCount?: number;\n readonly primitiveCount?: number;\n}\n\n/** What a `geometry`-typed default, document literal, or bridge value may be. */\nexport type GeometrySerialized = GeometryJson | GeometryFileRef;\n\nconst STORAGES = new Set<string>([\"f32\", \"f64\", \"i32\", \"u8\"]);\nconst NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst RESERVED_NAMES = new Set([\"__proto__\", \"prototype\", \"constructor\"]);\nfunction fail(code: string, message: string): never {\n throw new TypeError(`geometry/${code}: ${message}`);\n}\n\nfunction emptyTopology(): Topology {\n return {\n vertexPoints: new Int32Array(0),\n offsets: Int32Array.of(0),\n kinds: new Uint8Array(0),\n closed: new Uint8Array(0),\n };\n}\n\nfunction arrayType(storage: AttributeStorage) {\n if (storage === \"f64\") return Float64Array;\n if (storage === \"f32\") return Float32Array;\n if (storage === \"i32\") return Int32Array;\n return Uint8Array;\n}\n\nfunction validStoredNumber(storage: AttributeStorage, value: number): boolean {\n if (!Number.isFinite(value)) return false;\n if (storage === \"f64\" || storage === \"f32\") return true;\n if (!Number.isInteger(value)) return false;\n return storage === \"u8\"\n ? value >= 0 && value <= 255\n : value >= -2147483648 && value <= 2147483647;\n}\n\n/** Allocate a zeroed array for a storage kind. */\nexport function attributeArray(\n storage: AttributeStorage,\n length: number,\n): AttributeArray {\n if (!Number.isSafeInteger(length) || length < 0)\n fail(\"attribute-length\", \"attribute array length must be a non-negative safe integer\");\n if (storage === \"f64\") return new Float64Array(length);\n if (storage === \"f32\") return new Float32Array(length);\n if (storage === \"i32\") return new Int32Array(length);\n return new Uint8Array(length);\n}\n\n/** Copy values into a fresh array of a storage kind. */\nexport function attributeArrayFrom(\n storage: AttributeStorage,\n values: ArrayLike<number>,\n): AttributeArray {\n const array = attributeArray(storage, values.length);\n for (let index = 0; index < values.length; index += 1) {\n const value = values[index]!;\n if (!validStoredNumber(storage, value))\n fail(\n \"attribute-value\",\n `${String(value)} cannot be represented as ${storage}`,\n );\n array[index] = value;\n if (!Number.isFinite(array[index]))\n fail(\"attribute-value\", `${String(value)} overflows ${storage}`);\n }\n return array;\n}\n\n/** A plain-number copy of an attribute array, for the interchange form. */\nexport function attributeNumbers(data: AttributeArray): number[] {\n const result = new Array<number>(data.length);\n for (let index = 0; index < data.length; index += 1)\n result[index] = data[index]!;\n return result;\n}\n\nexport function isStringAttribute(\n attribute: AnyAttribute,\n): attribute is StringAttribute {\n return attribute.storage === \"string\";\n}\n\n/** How many elements an attribute covers, from its own arrays alone. */\nexport function attributeElementCount(attribute: AnyAttribute): number {\n return isStringAttribute(attribute)\n ? attribute.data.length\n : attribute.data.length / attribute.size;\n}\n\n/** The number of elements at a level, or 1 for `detail`. */\nexport function levelCount(geometry: Geometry, level: AttributeLevel): number {\n if (level === \"point\") return geometry.pointCount;\n if (level === \"vertex\") return geometry.vertexCount;\n if (level === \"primitive\") return geometry.primitiveCount;\n return 1;\n}\n\nfunction checkName(name: string, path: string): void {\n if (!NAME.test(name) || RESERVED_NAMES.has(name))\n fail(\"invalid-name\", `${path}.${name} is not a valid attribute name`);\n}\n\nfunction checkAttributeSet(\n set: AttributeSet,\n count: number,\n level: ElementLevel,\n): void {\n for (const [name, attribute] of Object.entries(set)) {\n checkName(name, level);\n if (isStringAttribute(attribute)) {\n if (!(attribute.data instanceof Int32Array))\n fail(\"attribute-storage\", `${level}.${name} string indices must be Int32Array`);\n if (attribute.size !== 1)\n fail(\"string-size\", `${level}.${name} string attributes have size 1`);\n if (attribute.data.length !== count)\n fail(\n \"attribute-length\",\n `${level}.${name} has ${attribute.data.length} entries for ${count} elements`,\n );\n for (const index of attribute.data)\n if (index < -1 || index >= attribute.table.length)\n fail(\n \"string-index\",\n `${level}.${name} references table entry ${index}`,\n );\n if (!Array.isArray(attribute.table) || attribute.table.some((item) => typeof item !== \"string\"))\n fail(\"string-table\", `${level}.${name} needs a string table`);\n continue;\n }\n if (!Number.isInteger(attribute.size) || attribute.size < 1)\n fail(\"attribute-size\", `${level}.${name} needs a size of at least 1`);\n if (!STORAGES.has(attribute.storage))\n fail(\n \"attribute-storage\",\n `${level}.${name} has an unknown storage ${String(attribute.storage)}`,\n );\n if (!(attribute.data instanceof arrayType(attribute.storage)))\n fail(\n \"attribute-storage\",\n `${level}.${name} declares ${attribute.storage} but uses ${attribute.data?.constructor?.name ?? \"unknown storage\"}`,\n );\n if (attribute.data.length !== attribute.size * count)\n fail(\n \"attribute-length\",\n `${level}.${name} has ${attribute.data.length} values for ${count} elements of size ${attribute.size}`,\n );\n for (const value of attribute.data)\n if (!Number.isFinite(value))\n fail(\"non-finite\", `${level}.${name} contains ${String(value)}`);\n }\n}\n\nfunction checkGroups(groups: Groups, count: number, level: string): void {\n for (const [name, mask] of Object.entries(groups)) {\n checkName(name, level);\n if (mask.length !== count)\n fail(\n \"group-length\",\n `${level}.${name} covers ${mask.length} of ${count} elements`,\n );\n for (const member of mask)\n if (member !== 0 && member !== 1)\n fail(\"group-mask\", `${level}.${name} contains ${member}; masks contain only 0 or 1`);\n }\n}\n\nexport interface GeometryParts {\n readonly pointCount: number;\n readonly point: AttributeSet;\n readonly vertex?: AttributeSet;\n readonly primitive?: AttributeSet;\n readonly detail?: DetailSet;\n readonly topology?: Topology;\n readonly pointGroups?: Groups;\n readonly primitiveGroups?: Groups;\n}\n\n/**\n * The validating constructor. Every invariant the operations rely on is checked\n * here once, so that no operation has to defend against a malformed input, and\n * the result is frozen.\n *\n * This is the one piece of logic contracts owns for this type, because the\n * codec below has to build a `Geometry` and a type whose invariants are\n * enforced somewhere else is a type whose invariants are optional.\n */\nexport function createGeometry(parts: GeometryParts): Geometry {\n const pointCount = parts.pointCount;\n if (!Number.isSafeInteger(pointCount) || pointCount < 0)\n fail(\"point-count\", \"pointCount must be a non-negative safe integer\");\n const topology = parts.topology ?? emptyTopology();\n if (\n !(topology.vertexPoints instanceof Int32Array) ||\n !(topology.offsets instanceof Int32Array) ||\n !(topology.kinds instanceof Uint8Array) ||\n !(topology.closed instanceof Uint8Array)\n )\n fail(\"topology-storage\", \"topology uses Int32Array indices and Uint8Array flags\");\n const primitiveCount = topology.offsets.length - 1;\n if (primitiveCount < 0)\n fail(\"offsets\", \"topology.offsets needs primitiveCount + 1 entries\");\n if (topology.offsets[0] !== 0)\n fail(\"offsets\", \"topology.offsets starts at 0\");\n for (let index = 1; index <= primitiveCount; index += 1)\n if (topology.offsets[index]! < topology.offsets[index - 1]!)\n fail(\"offsets\", \"topology.offsets must not decrease\");\n const vertexCount = topology.offsets[primitiveCount]!;\n if (vertexCount !== topology.vertexPoints.length)\n fail(\n \"offsets\",\n `topology.offsets ends at ${vertexCount} for ${topology.vertexPoints.length} vertices`,\n );\n if (\n topology.kinds.length !== primitiveCount ||\n topology.closed.length !== primitiveCount\n )\n fail(\n \"topology-length\",\n `topology.kinds and topology.closed need ${primitiveCount} entries`,\n );\n for (const point of topology.vertexPoints)\n if (point < 0 || point >= pointCount)\n fail(\"vertex-point\", `vertex references point ${point}`);\n for (const kind of topology.kinds)\n if (kind >= PRIMITIVE_KINDS.length)\n fail(\"primitive-kind\", `unknown primitive kind ${kind}`);\n for (const closed of topology.closed)\n if (closed !== 0 && closed !== 1)\n fail(\"closed-mask\", `topology.closed contains ${closed}; flags contain only 0 or 1`);\n // A B\u00E9zier chain's vertex count is not free: the handles are vertices too, so\n // an arity mistake here is a malformed curve that every later operation would\n // read as a valid one.\n const bezier = PRIMITIVE_KINDS.indexOf(\"bezier\");\n for (let index = 0; index < primitiveCount; index += 1) {\n if (topology.kinds[index] !== bezier) continue;\n const count = topology.offsets[index + 1]! - topology.offsets[index]!;\n const closed = topology.closed[index] === 1;\n const minimum = closed ? BEZIER_STRIDE : BEZIER_STRIDE + 1;\n if (count < minimum || (count - (closed ? 0 : 1)) % BEZIER_STRIDE !== 0)\n fail(\n \"bezier-arity\",\n `primitive ${index} has ${count} vertices, and a ${closed ? \"closed\" : \"open\"} bezier needs ${closed ? \"3n\" : \"3n + 1\"}`,\n );\n }\n\n const point = parts.point;\n const position = point[POSITION_ATTRIBUTE];\n if (position === undefined)\n fail(\"missing-position\", \"point.P is required on every geometry\");\n if (isStringAttribute(position))\n fail(\"position-storage\", \"point.P must be a numeric attribute\");\n if (position.size !== 2 && position.size !== 3)\n fail(\"position-size\", \"point.P must have a size of 2 or 3\");\n\n checkAttributeSet(point, pointCount, \"point\");\n const vertex = parts.vertex ?? {};\n checkAttributeSet(vertex, vertexCount, \"vertex\");\n const primitive = parts.primitive ?? {};\n checkAttributeSet(primitive, primitiveCount, \"primitive\");\n const pointGroups = parts.pointGroups ?? {};\n checkGroups(pointGroups, pointCount, \"pointGroups\");\n const primitiveGroups = parts.primitiveGroups ?? {};\n checkGroups(primitiveGroups, primitiveCount, \"primitiveGroups\");\n const detail = parts.detail ?? {};\n for (const [name, value] of Object.entries(detail)) {\n checkName(name, \"detail\");\n if (typeof value === \"number\") {\n if (!Number.isFinite(value))\n fail(\"non-finite\", `detail.${name} contains ${String(value)}`);\n } else if (typeof value !== \"string\") {\n if (!Array.isArray(value) || value.some((item) => !Number.isFinite(item)))\n fail(\"detail-value\", `detail.${name} must be a finite number, string, or finite number array`);\n }\n }\n\n return freezeGeometry({\n kind: \"geometry\",\n pointCount,\n vertexCount,\n primitiveCount,\n topology,\n point,\n vertex,\n primitive,\n detail,\n pointGroups,\n primitiveGroups,\n });\n}\n\n/**\n * Freeze the plain objects that describe a geometry. The typed arrays are left\n * alone because `Object.freeze` throws on a non-empty array buffer view, which\n * is why the copy-on-write rule above is a convention rather than a guarantee.\n */\nexport function freezeGeometry(geometry: Geometry): Geometry {\n for (const level of [\"point\", \"vertex\", \"primitive\"] as const) {\n const set = geometry[level];\n for (const attribute of Object.values(set)) {\n if (isStringAttribute(attribute)) Object.freeze(attribute.table);\n Object.freeze(attribute);\n }\n Object.freeze(set);\n }\n Object.freeze(geometry.topology);\n for (const value of Object.values(geometry.detail))\n if (Array.isArray(value)) Object.freeze(value);\n Object.freeze(geometry.detail);\n Object.freeze(geometry.pointGroups);\n Object.freeze(geometry.primitiveGroups);\n return Object.freeze(geometry);\n}\n\n/** An empty geometry with a declared position width and no points. */\nexport function emptyGeometry(positionSize: 2 | 3 = 2): Geometry {\n return createGeometry({\n pointCount: 0,\n point: {\n [POSITION_ATTRIBUTE]: {\n storage: \"f64\",\n size: positionSize,\n data: new Float64Array(0),\n },\n },\n });\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction finiteNumbers(value: unknown): value is readonly number[] {\n return (\n Array.isArray(value) &&\n value.every((item) => typeof item === \"number\" && Number.isFinite(item))\n );\n}\n\nfunction toJsonAttribute(attribute: AnyAttribute): AttributeJson {\n if (isStringAttribute(attribute))\n return {\n storage: \"string\",\n size: 1,\n table: [...attribute.table],\n data: Array.from(attribute.data),\n };\n const data = attributeNumbers(attribute.data);\n for (const item of data)\n if (!Number.isFinite(item))\n fail(\"non-finite\", \"geometry attribute values must be finite\");\n return { storage: attribute.storage, size: attribute.size, data };\n}\n\nfunction toJsonAttributeSet(set: AttributeSet): AttributeSetJson | undefined {\n const names = Object.keys(set);\n if (names.length === 0) return undefined;\n const result: Record<string, AttributeJson> = {};\n for (const name of names) result[name] = toJsonAttribute(set[name]!);\n return result;\n}\n\nfunction groupsToJson(\n groups: Groups,\n): Readonly<Record<string, readonly number[]>> | undefined {\n const names = Object.keys(groups);\n if (names.length === 0) return undefined;\n const result: Record<string, readonly number[]> = {};\n for (const name of names) {\n const mask = groups[name]!;\n const indices: number[] = [];\n for (let index = 0; index < mask.length; index += 1)\n if (mask[index]) indices.push(index);\n result[name] = indices;\n }\n return result;\n}\n\n/** In-memory to interchange. Lossless, and JSON-safe. */\nexport function geometryToJson(geometry: Geometry): GeometryJson {\n const json: {\n kind: \"geometry\";\n pointCount: number;\n point?: AttributeSetJson;\n vertex?: AttributeSetJson;\n primitive?: AttributeSetJson;\n detail?: Readonly<Record<string, DetailValue>>;\n topology?: TopologyJson;\n pointGroups?: Readonly<Record<string, readonly number[]>>;\n primitiveGroups?: Readonly<Record<string, readonly number[]>>;\n } = { kind: \"geometry\", pointCount: geometry.pointCount };\n const point = toJsonAttributeSet(geometry.point);\n if (point) json.point = point;\n const vertex = toJsonAttributeSet(geometry.vertex);\n if (vertex) json.vertex = vertex;\n const primitive = toJsonAttributeSet(geometry.primitive);\n if (primitive) json.primitive = primitive;\n if (Object.keys(geometry.detail).length > 0) {\n const detail: Record<string, DetailValue> = {};\n for (const [name, value] of Object.entries(geometry.detail))\n detail[name] = Array.isArray(value) ? [...value] : value;\n json.detail = detail;\n }\n if (geometry.primitiveCount > 0) {\n const topology: {\n vertexPoints: readonly number[];\n offsets: readonly number[];\n kinds?: readonly number[];\n closed?: readonly number[];\n } = {\n vertexPoints: Array.from(geometry.topology.vertexPoints),\n offsets: Array.from(geometry.topology.offsets),\n };\n if (geometry.topology.kinds.some((kind) => kind !== 0))\n topology.kinds = Array.from(geometry.topology.kinds);\n if (geometry.topology.closed.some((closed) => closed !== 0))\n topology.closed = Array.from(geometry.topology.closed);\n json.topology = topology;\n }\n const pointGroups = groupsToJson(geometry.pointGroups);\n if (pointGroups) json.pointGroups = pointGroups;\n const primitiveGroups = groupsToJson(geometry.primitiveGroups);\n if (primitiveGroups) json.primitiveGroups = primitiveGroups;\n return json;\n}\n\nfunction fromJsonAttributeSet(\n raw: AttributeSetJson | undefined,\n level: ElementLevel,\n): AttributeSet {\n if (raw === undefined) return {};\n const result: Record<string, AnyAttribute> = {};\n for (const [name, attribute] of Object.entries(raw)) {\n if (!isRecord(attribute))\n fail(\"attribute-shape\", `${level}.${name} must be an object`);\n if (attribute.storage === \"string\") {\n const table = attribute.table;\n if (\n !Array.isArray(table) ||\n table.some((item) => typeof item !== \"string\")\n )\n fail(\"string-table\", `${level}.${name} needs a string table`);\n if (!int32Numbers(attribute.data))\n fail(\"attribute-data\", `${level}.${name} needs 32-bit integer indices`);\n result[name] = {\n storage: \"string\",\n size: 1,\n table: [...(table as readonly string[])],\n data: Int32Array.from(attribute.data),\n };\n continue;\n }\n if (\n typeof attribute.storage !== \"string\" ||\n !STORAGES.has(attribute.storage)\n )\n fail(\n \"attribute-storage\",\n `${level}.${name} has an unknown storage ${String(attribute.storage)}`,\n );\n if (!finiteNumbers(attribute.data))\n fail(\"attribute-data\", `${level}.${name} needs finite numeric data`);\n const size = attribute.size;\n if (typeof size !== \"number\" || !Number.isInteger(size) || size < 1)\n fail(\"attribute-size\", `${level}.${name} needs a size of at least 1`);\n result[name] = {\n storage: attribute.storage as AttributeStorage,\n size,\n data: attributeArrayFrom(\n attribute.storage as AttributeStorage,\n attribute.data,\n ),\n };\n }\n return result;\n}\n\nfunction groupsFromJson(\n raw: Readonly<Record<string, readonly number[]>> | undefined,\n count: number,\n level: string,\n): Groups {\n if (raw === undefined) return {};\n const result: Record<string, Uint8Array> = {};\n for (const [name, indices] of Object.entries(raw)) {\n if (!finiteNumbers(indices))\n fail(\"group-indices\", `${level}.${name} must be a list of indices`);\n const mask = new Uint8Array(count);\n for (const index of indices) {\n if (!Number.isInteger(index) || index < 0 || index >= count)\n fail(\"group-indices\", `${level}.${name} references element ${index}`);\n mask[index] = 1;\n }\n result[name] = mask;\n }\n return result;\n}\n\n/** Interchange to in-memory. Throws a `geometry/*` TypeError on bad input. */\nexport function geometryFromJson(value: GeometryJson): Geometry {\n if (!isRecord(value) || value.kind !== \"geometry\")\n fail(\"not-geometry\", \"a geometry literal needs kind: 'geometry'\");\n const pointCount = value.pointCount;\n if (!Number.isSafeInteger(pointCount) || pointCount < 0)\n fail(\"point-count\", \"pointCount must be a non-negative safe integer\");\n const rawTopology = value.topology;\n let topology = emptyTopology();\n if (rawTopology !== undefined) {\n if (!isRecord(rawTopology))\n fail(\"topology-shape\", \"topology must be an object\");\n if (\n !int32Numbers(rawTopology.vertexPoints) ||\n !int32Numbers(rawTopology.offsets)\n )\n fail(\"topology-shape\", \"topology needs vertexPoints and offsets\");\n const primitiveCount = rawTopology.offsets.length - 1;\n if (primitiveCount < 0)\n fail(\"offsets\", \"topology.offsets needs primitiveCount + 1 entries\");\n const kinds = rawTopology.kinds;\n const closed = rawTopology.closed;\n if (kinds !== undefined && !byteNumbers(kinds))\n fail(\"topology-shape\", \"topology.kinds must be numeric\");\n if (closed !== undefined && (!byteNumbers(closed) || closed.some((item) => item !== 0 && item !== 1)))\n fail(\"topology-shape\", \"topology.closed must be numeric\");\n topology = {\n vertexPoints: Int32Array.from(rawTopology.vertexPoints),\n offsets: Int32Array.from(rawTopology.offsets),\n kinds:\n kinds === undefined\n ? new Uint8Array(primitiveCount)\n : Uint8Array.from(kinds),\n closed:\n closed === undefined\n ? new Uint8Array(primitiveCount)\n : Uint8Array.from(closed),\n };\n }\n const detail: Record<string, DetailValue> = {};\n for (const [name, item] of Object.entries(value.detail ?? {})) {\n if (typeof item === \"number\" || typeof item === \"string\")\n detail[name] = item;\n else if (finiteNumbers(item)) detail[name] = [...item];\n else\n fail(\n \"detail-value\",\n `detail.${name} must be a number, string, or number array`,\n );\n }\n return createGeometry({\n pointCount,\n point: fromJsonAttributeSet(value.point, \"point\"),\n vertex: fromJsonAttributeSet(value.vertex, \"vertex\"),\n primitive: fromJsonAttributeSet(value.primitive, \"primitive\"),\n detail,\n topology,\n pointGroups: groupsFromJson(value.pointGroups, pointCount, \"pointGroups\"),\n primitiveGroups: groupsFromJson(\n value.primitiveGroups,\n topology.offsets.length - 1,\n \"primitiveGroups\",\n ),\n });\n}\n\n/**\n * Validate an interchange value against the same constructor used to decode it.\n * Keeping a second structural validator here previously accepted bad attribute\n * lengths, fractional topology indices and out-of-range groups.\n */\nexport function isGeometryJson(value: unknown): value is GeometryJson {\n try {\n geometryFromJson(value as GeometryJson);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function isGeometryFileRef(value: unknown): value is GeometryFileRef {\n if (!isRecord(value) || value.kind !== \"geometry-file\") return false;\n if (typeof value.path !== \"string\" || value.path.length === 0) return false;\n if (value.format !== \"npy\" && value.format !== \"json\") return false;\n if (value.format === \"npy\" && value.attribute === undefined) return false;\n if (value.attribute !== undefined) {\n const attribute = value.attribute;\n if (!isRecord(attribute)) return false;\n if (\n attribute.level !== \"point\" &&\n attribute.level !== \"vertex\" &&\n attribute.level !== \"primitive\"\n )\n return false;\n if (\n typeof attribute.name !== \"string\" ||\n !NAME.test(attribute.name) ||\n RESERVED_NAMES.has(attribute.name)\n )\n return false;\n if (\n typeof attribute.size !== \"number\" ||\n !Number.isInteger(attribute.size) ||\n attribute.size < 1\n )\n return false;\n if (\n typeof attribute.storage !== \"string\" ||\n !STORAGES.has(attribute.storage)\n )\n return false;\n }\n for (const key of [\"pointCount\", \"primitiveCount\"] as const) {\n const count = value[key];\n if (\n count !== undefined &&\n (typeof count !== \"number\" || !Number.isSafeInteger(count) || count < 0)\n )\n return false;\n }\n return true;\n}\n\n/** Either serialized form is a valid `geometry` document value or default. */\nexport function isGeometrySerialized(\n value: unknown,\n): value is GeometrySerialized {\n return isGeometryJson(value) || isGeometryFileRef(value);\n}\n\n/**\n * Lift a bare path into a declared reference. The Python bridge returns a path\n * string today, and this is the one place that knows how to read an extension;\n * `attribute` is never guessed, because the third component of a points file\n * means radius in one project and z in another.\n */\nexport function geometryFileRefFromPath(\n path: string,\n options: Omit<GeometryFileRef, \"kind\" | \"path\" | \"format\"> = {},\n): GeometryFileRef {\n const lower = path.toLowerCase();\n const format = lower.endsWith(\".npy\")\n ? \"npy\"\n : lower.endsWith(\".json\")\n ? \"json\"\n : fail(\"unknown-format\", `cannot tell a geometry format from ${path}`);\n const ref = { kind: \"geometry-file\", path, format, ...options } as GeometryFileRef;\n if (!isGeometryFileRef(ref))\n fail(\"file-reference\", `${format} geometry reference is missing or has invalid metadata`);\n return ref;\n}\n\nfunction integerNumbers(value: unknown): value is readonly number[] {\n return finiteNumbers(value) && value.every(Number.isSafeInteger);\n}\n\nfunction int32Numbers(value: unknown): value is readonly number[] {\n return integerNumbers(value) && value.every((item) => item >= -2147483648 && item <= 2147483647);\n}\n\nfunction byteNumbers(value: unknown): value is readonly number[] {\n return integerNumbers(value) && value.every((item) => item >= 0 && item <= 255);\n}\n", "import type { Color } from \"./color.js\";\nimport type {\n Geometry,\n GeometryFileRef,\n GeometryJson,\n GeometrySerialized,\n} from \"./geometry.js\";\n\nexport const CORE_TYPES = [\n \"float\",\n \"int\",\n \"bool\",\n \"string\",\n \"vec2\",\n \"vec3\",\n \"vec4\",\n \"vec2i\",\n \"vec3i\",\n \"vec4i\",\n \"mat2\",\n \"mat3\",\n \"mat4\",\n \"image\",\n \"texture\",\n \"geometry\",\n \"points\",\n \"lines\",\n \"polyline\",\n \"mesh\",\n \"rects\",\n \"color\",\n \"asset\",\n \"array\",\n \"object\",\n \"any\",\n] as const;\n\nexport type CoreType = (typeof CORE_TYPES)[number];\nexport type NamespacedType = `${string}.${string}`;\nexport type CascadeType = CoreType | NamespacedType;\n\nconst TYPE_ALIASES: Readonly<Record<string, CoreType>> = {\n number: \"float\",\n boolean: \"bool\",\n curves: \"polyline\",\n};\n\nexport const IMPLICIT_TYPE_CONVERSIONS: Readonly<Record<string, readonly string[]>> = {\n int: [\"float\", \"string\"],\n float: [\"string\"],\n bool: [\"int\", \"float\", \"string\"],\n vec2i: [\"vec2\"],\n vec3i: [\"vec3\"],\n vec4i: [\"vec4\"],\n vec4: [\"color\"],\n color: [\"vec4\"],\n};\n\n/** Canonicalize compatibility spellings before validation or connection checks. */\nexport function normalizeCascadeType(type: string | undefined): string {\n if (!type) return \"any\";\n return TYPE_ALIASES[type] ?? type;\n}\n\n/** Shared widening rules for Studio, headless runtimes, and graph tooling. */\nexport function canConnectTypes(source: string, target: string): boolean {\n const from = normalizeCascadeType(source);\n const to = normalizeCascadeType(target);\n return (\n from === to ||\n from === \"any\" ||\n to === \"any\" ||\n (IMPLICIT_TYPE_CONVERSIONS[from]?.includes(to) ?? false)\n );\n}\nexport type JsonPrimitive = string | number | boolean | null;\nexport type JsonValue =\n JsonPrimitive | { readonly [key: string]: JsonValue } | readonly JsonValue[];\nexport type Vec2 = readonly [number, number];\nexport type Vec3 = readonly [number, number, number];\nexport type Vec4 = readonly [number, number, number, number];\nexport type Vec2i = Vec2;\nexport type Vec3i = Vec3;\nexport type Vec4i = Vec4;\nexport type Mat2 = readonly [number, number, number, number];\nexport type Mat3 = readonly [\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n];\nexport type Mat4 = readonly [\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n];\n\nexport interface ImageRef {\n readonly path: string;\n readonly size: Vec2i;\n readonly channels: \"r\" | \"a\" | \"rg\" | \"rgb\" | \"rgba\";\n readonly depth: \"u8\" | \"u16\" | \"f16\" | \"f32\";\n readonly space: \"srgb\" | \"linear\";\n}\n\ndeclare const textureHandleBrand: unique symbol;\nexport interface TextureHandle {\n readonly [textureHandleBrand]: true;\n}\nexport type Point =\n readonly [number, number] | readonly [number, number, number];\nexport interface PointSet {\n readonly points: readonly Point[];\n}\nexport type LineSegment = readonly [Point, Point];\nexport interface LineSegments {\n readonly segments: readonly LineSegment[];\n}\nexport interface Polyline {\n readonly points: readonly Point[];\n readonly closed?: boolean;\n readonly weight?: number;\n}\nexport interface Mesh {\n readonly positions: readonly number[];\n readonly indices: readonly number[];\n readonly normals?: readonly number[];\n readonly uvs?: readonly number[];\n}\nexport interface Rect {\n readonly x: number;\n readonly y: number;\n readonly width: number;\n readonly height: number;\n readonly tag?: string;\n}\nexport interface Rects {\n readonly rects: readonly Rect[];\n}\nexport interface AssetRef {\n readonly path: string;\n readonly mediaType?: string;\n}\nexport type SerializableValue =\n JsonValue | AssetRef | ImageRef | GeometryJson | GeometryFileRef;\n\nexport type ValueForType<T extends CascadeType> = T extends \"float\" | \"int\"\n ? number\n : T extends \"bool\"\n ? boolean\n : T extends \"string\"\n ? string\n : T extends \"vec2\"\n ? Vec2\n : T extends \"vec3\"\n ? Vec3\n : T extends \"vec4\"\n ? Vec4\n : T extends \"vec2i\"\n ? Vec2i\n : T extends \"vec3i\"\n ? Vec3i\n : T extends \"vec4i\"\n ? Vec4i\n : T extends \"mat2\"\n ? Mat2\n : T extends \"mat3\"\n ? Mat3\n : T extends \"mat4\"\n ? Mat4\n : T extends \"color\"\n ? Color\n : T extends \"image\"\n ? ImageRef\n : T extends \"texture\"\n ? TextureHandle\n : T extends \"geometry\"\n ? Geometry\n : T extends \"points\"\n ? PointSet\n : T extends \"lines\"\n ? LineSegments\n : T extends \"polyline\"\n ? Polyline\n : T extends \"mesh\"\n ? Mesh\n : T extends \"rects\"\n ? Rects\n : T extends \"asset\"\n ? AssetRef\n : T extends \"array\"\n ? readonly unknown[]\n : T extends \"object\"\n ? Readonly<\n Record<string, unknown>\n >\n : unknown;\n\nexport type SerializableValueForType<T extends CascadeType> =\n T extends \"texture\"\n ? never\n : T extends \"geometry\"\n ? GeometrySerialized\n : T extends \"array\"\n ? readonly JsonValue[]\n : T extends \"object\"\n ? Readonly<Record<string, JsonValue>>\n : T extends \"any\" | NamespacedType\n ? JsonValue\n : ValueForType<T>;\n", "import { isGeometrySerialized } from \"./geometry.js\";\nimport { CORE_TYPES, type JsonValue } from \"./values.js\";\nimport type { NodeCapabilityName } from \"./capabilities.js\";\nimport type { NodeDefinition, RuntimeEnvironment } from \"./definition.js\";\n\nexport interface Diagnostic {\n readonly phase: string;\n readonly code: string;\n readonly message: string;\n readonly path?: string;\n readonly file?: string;\n readonly line?: number;\n readonly column?: number;\n}\nconst IDENTIFIER = /^[A-Za-z][A-Za-z0-9_]*$/;\nconst NAMESPACED = /^[a-z][a-z0-9-]*(?:\\.[A-Za-z][A-Za-z0-9_]*)+$/;\nconst RESERVED = new Set([\"__proto__\", \"prototype\", \"constructor\"]);\nconst CORE = new Set<string>(CORE_TYPES);\nconst CONTROLS = new Set([\"number\", \"slider\", \"range\", \"int\", \"boolean\", \"text\", \"textarea\", \"select\", \"vector\", \"matrix\", \"color\", \"image\", \"asset\"]);\nconst ALLOWED: Record<RuntimeEnvironment, readonly NodeCapabilityName[]> = {\n portable: [\"assets\", \"media\"],\n browser: [\"assets\", \"media\", \"webgl\"],\n server: [\"files\", \"assets\", \"media\", \"python\", \"shell\"],\n};\nconst fields = (names: string) => new Set(names.split(\" \"));\nconst TOP_FIELDS = fields(\n \"apiVersion runsOn container capabilities label description icon inputs outputs props\",\n);\nconst DATA_FIELDS = fields(\n \"kind type default description variadic min max step accept control options\",\n);\nconst OUTPUT_FIELDS = fields(\"kind type description\");\nconst PROP_FIELDS = fields(\n \"type default label description min max step accept control options\",\n);\n\nfunction diagnostic(code: string, message: string, path?: string): Diagnostic {\n return { phase: \"definition\", code: `definition/${code}`, message, path };\n}\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\nfunction validType(type: unknown): type is string {\n return typeof type === \"string\" && (CORE.has(type) || NAMESPACED.test(type));\n}\nfunction finiteJson(value: unknown): value is JsonValue {\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\")\n return true;\n if (typeof value === \"number\") return Number.isFinite(value);\n if (Array.isArray(value)) return value.every(finiteJson);\n return isRecord(value) && Object.values(value).every(finiteJson);\n}\nfunction unknownFields(\n value: Record<string, unknown>,\n allowed: ReadonlySet<string>,\n path: string,\n): Diagnostic[] {\n return Object.keys(value)\n .filter((key) => !allowed.has(key))\n .map((key) =>\n diagnostic(\n \"unknown-field\",\n `${path}.${key} is not allowed`,\n `${path}.${key}`,\n ),\n );\n}\nfunction defaultMatches(type: string, value: unknown): boolean {\n if (!finiteJson(value)) return false;\n // Without this case a geometry default falls through the length table below\n // and any JSON value at all passes, which is the hole the four scalar cases\n // exist to close. A default that cannot be validated is not a default.\n if (type === \"geometry\") return isGeometrySerialized(value);\n if (type === \"float\") return typeof value === \"number\";\n if (type === \"int\") return typeof value === \"number\";\n if (type === \"bool\") return typeof value === \"boolean\";\n if (type === \"string\") return typeof value === \"string\";\n const lengths: Record<string, number> = {\n vec2: 2,\n vec3: 3,\n vec4: 4,\n vec2i: 2,\n vec3i: 3,\n vec4i: 4,\n mat2: 4,\n mat3: 9,\n mat4: 16,\n color: 4,\n };\n const length = lengths[type];\n return (\n length === undefined ||\n (Array.isArray(value) &&\n value.length === length &&\n value.every((item) =>\n type.endsWith(\"i\") ? Number.isInteger(item) : typeof item === \"number\",\n ))\n );\n}\n\nexport function validateNodeDefinition(value: unknown): readonly Diagnostic[] {\n if (!isRecord(value))\n return [diagnostic(\"not-object\", \"Definition must be an object\")];\n const result = unknownFields(value, TOP_FIELDS, \"definition\");\n const add = (code: string, message: string, path?: string) =>\n result.push(diagnostic(code, message, path));\n const environment = value.runsOn;\n if (value.apiVersion !== 1)\n add(\"api-version\", \"apiVersion must be 1\", \"apiVersion\");\n if (!Object.prototype.hasOwnProperty.call(ALLOWED, String(environment)))\n add(\"environment\", \"runsOn must be portable, browser, or server\", \"runsOn\");\n if (value.container !== undefined && value.container !== \"subnet\")\n add(\"invalid-container\", \"container must be subnet\", \"container\");\n\n const allowed = ALLOWED[environment as RuntimeEnvironment] ?? [];\n if (value.capabilities !== undefined && !Array.isArray(value.capabilities))\n add(\n \"invalid-capabilities\",\n \"capabilities must be an array\",\n \"capabilities\",\n );\n const seen = new Set<unknown>();\n for (const [index, capability] of (Array.isArray(value.capabilities)\n ? value.capabilities\n : []\n ).entries()) {\n const path = `capabilities.${index}`;\n if (\n !seen.has(capability) &&\n !allowed.includes(capability as NodeCapabilityName)\n )\n add(\n \"capability-not-allowed\",\n `${String(capability)} is not available on ${String(environment)}`,\n path,\n );\n if (seen.has(capability))\n add(\"duplicate-capability\", `${String(capability)} is duplicated`, path);\n seen.add(capability);\n }\n\n // Two namespaces, not one. An output is addressed in the other direction from\n // an input, so `geometry` in and `geometry` out is not ambiguous anywhere: the\n // document format names the two endpoints of a connection separately, the\n // runtime keys them as `source.outputName` and `target.inputName`, and\n // `NodeExecutionContext` hands a node `context.inputs` and `context.outputs`\n // as separate records. One shared namespace made \"geometry in, geometry out\"\n // inexpressible and forced every geometry operator to call its input `input`,\n // which Marcus overruled 2026-09-04: *\"sounds weird, we need to allow this\n // case.\"*\n //\n // Inputs and props still share one namespace. Both feed a value *into* the\n // node from the same side, an unconnected input with a default is the same\n // control as a prop to whoever is looking at the node, and there is no\n // direction to tell them apart by. That one stays a collision.\n const inward = new Map<string, string>();\n const outward = new Map<string, string>();\n for (const section of [\"inputs\", \"outputs\", \"props\"] as const) {\n const entries = value[section];\n if (entries === undefined) continue;\n if (!isRecord(entries)) {\n add(\"invalid-section\", `${section} must be an object`, section);\n continue;\n }\n for (const [name, raw] of Object.entries(entries)) {\n const path = `${section}.${name}`;\n if (!IDENTIFIER.test(name))\n add(\"invalid-name\", `${name} is not a valid identifier`, path);\n if (RESERVED.has(name)) add(\"reserved-name\", `${name} is reserved`, path);\n const names = section === \"outputs\" ? outward : inward;\n const previous = names.get(name);\n if (previous)\n add(\n \"name-collision\",\n `${name} is declared in ${previous} and ${section}`,\n path,\n );\n else names.set(name, section);\n if (!isRecord(raw)) {\n add(\"invalid-entry\", `${path} must be an object`, path);\n continue;\n }\n\n const fields =\n section === \"props\"\n ? PROP_FIELDS\n : section === \"outputs\"\n ? OUTPUT_FIELDS\n : DATA_FIELDS;\n if (\n section !== \"props\" &&\n raw.kind !== \"data\" &&\n raw.kind !== \"trigger\"\n ) {\n add(\n \"invalid-kind\",\n `${path}.kind must be data or trigger`,\n `${path}.kind`,\n );\n result.push(...unknownFields(raw, fields, path));\n continue;\n }\n if (section !== \"props\" && raw.kind === \"trigger\") {\n if (\n Object.keys(raw).some(\n (key) => key !== \"kind\" && key !== \"description\",\n )\n )\n add(\n \"trigger-extra\",\n \"Trigger ports allow only kind and description\",\n path,\n );\n continue;\n }\n result.push(...unknownFields(raw, fields, path));\n if (\n \"control\" in raw &&\n (typeof raw.control !== \"string\" || !CONTROLS.has(raw.control))\n )\n add(\n \"invalid-control\",\n `${String(raw.control)} is not a Cascade control`,\n `${path}.control`,\n );\n if (\"options\" in raw && raw.control !== \"select\")\n add(\n \"options-without-select\",\n \"options require the select control\",\n `${path}.options`,\n );\n const type = raw.type;\n if (!validType(type)) {\n add(\n \"invalid-type\",\n `${String(type)} is not a Cascade type`,\n `${path}.type`,\n );\n continue;\n }\n if (type === \"texture\" && environment !== \"browser\")\n add(\"texture-not-portable\", \"texture is browser-only\", `${path}.type`);\n if (type === \"texture\" && \"default\" in raw)\n add(\n \"texture-default\",\n \"texture cannot have a default\",\n `${path}.default`,\n );\n if (section === \"props\" && !(\"default\" in raw))\n add(\"missing-default\", \"Props require defaults\", `${path}.default`);\n if (\"default\" in raw && !finiteJson(raw.default))\n add(\n \"invalid-default\",\n \"Default must be finite JSON\",\n `${path}.default`,\n );\n else if (\"default\" in raw && !defaultMatches(type, raw.default))\n add(\n \"default-type\",\n `Default does not match ${type}`,\n `${path}.default`,\n );\n if (\n type === \"int\" &&\n \"default\" in raw &&\n (!Number.isFinite(raw.default) || !Number.isInteger(raw.default))\n )\n add(\n \"non-integer\",\n \"Integer defaults must be finite integers\",\n `${path}.default`,\n );\n if (\n \"step\" in raw &&\n (typeof raw.step !== \"number\" ||\n !Number.isFinite(raw.step) ||\n raw.step <= 0)\n )\n add(\"invalid-step\", \"step must be greater than zero\", `${path}.step`);\n if (\n typeof raw.min === \"number\" &&\n typeof raw.max === \"number\" &&\n raw.min > raw.max\n )\n add(\"invalid-range\", \"min must not exceed max\", path);\n }\n }\n return result;\n}\n\nexport function assertNodeDefinition(\n value: unknown,\n): asserts value is NodeDefinition {\n const diagnostics = validateNodeDefinition(value);\n if (diagnostics.length)\n throw new TypeError(\n diagnostics.map((item) => `${item.code}: ${item.message}`).join(\"\\n\"),\n );\n}\n", "import {\n canConnectTypes,\n CORE_TYPES as CONTRACT_CORE_TYPES,\n IMPLICIT_TYPE_CONVERSIONS,\n normalizeCascadeType,\n type CascadeType,\n type CoreType,\n type ImageRef,\n} from '@cascade/contracts';\n\nexport type { CascadeType, CoreType, ImageRef, Mesh, Polyline } from '@cascade/contracts';\n\n/**\n * Cascade's core data types \u2014 the vocabulary every node in a geometry and image\n * pipeline can rely on, so that inspecting a node's parameters and outputs is\n * the same act whatever the node does.\n *\n * The set is deliberately small. A type earns its place by needing its own\n * editor, its own port colour, or its own conversion rules; anything else is an\n * `object` with a shape. Special nodes extend by NAMESPACE \u2014 `archive.item`\n * \u2014 so a project can add what it needs without competing with core for names,\n * and anything unnamespaced is core by definition.\n */\n\n/** Scalars. `float` and `int` are distinct because an int wants a stepper and a\n * float wants a drag field, and because vec2i exists. */\nexport const SCALAR_TYPES = ['float', 'int', 'bool', 'string'] as const;\n\n/** Float and integer vectors, GLSL naming. */\nexport const VECTOR_TYPES = ['vec2', 'vec3', 'vec4', 'vec2i', 'vec3i', 'vec4i'] as const;\n\n/** Column-major, GLSL convention: mat4[0] is the first COLUMN. */\nexport const MATRIX_TYPES = ['mat2', 'mat3', 'mat4'] as const;\n\n/**\n * Pixels.\n *\n * `image` is file-backed and portable: a descriptor naming a file plus the\n * metadata needed to read it. It crosses the language boundary \u2014 Python writes\n * one, a browser node reads it, either can consume the other's.\n *\n * `texture` is a live GPU handle inside one browser session. It exists so a\n * chain of WebGL nodes can hand work along without a file round trip per link;\n * it cannot leave the page, and converting to an image is what makes it durable.\n */\nexport const IMAGE_TYPES = ['image', 'texture'] as const;\n\n/**\n * Geometry.\n *\n * `points` \u2014 a point set, Nx2 or Nx3.\n * `lines` \u2014 independent segments, pairs of endpoints. Not a chain.\n * `polyline` \u2014 connected chains, open or closed. A smoothed curve is one of\n * these; `curves` is kept as an alias rather than a second type,\n * because two names for one concept is how mask/field/plane/image\n * turned into four things that all meant the same.\n * `mesh` \u2014 vertices plus indices, with optional normals and uvs.\n * `rects` \u2014 axis-aligned rectangles, optionally tagged.\n */\nexport const GEOMETRY_TYPES = ['geometry', 'points', 'lines', 'polyline', 'mesh', 'rects'] as const;\n\n/** Colour is kept apart from vec4: it means something different, it wants a\n * swatch rather than four number fields, and it carries a colour space. */\nexport const OTHER_TYPES = ['color', 'asset', 'array', 'object', 'any'] as const;\n\nexport const CORE_TYPES = CONTRACT_CORE_TYPES;\n\nconst CORE_SET = new Set<string>(CORE_TYPES);\n\nexport function isCoreType(type: string): type is CoreType {\n return CORE_SET.has(type);\n}\n\n/** `archive.item` -> `archive`; a core type has no namespace. */\nexport function typeNamespace(type: string): string | null {\n const dot = type.indexOf('.');\n return dot > 0 ? type.slice(0, dot) : null;\n}\n\n// ---------------------------------------------------------------- structure\n\n/** How many components a vector or matrix carries, for editors and validation. */\nexport const TYPE_COMPONENTS: Record<string, number> = {\n vec2: 2, vec3: 3, vec4: 4,\n vec2i: 2, vec3i: 3, vec4i: 4,\n mat2: 4, mat3: 9, mat4: 16,\n color: 4,\n};\n\n/** Vector and matrix values are plain number arrays \u2014 JSON-native, the same\n * shape on both sides of the language boundary, and directly uploadable as a\n * uniform. No wrapper objects. */\nexport function isNumericTuple(type: string): boolean {\n return type in TYPE_COMPONENTS;\n}\n\n/** Integer vectors round rather than refuse, so a computed size is usable. */\nexport function isIntegerType(type: string): boolean {\n return type === 'int' || type.endsWith('i');\n}\n\n// ---------------------------------------------------------------- conversion\n\n/**\n * What may flow into what without an explicit conversion node.\n *\n * The rule throughout: widening is implicit, narrowing is not. An int vector\n * feeds a float vector because nothing is lost; the reverse silently discards\n * the fractional part, so it has to be asked for. And `texture` does not\n * implicitly become `image` \u2014 that is a GPU readback, which is expensive enough\n * that it should appear in the graph rather than happen invisibly.\n */\nexport const IMPLICIT_CONVERSIONS = IMPLICIT_TYPE_CONVERSIONS;\n\n/** Compatibility name retained for the Studio code while contracts owns the rule. */\nexport const normalizeType = normalizeCascadeType;\n\nexport function canConnect(fromType: string, toType: string): boolean {\n return canConnectTypes(fromType, toType);\n}\n\n// ------------------------------------------------------------------- colours\n\n/**\n * One colour per family, not per type. A reader should be able to tell a vector\n * from an image at a glance without learning twelve hues, and the port label\n * carries the precision.\n */\nexport const TYPE_COLORS: Record<string, string> = {\n float: '#4A9EFF',\n int: '#4A9EFF',\n bool: '#F472B6',\n string: '#A78BFA',\n\n vec2: '#38BDF8', vec3: '#38BDF8', vec4: '#38BDF8',\n vec2i: '#38BDF8', vec3i: '#38BDF8', vec4i: '#38BDF8',\n\n mat2: '#818CF8', mat3: '#818CF8', mat4: '#818CF8',\n\n image: '#FFD700',\n texture: '#FB7185',\n asset: '#FFD700',\n\n points: '#4ADE80', lines: '#4ADE80', polyline: '#4ADE80',\n mesh: '#22C55E', rects: '#4ADE80', curves: '#4ADE80',\n\n color: '#EC4899',\n array: '#F87171',\n object: '#FB923C',\n any: '#9CA3AF',\n};\n\n/** Project types get a colour derived from their namespace, so every\n * `archive.*` port reads as one family without core knowing about it. */\nexport function typeColor(type: string | undefined): string {\n if (!type) return TYPE_COLORS.any;\n if (TYPE_COLORS[type]) return TYPE_COLORS[type];\n const namespace = typeNamespace(type);\n if (!namespace) return TYPE_COLORS.any;\n let hash = 0;\n for (let i = 0; i < namespace.length; i++) hash = (hash * 31 + namespace.charCodeAt(i)) >>> 0;\n return `hsl(${hash % 360}, 65%, 62%)`;\n}\n\n// -------------------------------------------------------------------- images\n\nexport type ImageChannels = ImageRef['channels'];\nexport type ImageDepth = ImageRef['depth'];\nexport type ColorSpace = ImageRef['space'];\n\n/**\n * The value on an `image` port. Pixels stay in a file; this is the reference\n * plus what a reader needs to interpret it without opening it.\n *\n * A mask is an image: `{ channels: 'a', depth: 'f32' }`. So is a density field\n * or a height field. There is no separate field type, which is what stops the\n * mask/field/plane/image family from splitting into four near-identical things.\n */\nexport const CHANNEL_COUNT: Record<ImageChannels, number> = {\n r: 1, a: 1, rg: 2, rgb: 3, rgba: 4,\n};\n\nexport function isImageRef(value: unknown): value is ImageRef {\n return Boolean(\n value &&\n typeof value === 'object' &&\n typeof (value as ImageRef).path === 'string' &&\n Array.isArray((value as ImageRef).size)\n );\n}\n\n/**\n * Accept a bare path where an image is expected. Nodes written before the\n * descriptor existed emit a plain string, and refusing those would mean\n * migrating every node in one commit \u2014 the metadata is filled in by the reader\n * instead, which knows the file.\n */\nexport function coerceImageRef(value: unknown): ImageRef | null {\n if (isImageRef(value)) return value;\n if (typeof value !== 'string' || !value) return null;\n const float = value.endsWith('.npy');\n return {\n path: value,\n size: [0, 0],\n channels: float ? 'a' : 'rgb',\n depth: float ? 'f32' : 'u8',\n space: float ? 'linear' : 'srgb',\n };\n}\n", "import type { Graph } from './Graph.js';\nimport type { Node } from './Node.js';\n\nexport type CookPhase = 'idle' | 'scheduled' | 'cooking';\n\nexport interface CookStatus {\n phase: CookPhase;\n total: number;\n completed: number;\n currentNode: Node | null;\n startedAt: number | null;\n elapsed: number;\n}\n\ntype CookListener = (status: Readonly<CookStatus>) => void;\n\n/**\n * Coalesces invalidations and executes only the affected nodes. Node owns the\n * per-node state; this class owns ordering and graph-level progress.\n */\nexport class CookScheduler {\n private timer: ReturnType<typeof setTimeout> | null = null;\n private activeRun: Promise<void> | null = null;\n private rerunRequested = false;\n private listeners = new Set<CookListener>();\n private idleResolvers = new Set<() => void>();\n private _status: CookStatus = {\n phase: 'idle',\n total: 0,\n completed: 0,\n currentNode: null,\n startedAt: null,\n elapsed: 0\n };\n\n constructor(private readonly graph: Graph, readonly debounceMs = 50) {}\n\n get status(): Readonly<CookStatus> {\n return this._status;\n }\n\n get isRunning(): boolean {\n return this.activeRun !== null;\n }\n\n subscribe(listener: CookListener): () => void {\n this.listeners.add(listener);\n listener(this._status);\n return () => this.listeners.delete(listener);\n }\n\n /** @internal Called by Node whenever its sole cook state changes. */\n notifyNodeStateChange(): void {\n this.emit();\n }\n\n markStale(node: Node): void {\n const visited = new Set<string>();\n const visit = (candidate: Node): void => {\n if (visited.has(candidate.id)) return;\n visited.add(candidate.id);\n if (candidate.cookState !== 'stale') candidate.invalidateCook();\n for (const output of candidate.outputs) {\n for (const connection of output.connections) {\n const downstream = this.graph.getNode(connection.to.nodeId);\n if (downstream) visit(downstream);\n }\n }\n };\n visit(node);\n\n // Nodes can become dirty while their constructors are still declaring\n // ports. Do not start graph work until the node has actually been added.\n if (this.graph.getNode(node.id) === node) this.schedule();\n }\n\n markDownstreamStale(node: Node): void {\n for (const output of node.outputs) {\n for (const connection of output.connections) {\n const downstream = this.graph.getNode(connection.to.nodeId);\n if (downstream) this.markStale(downstream);\n }\n }\n }\n\n schedule(): void {\n if (this.activeRun) {\n this.rerunRequested = true;\n return;\n }\n if (this.timer) clearTimeout(this.timer);\n const total = this.graph.nodes.filter(node => node.cookState === 'stale' || node.cookState === 'queued').length;\n this.setStatus({ phase: 'scheduled', total, completed: 0, currentNode: null, startedAt: null, elapsed: 0 });\n this.timer = setTimeout(() => {\n this.timer = null;\n void this.flushScheduled();\n }, this.debounceMs);\n }\n\n async flush(entryNode?: Node): Promise<void> {\n await this.flushInternal(entryNode, true);\n }\n\n private async flushScheduled(): Promise<void> {\n await this.flushInternal(undefined, false);\n }\n\n private async flushInternal(entryNode: Node | undefined, retryErrors: boolean): Promise<void> {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n if (retryErrors) this.prepareErrorRetry(entryNode);\n if (this.activeRun) {\n this.rerunRequested = true;\n await this.activeRun;\n return;\n }\n\n this.activeRun = this.run(entryNode).finally(() => {\n this.activeRun = null;\n });\n await this.activeRun;\n }\n\n /** Explicit execution retries failed nodes once; debounced invalidation does not. */\n private prepareErrorRetry(entryNode?: Node): void {\n const allowed = entryNode ? this.collectDownstream(entryNode) : null;\n for (const node of this.graph.nodes) {\n if (node.cookState === 'error' && (!allowed || allowed.has(node.id))) {\n node.invalidateCook();\n }\n }\n }\n\n async whenIdle(): Promise<void> {\n if (!this.activeRun && !this.timer) return;\n await new Promise<void>(resolve => this.idleResolvers.add(resolve));\n }\n\n dispose(): void {\n if (this.timer) clearTimeout(this.timer);\n this.timer = null;\n this.listeners.clear();\n for (const resolve of this.idleResolvers) resolve();\n this.idleResolvers.clear();\n }\n\n private async run(entryNode?: Node): Promise<void> {\n let restrictTo = entryNode ? this.collectDownstream(entryNode) : null;\n\n do {\n this.rerunRequested = false;\n const stale = this.graph.nodes.filter(node =>\n (node.cookState === 'stale' || node.cookState === 'queued') &&\n (!restrictTo || restrictTo.has(node.id))\n );\n restrictTo = null;\n\n if (stale.length === 0) break;\n const staleIds = new Set(stale.map(node => node.id));\n const ordered = this.graph.getTopologicalOrder()\n .map(id => this.graph.getNode(id))\n .filter((node): node is Node => !!node && staleIds.has(node.id));\n const orderedIds = new Set(ordered.map(node => node.id));\n for (const node of stale) if (!orderedIds.has(node.id)) ordered.push(node);\n\n for (const node of ordered) node.setCookState('queued');\n const startedAt = performance.now();\n this.setStatus({\n phase: 'cooking',\n total: ordered.length,\n completed: 0,\n currentNode: null,\n startedAt,\n elapsed: 0\n });\n\n const blocked = new Set<string>();\n let superseded = false;\n for (const node of ordered) {\n const upstreamBlocked = node.inputs.some(input => input.connections.some(connection =>\n staleIds.has(connection.from.nodeId) &&\n (blocked.has(connection.from.nodeId) || this.graph.getNode(connection.from.nodeId)?.cookState === 'error')\n ));\n if (upstreamBlocked) {\n node.setCookState('stale');\n blocked.add(node.id);\n this.setStatus({\n ...this._status,\n completed: this._status.completed + 1,\n currentNode: null,\n elapsed: performance.now() - startedAt\n });\n continue;\n }\n\n node.setCookState('cooking');\n this.setStatus({ ...this._status, currentNode: node, elapsed: performance.now() - startedAt });\n await node.execute();\n if (node.cookState === 'error') blocked.add(node.id);\n if (node.cookState === 'stale') {\n blocked.add(node.id);\n superseded = true;\n }\n this.setStatus({\n ...this._status,\n completed: this._status.completed + 1,\n currentNode: null,\n elapsed: performance.now() - startedAt\n });\n }\n if (superseded) this.rerunRequested = true;\n } while (this.rerunRequested);\n\n this.setStatus({ phase: 'idle', total: 0, completed: 0, currentNode: null, startedAt: null, elapsed: 0 });\n for (const resolve of this.idleResolvers) resolve();\n this.idleResolvers.clear();\n }\n\n private collectDownstream(entryNode: Node): Set<string> {\n const result = new Set<string>();\n const visit = (node: Node): void => {\n if (result.has(node.id)) return;\n result.add(node.id);\n for (const output of node.outputs) {\n for (const connection of output.connections) {\n const downstream = this.graph.getNode(connection.to.nodeId);\n if (downstream) visit(downstream);\n }\n }\n };\n visit(entryNode);\n return result;\n }\n\n private setStatus(status: CookStatus): void {\n this._status = Object.freeze(status);\n this.emit();\n }\n\n private emit(): void {\n for (const listener of this.listeners) listener(this._status);\n }\n}\n", "import { Node } from './Node.js';\nimport { Annotation } from './annotations/Annotation.js';\nimport { ImageAnnotation } from './annotations/Image.js';\nimport { TextAnnotation } from './annotations/Text.js';\nimport { GroupAnnotation } from './annotations/Group.js';\nimport { LineAnnotation } from './annotations/Line.js';\nimport { PolylineAnnotation } from './annotations/Polyline.js';\nimport { AssetManager } from '../engine/AssetManager.js';\nimport { PackageManager } from '../engine/PackageManager.js';\nimport { ModuleResolver, createModuleResolver } from '../engine/ModuleResolver.js';\nimport { GraphValidator, type ValidationResult } from '../engine/GraphValidator.js';\nimport type {\n Connection,\n InputPort,\n OutputPort,\n ProjectPackage,\n EmbeddedModule,\n ExternalModule,\n ProjectConfig,\n NodeSource\n} from '../types/node.types.js';\nimport { packagePathToType, isStandardLibraryNode, getNodeClass, getNodeDisplayName } from '../utils/nodeTypeUtils.js';\nimport { loadProjectModule, loadEmbeddedModule } from '../engine/nodeModuleLoader.js';\nimport { normalizeColor, isColorValue } from '../utils/colorUtils.js';\nimport { canConnect, normalizeType } from '../types/coreTypes.js';\nimport { CookScheduler } from './CookScheduler.js';\n\n// Current file format version\nexport const GRAPH_FORMAT_VERSION = '0.2';\n\n/**\n * Parse a port ID to extract element ID, port type, and index\n * Format: ${elementId}_${portType}_${index}\n */\nfunction parsePortId(portId: string): { elementId: string; portType: 'input' | 'output'; index: number } {\n const parts = portId.split('_');\n if (parts.length < 3) {\n throw new Error(`Invalid port ID format: ${portId}`);\n }\n const portType = parts[parts.length - 2] as 'input' | 'output';\n const index = parseInt(parts[parts.length - 1], 10);\n if (isNaN(index)) {\n throw new Error(`Invalid port index in port ID: ${portId}`);\n }\n const elementId = parts.slice(0, -2).join('_');\n return { elementId, portType, index };\n}\n\n/**\n * Create a port ID from element ID, port type, and index\n */\nfunction createPortId(elementId: string, portType: 'input' | 'output', index: number): string {\n return `${elementId}_${portType}_${index}`;\n}\n\nexport type ExecutionState = 'idle' | 'running' | 'paused' | 'stopped';\n\n/**\n * Type representing annotation data structure used in UI\n */\nexport type CanvasAnnotation = Annotation & {\n content?: string;\n src?: string;\n endPosition?: { x: number; y: number };\n points?: { x: number; y: number }[];\n};\n\nexport class Graph {\n private _elements: Node[] = [];\n private _elementMap: Map<string, Node> = new Map(); // O(1) lookup cache\n connections: Connection[] = [];\n private _connectionMap: Map<string, Connection> = new Map(); // O(1) connection lookup\n private connectionIdCounter: number = 0;\n packageManager: PackageManager;\n assetManager: AssetManager;\n moduleResolver: ModuleResolver;\n\n // Project configuration (v0.2)\n project: ProjectConfig = { packages: [] };\n private createdAt = new Date().toISOString();\n\n get created(): string { return this.createdAt; }\n\n /**\n * Unified elements array (computations and annotations)\n */\n get elements(): Node[] {\n return this._elements;\n }\n\n set elements(value: Node[]) {\n this._elements = value;\n // Rebuild the element map for O(1) lookups\n this._elementMap.clear();\n for (const el of value) {\n this._elementMap.set(el.id, el);\n }\n }\n\n // Execution Control\n cookingNodes: Set<Node> = new Set();\n readonly scheduler: CookScheduler;\n\n // Execution state\n executionState: ExecutionState = 'idle';\n\n // Cached topological order (invalidated when graph structure changes)\n private cachedTopologicalOrder: string[] | null = null;\n \n constructor(assetManager?: AssetManager, packageManager?: PackageManager, moduleResolver?: ModuleResolver) {\n this.assetManager = assetManager || new AssetManager();\n this.packageManager = packageManager || new PackageManager();\n this.moduleResolver = moduleResolver || createModuleResolver();\n this.scheduler = new CookScheduler(this);\n }\n \n /**\n * Helper to check if an element is an annotation\n * Uses marker property for reliability (survives HMR and serialization)\n */\n private isAnnotation(element: Node): element is CanvasAnnotation {\n return (element as any).isAnnotation === true;\n }\n\n /**\n * Get all computations (non-annotation nodes)\n */\n get nodes(): Node[] {\n return this._elements.filter(e => !this.isAnnotation(e)) as Node[];\n }\n\n /**\n * Set computations (triggers Svelte reactivity)\n */\n set nodes(value: Node[]) {\n this._elements = [...this._elements.filter(e => this.isAnnotation(e)), ...value];\n }\n\n /**\n * Get all annotations\n */\n get annotations(): CanvasAnnotation[] {\n return this._elements.filter(e => this.isAnnotation(e)) as CanvasAnnotation[];\n }\n\n /**\n * Set annotations (triggers Svelte reactivity)\n */\n set annotations(value: CanvasAnnotation[]) {\n this._elements = [...this._elements.filter(e => !this.isAnnotation(e)), ...value];\n }\n \n /**\n * Generates a unique element ID based on a base ID.\n * If the base ID ends in a number (e.g., \"Checkers1\"), strips it and increments.\n * Always appends a number starting from 1 (e.g., \"Checkers1\", \"Checkers2\").\n * Ensures the ID has no spaces.\n * @param baseId The base ID to use (typically the element type or existing node ID)\n * @param excludeElementId Optional element ID to exclude from uniqueness check (useful when renaming)\n * @returns A unique element ID with no spaces\n */\n generateUniqueNodeId(baseId: string, excludeElementId?: string): string {\n // Remove spaces from base ID\n const sanitizedBaseId = baseId.replace(/\\s+/g, '');\n\n // Strip trailing numbers to get the base name\n // e.g., \"Checkers1\" -> \"Checkers\", \"Checkers123\" -> \"Checkers\", \"Checkers\" -> \"Checkers\"\n const match = sanitizedBaseId.match(/^(.+?)(\\d+)?$/);\n const baseName = match ? match[1] : sanitizedBaseId;\n\n // Always use numbered versions starting from 1\n let counter = 1;\n let candidateId = `${baseName}${counter}`;\n\n // Find the first available numbered ID\n while (this._elements.some(\n element => element.id === candidateId && (!excludeElementId || element.id !== excludeElementId)\n )) {\n counter++;\n candidateId = `${baseName}${counter}`;\n }\n\n return candidateId;\n }\n\n /**\n * Get any element by ID (O(1) using Map cache)\n */\n getElement(id: string): Node | null {\n return this._elementMap.get(id) || null;\n }\n\n /**\n * Get a computation by ID (type-safe)\n */\n getNode(nodeId: string): Node | null {\n const element = this.getElement(nodeId);\n return element && !this.isAnnotation(element) ? element : null;\n }\n\n /**\n * Get an annotation by ID (type-safe)\n */\n getAnnotation(id: string): Annotation | null {\n const element = this.getElement(id);\n return element && this.isAnnotation(element) ? element as Annotation : null;\n }\n\n /**\n * Get a node by absolute path (e.g., \"/effects/blur1\")\n */\n nodeByPath(path: string): Node | null {\n if (!path.startsWith('/')) return null;\n\n const segments = path.slice(1).split('/').filter(s => s.length > 0);\n if (segments.length === 0) return null;\n\n let current = this.nodes.find(node => !node.parent && node.id === segments[0]) ?? null;\n for (let index = 1; current && index < segments.length; index++) {\n if (!current.isNetwork()) return null;\n current = current.children().find(child => child.id === segments[index]) ?? null;\n }\n return current;\n }\n\n /**\n * Add an element to the graph\n */\n addElement(element: Node): void {\n this._elements.push(element);\n this._elementMap.set(element.id, element);\n this.invalidateTopologicalOrder();\n }\n\n /**\n * Move an element between networks while keeping both sides of the parent\n * relationship consistent. Structural editor code must use this instead of\n * mutating `parent` or `_children` directly.\n */\n reparentElement(element: Node, parent: Node | null): boolean {\n if (parent) {\n if (!parent.isNetwork() || parent === element) return false;\n for (let ancestor: Node | null = parent; ancestor; ancestor = ancestor.parent) {\n if (ancestor === element) return false;\n }\n }\n if (element.parent === parent) return true;\n\n const previous = element.parent;\n if (previous) {\n const removeChild = (previous as any).removeChild;\n if (typeof removeChild === 'function') removeChild.call(previous, element);\n else {\n (previous as any)._children = previous.children().filter(child => child !== element);\n element.parent = null;\n }\n }\n\n if (parent) {\n const addChild = (parent as any).addChild;\n if (typeof addChild === 'function') addChild.call(parent, element);\n else {\n element.parent = parent;\n (parent as any)._children.push(element);\n }\n }\n this.invalidateTopologicalOrder();\n return true;\n }\n\n /**\n * Remove an element from the graph\n */\n removeElement(id: string): void {\n const element = this._elementMap.get(id);\n if (!element) return;\n\n const removed: Node[] = [];\n const visited = new Set<Node>();\n const collect = (candidate: Node): void => {\n if (visited.has(candidate)) return;\n visited.add(candidate);\n candidate.children().forEach(collect);\n removed.push(candidate);\n };\n collect(element);\n\n const removedIds = new Set(removed.map(candidate => candidate.id));\n this.connections\n .filter(connection => removedIds.has(connection.from.nodeId) || removedIds.has(connection.to.nodeId))\n .forEach(connection => this.disconnect(connection.id));\n\n const pending = (this as any)._connectionsToRestore;\n if (Array.isArray(pending)) {\n (this as any)._connectionsToRestore = pending.filter((connection: any) => {\n const fromId = Array.isArray(connection?.[0]) ? connection[0][0] : undefined;\n const toId = Array.isArray(connection?.[1]) ? connection[1][0] : undefined;\n return !removedIds.has(fromId) && !removedIds.has(toId);\n });\n }\n\n this._elements = this._elements.filter(candidate => !removedIds.has(candidate.id));\n for (const candidate of removed) {\n this._elementMap.delete(candidate.id);\n this.cookingNodes.delete(candidate);\n }\n\n // `removed` is deepest-first, so every child is detached before its parent.\n for (const candidate of removed) {\n const parent = candidate.parent;\n if (parent) {\n const removeChild = (parent as any).removeChild;\n if (typeof removeChild === 'function') removeChild.call(parent, candidate);\n else candidate.parent = null;\n }\n }\n\n this.invalidateTopologicalOrder();\n for (const candidate of removed) candidate.onDestroy?.();\n }\n\n /**\n * Rename an element's ID, updating internal maps\n */\n renameElement(oldId: string, newId: string): boolean {\n const element = this._elementMap.get(oldId);\n if (!element || !newId || (oldId !== newId && this._elementMap.has(newId))) return false;\n if (oldId === newId) return true;\n\n const renamedPorts = element.renameId(newId);\n this._elementMap.delete(oldId);\n this._elementMap.set(newId, element);\n\n for (const connection of this.connections) {\n if (connection.from.nodeId === oldId) connection.from.nodeId = newId;\n if (connection.to.nodeId === oldId) connection.to.nodeId = newId;\n connection.from.portId = renamedPorts.get(connection.from.portId) ?? connection.from.portId;\n connection.to.portId = renamedPorts.get(connection.to.portId) ?? connection.to.portId;\n }\n\n const pending = (this as any)._connectionsToRestore;\n if (Array.isArray(pending)) {\n for (const connection of pending) {\n for (const endpoint of Array.isArray(connection) ? connection : []) {\n if (Array.isArray(endpoint) && endpoint[0] === oldId) endpoint[0] = newId;\n }\n }\n }\n for (const annotation of this.annotations) {\n if (Array.isArray(annotation.containedElements)) {\n annotation.containedElements = annotation.containedElements.map(id => id === oldId ? newId : id);\n }\n }\n\n this.invalidateTopologicalOrder();\n return true;\n }\n\n addNode(type: string, position: { x: number; y: number }): Node {\n // Get display name for ID generation (uses metadata if available, falls back to type)\n const displayName = getNodeDisplayName(type);\n // Convert to lowercase with underscores (e.g., \"Prompt to Image\" -> \"prompt_to_image\")\n const baseId = displayName.toLowerCase().replace(/\\s+/g, '_');\n\n // Generate unique ID automatically based on display name\n const id = this.generateUniqueNodeId(baseId);\n\n // Try to get a class-based node first (for stdlib nodes)\n const NodeClass = getNodeClass(type);\n let node: Node;\n\n if (NodeClass) {\n // Class-based node - instantiate directly\n node = new NodeClass(id, this);\n } else {\n // Fallback: create base Node for custom/function-based nodes\n node = new Node(id, packagePathToType(type), this);\n }\n\n // Store full module path and source type for serialization\n // This ensures custom nodes (local.*) are saved correctly\n (node as any).modulePath = type;\n if (isStandardLibraryNode(type)) {\n (node as any).sourceType = 'stdlib';\n } else if (type.startsWith('local.')) {\n (node as any).sourceType = 'embedded';\n } else {\n // Check module resolver for project modules\n const sourceType = this.moduleResolver.getSourceType(type);\n (node as any).sourceType = sourceType || 'embedded';\n }\n\n node.position = position;\n this.addElement(node);\n\n return node;\n }\n \n /**\n * Point an existing node instance at a different module.\n *\n * Duplicating a built-in into an editable copy, and promoting an embedded\n * node to a file, both keep the node where it is on the canvas with its\n * connections and parameter values intact and only change which module\n * supplies `execute`. The compiled module is captured once when a node is\n * loaded, so swapping the path alone would leave the old code running.\n *\n * Ports are untouched on purpose: both callers move identical code, so the\n * ports the next cook declares are the ones already there.\n */\n retargetModule(\n nodeId: string,\n modulePath: string,\n source: 'embedded' | 'project',\n code?: string,\n ): boolean {\n const node = this.getNode(nodeId);\n if (!node) return false;\n\n (node as any).modulePath = modulePath;\n (node as any).sourceType = source;\n if (source === 'embedded' && code !== undefined) node.code = code;\n\n const modulePromise = source === 'project'\n ? loadProjectModule(modulePath)\n : loadEmbeddedModule(code ?? node.code);\n node.setFunction((n: unknown, g: unknown) => modulePromise.then((m) => m.execute(n, g)));\n modulePromise.catch((error) => console.warn('Failed to compile ' + modulePath + ':', error));\n\n node.markDirty();\n return true;\n }\n\n removeNode(nodeId: string) {\n this.removeElement(nodeId);\n }\n \n /**\n * Validate a connection before creating it\n * Works with any element type (nodes and annotations)\n */\n validateConnection(fromPort: any, toPort: any): { valid: boolean; error?: string } {\n // Parse port IDs to get element IDs\n let fromElementId: string;\n let toElementId: string;\n \n try {\n const fromParsed = parsePortId(fromPort.id);\n const toParsed = parsePortId(toPort.id);\n fromElementId = fromParsed.elementId;\n toElementId = toParsed.elementId;\n } catch (err) {\n return { valid: false, error: `Invalid port ID format: ${err}` };\n }\n \n const fromElement = this.getElement(fromElementId);\n const toElement = this.getElement(toElementId);\n \n if (!fromElement || !toElement) {\n return { valid: false, error: 'Element not found' };\n }\n \n // For node-to-node connections, use GraphValidator\n // For annotation-to-node or other combinations, allow them\n if (!this.isAnnotation(fromElement) && !this.isAnnotation(toElement)) {\n const error = GraphValidator.validateConnection(\n this,\n fromElementId,\n toElementId,\n fromPort.id,\n toPort.id\n );\n \n if (error) {\n return { valid: false, error: error.message };\n }\n }\n \n return { valid: true };\n }\n\n /**\n * Check data type compatibility between ports\n * Returns a warning message if types don't match, or null if compatible\n */\n checkDataTypeCompatibility(fromPort: any, toPort: any): string | null {\n const fromType = normalizeType(fromPort.dataType);\n const toType = normalizeType(toPort.dataType);\n\n // The core rule, in coreTypes.ts: widening is implicit, narrowing is not.\n // vec2i feeds vec2 because nothing is lost; vec2 into vec2i would silently\n // drop the fraction, and texture into image is a GPU readback \u2014 both are\n // real operations and belong in the graph rather than happening invisibly.\n if (canConnect(fromType, toType)) return null;\n\n // Legacy pairs from before the core set existed, kept so old graphs load.\n const legacy: Record<string, string[]> = {\n number: ['number[]', 'string'],\n float: ['number[]'],\n int: ['number[]'],\n string: ['number', 'float', 'int'],\n };\n if (legacy[fromType]?.includes(toType)) return null;\n\n return `Type mismatch: connecting ${fromType} to ${toType}`;\n }\n\n /**\n * Update type mismatch warnings on a node based on its input connections\n */\n updateTypeMismatchWarnings(nodeId: string): void {\n const node = this.getNode(nodeId);\n if (!node) return;\n\n const warnings: string[] = [];\n\n // Check each input port's connections\n for (const inputPort of node.inputs) {\n for (const conn of inputPort.connections) {\n const fromNode = this.getNode(conn.from.nodeId);\n if (!fromNode) continue;\n\n const fromPort = fromNode.outputs.find(p => p.id === conn.from.portId);\n if (!fromPort) continue;\n\n const warning = this.checkDataTypeCompatibility(fromPort, inputPort);\n if (warning) {\n warnings.push(warning);\n }\n }\n }\n\n // Set or clear the warning on the node\n if (warnings.length > 0) {\n node.warning = warnings.join('; ');\n } else if (node.warning?.startsWith('Type mismatch')) {\n // Only clear if it was a type mismatch warning\n node.warning = null;\n }\n }\n\n connect(fromPort: any, toPort: any): Connection {\n // Validate connection first\n const validation = this.validateConnection(fromPort, toPort);\n if (!validation.valid) {\n throw new Error(`Invalid connection: ${validation.error}`);\n }\n\n // For non-variadic input ports, remove existing connections first (replacement behavior)\n if (!toPort.variadic && toPort.connections && toPort.connections.length > 0) {\n // Get connection IDs to remove\n const connectionsToRemove = [...toPort.connections];\n for (const conn of connectionsToRemove) {\n this.disconnect(conn.id);\n }\n }\n\n // Parse port IDs to get element IDs\n const fromParsed = parsePortId(fromPort.id);\n const toParsed = parsePortId(toPort.id);\n \n // Use a counter to ensure unique IDs even if connections are created in the same millisecond\n const connection: Connection = {\n id: `conn_${Date.now()}_${++this.connectionIdCounter}`,\n from: { \n nodeId: fromParsed.elementId, \n portId: fromPort.id \n },\n to: { \n nodeId: toParsed.elementId, \n portId: toPort.id \n },\n type: fromPort.portType\n };\n \n // Check for duplicates before adding\n const existing = this.connections.find(c => \n c.from.nodeId === connection.from.nodeId &&\n c.from.portId === connection.from.portId &&\n c.to.nodeId === connection.to.nodeId &&\n c.to.portId === connection.to.portId\n );\n \n if (existing) {\n // Return existing connection instead of creating duplicate\n return existing;\n }\n \n this.connections.push(connection);\n this._connectionMap.set(connection.id, connection);\n fromPort.connections.push(connection);\n toPort.connections.push(connection);\n \n // Invalidate cached topological order when graph structure changes\n this.invalidateTopologicalOrder();\n \n // Propagate existing value from output port to input port when connection is made\n if (fromPort.value !== undefined && fromPort.value !== null) {\n toPort.value = fromPort.value;\n // Trigger onChange callback if it exists\n if (toPort.onChange) {\n try {\n toPort.onChange(fromPort.value);\n } catch (err) {\n console.error(`Error in onChange callback for port ${toPort.name}:`, err);\n }\n }\n }\n\n // Sync variadic ports on the target node\n this.syncVariadicPortsOnNode(toParsed.elementId);\n\n // Check for type mismatches and set warnings on the target node\n this.updateTypeMismatchWarnings(toParsed.elementId);\n\n // A structural input change invalidates exactly the target branch. This is\n // also what advances the bounded cold-load fixpoint as ports appear and\n // pending connections become bindable between passes.\n this.getNode(toParsed.elementId)?.markDirty();\n\n return connection;\n }\n\n disconnect(connectionId: string) {\n // O(1) connection lookup via map\n const conn = this._connectionMap.get(connectionId);\n if (!conn) return;\n\n // Direct O(1) removal from source and target ports only (not all elements)\n const sourceNode = this.getElement(conn.from.nodeId);\n const targetNode = this.getElement(conn.to.nodeId);\n\n if (sourceNode) {\n const sourcePort = sourceNode.getPort(conn.from.portId);\n if (sourcePort) {\n sourcePort.connections = sourcePort.connections.filter(c => c.id !== connectionId);\n }\n }\n\n if (targetNode) {\n const targetPort = targetNode.getPort(conn.to.portId) as InputPort | undefined;\n if (targetPort) {\n targetPort.connections = targetPort.connections.filter(c => c.id !== connectionId);\n if (targetPort.connections.length === 0) {\n targetPort.value = targetPort.defaultValue;\n try {\n targetPort.onChange?.(targetPort.defaultValue);\n } catch (err) {\n console.error(`Error in onChange callback for port ${targetPort.name}:`, err);\n }\n }\n }\n }\n\n // Remove from array and map\n const index = this.connections.findIndex(c => c.id === connectionId);\n if (index >= 0) {\n this.connections.splice(index, 1);\n }\n this._connectionMap.delete(connectionId);\n\n // Invalidate cached topological order when graph structure changes\n this.invalidateTopologicalOrder();\n\n // Sync variadic ports on the target node\n this.syncVariadicPortsOnNode(conn.to.nodeId);\n\n // Re-check type mismatches after disconnection\n this.updateTypeMismatchWarnings(conn.to.nodeId);\n this.getNode(conn.to.nodeId)?.markDirty();\n }\n\n /**\n * Sync variadic ports on a node after connection changes\n */\n private syncVariadicPortsOnNode(nodeId: string): void {\n const node = this.getNode(nodeId);\n if (node) {\n node.syncVariadicPorts();\n }\n }\n\n /**\n * Validate the entire graph\n */\n validate(): ValidationResult {\n return GraphValidator.validateGraph(this);\n }\n \n /**\n * Execute graph using topological sort for proper ordering\n */\n async execute(entryNode?: Node) {\n this.executionState = 'running';\n try {\n await this.scheduler.flush(entryNode);\n } finally {\n this.executionState = 'idle';\n }\n }\n \n /**\n * Get or compute topological order for the entire graph\n * Caches the result until graph structure changes\n */\n getTopologicalOrder(): string[] {\n if (this.cachedTopologicalOrder) {\n return this.cachedTopologicalOrder;\n }\n \n this.cachedTopologicalOrder = GraphValidator.topologicalSort(this);\n return this.cachedTopologicalOrder;\n }\n \n /**\n * Invalidate cached topological order (call when graph structure changes)\n */\n private invalidateTopologicalOrder(): void {\n this.cachedTopologicalOrder = null;\n }\n \n stop() {\n this.executionState = 'stopped';\n }\n\n reset() {\n this.nodes.forEach(node => {\n node.error = null;\n node.warning = null;\n node.markDirty();\n });\n this.cookingNodes.clear();\n this.executionState = 'idle';\n }\n \n // Behavior Control (v1.2)\n clearCookingNodes(except?: Node): void {\n if (except) {\n this.cookingNodes.forEach(comp => {\n if (comp !== except) {\n comp.setCook(false);\n }\n });\n } else {\n this.cookingNodes.forEach(comp => {\n comp.setCook(false);\n });\n }\n }\n \n isDownstreamOfCooking(node: Node): boolean {\n // Check if computation is downstream of any cooking computation\n const visited = new Set<string>();\n \n const checkUpstream = (n: Node): boolean => {\n if (visited.has(n.id)) return false;\n visited.add(n.id);\n \n if (this.cookingNodes.has(n)) {\n return true;\n }\n \n // Check all upstream computations\n for (const input of n.inputs) {\n for (const conn of input.connections) {\n const upstreamNode = this.getNode(conn.from.nodeId);\n if (upstreamNode && checkUpstream(upstreamNode)) {\n return true;\n }\n }\n }\n \n return false;\n };\n \n return checkUpstream(node);\n }\n \n addAnnotation(annotation: Annotation | any): void {\n let annotationInstance: Annotation;\n\n if (this.isAnnotation(annotation)) {\n annotationInstance = annotation;\n } else {\n const annData = annotation;\n // Normalize type to PascalCase for switch matching\n const normalizedType = annData.type.charAt(0).toUpperCase() + annData.type.slice(1).toLowerCase();\n\n switch (normalizedType) {\n case 'Image':\n annotationInstance = new ImageAnnotation(annData.id, this);\n (annotationInstance as ImageAnnotation).src = annData.src;\n break;\n case 'Text':\n annotationInstance = new TextAnnotation(annData.id, this);\n (annotationInstance as TextAnnotation).content = annData.content;\n break;\n case 'Group':\n annotationInstance = new GroupAnnotation(annData.id, this);\n (annotationInstance as any).content = annData.content;\n break;\n case 'Line':\n annotationInstance = new LineAnnotation(annData.id, this);\n if (annData.endPosition) {\n (annotationInstance as LineAnnotation).endPosition = annData.endPosition;\n }\n break;\n case 'Polyline':\n annotationInstance = new PolylineAnnotation(annData.id, this);\n if (annData.points) {\n (annotationInstance as PolylineAnnotation).points = annData.points;\n }\n break;\n default:\n // Fallback: create base Annotation and copy all type-specific properties\n annotationInstance = new Annotation(annData.id, annData.type, this);\n if (annData.content !== undefined) (annotationInstance as any).content = annData.content;\n if (annData.src !== undefined) (annotationInstance as any).src = annData.src;\n if (annData.endPosition) (annotationInstance as any).endPosition = annData.endPosition;\n if (annData.points) (annotationInstance as any).points = annData.points;\n }\n\n annotationInstance.position = annData.position || { x: 0, y: 0 };\n if (annData.size) annotationInstance.size = annData.size;\n if (annData.style) annotationInstance.style = { ...annData.style };\n if (annData.caption !== undefined) annotationInstance.caption = annData.caption;\n if (annData.containedElements) annotationInstance.containedElements = annData.containedElements;\n }\n\n this.addElement(annotationInstance);\n this.initializeAnnotationPorts(annotationInstance).catch(err => {\n console.error(`Failed to initialize ports for annotation ${annotationInstance.id}:`, err);\n });\n }\n \n removeAnnotation(id: string): void {\n this.removeElement(id);\n }\n\n /**\n * Initialize output ports for an annotation based on its type\n * Annotations always have exactly one output at index 0\n */\n async initializeAnnotationPorts(annotation: Annotation): Promise<void> {\n annotation.outputs = [];\n\n if (annotation.type === 'Image') {\n const imageAnnotation = annotation as ImageAnnotation;\n const portId = createPortId(annotation.id, 'output', 0);\n const port: OutputPort<HTMLImageElement> = {\n id: portId,\n name: 'image',\n portType: 'param',\n dataType: 'asset',\n value: null as any,\n connections: [],\n setValue: (value: HTMLImageElement) => {\n port.value = value;\n port.connections.forEach(conn => {\n const toParsed = parsePortId(conn.to.portId);\n const targetElement = this.getElement(toParsed.elementId);\n if (targetElement && !this.isAnnotation(targetElement)) {\n const targetPort = targetElement.getInputPort(toParsed.index);\n if (targetPort) {\n targetPort.value = value;\n targetPort.onChange?.(value);\n }\n }\n });\n },\n trigger: (props?: any) => {\n port.connections.forEach(conn => {\n const toParsed = parsePortId(conn.to.portId);\n const targetElement = this.getElement(toParsed.elementId);\n if (targetElement && !this.isAnnotation(targetElement)) {\n const targetPort = targetElement.getInputPort(toParsed.index);\n targetPort?.onTrigger?.(props);\n }\n });\n }\n };\n\n annotation.outputs.push(port);\n\n const imageSrc = imageAnnotation.src;\n if (imageSrc) {\n try {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n await new Promise<void>((resolve, reject) => {\n img.onload = () => { port.setValue(img); resolve(); };\n img.onerror = reject;\n img.src = imageSrc.startsWith('/') || imageSrc.startsWith('http') || imageSrc.startsWith('data:')\n ? imageSrc : `/${imageSrc}`;\n });\n } catch (error) {\n console.error(`Failed to load image for annotation ${annotation.id}:`, error);\n }\n }\n } else if (annotation.type === 'Text') {\n const textAnnotation = annotation as TextAnnotation;\n if (textAnnotation.content !== undefined) {\n const portId = createPortId(annotation.id, 'output', 0);\n const port: OutputPort<string> = {\n id: portId,\n name: 'text',\n portType: 'param',\n dataType: 'string',\n value: textAnnotation.content,\n connections: [],\n setValue: (value: string) => {\n port.value = value;\n port.connections.forEach(conn => {\n const toParsed = parsePortId(conn.to.portId);\n const targetElement = this.getElement(toParsed.elementId);\n if (targetElement && !this.isAnnotation(targetElement)) {\n const targetPort = targetElement.getInputPort(toParsed.index);\n if (targetPort) {\n targetPort.value = value;\n targetPort.onChange?.(value);\n }\n }\n });\n },\n trigger: (props?: any) => {\n port.connections.forEach(conn => {\n const toParsed = parsePortId(conn.to.portId);\n const targetElement = this.getElement(toParsed.elementId);\n if (targetElement && !this.isAnnotation(targetElement)) {\n const targetPort = targetElement.getInputPort(toParsed.index);\n targetPort?.onTrigger?.(props);\n }\n });\n }\n };\n annotation.outputs.push(port);\n }\n }\n }\n\n // ============ Path Validation ============\n\n /**\n * Validate all expressions in the graph for broken paths\n * Returns warnings for any expressions referencing non-existent nodes or parameters\n */\n validateExpressionPaths(): { valid: boolean; warnings: { location: string; expression: string; brokenPath: string; suggestion?: string }[] } {\n type PathWarning = { location: string; expression: string; brokenPath: string; suggestion?: string };\n const warnings: PathWarning[] = [];\n\n // Regex to extract path references from ch(), chs(), chv() calls\n const pathRefPattern = /\\b(?:ch|chs|chv)\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g;\n\n for (const node of this.nodes) {\n for (const [propName, prop] of Object.entries(node.props)) {\n if (!prop.expression) continue;\n\n const location = `${node.path()}/${propName}`;\n const matches = prop.expression.matchAll(pathRefPattern);\n\n for (const match of matches) {\n const referencedPath = match[1];\n const resolvedNode = this.resolvePathFromNode(node, referencedPath);\n\n if (!resolvedNode.node) {\n warnings.push({\n location,\n expression: prop.expression,\n brokenPath: referencedPath,\n suggestion: this.suggestPathFix(node, referencedPath)\n });\n } else if (resolvedNode.parmName && !resolvedNode.node.props[resolvedNode.parmName]) {\n // Path resolved to a node but parameter doesn't exist\n warnings.push({\n location,\n expression: prop.expression,\n brokenPath: referencedPath,\n suggestion: `Parameter \"${resolvedNode.parmName}\" not found on node \"${resolvedNode.node.id}\"`\n });\n }\n }\n }\n }\n\n return {\n valid: warnings.length === 0,\n warnings\n };\n }\n\n /**\n * Resolve a path from a node's context, returning both the node and optional parameter name\n */\n private resolvePathFromNode(fromNode: Node, path: string): { node: Node | null; parmName?: string } {\n // Split path into node path and optional parameter\n const lastSlash = path.lastIndexOf('/');\n let nodePath: string;\n let parmName: string | undefined;\n\n // Check if the last segment could be a parameter (not a node)\n if (lastSlash > 0) {\n const possibleParm = path.substring(lastSlash + 1);\n const possibleNodePath = path.substring(0, lastSlash);\n\n // Try to resolve as node first\n const asNode = fromNode.node(path);\n if (asNode) {\n return { node: asNode };\n }\n\n // Try as node path + parameter\n const parentNode = fromNode.node(possibleNodePath);\n if (parentNode) {\n return { node: parentNode, parmName: possibleParm };\n }\n }\n\n // Try resolving the whole path as a node\n return { node: fromNode.node(path) };\n }\n\n /**\n * Try to suggest a fix for a broken path\n */\n private suggestPathFix(fromNode: Node, brokenPath: string): string | undefined {\n // Extract the target node name from the path\n const segments = brokenPath.replace(/^\\.?\\.?\\//, '').split('/');\n const targetName = segments[segments.length - 1];\n\n // Search for nodes with similar names in the graph\n const allNodes = this.nodes;\n const similar = allNodes.filter(n =>\n n.id.toLowerCase().includes(targetName.toLowerCase()) ||\n targetName.toLowerCase().includes(n.id.toLowerCase())\n );\n\n if (similar.length > 0) {\n const suggestion = similar[0];\n return `Did you mean \"${suggestion.path()}\"?`;\n }\n\n return undefined;\n }\n\n toJSON() {\n const result: any = {\n version: GRAPH_FORMAT_VERSION,\n metadata: {\n name: this.project.name || 'Cascade Graph',\n created: this.createdAt,\n modified: new Date().toISOString(),\n ...(this.project.description ? { description: this.project.description } : {}),\n ...(this.project.author ? { author: this.project.author } : {})\n }\n };\n\n // Project configuration (v0.2)\n if (this.project.packages.length > 0) {\n result.project = {\n packages: this.project.packages.map(pkg => ({\n path: pkg.path,\n alias: pkg.alias\n }))\n };\n }\n\n // Embedded modules (v0.2) - modules stored inline in the file\n const resolverConfig = this.moduleResolver.exportConfig();\n if (Object.keys(resolverConfig.embeddedModules).length > 0) {\n result.embeddedModules = resolverConfig.embeddedModules;\n }\n\n // External modules (v0.2) - references to project files with cached code\n if (Object.keys(resolverConfig.externalModules).length > 0) {\n result.externalModules = resolverConfig.externalModules;\n }\n\n // NPM packages (for runtime dependencies)\n const packages = this.packageManager.getCachedPackages().map((pkg: string) => {\n const [name, version] = pkg.split('@');\n return { name, version: version || 'latest' };\n });\n if (packages.length > 0) {\n result.packages = packages;\n }\n\n // Only include assets if manifest is not empty\n const assets = this.assetManager.list().map(asset => ({\n id: asset.id,\n path: asset.path,\n type: asset.type,\n size: asset.size\n }));\n if (assets.length > 0) {\n result.assets = { manifest: assets };\n }\n\n // Order: 1. annotations, 2. nodes, 3. connections (logical loading order)\n const annotations = this.annotations;\n const nodes = this.nodes;\n\n // Only include annotations if not empty\n if (annotations.length > 0) {\n result.annotations = annotations.map(ann => {\n const serialized: any = {\n id: ann.id,\n type: ann.type,\n position: [ann.position.x, ann.position.y]\n };\n const annAny = ann as any; // Type assertion for accessing specific properties\n if (annAny.content !== undefined) serialized.content = annAny.content;\n if (annAny.src !== undefined) serialized.src = annAny.src;\n if (ann.size) serialized.size = ann.size;\n if (annAny.points) serialized.points = annAny.points.map((p: { x: number; y: number }) => [p.x, p.y]);\n if (annAny.endPosition) serialized.endPosition = [annAny.endPosition.x, annAny.endPosition.y];\n if (ann.style) serialized.style = ann.style;\n if (ann.caption !== undefined) serialized.caption = ann.caption;\n if (ann.containedElements) serialized.containedElements = ann.containedElements;\n // Positions are relative to the parent subnet when this field is present.\n if (ann.parent) serialized.parent = ann.parent.id;\n return serialized;\n });\n }\n\n result.nodes = nodes.map(n => this.nodeToJSON(n));\n\n // Only include connections if not empty\n const connections = this.connections.map(conn => {\n // Parse port IDs to get element IDs and indices\n try {\n const fromParsed = parsePortId(conn.from.portId);\n const toParsed = parsePortId(conn.to.portId);\n\n const fromElement = this.getElement(fromParsed.elementId);\n const toElement = this.getElement(toParsed.elementId);\n\n if (!fromElement || !toElement) return null;\n\n // Verify port indices match - access ports directly from arrays (works for both computations and annotations)\n const fromPort = fromElement.outputs?.[fromParsed.index];\n const toPort = toElement.inputs?.[toParsed.index];\n\n if (!fromPort || !toPort) return null;\n\n // [[elementId, portIndex, portName], [elementId, portIndex, portName]].\n // The NAME is what a reader should use; the index stays as a fallback\n // for files and readers that predate it. Index alone was fragile: a\n // node's ports are created in the order its code calls in()/out(), so\n // any input pre-seeded in the file takes an earlier index and shifts\n // every connection after it \u2014 silently rewiring the graph.\n return [\n [fromParsed.elementId, fromParsed.index, fromPort.name],\n [toParsed.elementId, toParsed.index, toPort.name],\n ];\n } catch (err) {\n console.warn(`Failed to parse port ID in connection: ${err}`);\n return null;\n }\n }).filter((conn): conn is [[string, number, string], [string, number, string]] => conn !== null);\n if (connections.length > 0) {\n result.connections = connections;\n }\n\n return result;\n }\n\n /**\n * Serialize a node with v0.2 source information\n */\n private nodeToJSON(node: Node): any {\n // Use stored modulePath if available (set by addNode or fromJSON)\n // Otherwise fall back to deriving from node.type\n const nodeAny = node as any;\n const fullType = nodeAny.modulePath || (node.type.includes('.') ? node.type : `cascade.image.${node.type}`);\n\n // Use stored sourceType if available, otherwise derive it\n let sourceType = nodeAny.sourceType;\n if (!sourceType) {\n if (isStandardLibraryNode(fullType)) {\n sourceType = 'stdlib';\n } else if (fullType.startsWith('local.')) {\n sourceType = 'embedded';\n } else {\n sourceType = this.moduleResolver.getSourceType(fullType) || 'embedded';\n }\n }\n\n const result: any = {\n id: node.id,\n module: fullType,\n position: [node.position.x, node.position.y],\n source: sourceType\n };\n\n // For project modules, include file reference\n if (sourceType === 'project') {\n const config = this.moduleResolver.exportConfig();\n const external = config.externalModules[fullType];\n if (external) {\n result.file = external.file;\n }\n }\n\n // Only include code for non-stdlib embedded nodes\n if (result.source === 'embedded' && node.code) {\n result.code = node.code;\n }\n\n // Only include comment if not empty\n if (node.comment && node.comment.trim()) {\n result.comment = node.comment;\n }\n\n // A node's colour is a grouping the author chose; it belongs in the file.\n if ((node as any).color) {\n result.color = (node as any).color;\n }\n\n // Positions are relative to the parent subnet when this field is present.\n if (node.parent) {\n result.parent = node.parent.id;\n }\n\n /**\n * Parameters \u2014 the node's own values. Only those that differ from the code\n * default, plus anything promoted to a pin, so a file records decisions\n * rather than restating every default a module already has.\n */\n const changedParameters = (node.parameters ?? [])\n .filter(p => p.promoted || JSON.stringify(p.value) !== JSON.stringify(p.defaultValue));\n const parameters = changedParameters\n .filter(p => p.documentField !== 'props')\n .map(p => (p.promoted ? { name: p.name, value: p.value, promoted: true } : { name: p.name, value: p.value }));\n if (parameters.length > 0) {\n result.params = parameters;\n }\n\n /**\n * Serialize the value of every UNCONNECTED input port.\n *\n * This is where a node's parameters actually live: a node declares them\n * with `node.in(name, default)`, so a value someone set in the Inspector is\n * a port value and nothing else. Without this, saving discarded every one\n * of them \u2014 the graph reloaded with code defaults, and a setting that was\n * live a moment ago was simply gone. Caught by a save wiping the default\n * source out of a project graph, after which the loader had nothing to load.\n *\n * A connected port is skipped: its value belongs to the node upstream and\n * is recomputed on the next cook, so writing it down would only preserve a\n * stale copy.\n */\n const inputValues = node.inputs\n .filter(port => (port.connections?.length ?? 0) === 0)\n .filter(port => port.value !== undefined && port.value !== null)\n .filter(port => typeof port.value !== 'function')\n .map(port => ({ name: port.name, defaultValue: port.value, dataType: port.dataType }))\n .filter(port => port.defaultValue !== '' || port.dataType === 'string');\n\n if (inputValues.length > 0) {\n result.inputs = inputValues;\n }\n\n // Serialize props (value and expression if present)\n const props = Object.entries(node.props).reduce((acc, [key, prop]) => {\n let value = prop.value;\n if (prop.type === 'color' && isColorValue(value)) {\n const normalized = normalizeColor(value as any);\n value = [normalized.r, normalized.g, normalized.b, normalized.a ?? 1.0];\n }\n\n // If prop has an expression, save both value and expression\n if (prop.expression) {\n acc[key] = { value, expression: prop.expression };\n } else {\n acc[key] = value;\n }\n return acc;\n }, {} as Record<string, any>);\n for (const parameter of changedParameters) {\n if (parameter.documentField === 'props') props[parameter.name] = parameter.value;\n }\n if (Object.keys(props).length > 0) {\n result.props = props;\n }\n\n // Behavior toggles\n if (node.bypass) {\n result.bypass = true;\n }\n if (node.cook) {\n result.cook = true;\n }\n\n // Call node's serialize() method if it exists (polymorphic serialization)\n if (typeof (node as any).serialize === 'function') {\n const nodeState = (node as any).serialize();\n if (nodeState && Object.keys(nodeState).length > 0) {\n result.state = nodeState;\n }\n }\n\n return result;\n }\n\n static fromJSON(json: any, assetManager?: AssetManager, packageManager?: PackageManager): Graph {\n const graph = new Graph(assetManager, packageManager);\n const version = json.version || '0.1';\n if (typeof json.metadata?.created === 'string') graph.createdAt = json.metadata.created;\n\n /**\n * The project's name, read whether or not the file carries a `project`\n * block. It used to be read only inside the `if (json.project)` below, so\n * a graph with no npm packages \u2014 which is most of them \u2014 dropped its name\n * on load and then wrote 'Cascade Graph' back over it on the next save.\n * The name is metadata about the graph, not about its packages.\n */\n graph.project = {\n ...graph.project,\n ...(typeof json.metadata?.name === 'string' ? { name: json.metadata.name } : {}),\n ...(typeof json.metadata?.description === 'string' ? { description: json.metadata.description } : {}),\n ...(typeof json.metadata?.author === 'string' ? { author: json.metadata.author } : {}),\n };\n\n // Load project configuration (v0.2)\n if (json.project) {\n graph.project = {\n ...graph.project,\n name: json.metadata?.name ?? graph.project.name,\n description: json.metadata?.description ?? graph.project.description,\n author: json.metadata?.author ?? graph.project.author,\n packages: json.project.packages || []\n };\n // Update module resolver with project packages\n json.project.packages?.forEach((pkg: ProjectPackage) => {\n graph.moduleResolver.addProjectPackage(pkg);\n });\n }\n\n // Load embedded modules (v0.2)\n if (json.embeddedModules) {\n graph.moduleResolver.importConfig({\n embeddedModules: json.embeddedModules\n });\n }\n\n // Load external modules (v0.2)\n if (json.externalModules) {\n graph.moduleResolver.importConfig({\n externalModules: json.externalModules\n });\n }\n\n // Load packages if specified (for future use)\n if (json.packages && Array.isArray(json.packages)) {\n // Packages will be loaded on-demand when nodes require them\n // We could preload them here, but it's better to load on-demand\n }\n\n // Create nodes\n json.nodes.forEach((nodeData: any) => {\n // Use the saved ID directly, or generate a unique one if not present\n let nodeId = nodeData.id;\n if (!nodeId) {\n // Fallback: use name if available (for backward compatibility), otherwise use type\n const baseId = nodeData.name || nodeData.type || nodeData.module;\n nodeId = graph.generateUniqueNodeId(baseId);\n } else {\n // Check if ID is unique, if not, generate a unique variant\n let counter = 1;\n let candidateId = nodeId;\n while (graph.elements.some(e => e.id === candidateId)) {\n counter++;\n candidateId = `${nodeId}${counter}`;\n }\n nodeId = candidateId;\n }\n\n // Support both v0.1 'type' and v0.2 'module' fields\n const nodeType = nodeData.module || nodeData.type;\n if (!nodeType || !nodeType.includes('.')) {\n console.warn(`Invalid node type format: ${nodeType}. Expected package path (e.g., \"cascade.image.Color\"). Skipping node.`);\n return;\n }\n\n // Extract short type name for internal representation\n const shortType = packagePathToType(nodeType);\n\n // Determine source and get code for custom nodes\n const source = nodeData.source || (isStandardLibraryNode(nodeType) ? 'stdlib' : 'embedded');\n let nodeCode = '';\n\n if (source === 'embedded') {\n // Check embedded modules first (v0.2), then inline code\n const embeddedModule = json.embeddedModules?.[nodeType];\n nodeCode = embeddedModule?.code || nodeData.code || '';\n } else if (source === 'project') {\n // Project source - use cached code from external modules\n const externalModule = json.externalModules?.[nodeType];\n nodeCode = externalModule?.cachedCode || nodeData.code || '';\n }\n // stdlib nodes use class-based instantiation, no code needed\n\n // Try to get a class-based node first (for stdlib nodes)\n const NodeClass = getNodeClass(nodeType);\n let node: Node;\n\n if (NodeClass) {\n // Class-based node - instantiate directly\n node = new NodeClass(nodeId, graph);\n } else if (nodeType.startsWith('cascade.')) {\n throw new Error(`Unknown Cascade node type: ${nodeType}`);\n } else {\n // Fallback: create base Node for custom/function-based nodes\n node = new Node(nodeId, shortType, graph);\n }\n\n // Store full module path for source tracking\n (node as any).modulePath = nodeType;\n (node as any).sourceType = source;\n\n // Support both array [x, y] and object { x, y } formats for backward compatibility\n if (Array.isArray(nodeData.position)) {\n node.position = { x: nodeData.position[0] || 0, y: nodeData.position[1] || 0 };\n } else if (nodeData.position && typeof nodeData.position === 'object') {\n node.position = { x: nodeData.position.x || 0, y: nodeData.position.y || 0 };\n } else {\n node.position = { x: 0, y: 0 };\n }\n node.code = nodeCode;\n node.comment = nodeData.comment || '';\n if (nodeData.color) (node as any).color = nodeData.color;\n\n // Parameters are restored BEFORE the node's code runs, so that when\n // param() declares one it finds the saved value already there rather than\n // resetting it to the code default.\n if (Array.isArray(nodeData.params)) {\n nodeData.params.forEach((saved: any) => {\n if (!saved?.name) return;\n const declared = node.parameters.find(parameter => parameter.name === saved.name);\n if (declared) {\n declared.value = saved.value;\n declared.promoted = Boolean(saved.promoted);\n } else {\n node.parameters.push({\n name: saved.name,\n value: saved.value,\n defaultValue: saved.value,\n dataType: 'any',\n promoted: Boolean(saved.promoted),\n options: {},\n });\n }\n // A promoted parameter needs its pin to exist now, or the connection\n // into it has nothing to bind to on the first pass.\n if (saved.promoted) {\n const port = node.in(saved.name, saved.value);\n (port as any).fromParameter = saved.name;\n }\n });\n }\n graph.addElement(node);\n\n // Runtime documents accept either the legacy port array or the compact\n // name/value record. A class node's declared schema remains authoritative:\n // authored values override its live value, never its type or reset default.\n const restoreInput = (\n name: string,\n value: unknown,\n hasValue: boolean,\n saved: { dataType?: any; id?: string } = {},\n ) => {\n if (!name) return;\n const declared = node.inputs.find(port => port.name === name);\n const port = declared ?? node.in(\n name,\n hasValue ? value : undefined,\n saved.dataType ? { type: saved.dataType } : {},\n );\n if (declared && hasValue) declared.value = value;\n\n // Never replace a generated ID with an absent one. The generated ID is\n // what name-based, hand-authored documents need for connections.\n if (saved.id && port.id !== saved.id) (port as any).id = saved.id;\n };\n\n if (Array.isArray(nodeData.inputs)) {\n nodeData.inputs.forEach((saved: any) => {\n if (!saved || typeof saved !== 'object') return;\n const hasDefault = Object.prototype.hasOwnProperty.call(saved, 'defaultValue');\n const hasValue = Object.prototype.hasOwnProperty.call(saved, 'value');\n restoreInput(\n saved.name,\n hasDefault ? saved.defaultValue : saved.value,\n hasDefault || hasValue,\n saved,\n );\n });\n } else if (nodeData.inputs && typeof nodeData.inputs === 'object') {\n Object.entries(nodeData.inputs).forEach(([name, value]) => {\n restoreInput(name, value, true);\n });\n }\n\n if (nodeData.outputs && Array.isArray(nodeData.outputs)) {\n nodeData.outputs.forEach((portData: any) => {\n // Create port using the stored metadata\n const port = node.out(portData.name, portData.portType || 'param');\n // Same guard as the inputs above \u2014 never overwrite a generated id\n // with an absent one.\n if (portData.id && port.id !== portData.id) {\n (port as any).id = portData.id;\n }\n });\n }\n\n // Restore props\n if (nodeData.props) {\n Object.entries(nodeData.props).forEach(([key, propData]: [string, any]) => {\n // Check if propData is an object with value/expression or just a raw value\n let value: any;\n let expression: string | undefined;\n\n if (propData && typeof propData === 'object' && 'value' in propData) {\n // New format: { value: ..., expression?: ... }\n value = propData.value;\n expression = propData.expression;\n } else {\n // Old format: just the value\n value = propData;\n }\n\n // Normalize color values (support array format [r,g,b,a] and object format for backward compatibility)\n // Colors are stored internally as ColorObject, so normalizeColor handles the conversion\n let normalizedValue = value;\n if (isColorValue(value)) {\n const normalized = normalizeColor(value);\n // Store as ColorObject internally (normalizeColor already handles array/object/string formats)\n normalizedValue = normalized.a !== undefined && normalized.a !== 1.0\n ? { r: normalized.r, g: normalized.g, b: normalized.b, a: normalized.a }\n : { r: normalized.r, g: normalized.g, b: normalized.b };\n }\n\n const definitionProp = node.parameters.find(parameter =>\n parameter.name === key && parameter.documentField === 'props'\n );\n if (definitionProp) {\n // Definition props are Studio parameters but public document props.\n // Keep their contract value shape (not legacy UI color objects).\n definitionProp.value = value;\n } else if (!node.props[key]) {\n // Dynamic node props may be defined after the module first executes.\n node.props[key] = { value: normalizedValue } as any;\n } else {\n node.props[key].value = normalizedValue;\n }\n\n // Restore expression if present\n if (expression && !definitionProp) {\n node.props[key].expression = expression;\n }\n });\n }\n\n // Restore behavior toggles\n if (nodeData.bypass !== undefined) {\n node.setBypass(nodeData.bypass);\n }\n if (nodeData.cook !== undefined) {\n node.setCook(nodeData.cook);\n }\n\n // Set up node function - class-based nodes don't need this (they use setup())\n // Custom nodes (project or embedded) are real ES modules compiled\n // server-side (see nodeModuleLoader.ts) \u2014 the load is async, but\n // setFunction can be called with a stable wrapper immediately: it\n // awaits the compiled module the first time this node actually\n // executes, which always happens after fromJSON returns.\n // Gate on source === 'project' as well as node.code: a project\n // module's real content lives on disk (loadProjectModule always\n // fetches fresh), so node.code \u2014 only ever a legacy cached snapshot\n // for that source type \u2014 can be empty in a hand-authored or minimal\n // .cascade file without that meaning \"no function to wire up.\"\n if (!NodeClass && (source === 'project' || node.code)) {\n const modulePromise = source === 'project' ? loadProjectModule(nodeType) : loadEmbeddedModule(node.code);\n node.setFunction((n: unknown, g: unknown) =>\n modulePromise.then((m) => m.execute(n, g))\n );\n modulePromise.catch((err) => {\n console.warn('Failed to compile node ' + node.id + ':', err);\n });\n }\n\n // Call node's deserialize() method if it exists (polymorphic deserialization)\n // This restores node-specific state such as cached data.\n if (nodeData.state && typeof (node as any).deserialize === 'function') {\n try {\n (node as any).deserialize(nodeData.state);\n } catch (err) {\n console.warn('Failed to deserialize state for node ' + node.id + ':', err);\n }\n }\n });\n \n // Restore connections (ports may not exist yet if nodes haven't executed)\n // Connections will be fully validated after nodes execute\n const connectionsToRestore = json.connections || [];\n \n // Restore annotations\n if (json.annotations && Array.isArray(json.annotations)) {\n const annotations: Annotation[] = json.annotations.map((annData: any) => {\n let annotation: Annotation;\n const position = Array.isArray(annData.position)\n ? { x: annData.position[0] || 0, y: annData.position[1] || 0 }\n : { x: annData.position?.x || 0, y: annData.position?.y || 0 };\n\n // Normalize type to PascalCase for switch matching\n const normalizedType = annData.type.charAt(0).toUpperCase() + annData.type.slice(1).toLowerCase();\n\n switch (normalizedType) {\n case 'Image':\n annotation = new ImageAnnotation(annData.id, graph);\n (annotation as ImageAnnotation).src = annData.src;\n break;\n case 'Text':\n annotation = new TextAnnotation(annData.id, graph);\n (annotation as TextAnnotation).content = annData.content;\n break;\n case 'Group':\n annotation = new GroupAnnotation(annData.id, graph);\n (annotation as any).content = annData.content;\n break;\n case 'Line':\n annotation = new LineAnnotation(annData.id, graph);\n if (annData.endPosition) {\n (annotation as LineAnnotation).endPosition = Array.isArray(annData.endPosition)\n ? { x: annData.endPosition[0] || 0, y: annData.endPosition[1] || 0 }\n : { x: annData.endPosition.x || 0, y: annData.endPosition.y || 0 };\n }\n break;\n case 'Polyline':\n annotation = new PolylineAnnotation(annData.id, graph);\n if (annData.points) {\n (annotation as PolylineAnnotation).points = annData.points.map((p: any) =>\n Array.isArray(p)\n ? { x: p[0] || 0, y: p[1] || 0 }\n : { x: p.x || 0, y: p.y || 0 }\n );\n }\n break;\n default:\n annotation = new Annotation(annData.id, annData.type, graph);\n }\n\n annotation.position = position;\n if (annData.size) annotation.size = { width: annData.size.width, height: annData.size.height };\n if (annData.style) annotation.style = { ...annData.style };\n if (annData.caption !== undefined) annotation.caption = annData.caption;\n if (annData.containedElements) annotation.containedElements = annData.containedElements;\n\n return annotation;\n });\n \n // Add annotations to graph\n annotations.forEach(ann => graph.addElement(ann));\n \n // Store the promise for annotation port initialization so callers can await it\n (graph as any)._annotationPortsInitialized = Promise.all(\n annotations.map(ann => graph.initializeAnnotationPorts(ann))\n ).catch(err => {\n console.error('Failed to initialize some annotation ports:', err);\n });\n } else {\n // No annotations, so initialization is already complete\n (graph as any)._annotationPortsInitialized = Promise.resolve();\n }\n\n const authoredElements = [\n ...(Array.isArray(json.nodes) ? json.nodes : []),\n ...(Array.isArray(json.annotations) ? json.annotations : []),\n ];\n for (const elementData of authoredElements) {\n if (typeof elementData?.parent !== 'string') continue;\n\n const child = graph.getElement(elementData.id);\n const parent = graph.getElement(elementData.parent);\n const warn = (reason: string) => console.warn(\n `Parent link for \"${elementData.id}\" to \"${elementData.parent}\" ignored: ${reason}; element loaded at root.`\n );\n\n if (!child) continue;\n if (!parent) {\n warn('parent does not exist');\n continue;\n }\n if (child === parent) {\n warn('self-parenting is invalid');\n continue;\n }\n if (!parent.isNetwork()) {\n warn('parent is not a network');\n continue;\n }\n\n let ancestor: Node | null = parent;\n let closesCycle = false;\n const visited = new Set<Node>();\n while (ancestor && !visited.has(ancestor)) {\n if (ancestor === child) {\n closesCycle = true;\n break;\n }\n visited.add(ancestor);\n ancestor = ancestor.parent;\n }\n if (closesCycle) {\n warn('parent cycle detected');\n continue;\n }\n\n graph.reparentElement(child, parent);\n }\n\n const depth = (node: Node): number => {\n let value = 0;\n let parent = node.parent;\n const visited = new Set<Node>();\n while (parent && !visited.has(parent)) {\n visited.add(parent);\n value++;\n parent = parent.parent;\n }\n return value;\n };\n graph.nodes\n .filter(node => node.isNetwork())\n .sort((left, right) => depth(right) - depth(left))\n .forEach(node => (node as any).syncPorts?.());\n \n // Store connections to restore after nodes execute\n (graph as any)._connectionsToRestore = connectionsToRestore;\n\n // Try to restore connections now (will work if nodes were already executed)\n connectionsToRestore.forEach((connData: any) => {\n graph.tryRestoreConnection(connData, false);\n });\n\n return graph;\n }\n \n async waitForAnnotationPorts(): Promise<void> {\n const initPromise = (this as any)._annotationPortsInitialized;\n if (initPromise) {\n await initPromise;\n }\n }\n\n /**\n * Try to restore a single connection from serialized data\n * @internal\n */\n tryRestoreConnection(connData: any, checkDuplicates = false): boolean {\n if (!Array.isArray(connData) || !Array.isArray(connData[0]) || !Array.isArray(connData[1])) {\n return false;\n }\n\n const [fromNodeId, fromPortIndex, fromPortName] = connData[0];\n const [toNodeId, toPortIndex, toPortName] = connData[1];\n\n if (typeof fromPortIndex !== 'number' || typeof toPortIndex !== 'number') {\n return false;\n }\n\n const fromElement = this.getElement(fromNodeId);\n const toElement = this.getElement(toNodeId);\n if (!fromElement || !toElement) return false;\n\n // Name first, index as the fallback. A port's index depends on the order the\n // node's code happens to declare its ports, which changes whenever an input\n // is pre-seeded in the file or a parameter is added to the module; the name\n // doesn't. Files written before names existed still resolve by index.\n const byName = <T extends { name?: string }>(ports: T[] | undefined, name: unknown) =>\n typeof name === 'string' ? ports?.find(p => p.name === name) : undefined;\n\n /**\n * When the file names a port, ONLY the name resolves it \u2014 never the index.\n *\n * Falling back to the index when a named port isn't found yet is worse than\n * failing: a port that a node creates late in its own code simply doesn't\n * exist during the first passes, and the fallback then binds the wire to\n * whatever happens to sit at that index. Seen live: an edge meant for\n * `brightness_contribution` landed on `brightness`, so the blend read a\n * weight where it expected an image and quietly produced nothing. Waiting a\n * pass costs nothing; guessing costs a silently miswired graph.\n */\n const resolve = <T extends { name?: string }>(ports: T[] | undefined, name: unknown, index: number) =>\n typeof name === 'string' ? byName(ports, name) : ports?.[index];\n\n const fromPort = resolve(fromElement.outputs, fromPortName, fromPortIndex);\n const toPort = resolve(toElement.inputs, toPortName, toPortIndex);\n // Not an error: the target's ports may not exist until its code has run.\n // restoreConnections() keeps this one pending and tries again next pass.\n if (!fromPort || !toPort) return false;\n\n if (checkDuplicates) {\n const exists = this.connections.some(c =>\n c.from.nodeId === fromNodeId &&\n c.from.portId === fromPort.id &&\n c.to.nodeId === toNodeId &&\n c.to.portId === toPort.id\n );\n if (exists) return true;\n }\n\n try {\n this.connect(fromPort, toPort);\n return true;\n } catch (err) {\n // A rejection here IS a fault \u2014 both ports exist and the graph still\n // refused the edge. Silence cost a day: every connection into a\n // hand-authored node failed this way and the graph simply sat there.\n console.warn(`[connect] ${fromNodeId}[${fromPortIndex}] -> ${toNodeId}[${toPortIndex}] rejected:`, err);\n return false;\n }\n }\n\n /**\n * Restore connections that were stored during fromJSON\n */\n /**\n * Bind the connections a loaded file described, and KEEP the ones that could\n * not bind yet.\n *\n * A node's ports are created by running its code, so on load a connection\n * into a node that hasn't executed has no port to attach to. This used to\n * drop those connections on the floor \u2014 the pending list was deleted after\n * one pass \u2014 which meant a graph of code-defined nodes came up almost\n * entirely unwired, and nothing downstream of a source ever ran. Anything\n * still unresolved stays pending, so calling this again after another cook\n * finishes the job.\n */\n restoreConnections(): void {\n const connectionsToRestore = (this as any)._connectionsToRestore || [];\n if (connectionsToRestore.length === 0) return;\n\n const stillPending = connectionsToRestore.filter(\n (connData: any) => !this.tryRestoreConnection(connData, true)\n );\n\n if (stillPending.length > 0) {\n (this as any)._connectionsToRestore = stillPending;\n } else {\n delete (this as any)._connectionsToRestore;\n }\n }\n}\n", "import type { AssetLoader } from './AssetManager.js';\n\ninterface FileReader {\n readFile(path: string): Promise<Uint8Array>;\n readFile(path: string, encoding: 'utf-8'): Promise<string>;\n}\n\n/** Node-only asset IO. Browser entry points must not import this module. */\nexport class NodeAssetLoader implements AssetLoader {\n constructor(private readonly files: FileReader) {}\n\n loadImage(path: string): Promise<Uint8Array> {\n return this.files.readFile(path);\n }\n\n async loadJSON(path: string): Promise<unknown> {\n return JSON.parse(await this.files.readFile(path, 'utf-8'));\n }\n\n loadText(path: string): Promise<string> {\n return this.files.readFile(path, 'utf-8');\n }\n\n async loadBinary(path: string): Promise<ArrayBuffer> {\n const data = await this.files.readFile(path);\n return data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer;\n }\n}\n", "import { Graph } from '../nodes/Graph.js';\nimport { Node } from '../nodes/Node.js';\nimport { AssetManager } from '../engine/AssetManager.js';\nimport { NodeAssetLoader } from '../engine/NodeAssetLoader.js';\nimport { PackageManager } from '../engine/PackageManager.js';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { checkProjectGraph, inspectProjectGraph, runDeterministicProjectGraph, validateProjectGraph } from './projectRuntime.js';\nimport { setEmbeddedCompiler, setProjectModuleCompiler } from '../engine/nodeModuleLoader.js';\nimport { compileEmbedded, compileProjectModule } from '../../server/src/compile.js';\nimport { ProjectRoot } from '../../server/src/project.js';\nimport { runProjectStage } from '../../server/src/stageRunner.js';\nimport { installStageBridge } from '../../server/src/runtime/stage.js';\n\nexport interface RunOptions {\n file: string;\n entryNode?: string;\n validateOnly?: boolean;\n checkOnly?: boolean;\n inspectOnly?: boolean;\n verbose?: boolean;\n}\n\nexport async function runGraph(options: RunOptions): Promise<void> {\n const { file, entryNode, validateOnly, checkOnly, inspectOnly, verbose } = options;\n\n if (verbose) {\n console.log(`Loading graph from: ${file}`);\n }\n\n // Read and parse graph file\n let graphData: any;\n try {\n const filePath = path.resolve(file);\n const content = await fs.readFile(filePath, 'utf-8');\n graphData = JSON.parse(content);\n } catch (error: any) {\n console.error(`Failed to load graph file: ${error.message}`);\n process.exit(1);\n }\n\n // Create environment-specific managers\n const projectRoot = path.dirname(path.resolve(file));\n const assetLoader = new NodeAssetLoader(fs);\n const assetManager = new AssetManager(projectRoot, assetLoader);\n const packageManager = new PackageManager();\n\n if (validateOnly || checkOnly) {\n if (checkOnly) await checkProjectGraph(file, graphData);\n else await validateProjectGraph(file, graphData);\n console.log(checkOnly ? 'Static check passed!' : 'Graph validation passed!');\n return;\n }\n\n if (inspectOnly) {\n console.log(JSON.stringify(await inspectProjectGraph(file, graphData), null, 2));\n return;\n }\n\n if (await runDeterministicProjectGraph(file, graphData, entryNode)) {\n if (verbose) console.log('Graph execution completed');\n return;\n }\n\n // A dynamic graph reaches here, and until now it died trying to fetch its\n // modules from `/api/nodes/...` \u2014 a relative URL, with no server behind it and\n // no origin to resolve it against. Compiling them in-process with the same\n // esbuild pass the server uses is what makes `cascade run` work on the graphs\n // people actually have, rather than only on fully migrated ones.\n // Best effort: a .cascade file can sit outside a project directory, and such\n // a graph should still run whatever it carries inline rather than failing on\n // a project that is not there.\n let disposeStageBridge: (() => void) | undefined;\n try {\n const project = new ProjectRoot(path.dirname(path.resolve(file)));\n setProjectModuleCompiler(async (folderName) => (await compileProjectModule(project, folderName)).code);\n setEmbeddedCompiler(async (code) => (await compileEmbedded(project, code)).code);\n // A node importing `cascade/stage` posts to the server in the page and\n // calls this in a headless run, so one Python-backed node renders either way.\n disposeStageBridge = installStageBridge((stage, args) => runProjectStage(project, stage, args));\n } catch (error) {\n if (verbose) console.warn(`No project context for ${file}: ${error instanceof Error ? error.message : error}`);\n }\n\n try {\n // Create graph from JSON\n let graph: Graph;\n try {\n graph = Graph.fromJSON(graphData, assetManager, packageManager);\n } catch (error: any) {\n console.error(`Failed to create graph: ${error.message}`);\n process.exit(1);\n }\n\n // Ports should already be restored from JSON metadata (if available)\n // Only execute computations if ports weren't restored from metadata\n // This avoids unnecessary execution just for port discovery\n const nodesNeedingExecution: Node[] = [];\n for (const element of graph.elements.filter(e => !(e as any).isAnnotation)) {\n const node = element as Node;\n // Check if computation has ports (restored from metadata)\n // If not, we may need to execute to create them\n const hasPorts = node.inputs.length > 0 || node.outputs.length > 0;\n // Gate on the source as well as on node.code, for the same reason\n // Graph.fromJSON does: a project module's code lives on disk, so node.code\n // is empty for it. Checking only node.code meant no project node was ever\n // initialised headlessly, so no ports existed, so no connections could be\n // restored \u2014 and every graph \"completed\" while doing nothing at all.\n const isProject = (node as any).sourceType === 'project'\n || String((node as any).modulePath ?? '').startsWith('project.');\n if (!hasPorts && (node.code || isProject)) {\n nodesNeedingExecution.push(node);\n }\n }\n\n // Only execute nodes that don't have ports from metadata\n for (const node of nodesNeedingExecution) {\n try {\n // Execute to initialize ports and props\n // The node's execute() method handles initialization properly\n // Suppress browser API errors in Node.js environment\n await node.execute();\n } catch (err: any) {\n // Ignore execution errors during initialization - they'll be caught during actual execution\n // Browser API errors (like document is not defined) are expected in CLI for browser-only nodes\n const errMsg = err.message || String(err);\n const isBrowserAPIError =\n errMsg.includes('document is not defined') ||\n errMsg.includes('window is not defined') ||\n errMsg.includes('HTMLCanvasElement') ||\n errMsg.includes('HTMLImageElement');\n\n if (verbose && !isBrowserAPIError) {\n console.warn(`Warning: Node ${node.id} failed to initialize: ${errMsg}`);\n }\n // Browser API errors are expected and can be ignored - these nodes are designed for browser execution\n }\n }\n\n // Restore connections now that ports exist (either from metadata or execution)\n graph.restoreConnections();\n\n // Validate graph (now that ports and connections exist)\n const validation = graph.validate();\n\n if (validation.errors.length > 0) {\n console.error('Graph validation failed:');\n validation.errors.forEach(error => {\n console.error(` - ${error.type}: ${error.message}`);\n if (error.nodeIds) {\n console.error(` Nodes: ${error.nodeIds.join(', ')}`);\n }\n });\n process.exit(1);\n }\n\n if (validation.warnings.length > 0) {\n console.warn('Graph validation warnings:');\n validation.warnings.forEach(warning => {\n console.warn(` - ${warning.type}: ${warning.message}`);\n });\n }\n\n if (verbose) {\n const nodeCount = graph.elements.filter(e => !(e as any).isAnnotation).length;\n console.log(`Graph loaded: ${nodeCount} nodes, ${graph.connections.length} connections`);\n }\n\n // Execute graph\n try {\n if (entryNode) {\n const node = graph.getNode(entryNode);\n if (!node) {\n console.error(`Entry node not found: ${entryNode}`);\n process.exit(1);\n }\n if (verbose) {\n console.log(`Executing from entry node: ${entryNode}`);\n }\n await graph.execute(node);\n } else {\n if (verbose) {\n console.log('Executing all entry points...');\n }\n await graph.execute();\n }\n\n const failedNodes = graph.nodes.filter(node => node.error !== null);\n if (failedNodes.length > 0) {\n console.error('Graph execution failed:');\n for (const node of failedNodes) {\n console.error(` - node/cook-failed [${node.id}]: ${node.error?.message ?? 'Unknown cook error'}`);\n }\n process.exit(1);\n }\n\n if (verbose) {\n console.log('Graph execution completed');\n }\n } catch (error: any) {\n console.error(`Graph execution failed: ${error.message}`);\n if (verbose && error.stack) {\n console.error(error.stack);\n }\n process.exit(1);\n }\n } finally {\n disposeStageBridge?.();\n setProjectModuleCompiler(null);\n setEmbeddedCompiler(null);\n }\n}\n", "import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport ts from 'typescript';\nimport { build } from 'esbuild';\nimport type { NodeDefinition } from '../../packages/contracts/src/index.js';\nimport { createRuntime } from '../../packages/runtime/src/index.js';\nimport { builtinNodeRegistration, builtinNodeRegistrations } from '../../packages/runtime/src/builtins/index.js';\nimport { createNodeRuntimeHost } from '../../packages/runtime/src/node.js';\nimport { extractNodeDefinition } from '../../packages/runtime/src/definition/extract.js';\nimport { validateNodeModuleArchitecture } from '../../packages/runtime/src/definition/architecture.js';\nimport type { DefinitionNodeRegistration } from '../../packages/runtime/src/types.js';\nimport { ProjectRoot } from '../../server/src/project.js';\n\ninterface ProjectNode {\n id: string;\n module?: string;\n type?: string;\n source?: unknown;\n inputs?: unknown;\n outputs?: unknown;\n props?: Record<string, unknown>;\n}\n\ninterface PreparedGraph {\n registrations: DefinitionNodeRegistration[];\n deterministic: Set<string>;\n}\n\nexport async function validateProjectGraph(file: string, document: any): Promise<void> {\n const prepared = await prepare(file, document, false);\n const nodes = document.nodes as ProjectNode[];\n if (nodes.some((node) => !prepared.deterministic.has(moduleId(node)))) {\n validateDynamicDocument(document);\n return;\n }\n const runtime = createRuntime({\n host: createNodeRuntimeHost({ modules: resolver(prepared.registrations) }),\n nodes: prepared.registrations,\n });\n const graph = await runtime.load(document);\n await graph.dispose();\n await runtime.dispose();\n}\n\nexport async function checkProjectGraph(file: string, document: any): Promise<void> {\n const prepared = await prepare(file, document, false);\n const nodes = document.nodes as ProjectNode[];\n const dynamic = [...new Set(nodes\n .map(moduleId)\n .filter((id) => id && !prepared.deterministic.has(id)))];\n if (dynamic.length) {\n throw new Error(`Static check requires definition-v1 modules; dynamic modules: ${dynamic.join(', ')}`);\n }\n const runtime = createRuntime({\n host: createNodeRuntimeHost({ modules: resolver(prepared.registrations) }),\n nodes: prepared.registrations,\n });\n const graph = await runtime.load(document);\n await graph.dispose();\n await runtime.dispose();\n}\n\nexport async function runDeterministicProjectGraph(\n file: string,\n document: any,\n entryNode?: string,\n): Promise<boolean> {\n const prepared = await prepare(file, document, true);\n const nodes = Array.isArray(document?.nodes) ? document.nodes as ProjectNode[] : [];\n const deterministicCount = nodes.filter((node) => prepared.deterministic.has(moduleId(node))).length;\n if (!nodes.length || deterministicCount === 0) return false;\n if (deterministicCount !== nodes.length) {\n throw new Error('Mixed deterministic and dynamic graphs are not executable until the bounded legacy adapter is implemented');\n }\n\n const project = new ProjectRoot(path.dirname(path.resolve(file)));\n const runtime = createRuntime({\n host: createNodeRuntimeHost({\n modules: resolver(prepared.registrations),\n shell: project.shell as never,\n }),\n nodes: prepared.registrations,\n });\n const graph = await runtime.load(document);\n const result = await graph.run(entryNode ? { target: { kind: 'node', nodeId: entryNode } } : {});\n await graph.dispose();\n await runtime.dispose();\n if (result.status !== 'completed') {\n throw new Error(result.diagnostics.map((item) => item.message).join('\\n') || `Graph ${result.status}`);\n }\n return true;\n}\n\nexport async function inspectProjectGraph(file: string, document: any) {\n const prepared = await prepare(file, document, false);\n const registrations = new Map(\n [...builtinNodeRegistrations, ...prepared.registrations].map((item) => [item.moduleId, item]),\n );\n const nodes = (document.nodes as ProjectNode[]).map((node) => {\n const id = moduleId(node);\n return {\n id: node.id,\n module: id,\n classification: prepared.deterministic.has(id) ? 'definition-v1' : 'dynamic',\n ...(prepared.deterministic.has(id) ? { definition: registrations.get(id)?.definition } : {}),\n };\n });\n return {\n file: path.resolve(file),\n version: document.version ?? null,\n deterministic: nodes.length > 0 && nodes.every((node) => node.classification === 'definition-v1'),\n nodes,\n connections: Array.isArray(document.connections) ? document.connections.length : 0,\n };\n}\n\nasync function prepare(file: string, document: any, compileExecutors: boolean): Promise<PreparedGraph> {\n if (!document || typeof document !== 'object' || !Array.isArray(document.nodes)) {\n throw new Error('Graph document must contain a nodes array');\n }\n const projectRoot = path.dirname(path.resolve(file));\n const registrations: DefinitionNodeRegistration[] = [];\n const deterministic = new Set<string>();\n const seen = new Set<string>();\n\n for (const node of document.nodes as ProjectNode[]) {\n const id = moduleId(node);\n if (!id || seen.has(id)) continue;\n seen.add(id);\n if (builtinNodeRegistration(id)) {\n deterministic.add(id);\n continue;\n }\n const moduleFile = await projectModuleFile(projectRoot, node, id);\n if (!moduleFile) {\n registrations.push(savedRegistration(id, node));\n continue;\n }\n\n const source = await fs.readFile(moduleFile, 'utf8');\n const mentionsDefinition = /\\bexport\\s+const\\s+definition\\b/.test(source);\n const extracted = extractNodeDefinition(source, moduleFile, ts);\n if (!extracted.ok) {\n if (!mentionsDefinition && extracted.diagnostics.every((item) => item.code === 'definition/missing-export')) {\n registrations.push(savedRegistration(id, node));\n continue;\n }\n throw new Error(extracted.diagnostics.map(formatDiagnostic).join('\\n'));\n }\n const architectureDiagnostics = validateNodeModuleArchitecture(source, moduleFile, ts);\n if (architectureDiagnostics.length) {\n throw new Error(architectureDiagnostics.map(formatDiagnostic).join('\\n'));\n }\n\n deterministic.add(id);\n registrations.push({\n kind: 'definition-v1',\n moduleId: id,\n definition: extracted.definition,\n loadExecute: compileExecutors\n ? () => compileExecute(projectRoot, moduleFile)\n : async () => { throw new Error('Static validation never loads execute'); },\n });\n }\n return { registrations, deterministic };\n}\n\nasync function projectModuleFile(root: string, node: ProjectNode, id: string): Promise<string | null> {\n const source = node.source;\n if (source && typeof source === 'object' && (source as any).type === 'project' && typeof (source as any).file === 'string') {\n const candidate = path.resolve(root, (source as any).file);\n if (within(root, candidate) && await exists(candidate)) return candidate;\n }\n if (!id.startsWith('project.')) return null;\n const name = id.slice('project.'.length);\n const candidate = path.resolve(root, 'nodes', name, 'index.ts');\n return within(root, candidate) && await exists(candidate) ? candidate : null;\n}\n\nasync function compileExecute(projectRoot: string, moduleFile: string) {\n const cache = path.join(projectRoot, '.cascade-cache', 'nodes');\n await fs.mkdir(cache, { recursive: true });\n const output = path.join(cache, `${path.basename(path.dirname(moduleFile))}.mjs`);\n await build({\n entryPoints: [moduleFile],\n outfile: output,\n bundle: true,\n packages: 'external',\n platform: 'node',\n target: 'node20',\n format: 'esm',\n sourcemap: 'inline',\n });\n const loaded = await import(`${pathToFileURL(output).href}?v=${Date.now()}`);\n if (typeof loaded.execute !== 'function') throw new Error(`${moduleFile} does not export execute`);\n return loaded.execute;\n}\n\nfunction savedRegistration(moduleId: string, node: ProjectNode): DefinitionNodeRegistration {\n return {\n kind: 'definition-v1',\n moduleId,\n definition: savedDefinition(node),\n loadExecute: async () => { throw new Error(`Legacy module ${moduleId} cannot run through the deterministic runtime`); },\n };\n}\n\nfunction savedDefinition(node: ProjectNode): NodeDefinition {\n const inputs = portDefinitions(node.inputs, 'input');\n const outputs = portDefinitions(node.outputs, 'output');\n // Only the input names, because outputs have their own namespace now: a prop\n // and an output may share a name and dropping the prop for that would be\n // silent data loss. Inputs and props still share one, so a prop colliding\n // there is the one that has to go.\n const used = new Set(Object.keys(inputs));\n const props = Object.fromEntries(Object.entries(node.props ?? {}).filter(([name]) => !used.has(name)).map(([name, value]) => [name, {\n type: 'any',\n default: jsonValue(value && typeof value === 'object' && 'value' in value ? (value as any).value : value),\n }]));\n return {\n apiVersion: 1,\n runsOn: 'portable',\n inputs,\n outputs,\n props,\n } as NodeDefinition;\n}\n\nfunction validateDynamicDocument(document: any): void {\n if (!Array.isArray(document.nodes)) throw new Error('Graph document must contain a nodes array');\n const ids = new Set<string>();\n for (const node of document.nodes as ProjectNode[]) {\n if (!node || typeof node.id !== 'string' || !node.id || !moduleId(node)) {\n throw new Error('Every graph node must have a non-empty id and module');\n }\n if (ids.has(node.id)) throw new Error(`Duplicate node id: ${node.id}`);\n ids.add(node.id);\n }\n if (document.connections !== undefined && !Array.isArray(document.connections)) {\n throw new Error('Graph connections must be an array');\n }\n for (const [index, connection] of (document.connections ?? []).entries()) {\n const endpoints = Array.isArray(connection)\n ? connection\n : [connection?.source, connection?.target];\n if (endpoints.length !== 2) throw new Error(`Connection ${index} must have two endpoints`);\n for (const endpoint of endpoints) {\n const nodeId = Array.isArray(endpoint) ? endpoint[0] : endpoint?.nodeId;\n if (typeof nodeId !== 'string' || !ids.has(nodeId)) {\n throw new Error(`Connection ${index} references an unknown node`);\n }\n }\n }\n}\n\nfunction portDefinitions(value: unknown, direction: 'input' | 'output'): Record<string, any> {\n if (!Array.isArray(value)) return {};\n return Object.fromEntries(value.flatMap((port: any, index) => {\n const name = typeof port?.name === 'string' && /^[A-Za-z][A-Za-z0-9_]*$/.test(port.name) ? port.name : `${direction}_${index}`;\n if (port?.portType === 'trigger' || port?.dataType === 'trigger') return [[name, { kind: 'trigger' }]];\n const definition: Record<string, unknown> = { kind: 'data', type: cascadeType(port?.dataType) };\n if (direction === 'input' && ('defaultValue' in (port ?? {}) || 'value' in (port ?? {}))) {\n definition.default = jsonValue('defaultValue' in port ? port.defaultValue : port.value);\n }\n return [[name, definition]];\n }));\n}\n\nfunction moduleId(node: ProjectNode): string {\n return typeof node?.module === 'string' ? node.module : typeof node?.type === 'string' ? node.type : '';\n}\n\nfunction cascadeType(value: unknown): string {\n if (value === 'number') return 'float';\n if (value === 'boolean') return 'bool';\n return typeof value === 'string' && value !== 'trigger' ? value : 'any';\n}\n\nfunction jsonValue(value: unknown): any {\n try { return value === undefined ? null : JSON.parse(JSON.stringify(value)); }\n catch { return null; }\n}\n\nfunction resolver(registrations: DefinitionNodeRegistration[]) {\n const modules = new Map(registrations.map((registration) => [registration.moduleId, registration]));\n return { resolve: async (id: string) => modules.get(id) ?? null };\n}\n\nfunction formatDiagnostic(diagnostic: any): string {\n const location = diagnostic.file ? `${diagnostic.file}${diagnostic.line ? `:${diagnostic.line}:${diagnostic.column}` : ''}: ` : '';\n return `${location}${diagnostic.code}: ${diagnostic.message}`;\n}\n\nfunction within(root: string, candidate: string): boolean {\n const relative = path.relative(path.resolve(root), candidate);\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nasync function exists(file: string): Promise<boolean> {\n try { await fs.access(file); return true; } catch { return false; }\n}\n", "import type { Diagnostic } from \"@cascade/contracts\";\n\nexport class CascadeRuntimeError extends Error {\n readonly name = \"CascadeRuntimeError\";\n constructor(\n readonly code: string,\n readonly diagnostics: readonly Diagnostic[],\n message = diagnostics[0]?.message ?? code,\n ) {\n super(message);\n }\n}\n", "import {\n attributeArray,\n attributeArrayFrom,\n createGeometry,\n isStringAttribute,\n levelCount,\n POSITION_ATTRIBUTE,\n type AnyAttribute,\n type Attribute,\n type AttributeLevel,\n type AttributeSet,\n type AttributeStorage,\n type DetailValue,\n type ElementLevel,\n type Geometry,\n type StringAttribute,\n} from \"@cascade/contracts\";\n\n/**\n * Attribute reads and writes. Every write returns a new `Geometry` and shares\n * the arrays it did not touch, which is the whole reason the format is\n * struct-of-arrays: with array-of-structs there is no granularity to share at.\n *\n * Node code should stay on this surface rather than reaching into an\n * attribute's `data`, because nothing in the language stops a write into a\n * shared array and everything downstream would then see it. See the immutability\n * note at the top of `packages/contracts/src/geometry.ts`.\n */\n\nexport function geometryError(code: string, message: string): never {\n throw new TypeError(`geometry/${code}: ${message}`);\n}\n\n/** The attribute set at an element level. */\nexport function attributeSet(\n geometry: Geometry,\n level: ElementLevel,\n): AttributeSet {\n return geometry[level];\n}\n\nexport function getAttribute(\n geometry: Geometry,\n level: ElementLevel,\n name: string,\n): AnyAttribute | undefined {\n return geometry[level][name];\n}\n\nexport function hasAttribute(\n geometry: Geometry,\n level: ElementLevel,\n name: string,\n): boolean {\n return Object.prototype.hasOwnProperty.call(geometry[level], name);\n}\n\n/** Names at a level, in insertion order. */\nexport function attributeNames(\n geometry: Geometry,\n level: ElementLevel,\n): readonly string[] {\n return Object.keys(geometry[level]);\n}\n\nexport function requireAttribute(\n geometry: Geometry,\n level: ElementLevel,\n name: string,\n): AnyAttribute {\n const attribute = geometry[level][name];\n if (attribute === undefined)\n geometryError(\"missing-attribute\", `${level}.${name} is not present`);\n return attribute;\n}\n\n/** A numeric attribute when present, with consumer-specific arity validation. */\nexport function numericAttribute(\n attribute: AnyAttribute | undefined,\n path: string,\n sizes?: readonly number[],\n): Attribute | undefined {\n if (attribute === undefined) return undefined;\n if (isStringAttribute(attribute))\n geometryError(\"attribute-storage\", `${path} must be numeric`);\n if (sizes !== undefined && !sizes.includes(attribute.size))\n geometryError(\n \"attribute-size\",\n `${path} has size ${attribute.size}; expected ${sizes.join(\" or \")}`,\n );\n return attribute;\n}\n\n/** One component of one element. */\nexport function readComponent(\n attribute: Attribute,\n index: number,\n component = 0,\n): number {\n return attribute.data[index * attribute.size + component];\n}\n\n/** Every component of one element, as a plain array. */\nexport function readElement(attribute: Attribute, index: number): number[] {\n const values = new Array<number>(attribute.size);\n for (let component = 0; component < attribute.size; component += 1)\n values[component] = attribute.data[index * attribute.size + component];\n return values;\n}\n\n/** One element of a string attribute. Out-of-table indices read as empty. */\nexport function readString(attribute: StringAttribute, index: number): string {\n const slot = attribute.data[index];\n return slot < 0 ? \"\" : (attribute.table[slot] ?? \"\");\n}\n\n/** A whole element without knowing which kind of attribute it is. */\nexport function readAttribute(\n attribute: AnyAttribute,\n index: number,\n): number | number[] | string {\n if (isStringAttribute(attribute)) return readString(attribute, index);\n return attribute.size === 1\n ? readComponent(attribute, index)\n : readElement(attribute, index);\n}\n\n/** Declared position width: 2 or 3. */\nexport function positionSize(geometry: Geometry): number {\n return (geometry.point[POSITION_ATTRIBUTE] as Attribute).size;\n}\n\nexport function positionAttribute(geometry: Geometry): Attribute {\n return geometry.point[POSITION_ATTRIBUTE] as Attribute;\n}\n\nexport function getPosition(geometry: Geometry, index: number): number[] {\n return readElement(positionAttribute(geometry), index);\n}\n\n/** A zeroed numeric attribute for `count` elements. */\nexport function createAttribute(\n count: number,\n size: number,\n storage: AttributeStorage = \"f64\",\n fill?: readonly number[] | number,\n): Attribute {\n const data = attributeArray(storage, size * count);\n if (fill !== undefined) {\n const values = typeof fill === \"number\" ? [fill] : fill;\n for (let index = 0; index < count; index += 1)\n for (let component = 0; component < size; component += 1)\n data[index * size + component] =\n values[component % Math.max(values.length, 1)] ?? 0;\n }\n return { storage, size, data };\n}\n\n/** A string attribute from per-element strings, tabled and deduplicated. */\nexport function createStringAttribute(\n values: readonly string[],\n): StringAttribute {\n const table: string[] = [];\n const slots = new Map<string, number>();\n const data = new Int32Array(values.length);\n for (let index = 0; index < values.length; index += 1) {\n const value = values[index];\n let slot = slots.get(value);\n if (slot === undefined) {\n slot = table.length;\n table.push(value);\n slots.set(value, slot);\n }\n data[index] = slot;\n }\n return { storage: \"string\", size: 1, table, data };\n}\n\n/** Replace one level's attribute set, sharing every other array. */\nexport function withAttributeSet(\n geometry: Geometry,\n level: ElementLevel,\n set: AttributeSet,\n): Geometry {\n return createGeometry({\n pointCount: geometry.pointCount,\n point: level === \"point\" ? set : geometry.point,\n vertex: level === \"vertex\" ? set : geometry.vertex,\n primitive: level === \"primitive\" ? set : geometry.primitive,\n detail: geometry.detail,\n topology: geometry.topology,\n pointGroups: geometry.pointGroups,\n primitiveGroups: geometry.primitiveGroups,\n });\n}\n\n/** Add or replace one attribute. Copy-on-write at attribute granularity. */\nexport function setAttribute(\n geometry: Geometry,\n level: ElementLevel,\n name: string,\n attribute: AnyAttribute,\n): Geometry {\n return withAttributeSet(geometry, level, {\n ...geometry[level],\n [name]: attribute,\n });\n}\n\nexport function removeAttribute(\n geometry: Geometry,\n level: ElementLevel,\n name: string,\n): Geometry {\n if (level === \"point\" && name === POSITION_ATTRIBUTE)\n geometryError(\"remove-position\", \"point.P cannot be removed\");\n if (!hasAttribute(geometry, level, name)) return geometry;\n const set: Record<string, AnyAttribute> = { ...geometry[level] };\n delete set[name];\n return withAttributeSet(geometry, level, set);\n}\n\n/** Replace the detail record, sharing every array. */\nexport function setDetail(\n geometry: Geometry,\n name: string,\n value: DetailValue,\n): Geometry {\n return createGeometry({\n pointCount: geometry.pointCount,\n point: geometry.point,\n vertex: geometry.vertex,\n primitive: geometry.primitive,\n detail: { ...geometry.detail, [name]: value },\n topology: geometry.topology,\n pointGroups: geometry.pointGroups,\n primitiveGroups: geometry.primitiveGroups,\n });\n}\n\n/** Drop one detail value, sharing every array. */\nexport function removeDetail(geometry: Geometry, name: string): Geometry {\n if (!Object.prototype.hasOwnProperty.call(geometry.detail, name))\n return geometry;\n const detail: Record<string, DetailValue> = { ...geometry.detail };\n delete detail[name];\n return createGeometry({\n pointCount: geometry.pointCount,\n point: geometry.point,\n vertex: geometry.vertex,\n primitive: geometry.primitive,\n detail,\n topology: geometry.topology,\n pointGroups: geometry.pointGroups,\n primitiveGroups: geometry.primitiveGroups,\n });\n}\n\nexport interface AttributeCreateOptions {\n readonly level: AttributeLevel;\n readonly name: string;\n /** A constant for every element at the level, or the detail value. */\n readonly value: number | readonly number[] | string;\n /** Ignored for a string value; defaults to `f64`. */\n readonly storage?: AttributeStorage;\n}\n\n/**\n * The Attribute Create operation: one named attribute at one level, filled with\n * a constant. This is the operation that makes the four-level model visible\n * rather than an implementation detail, and it is the one that stops the\n * `cloud-plots` class of bug, where every hand-rolled per-primitive value had\n * to be remembered by name in every operation that touched the geometry.\n */\nexport function attributeCreate(\n geometry: Geometry,\n options: AttributeCreateOptions,\n): Geometry {\n const { level, name, value } = options;\n if (level === \"detail\")\n return setDetail(\n geometry,\n name,\n typeof value === \"number\" || typeof value === \"string\"\n ? value\n : [...value],\n );\n const count = levelCount(geometry, level);\n if (typeof value === \"string\")\n return setAttribute(\n geometry,\n level,\n name,\n createStringAttribute(new Array<string>(count).fill(value)),\n );\n const values = typeof value === \"number\" ? [value] : value;\n if (values.length === 0)\n geometryError(\"attribute-size\", `${level}.${name} needs at least one component`);\n const storage = options.storage ?? \"f64\";\n const data = attributeArray(storage, values.length * count);\n for (let index = 0; index < count; index += 1)\n for (let component = 0; component < values.length; component += 1)\n data[index * values.length + component] = values[component];\n return setAttribute(geometry, level, name, {\n storage,\n size: values.length,\n data,\n });\n}\n\n/** A same-storage copy of an attribute's array, for a write-in-place pass. */\nexport function copyAttributeArray(attribute: Attribute) {\n return attributeArrayFrom(attribute.storage, attribute.data);\n}\n", "import {\n attributeArrayFrom,\n createGeometry,\n emptyGeometry,\n POSITION_ATTRIBUTE,\n PRIMITIVE_KINDS,\n type AnyAttribute,\n type AttributeStorage,\n type DetailValue,\n type ElementLevel,\n type Geometry,\n type PrimitiveKind,\n} from \"@cascade/contracts\";\n\nimport { createStringAttribute, geometryError } from \"./attributes.js\";\n\nexport { emptyGeometry };\n\nexport interface GeometryBuilderOptions {\n /** 2 by default: the reference workloads are two-component. */\n readonly positionSize?: 2 | 3;\n readonly positionStorage?: \"f32\" | \"f64\";\n}\n\nexport interface AddPrimitiveOptions {\n readonly closed?: boolean;\n readonly kind?: PrimitiveKind;\n}\n\n/**\n * The accumulating constructor. Points and primitives go in one at a time and\n * `build` produces the frozen struct-of-arrays form once, so a generator does\n * not have to know the final counts up front or touch a typed array.\n *\n * Attributes are set after the elements exist, by name and level, because the\n * builder does not know which attributes a generator will invent and should not\n * have to.\n */\nexport class GeometryBuilder {\n private readonly positions: number[] = [];\n private readonly size: number;\n private readonly storage: AttributeStorage;\n private readonly vertexPoints: number[] = [];\n private readonly offsets: number[] = [0];\n private readonly kinds: number[] = [];\n private readonly closed: number[] = [];\n private readonly attributes: Record<\n ElementLevel,\n Record<string, AnyAttribute>\n > = { point: {}, vertex: {}, primitive: {} };\n private readonly detail: Record<string, DetailValue> = {};\n private readonly pointGroups = new Map<string, Set<number>>();\n private readonly primitiveGroups = new Map<string, Set<number>>();\n\n constructor(options: GeometryBuilderOptions = {}) {\n this.size = options.positionSize ?? 2;\n this.storage = options.positionStorage ?? \"f64\";\n }\n\n get pointCount(): number {\n return this.positions.length / this.size;\n }\n\n get vertexCount(): number {\n return this.vertexPoints.length;\n }\n\n get primitiveCount(): number {\n return this.offsets.length - 1;\n }\n\n /** Append one point and return its index. */\n addPoint(x: number, y: number, z = 0): number {\n const index = this.pointCount;\n this.positions.push(x, y);\n if (this.size === 3) this.positions.push(z);\n return index;\n }\n\n /** Append points from a flat array of `positionSize`-wide entries. */\n addPoints(flat: ArrayLike<number>): number {\n if (flat.length % this.size !== 0)\n geometryError(\n \"point-stride\",\n `${flat.length} values is not a multiple of the position size ${this.size}`,\n );\n const first = this.pointCount;\n for (let index = 0; index < flat.length; index += 1)\n this.positions.push(flat[index]);\n return first;\n }\n\n /**\n * Append one primitive over existing point indices and return its index. A\n * closed primitive does not repeat its first point: `closed` is topology, not\n * a duplicated vertex.\n */\n addPrimitive(\n points: readonly number[],\n options: AddPrimitiveOptions = {},\n ): number {\n const index = this.primitiveCount;\n for (const point of points) {\n if (!Number.isInteger(point) || point < 0 || point >= this.pointCount)\n geometryError(\n \"vertex-point\",\n `primitive ${index} references point ${point} of ${this.pointCount}`,\n );\n this.vertexPoints.push(point);\n }\n this.offsets.push(this.vertexPoints.length);\n this.kinds.push(PRIMITIVE_KINDS.indexOf(options.kind ?? \"poly\"));\n this.closed.push(options.closed ? 1 : 0);\n return index;\n }\n\n /** Append points and one primitive over them, the common generator case. */\n addPolygon(\n flat: ArrayLike<number>,\n options: AddPrimitiveOptions = {},\n ): number {\n const first = this.addPoints(flat);\n const points: number[] = [];\n for (let index = first; index < this.pointCount; index += 1)\n points.push(index);\n return this.addPrimitive(points, options);\n }\n\n setAttribute(\n level: ElementLevel,\n name: string,\n attribute: AnyAttribute,\n ): this {\n if (level === \"point\" && name === POSITION_ATTRIBUTE)\n geometryError(\n \"set-position\",\n \"point.P is owned by the builder; use addPoint\",\n );\n this.attributes[level][name] = attribute;\n return this;\n }\n\n setNumericAttribute(\n level: ElementLevel,\n name: string,\n values: ArrayLike<number>,\n size = 1,\n storage: AttributeStorage = \"f64\",\n ): this {\n return this.setAttribute(level, name, {\n storage,\n size,\n data: attributeArrayFrom(storage, values),\n });\n }\n\n setStringAttribute(\n level: ElementLevel,\n name: string,\n values: readonly string[],\n ): this {\n return this.setAttribute(level, name, createStringAttribute(values));\n }\n\n setDetail(name: string, value: DetailValue): this {\n this.detail[name] = value;\n return this;\n }\n\n addToPointGroup(name: string, index: number): this {\n const members = this.pointGroups.get(name) ?? new Set<number>();\n members.add(index);\n this.pointGroups.set(name, members);\n return this;\n }\n\n addToPrimitiveGroup(name: string, index: number): this {\n const members = this.primitiveGroups.get(name) ?? new Set<number>();\n members.add(index);\n this.primitiveGroups.set(name, members);\n return this;\n }\n\n build(): Geometry {\n const pointCount = this.pointCount;\n const pointGroups: Record<string, Uint8Array> = {};\n for (const [name, members] of this.pointGroups)\n pointGroups[name] = mask(members, pointCount);\n const primitiveGroups: Record<string, Uint8Array> = {};\n for (const [name, members] of this.primitiveGroups)\n primitiveGroups[name] = mask(members, this.primitiveCount);\n return createGeometry({\n pointCount,\n point: {\n ...this.attributes.point,\n [POSITION_ATTRIBUTE]: {\n storage: this.storage,\n size: this.size,\n data: attributeArrayFrom(this.storage, this.positions),\n },\n },\n vertex: this.attributes.vertex,\n primitive: this.attributes.primitive,\n detail: this.detail,\n topology: {\n vertexPoints: Int32Array.from(this.vertexPoints),\n offsets: Int32Array.from(this.offsets),\n kinds: Uint8Array.from(this.kinds),\n closed: Uint8Array.from(this.closed),\n },\n pointGroups,\n primitiveGroups,\n });\n }\n}\n\nfunction mask(members: ReadonlySet<number>, count: number): Uint8Array {\n const result = new Uint8Array(count);\n for (const member of members) {\n if (!Number.isInteger(member) || member < 0 || member >= count)\n geometryError(\"group-indices\", `group references element ${member}`);\n result[member] = 1;\n }\n return result;\n}\n", "import { createGeometry, levelCount, type Geometry } from \"@cascade/contracts\";\n\nimport { geometryError } from \"./attributes.js\";\n\n/**\n * Groups are named subsets, stored as one byte per element. A mask is the right\n * shape because membership is tested far more often than it is enumerated, and\n * because it is what lets a subset be named without duplicating the geometry:\n * `cloud-plots` copies 5.8 MB of geometry per cook to express what a 39 KB mask\n * says, purely because there is no way to say \"this subset of primitives\".\n */\n\nexport type GroupLevel = \"point\" | \"primitive\";\n\nconst KEYS = {\n point: \"pointGroups\",\n primitive: \"primitiveGroups\",\n} as const;\n\nexport function groupMask(\n geometry: Geometry,\n level: GroupLevel,\n name: string,\n): Uint8Array | undefined {\n return geometry[KEYS[level]][name];\n}\n\nexport function inGroup(mask: Uint8Array, index: number): boolean {\n return mask[index] === 1;\n}\n\n/** The members of a mask, ascending. Enumerate only when you must. */\nexport function groupIndices(mask: Uint8Array): number[] {\n const indices: number[] = [];\n for (let index = 0; index < mask.length; index += 1)\n if (mask[index]) indices.push(index);\n return indices;\n}\n\nexport function groupNames(\n geometry: Geometry,\n level: GroupLevel,\n): readonly string[] {\n return Object.keys(geometry[KEYS[level]]);\n}\n\n/** Add or replace one named subset, from a mask or a list of indices. */\nexport function setGroup(\n geometry: Geometry,\n level: GroupLevel,\n name: string,\n members: Uint8Array | readonly number[],\n): Geometry {\n const count = levelCount(geometry, level);\n let mask: Uint8Array;\n if (members instanceof Uint8Array) {\n if (members.length !== count)\n geometryError(\n \"group-length\",\n `${name} covers ${members.length} of ${count} elements`,\n );\n mask = members;\n } else {\n mask = new Uint8Array(count);\n for (const member of members) {\n if (!Number.isInteger(member) || member < 0 || member >= count)\n geometryError(\"group-indices\", `${name} references element ${member}`);\n mask[member] = 1;\n }\n }\n const groups = { ...geometry[KEYS[level]], [name]: mask };\n return createGeometry({\n pointCount: geometry.pointCount,\n point: geometry.point,\n vertex: geometry.vertex,\n primitive: geometry.primitive,\n detail: geometry.detail,\n topology: geometry.topology,\n pointGroups: level === \"point\" ? groups : geometry.pointGroups,\n primitiveGroups: level === \"primitive\" ? groups : geometry.primitiveGroups,\n });\n}\n\nexport function removeGroup(\n geometry: Geometry,\n level: GroupLevel,\n name: string,\n): Geometry {\n if (groupMask(geometry, level, name) === undefined) return geometry;\n const groups: Record<string, Uint8Array> = { ...geometry[KEYS[level]] };\n delete groups[name];\n return createGeometry({\n pointCount: geometry.pointCount,\n point: geometry.point,\n vertex: geometry.vertex,\n primitive: geometry.primitive,\n detail: geometry.detail,\n topology: geometry.topology,\n pointGroups: level === \"point\" ? groups : geometry.pointGroups,\n primitiveGroups: level === \"primitive\" ? groups : geometry.primitiveGroups,\n });\n}\n", "import type { Mat3 } from \"@cascade/contracts\";\n\n/**\n * The `mat3` a transform node or an instancing operation needs, built from the\n * four parameters a Houdini user already knows: translate, rotate, scale and\n * pivot.\n *\n * Matrices are column-major, as the `mat3` type is documented to be, so the\n * translation sits in the third column at indices 6 and 7 and `transformGeometry`\n * reads it there.\n *\n * Rotation is in degrees and counter-clockwise, because geometry is +Y up and a\n * positive angle turning clockwise would be the first of the small surprises\n * that make a hand feel wrong.\n *\n * The order is Houdini's SRT with a pivot: scale, then rotate, then translate,\n * all about the pivot. Written out, `M = T(t) \u00B7 T(p) \u00B7 R(r) \u00B7 S(s) \u00B7 T(-p)`.\n */\nexport interface TransformParameters {\n readonly translate?: readonly [number, number];\n /** Degrees, counter-clockwise. */\n readonly rotate?: number;\n readonly scale?: readonly [number, number];\n readonly pivot?: readonly [number, number];\n}\n\nexport function transformMatrix(parameters: TransformParameters): Mat3 {\n const [tx, ty] = parameters.translate ?? [0, 0];\n const [sx, sy] = parameters.scale ?? [1, 1];\n const [px, py] = parameters.pivot ?? [0, 0];\n const rotate = parameters.rotate ?? 0;\n if (![tx, ty, sx, sy, px, py, rotate].every(Number.isFinite))\n throw new TypeError(\"geometry/transform: transform parameters must be finite\");\n const radians = (rotate * Math.PI) / 180;\n const cos = Math.cos(radians);\n const sin = Math.sin(radians);\n const a00 = cos * sx;\n const a10 = sin * sx;\n const a01 = -sin * sy;\n const a11 = cos * sy;\n return [\n a00,\n a10,\n 0,\n a01,\n a11,\n 0,\n tx + px - (a00 * px + a01 * py),\n ty + py - (a10 * px + a11 * py),\n 1,\n ];\n}\n", "import {\n attributeArray,\n createGeometry,\n emptyGeometry,\n isStringAttribute,\n levelCount,\n type AnyAttribute,\n type Attribute,\n type AttributeSet,\n type AttributeStorage,\n type DetailSet,\n type DetailValue,\n type ElementLevel,\n type Geometry,\n type Groups,\n} from \"@cascade/contracts\";\n\nimport { createStringAttribute, geometryError, readString } from \"./attributes.js\";\n\n/**\n * Merge concatenates geometries and renumbers points, vertices and primitives.\n *\n * It is the operation that proves the format composes, so the attribute rule is\n * the interesting part: the result carries the *union* of the attribute names on\n * its inputs, and an attribute present on one side and absent on the other is\n * zero-filled over the range that lacked it rather than dropped. That is the\n * whole argument for a generic attribute table. The two live bugs in\n * `cloud-plots` are both an operation dropping an attribute it had never heard\n * of, and an operation that copies the whole set cannot make that mistake.\n *\n * Three conflicts have to be resolved rather than avoided:\n *\n * A differing component count widens to the largest and zero-fills the missing\n * components. This is how a 2-component `P` and a 3-component `P` merge into a\n * 3-component one with z = 0, which is the case that actually occurs.\n *\n * A differing storage widens to whichever holds both exactly, so an `i32`\n * meeting an `f32` becomes `f64` rather than silently losing large integers.\n *\n * A name that is a string attribute on one side and numeric on the other is an\n * error, because either coercion would be a guess.\n *\n * Detail is first-wins, so merging into a geometry keeps the document facts of\n * the first input. Houdini's Merge does the same and the alternative, last-wins,\n * makes the result depend on wiring order in a way nobody can see.\n */\nexport function mergeGeometry(...inputs: readonly Geometry[]): Geometry {\n return mergeGeometries(inputs);\n}\n\nexport function mergeGeometries(inputs: readonly Geometry[]): Geometry {\n if (inputs.length === 0) return emptyGeometry(2);\n if (inputs.length === 1) return inputs[0];\n\n const pointCount = sum(inputs, (input) => input.pointCount);\n const vertexCount = sum(inputs, (input) => input.vertexCount);\n const primitiveCount = sum(inputs, (input) => input.primitiveCount);\n\n const vertexPoints = new Int32Array(vertexCount);\n const offsets = new Int32Array(primitiveCount + 1);\n const kinds = new Uint8Array(primitiveCount);\n const closed = new Uint8Array(primitiveCount);\n let pointBase = 0;\n let vertexBase = 0;\n let primitiveBase = 0;\n for (const input of inputs) {\n for (let vertex = 0; vertex < input.vertexCount; vertex += 1)\n vertexPoints[vertexBase + vertex] =\n input.topology.vertexPoints[vertex] + pointBase;\n for (let primitive = 0; primitive < input.primitiveCount; primitive += 1) {\n offsets[primitiveBase + primitive] =\n input.topology.offsets[primitive] + vertexBase;\n kinds[primitiveBase + primitive] = input.topology.kinds[primitive];\n closed[primitiveBase + primitive] = input.topology.closed[primitive];\n }\n pointBase += input.pointCount;\n vertexBase += input.vertexCount;\n primitiveBase += input.primitiveCount;\n }\n offsets[primitiveCount] = vertexCount;\n\n const detail: Record<string, DetailValue> = {};\n for (const input of inputs)\n for (const [name, value] of Object.entries(input.detail as DetailSet))\n if (!Object.prototype.hasOwnProperty.call(detail, name))\n detail[name] = value;\n\n return createGeometry({\n pointCount,\n point: mergeLevel(inputs, \"point\"),\n vertex: mergeLevel(inputs, \"vertex\"),\n primitive: mergeLevel(inputs, \"primitive\"),\n detail,\n topology: { vertexPoints, offsets, kinds, closed },\n pointGroups: mergeGroups(inputs, \"point\"),\n primitiveGroups: mergeGroups(inputs, \"primitive\"),\n });\n}\n\nfunction sum(\n inputs: readonly Geometry[],\n read: (input: Geometry) => number,\n): number {\n let total = 0;\n for (const input of inputs) total += read(input);\n return total;\n}\n\nconst STORAGE_RANK: Record<AttributeStorage, number> = {\n u8: 0,\n i32: 1,\n f32: 2,\n f64: 3,\n};\n\n/** The narrowest storage that holds both operands' values exactly. */\nexport function widerStorage(\n a: AttributeStorage,\n b: AttributeStorage,\n): AttributeStorage {\n if (a === b) return a;\n if (a === \"f64\" || b === \"f64\") return \"f64\";\n // f32 has 24 bits of mantissa, so it cannot hold every i32 exactly.\n if ((a === \"i32\" && b === \"f32\") || (a === \"f32\" && b === \"i32\")) return \"f64\";\n return STORAGE_RANK[a] > STORAGE_RANK[b] ? a : b;\n}\n\nfunction mergeLevel(\n inputs: readonly Geometry[],\n level: ElementLevel,\n): AttributeSet {\n const names: string[] = [];\n for (const input of inputs)\n for (const name of Object.keys(input[level]))\n if (!names.includes(name)) names.push(name);\n const total = sum(inputs, (input) => levelCount(input, level));\n const result: Record<string, AnyAttribute> = {};\n for (const name of names) {\n const present = inputs\n .map((input) => input[level][name])\n .filter((attribute): attribute is AnyAttribute => attribute !== undefined);\n const strings = present.filter(isStringAttribute).length;\n if (strings !== 0 && strings !== present.length)\n geometryError(\n \"attribute-conflict\",\n `${level}.${name} is a string attribute on one input and numeric on another`,\n );\n result[name] =\n strings === present.length\n ? mergeStringAttribute(inputs, level, name, total)\n : mergeNumericAttribute(inputs, level, name, total);\n }\n return result;\n}\n\nfunction mergeNumericAttribute(\n inputs: readonly Geometry[],\n level: ElementLevel,\n name: string,\n total: number,\n): Attribute {\n let size = 1;\n let storage: AttributeStorage | undefined;\n for (const input of inputs) {\n const attribute = input[level][name];\n if (attribute === undefined || isStringAttribute(attribute)) continue;\n size = Math.max(size, attribute.size);\n storage = storage === undefined ? attribute.storage : widerStorage(storage, attribute.storage);\n }\n const data = attributeArray(storage ?? \"f64\", size * total);\n let base = 0;\n for (const input of inputs) {\n const count = levelCount(input, level);\n const attribute = input[level][name];\n if (attribute !== undefined && !isStringAttribute(attribute))\n for (let index = 0; index < count; index += 1)\n for (let component = 0; component < attribute.size; component += 1)\n data[(base + index) * size + component] =\n attribute.data[index * attribute.size + component];\n base += count;\n }\n return { storage: storage ?? \"f64\", size, data };\n}\n\nfunction mergeStringAttribute(\n inputs: readonly Geometry[],\n level: ElementLevel,\n name: string,\n total: number,\n) {\n const values = new Array<string>(total).fill(\"\");\n let base = 0;\n for (const input of inputs) {\n const count = levelCount(input, level);\n const attribute = input[level][name];\n if (attribute !== undefined && isStringAttribute(attribute))\n for (let index = 0; index < count; index += 1)\n values[base + index] = readString(attribute, index);\n base += count;\n }\n return createStringAttribute(values);\n}\n\nfunction mergeGroups(\n inputs: readonly Geometry[],\n level: \"point\" | \"primitive\",\n): Groups {\n const key = level === \"point\" ? \"pointGroups\" : \"primitiveGroups\";\n const names: string[] = [];\n for (const input of inputs)\n for (const name of Object.keys(input[key]))\n if (!names.includes(name)) names.push(name);\n const total = sum(inputs, (input) => levelCount(input, level));\n const result: Record<string, Uint8Array> = {};\n for (const name of names) {\n const mask = new Uint8Array(total);\n let base = 0;\n for (const input of inputs) {\n const count = levelCount(input, level);\n const source = input[key][name];\n if (source !== undefined)\n for (let index = 0; index < count; index += 1)\n mask[base + index] = source[index];\n base += count;\n }\n result[name] = mask;\n }\n return result;\n}\n", "import {\n POSITION_ATTRIBUTE,\n type Geometry,\n type Mat3,\n type Mat4,\n} from \"@cascade/contracts\";\n\nimport {\n attributeSet,\n copyAttributeArray,\n geometryError,\n positionAttribute,\n withAttributeSet,\n} from \"./attributes.js\";\n\n/**\n * Transform `P`. Matrices are column-major, as the `mat3` and `mat4` types are\n * already documented to be, so a `mat3`'s third column carries the 2D\n * translation.\n *\n * Geometry is authored +Y up. The flip into SVG's and Canvas's +Y-down frame\n * belongs in the export and render operations, once, and never here: a flip\n * applied per operation is the version that produces a drawing which is right\n * until something rotates.\n *\n * A `mat3` moves x and y and leaves a third position component alone, which is\n * what 2D work wants on a 3-component `P`. A `mat4` moves all three, treating a\n * 2-component `P` as z = 0 and discarding the resulting z, because widening `P`\n * is a declaration and not a side effect of a transform.\n */\nexport function transformGeometry(\n geometry: Geometry,\n matrix: Mat3 | Mat4,\n): Geometry {\n if (matrix.length !== 9 && matrix.length !== 16)\n geometryError(\"matrix\", \"transform needs a mat3 or a mat4\");\n if (!matrix.every(Number.isFinite))\n geometryError(\"matrix\", \"transform matrix values must be finite\");\n if (geometry.pointCount === 0) return geometry;\n const position = positionAttribute(geometry);\n const size = position.size;\n const data = copyAttributeArray(position);\n if (matrix.length === 9) {\n const m = matrix as Mat3;\n for (let point = 0; point < geometry.pointCount; point += 1) {\n const base = point * size;\n const x = data[base];\n const y = data[base + 1];\n data[base] = m[0] * x + m[3] * y + m[6];\n data[base + 1] = m[1] * x + m[4] * y + m[7];\n }\n } else {\n const m = matrix as Mat4;\n for (let point = 0; point < geometry.pointCount; point += 1) {\n const base = point * size;\n const x = data[base];\n const y = data[base + 1];\n const z = size === 3 ? data[base + 2] : 0;\n data[base] = m[0] * x + m[4] * y + m[8] * z + m[12];\n data[base + 1] = m[1] * x + m[5] * y + m[9] * z + m[13];\n if (size === 3)\n data[base + 2] = m[2] * x + m[6] * y + m[10] * z + m[14];\n }\n }\n return withAttributeSet(geometry, \"point\", {\n ...attributeSet(geometry, \"point\"),\n [POSITION_ATTRIBUTE]: { storage: position.storage, size, data },\n });\n}\n", "import {\n emptyGeometry,\n isStringAttribute,\n POSITION_ATTRIBUTE,\n type AnyAttribute,\n type Geometry,\n} from \"@cascade/contracts\";\n\nimport {\n createAttribute,\n createStringAttribute,\n geometryError,\n getPosition,\n numericAttribute,\n positionSize,\n readComponent,\n readElement,\n readString,\n setAttribute,\n} from \"./attributes.js\";\nimport { groupIndices, groupMask } from \"./groups.js\";\nimport { transformMatrix } from \"./matrix.js\";\nimport { mergeGeometries } from \"./merge.js\";\nimport { transformGeometry } from \"./transform.js\";\n\n/**\n * Copy to Points: one geometry instanced onto every point of another.\n *\n * This is the node a generative composition actually comes from, and it is the\n * second half of the argument for a generic attribute table. It is written\n * entirely as transform-then-merge over the existing operations, which is the\n * point: it invents no attribute handling of its own, so it composes with any\n * attribute a later node invents and cannot drop one it has never heard of.\n * Because a cubic B\u00E9zier is affine-invariant, it is also exactly right on a\n * curve without knowing that a curve is what it is copying.\n *\n * Houdini's conventions, followed rather than reinvented: `pscale` scales each\n * copy, `N` orients it, and the copies carry a `copynum` primitive attribute\n * recording which target point they came from.\n */\nexport interface CopyToPointsOptions {\n /** Restrict to a target point group. Houdini's \"Target Group\". */\n readonly targetGroup?: string;\n /**\n * Read `pscale` and `N` from the target points. Houdini's \"Transform Using\n * Target Point Orientations\", and the reason `N` is a direction rather than\n * an angle: it is the attribute a Scatter or a Resample already writes.\n */\n readonly useTargetOrientations?: boolean;\n /**\n * Carry the target's point attributes onto the points of each copy, where the\n * source does not already carry a name of its own. Source wins on a\n * collision, because the copy's own values describe the copy.\n */\n readonly transferTargetAttributes?: boolean;\n /** Primitive attribute recording the target point index; \"\" disables it. */\n readonly copyNumberAttribute?: string;\n}\n\nexport function copyToPoints(\n source: Geometry,\n target: Geometry,\n options: CopyToPointsOptions = {},\n): Geometry {\n const width = positionSize(source) === 3 ? 3 : 2;\n const selection =\n options.targetGroup === undefined || options.targetGroup === \"\"\n ? undefined\n : (groupMask(target, \"point\", options.targetGroup) ??\n geometryError(\n \"missing-group\",\n `point group ${options.targetGroup} is not present on the target`,\n ));\n const indices =\n selection === undefined\n ? range(target.pointCount)\n : groupIndices(selection);\n if (indices.length === 0 || source.pointCount === 0)\n return emptyGeometry(width);\n\n const orient = options.useTargetOrientations ?? true;\n const pscale = orient\n ? numericAttribute(target.point.pscale, \"point.pscale\", [1])\n : undefined;\n const normal = orient\n ? numericAttribute(target.point.N, \"point.N\", [2, 3])\n : undefined;\n const copyNumber = options.copyNumberAttribute ?? \"copynum\";\n const transfer =\n (options.transferTargetAttributes ?? true)\n ? Object.keys(target.point).filter(\n (name) =>\n name !== POSITION_ATTRIBUTE &&\n !Object.prototype.hasOwnProperty.call(source.point, name),\n )\n : [];\n\n const copies: Geometry[] = [];\n for (const index of indices) {\n const position = getPosition(target, index);\n const scale = pscale === undefined ? 1 : readComponent(pscale, index);\n const rotate =\n normal === undefined\n ? 0\n : (Math.atan2(\n readComponent(normal, index, 1),\n readComponent(normal, index, 0),\n ) *\n 180) /\n Math.PI;\n let copy = transformGeometry(\n source,\n transformMatrix({\n translate: [position[0], position[1]],\n rotate,\n scale: [scale, scale],\n }),\n );\n if (copyNumber !== \"\")\n copy = setAttribute(copy, \"primitive\", copyNumber, {\n storage: \"i32\",\n size: 1,\n data: new Int32Array(copy.primitiveCount).fill(index),\n });\n for (const name of transfer)\n copy = setAttribute(\n copy,\n \"point\",\n name,\n spread(target.point[name]!, index, copy.pointCount),\n );\n copies.push(copy);\n }\n return mergeGeometries(copies);\n}\n\nfunction range(count: number): number[] {\n const indices = new Array<number>(count);\n for (let index = 0; index < count; index += 1) indices[index] = index;\n return indices;\n}\n\n/** One element of a target attribute, repeated across a copy's points. */\nfunction spread(\n attribute: AnyAttribute,\n index: number,\n count: number,\n): AnyAttribute {\n if (isStringAttribute(attribute))\n return createStringAttribute(\n new Array<string>(count).fill(readString(attribute, index)),\n );\n return createAttribute(\n count,\n attribute.size,\n attribute.storage,\n readElement(attribute, index),\n );\n}\n", "import type { Geometry } from \"@cascade/contracts\";\n\nimport { geometryError } from \"./attributes.js\";\nimport { GeometryBuilder } from \"./builder.js\";\n\n/**\n * The generators. Each returns one primitive in a geometry of its own, so a\n * graph composes them with `Merge` rather than with a multi-shape node.\n *\n * Geometry is +Y up, so a circle of radius 1 has a point at `(0, 1)` above the\n * origin and a rectangle's first corner is its bottom-left one. The flip into\n * SVG's frame lives in `geometryToSvg` and nowhere else.\n */\n\nexport interface RectangleOptions {\n /** Width and height, as Houdini's Grid states its size. */\n readonly size?: readonly [number, number];\n readonly center?: readonly [number, number];\n}\n\nfunction finitePair(value: readonly [number, number], code: string): void {\n if (!Number.isFinite(value[0]) || !Number.isFinite(value[1]))\n geometryError(code, \"both components must be finite\");\n}\n\n/**\n * A closed four-point polygon, counter-clockwise from the bottom-left corner.\n * Houdini has no Rectangle: its Grid with two rows and two columns does the\n * job, and `size` and `center` are that node's parameter names.\n */\nexport function rectangleGeometry(options: RectangleOptions = {}): Geometry {\n const [width, height] = options.size ?? [1, 1];\n const [cx, cy] = options.center ?? [0, 0];\n finitePair([width, height], \"rectangle-size\");\n finitePair([cx, cy], \"rectangle-center\");\n if (width < 0 || height < 0)\n geometryError(\"rectangle-size\", \"rectangle size must not be negative\");\n const x0 = cx - width / 2;\n const x1 = cx + width / 2;\n const y0 = cy - height / 2;\n const y1 = cy + height / 2;\n const builder = new GeometryBuilder();\n builder.addPolygon([x0, y0, x1, y0, x1, y1, x0, y1], { closed: true });\n return builder.build();\n}\n\nexport interface CircleOptions {\n readonly center?: readonly [number, number];\n /** X and Y radius, as Houdini's Circle states its radius. */\n readonly radius?: readonly [number, number];\n /**\n * Houdini's Circle \"Primitive Type\". `bezier` is the default because a circle\n * is a circle: four cubic segments hold it to within 0.02% of the true arc,\n * where a polygon of any division count is visibly a polygon in print.\n */\n readonly type?: \"bezier\" | \"poly\";\n /** Houdini's Circle \"Divisions\". Used by `poly` only. */\n readonly divisions?: number;\n}\n\n/**\n * A closed circle, either as one cubic B\u00E9zier chain or as one polygon.\n *\n * The B\u00E9zier form is four segments with the classic handle length\n * `k = 4/3 \u00B7 tan(\u03C0/8)`, which is the standard four-arc approximation and the\n * one every vector tool uses. Twelve points: four anchors at the axes and two\n * handles between each pair.\n */\nexport function circleGeometry(options: CircleOptions = {}): Geometry {\n const [cx, cy] = options.center ?? [0, 0];\n const [rx, ry] = options.radius ?? [1, 1];\n finitePair([cx, cy], \"circle-center\");\n finitePair([rx, ry], \"circle-radius\");\n if (rx < 0 || ry < 0)\n geometryError(\"circle-radius\", \"circle radius must not be negative\");\n const builder = new GeometryBuilder();\n if ((options.type ?? \"bezier\") === \"poly\") {\n const divisions = options.divisions ?? 32;\n if (!Number.isSafeInteger(divisions) || divisions < 3)\n geometryError(\n \"circle-divisions\",\n \"a polygonal circle needs an integer division count of at least 3\",\n );\n const flat: number[] = [];\n for (let index = 0; index < divisions; index += 1) {\n const angle = (2 * Math.PI * index) / divisions;\n flat.push(cx + rx * Math.cos(angle), cy + ry * Math.sin(angle));\n }\n builder.addPolygon(flat, { closed: true });\n return builder.build();\n }\n const k = (4 / 3) * Math.tan(Math.PI / 8);\n const kx = rx * k;\n const ky = ry * k;\n // Anchor, handle, handle, per quarter, counter-clockwise from +X.\n const flat = [\n cx + rx, cy,\n cx + rx, cy + ky,\n cx + kx, cy + ry,\n cx, cy + ry,\n cx - kx, cy + ry,\n cx - rx, cy + ky,\n cx - rx, cy,\n cx - rx, cy - ky,\n cx - kx, cy - ry,\n cx, cy - ry,\n cx + kx, cy - ry,\n cx + rx, cy - ky,\n ];\n builder.addPolygon(flat, { closed: true, kind: \"bezier\" });\n return builder.build();\n}\n", "import type { Geometry, PrimitiveKind } from \"@cascade/contracts\";\nimport { BEZIER_STRIDE, PRIMITIVE_KINDS } from \"@cascade/contracts\";\n\nimport {\n geometryError,\n positionAttribute,\n positionSize,\n} from \"./attributes.js\";\n\n/** Topology and measurement reads that the operations share. */\n\nexport function primitiveKind(\n geometry: Geometry,\n primitive: number,\n): PrimitiveKind {\n return PRIMITIVE_KINDS[geometry.topology.kinds[primitive]] ?? \"poly\";\n}\n\nexport function isClosed(geometry: Geometry, primitive: number): boolean {\n return geometry.topology.closed[primitive] === 1;\n}\n\n/** True when the primitive's vertex run is a cubic B\u00E9zier chain. */\nexport function isBezier(geometry: Geometry, primitive: number): boolean {\n return primitiveKind(geometry, primitive) === \"bezier\";\n}\n\n/**\n * The cubic segments of a `bezier` primitive, each as the four point indices\n * `[anchor, handle, handle, anchor]`. A closed primitive's last segment wraps\n * to the first anchor. The arity is guaranteed by `createGeometry`, so this\n * needs no defensive branch.\n */\nexport function bezierSegments(\n geometry: Geometry,\n primitive: number,\n): number[][] {\n const points = primitivePoints(geometry, primitive);\n const closed = isClosed(geometry, primitive);\n const count = closed\n ? points.length / BEZIER_STRIDE\n : (points.length - 1) / BEZIER_STRIDE;\n const segments: number[][] = [];\n for (let index = 0; index < count; index += 1) {\n const base = index * BEZIER_STRIDE;\n segments.push([\n points[base],\n points[base + 1],\n points[base + 2],\n points[(base + BEZIER_STRIDE) % points.length],\n ]);\n }\n return segments;\n}\n\n/** Half-open vertex range `[start, end)` of one primitive. */\nexport function vertexRange(\n geometry: Geometry,\n primitive: number,\n): readonly [number, number] {\n return [\n geometry.topology.offsets[primitive],\n geometry.topology.offsets[primitive + 1],\n ];\n}\n\nexport function vertexCountOf(geometry: Geometry, primitive: number): number {\n const [start, end] = vertexRange(geometry, primitive);\n return end - start;\n}\n\n/** The point indices a primitive's vertices reference, in vertex order. */\nexport function primitivePoints(\n geometry: Geometry,\n primitive: number,\n): number[] {\n const [start, end] = vertexRange(geometry, primitive);\n const points = new Array<number>(end - start);\n for (let vertex = start; vertex < end; vertex += 1)\n points[vertex - start] = geometry.topology.vertexPoints[vertex];\n return points;\n}\n\n/** A mask of the points no primitive references: the loose points, the dots. */\nexport function loosePointMask(geometry: Geometry): Uint8Array {\n const used = new Uint8Array(geometry.pointCount);\n for (const point of geometry.topology.vertexPoints) used[point] = 1;\n const loose = new Uint8Array(geometry.pointCount);\n for (let index = 0; index < loose.length; index += 1)\n loose[index] = used[index] ? 0 : 1;\n return loose;\n}\n\nexport function distance(\n positions: ArrayLike<number>,\n size: number,\n a: number,\n b: number,\n): number {\n let total = 0;\n for (let component = 0; component < size; component += 1) {\n const delta = positions[b * size + component] - positions[a * size + component];\n total += delta * delta;\n }\n return Math.sqrt(total);\n}\n\n/**\n * Cumulative arc lengths along one primitive, one entry per segment. A closed\n * primitive has one more segment than an open one, the one that returns to its\n * first point.\n *\n * Linear only. A `bezier` primitive is refused rather than measured along its\n * control polygon, because a length that is quietly 10% short is worse than one\n * that is missing: flatten the curve first, and see the note on the kind\n * vocabulary in `packages/contracts/src/geometry.ts`.\n */\nexport function arcLengths(geometry: Geometry, primitive: number): number[] {\n if (isBezier(geometry, primitive))\n geometryError(\n \"curve-measure\",\n `primitive ${primitive} is a bezier; arc length along a curve is not implemented`,\n );\n const position = positionAttribute(geometry);\n const size = position.size;\n const points = primitivePoints(geometry, primitive);\n const closed = isClosed(geometry, primitive);\n const segments = points.length < 2 ? 0 : closed ? points.length : points.length - 1;\n const cumulative = new Array<number>(segments);\n let total = 0;\n for (let segment = 0; segment < segments; segment += 1) {\n const from = points[segment];\n const to = points[(segment + 1) % points.length];\n total += distance(position.data, size, from, to);\n cumulative[segment] = total;\n }\n return cumulative;\n}\n\nexport function primitiveLength(geometry: Geometry, primitive: number): number {\n const cumulative = arcLengths(geometry, primitive);\n return cumulative.length === 0 ? 0 : cumulative[cumulative.length - 1];\n}\n\nexport function geometryLength(geometry: Geometry): number {\n let total = 0;\n for (let primitive = 0; primitive < geometry.primitiveCount; primitive += 1)\n total += primitiveLength(geometry, primitive);\n return total;\n}\n\nexport interface Bounds {\n readonly min: readonly number[];\n readonly max: readonly number[];\n}\n\n/** Axis-aligned bounds over every point, or undefined for an empty geometry. */\nexport function geometryBounds(geometry: Geometry): Bounds | undefined {\n if (geometry.pointCount === 0) return undefined;\n const position = positionAttribute(geometry);\n const size = positionSize(geometry);\n const min = new Array<number>(size).fill(Number.POSITIVE_INFINITY);\n const max = new Array<number>(size).fill(Number.NEGATIVE_INFINITY);\n for (let point = 0; point < geometry.pointCount; point += 1)\n for (let component = 0; component < size; component += 1) {\n const value = position.data[point * size + component];\n if (value < min[component]) min[component] = value;\n if (value > max[component]) max[component] = value;\n }\n return { min, max };\n}\n", "import {\n Color,\n isStringAttribute,\n type AnyAttribute,\n type Attribute,\n type Geometry,\n} from \"@cascade/contracts\";\n\nimport {\n geometryError,\n numericAttribute,\n positionAttribute,\n readComponent,\n} from \"./attributes.js\";\nimport { groupNames } from \"./groups.js\";\nimport {\n bezierSegments,\n geometryBounds,\n isBezier,\n isClosed,\n loosePointMask,\n primitivePoints,\n} from \"./primitives.js\";\n\n/**\n * Geometry to an SVG document. The node that makes the library provably useful,\n * because it produces a file to print or plot rather than an assertion.\n *\n * ## The Y flip lives here and nowhere else\n *\n * Geometry is +Y up: Marcus ruled on that, so a `Circle` at `+1` sits above the\n * origin and every operation upstream reads the same way. SVG, Canvas and the\n * existing rasterizer are all +Y down. The whole point of deciding the handedness\n * once is that there is then exactly one flip, and this is it: a\n * `transform=\"scale(1,-1)\"` on the root group, with the viewBox's `y` set to\n * `-maxY` so the flipped content lands inside it.\n *\n * Do not \"fix\" this by negating anywhere upstream. A flip applied per operation\n * is the version that produces a drawing which is right until something rotates.\n *\n * ## Style is an attribute, with the prop as the fallback\n *\n * `Cd`, `width` and `opacity` are read per primitive when present and taken\n * from the caller's default when absent. That rule is not invented here:\n * `cloud-plots/src/cloud_plots/svgio.py` already runs it as\n * `color = r.get(\"color\", mark_color)`, having arrived at Houdini's convention\n * independently. So the defaults go on the root group and a per-primitive value\n * is emitted only where it exists, which also keeps the file small.\n *\n * ## Colour is a `vec4`, and this file is where it becomes text\n *\n * `Cd` is a four-component colour and nothing else. A string `Cd` used to be\n * accepted here so that `cloud-plots`' `\"#3a7f5c\"` could be stored verbatim;\n * Marcus overruled that 2026-09-04, so a hex string is now converted at the\n * boundary by `Color.fromHex` and the attribute holds the vector. An emitted\n * paint goes through `Color.toHex`, and `Cd`'s alpha becomes a separate\n * `stroke-opacity` rather than an eight-digit hex, because plotter and\n * vector-editor software does not read CSS Color 4.\n *\n * A `Cd` that is a string, or numeric with any size but 4, is refused rather\n * than ignored. Silently dropping a colour attribute is the exact bug the plan\n * records twice in `cloud-plots`, and an export that quietly turns black is\n * worse than one that says why.\n *\n * ## One group element per primitive group\n *\n * Not a refinement either: `cloud-plots` carries a whole `layer-group` node and\n * a layers path through its Python writer so that plotter software can assign a\n * pen per layer, and duplicates the geometry per layer to express it. A\n * primitive belongs to exactly one emitted group, the first it is a member of in\n * insertion order, because a pen is not a set.\n */\nexport interface SvgExportOptions {\n /** Document width; 0 or absent derives it from the geometry bounds. */\n readonly width?: number;\n readonly height?: number;\n /** Added around the derived bounds, in geometry units. */\n readonly margin?: number;\n /** Fallback stroke colour for a primitive with no `Cd`. */\n readonly stroke?: Color;\n /** Fallback stroke width for a primitive with no `width`. */\n readonly strokeWidth?: number;\n /** Fallback opacity for a primitive with no `opacity`. */\n readonly opacity?: number;\n /**\n * Fill colour for every primitive, applied only when `fillMode` is \"solid\".\n *\n * Fill is two settings rather than one because a zero-alpha fill and SVG's\n * `fill=\"none\"` are not the same thing: `none` says the region is not filled,\n * while a transparent fill says it is filled with nothing, and a plotter\n * driver reading the second still generates a fill toolpath. Inferring the\n * intent from alpha also throws the colour away, so a fill cannot be switched\n * back on without picking it again. Declaring the mode keeps the two\n * independent. Stroke has no matching mode because nothing exports geometry\n * with no stroke, and inventing one for symmetry would add a way to produce an\n * empty file.\n */\n readonly fill?: Color;\n readonly fillMode?: \"none\" | \"solid\";\n /** Radius for a loose point with no `pscale`. */\n readonly pointRadius?: number;\n /** Decimal places on emitted coordinates. */\n readonly precision?: number;\n}\n\nconst UNGROUPED = \"ungrouped\";\nconst BLACK: Color = [0, 0, 0, 1];\n\nexport function geometryToSvg(\n geometry: Geometry,\n options: SvgExportOptions = {},\n): string {\n validateOptions(options);\n const margin = options.margin ?? 0;\n const bounds = geometryBounds(geometry);\n const minX = bounds === undefined ? 0 : bounds.min[0] - margin;\n const minY = bounds === undefined ? 0 : bounds.min[1] - margin;\n const maxX = bounds === undefined ? 1 : bounds.max[0] + margin;\n const maxY = bounds === undefined ? 1 : bounds.max[1] + margin;\n const spanX = Math.max(maxX - minX, Number.EPSILON);\n const spanY = Math.max(maxY - minY, Number.EPSILON);\n const width = options.width && options.width > 0 ? options.width : spanX;\n const height = options.height && options.height > 0 ? options.height : spanY;\n const precision = options.precision ?? 3;\n const number = (value: number) => format(value, precision);\n\n const stroke = options.stroke ?? BLACK;\n const strokeWidth = options.strokeWidth ?? 1;\n const fill = options.fill ?? BLACK;\n const filled = (options.fillMode ?? \"none\") === \"solid\";\n\n const colour = geometry.primitive.Cd;\n const strokeWidths = numericAttribute(geometry.primitive.width, \"primitive.width\", [1]);\n const opacities = numericAttribute(geometry.primitive.opacity, \"primitive.opacity\", [1]);\n const pointScale = numericAttribute(geometry.point.pscale, \"point.pscale\", [1]);\n const pointColour = geometry.point.Cd;\n validateRange(strokeWidths, \"primitive.width\", (value) => value >= 0, \"non-negative\");\n validateRange(opacities, \"primitive.opacity\", (value) => value >= 0 && value <= 1, \"between 0 and 1\");\n validateRange(pointScale, \"point.pscale\", (value) => value >= 0, \"non-negative\");\n\n const names = groupNames(geometry, \"primitive\");\n const assigned = new Int32Array(geometry.primitiveCount).fill(-1);\n for (let index = 0; index < names.length; index += 1) {\n const mask = geometry.primitiveGroups[names[index]!]!;\n for (let primitive = 0; primitive < geometry.primitiveCount; primitive += 1)\n if (mask[primitive] === 1 && assigned[primitive] === -1)\n assigned[primitive] = index;\n }\n\n const path = (primitive: number): string => {\n const attributes: string[] = [`d=\"${pathData(geometry, primitive, number)}\"`];\n const paint = paintOf(colour, primitive, \"primitive\");\n if (paint !== undefined) {\n attributes.push(`stroke=\"${Color.toHex(paint)}\"`);\n if (Color.alpha(paint) < 1)\n attributes.push(`stroke-opacity=\"${number(Color.alpha(paint))}\"`);\n }\n if (strokeWidths !== undefined)\n attributes.push(\n `stroke-width=\"${number(readComponent(strokeWidths, primitive))}\"`,\n );\n if (opacities !== undefined)\n attributes.push(`opacity=\"${number(readComponent(opacities, primitive))}\"`);\n return `<path ${attributes.join(\" \")} />`;\n };\n\n const body: string[] = [];\n if (names.length === 0) {\n for (let primitive = 0; primitive < geometry.primitiveCount; primitive += 1)\n body.push(indent(path(primitive), 2));\n } else {\n for (let index = 0; index < names.length; index += 1) {\n const members: string[] = [];\n for (\n let primitive = 0;\n primitive < geometry.primitiveCount;\n primitive += 1\n )\n if (assigned[primitive] === index)\n members.push(indent(path(primitive), 3));\n body.push(\n indent(`<g id=\"${escapeXml(names[index]!)}\">`, 2),\n ...members,\n indent(\"</g>\", 2),\n );\n }\n const rest: string[] = [];\n for (let primitive = 0; primitive < geometry.primitiveCount; primitive += 1)\n if (assigned[primitive] === -1) rest.push(indent(path(primitive), 3));\n if (rest.length > 0)\n body.push(\n indent(`<g id=\"${UNGROUPED}\">`, 2),\n ...rest,\n indent(\"</g>\", 2),\n );\n }\n\n // Loose points are the dots: a point no primitive references. `cascade-logo`\n // is half made of them and `cloud-plots` stipples thousands, so they are a\n // first-class part of the drawing rather than debris. They take their radius\n // from `pscale`, which is Houdini's name for exactly that quantity and what\n // the Python stipple stage already means by its third position component.\n const loose = loosePointMask(geometry);\n const position = positionAttribute(geometry);\n for (let point = 0; point < geometry.pointCount; point += 1) {\n if (loose[point] !== 1) continue;\n const radius =\n pointScale === undefined\n ? (options.pointRadius ?? 0.5)\n : readComponent(pointScale, point);\n const paint = paintOf(pointColour, point, \"point\") ?? stroke;\n const transparent = Color.alpha(paint) < 1;\n body.push(\n indent(\n `<circle cx=\"${number(readComponent(position, point, 0))}\" cy=\"${number(\n readComponent(position, point, 1),\n )}\" r=\"${number(radius)}\" fill=\"${Color.toHex(paint)}\"${\n transparent ? ` fill-opacity=\"${number(Color.alpha(paint))}\"` : \"\"\n } stroke=\"none\" />`,\n 2,\n ),\n );\n }\n\n const root: string[] = [\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${number(width)}\" height=\"${number(height)}\" viewBox=\"${number(minX)} ${number(-maxY)} ${number(spanX)} ${number(spanY)}\">`,\n indent(\"<!-- Geometry is +Y up; SVG is +Y down. This is the one flip. -->\", 1),\n indent(\n `<g transform=\"scale(1,-1)\" fill=\"${\n filled ? Color.toHex(fill) : \"none\"\n }\"${\n filled && Color.alpha(fill) < 1\n ? ` fill-opacity=\"${number(Color.alpha(fill))}\"`\n : \"\"\n } stroke=\"${Color.toHex(stroke)}\"${\n Color.alpha(stroke) < 1\n ? ` stroke-opacity=\"${number(Color.alpha(stroke))}\"`\n : \"\"\n } stroke-width=\"${number(strokeWidth)}\"${\n options.opacity !== undefined && options.opacity !== 1\n ? ` opacity=\"${number(options.opacity)}\"`\n : \"\"\n }>`,\n 1,\n ),\n ...body,\n indent(\"</g>\", 1),\n \"</svg>\",\n ];\n return `${root.join(\"\\n\")}\\n`;\n}\n\nfunction pathData(\n geometry: Geometry,\n primitive: number,\n number: (value: number) => string,\n): string {\n const position = positionAttribute(geometry);\n const at = (point: number) =>\n `${number(readComponent(position, point, 0))} ${number(\n readComponent(position, point, 1),\n )}`;\n const closed = isClosed(geometry, primitive);\n if (isBezier(geometry, primitive)) {\n const segments = bezierSegments(geometry, primitive);\n if (segments.length === 0) return \"\";\n const commands = [`M ${at(segments[0]![0]!)}`];\n for (const [, first, second, end] of segments)\n commands.push(`C ${at(first!)} ${at(second!)} ${at(end!)}`);\n if (closed) commands.push(\"Z\");\n return commands.join(\" \");\n }\n const points = primitivePoints(geometry, primitive);\n if (points.length === 0) return \"\";\n const commands = [`M ${at(points[0]!)}`];\n for (let index = 1; index < points.length; index += 1)\n commands.push(`L ${at(points[index]!)}`);\n if (closed) commands.push(\"Z\");\n return commands.join(\" \");\n}\n\n/**\n * The colour of one element from a `Cd` attribute. `Cd` is a `vec4` and this\n * refuses anything else, loudly: a string attribute is the representation the\n * ruling removed, and a numeric attribute of any other size is a colour whose\n * components do not mean what the reader assumes.\n */\nfunction paintOf(\n attribute: AnyAttribute | undefined,\n index: number,\n level: string,\n): Color | undefined {\n if (attribute === undefined) return undefined;\n if (isStringAttribute(attribute))\n geometryError(\n \"colour-storage\",\n `${level}.Cd is a string attribute; colour is a vec4. Convert with Color.fromHex at the boundary.`,\n );\n if (attribute.size !== 4)\n geometryError(\n \"colour-size\",\n `${level}.Cd has size ${attribute.size}; colour is a vec4`,\n );\n return Color.fromComponents(attribute.data, index * 4, 4);\n}\n\nfunction format(value: number, precision: number): string {\n if (!Number.isFinite(value))\n geometryError(\"svg-number\", `cannot format non-finite value ${String(value)}`);\n const rounded = Number.parseFloat(value.toFixed(precision));\n return Object.is(rounded, -0) ? \"0\" : String(rounded);\n}\n\nfunction validateOptions(options: SvgExportOptions): void {\n for (const [name, value] of [\n [\"width\", options.width],\n [\"height\", options.height],\n [\"margin\", options.margin],\n [\"strokeWidth\", options.strokeWidth],\n [\"opacity\", options.opacity],\n [\"pointRadius\", options.pointRadius],\n ] as const) {\n if (value !== undefined && !Number.isFinite(value))\n geometryError(\"svg-option\", `${name} must be finite`);\n }\n if ((options.width ?? 0) < 0 || (options.height ?? 0) < 0)\n geometryError(\"svg-option\", \"width and height must not be negative\");\n if ((options.strokeWidth ?? 0) < 0 || (options.pointRadius ?? 0) < 0)\n geometryError(\"svg-option\", \"strokeWidth and pointRadius must not be negative\");\n if (options.opacity !== undefined && (options.opacity < 0 || options.opacity > 1))\n geometryError(\"svg-option\", \"opacity must be between 0 and 1\");\n const precision = options.precision ?? 3;\n if (!Number.isSafeInteger(precision) || precision < 0 || precision > 15)\n geometryError(\"svg-precision\", \"precision must be an integer from 0 to 15\");\n}\n\nfunction validateRange(\n attribute: Attribute | undefined,\n path: string,\n accepts: (value: number) => boolean,\n expectation: string,\n): void {\n if (attribute === undefined) return;\n for (const value of attribute.data)\n if (!accepts(value))\n geometryError(\"attribute-value\", `${path} values must be ${expectation}`);\n}\n\nfunction indent(line: string, depth: number): string {\n return `${\" \".repeat(depth)}${line}`;\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n\n/**\n * UTF-8 bytes for a document, hand-rolled because the runtime's `lib` is\n * `ES2022` and nothing else: `TextEncoder` exists in every host that will ever\n * run this but is typed in the DOM and Node libraries, which this package\n * deliberately does not include. Adding either to see one constructor would\n * widen the environment-neutral surface for the sake of a nine-line loop.\n */\nexport function utf8Bytes(value: string): Uint8Array {\n const bytes: number[] = [];\n for (const character of value) {\n let code = character.codePointAt(0)!;\n if (code < 0x80) bytes.push(code);\n else if (code < 0x800) bytes.push(0xc0 | (code >> 6), 0x80 | (code & 0x3f));\n else if (code < 0x10000)\n bytes.push(\n 0xe0 | (code >> 12),\n 0x80 | ((code >> 6) & 0x3f),\n 0x80 | (code & 0x3f),\n );\n else\n bytes.push(\n 0xf0 | (code >> 18),\n 0x80 | ((code >> 12) & 0x3f),\n 0x80 | ((code >> 6) & 0x3f),\n 0x80 | (code & 0x3f),\n );\n code = 0;\n }\n return Uint8Array.from(bytes);\n}\n", "import type { NodeDefinition, NodeExecutionContext } from \"@cascade/contracts\";\n\nimport type { DefinitionNodeRegistration } from \"../../types.js\";\n\nexport const randomDefinition = {\n apiVersion: 1,\n label: \"Random\",\n description: \"Generate a deterministic unit value from an explicit seed.\",\n icon: \"Dice5\",\n runsOn: \"portable\",\n inputs: {\n seed: {\n kind: \"data\",\n type: \"int\",\n default: 0,\n description: \"Integer seed. Equal seeds always produce equal values.\",\n },\n sample: {\n kind: \"data\",\n type: \"int\",\n default: 0,\n description: \"Stable sample index within the seeded sequence.\",\n },\n },\n outputs: {\n value: {\n kind: \"data\",\n type: \"float\",\n description: \"Deterministic value in the half-open range [0, 1).\",\n },\n },\n} as const satisfies NodeDefinition;\n\n/** Mulberry32's output transform, evaluated once for the supplied seed. */\nexport function randomFromSeed(seed: number, sample = 0): number {\n const streamSeed = (Math.trunc(seed) ^ Math.imul(Math.trunc(sample), 0x9e3779b1)) >>> 0;\n let value = (streamSeed + 0x6d2b79f5) >>> 0;\n value = Math.imul(value ^ (value >>> 15), value | 1);\n value ^= value + Math.imul(value ^ (value >>> 7), value | 61);\n return ((value ^ (value >>> 14)) >>> 0) / 0x1_0000_0000;\n}\n\nexport function executeRandom(\n context: NodeExecutionContext<typeof randomDefinition>,\n): void {\n context.outputs.value.set(randomFromSeed(context.inputs.seed, context.inputs.sample));\n}\n\nexport const randomRegistration = {\n kind: \"definition-v1\",\n moduleId: \"cascade.core.Random\",\n definition: randomDefinition,\n loadExecute: async () => executeRandom,\n} satisfies DefinitionNodeRegistration<typeof randomDefinition>;\n", "import type { NodeDefinition, NodeExecutionContext } from \"@cascade/contracts\";\n\nimport type { DefinitionNodeRegistration } from \"../../types.js\";\n\nexport const remapDefinition = {\n apiVersion: 1,\n label: \"Remap\",\n description: \"Map a number from one range into another.\",\n icon: \"ArrowRightLeft\",\n runsOn: \"portable\",\n inputs: {\n value: { kind: \"data\", type: \"float\", default: 0 },\n inMin: { kind: \"data\", type: \"float\", default: 0 },\n inMax: { kind: \"data\", type: \"float\", default: 1 },\n outMin: { kind: \"data\", type: \"float\", default: 0 },\n outMax: { kind: \"data\", type: \"float\", default: 1 },\n },\n outputs: {\n result: { kind: \"data\", type: \"float\" },\n },\n props: {\n clamp: {\n type: \"bool\",\n default: false,\n label: \"Clamp\",\n description: \"Keep the normalized input between zero and one.\",\n },\n },\n} as const satisfies NodeDefinition;\n\nexport function remap(\n value: number,\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n clamp: boolean,\n): number {\n if (inMin === inMax) return outMin;\n const normalized = (value - inMin) / (inMax - inMin);\n const amount = clamp ? Math.min(1, Math.max(0, normalized)) : normalized;\n return outMin + amount * (outMax - outMin);\n}\n\nexport function executeRemap(\n context: NodeExecutionContext<typeof remapDefinition>,\n): void {\n const { value, inMin, inMax, outMin, outMax } = context.inputs;\n context.outputs.result.set(\n remap(value, inMin, inMax, outMin, outMax, context.props.clamp),\n );\n}\n\nexport const remapRegistration = {\n kind: \"definition-v1\",\n moduleId: \"cascade.core.Remap\",\n definition: remapDefinition,\n loadExecute: async () => executeRemap,\n} satisfies DefinitionNodeRegistration<typeof remapDefinition>;\n", "import type { DefinitionNodeRegistration } from \"../../types.js\";\n\nconst switchDefinition = {\n apiVersion: 1,\n runsOn: \"portable\",\n label: \"Switch\",\n description: \"Selects one input by index\",\n icon: \"GitBranch\",\n inputs: {\n inputs: { kind: \"data\", type: \"any\", variadic: true },\n },\n outputs: {\n output: { kind: \"data\", type: \"any\" },\n },\n props: {\n index: { type: \"int\", default: 0, min: 0, step: 1 },\n },\n} as const;\n\nconst mergeDefinition = {\n apiVersion: 1,\n runsOn: \"portable\",\n label: \"Merge\",\n description: \"Collects inputs into an array\",\n icon: \"GitMerge\",\n inputs: {\n inputs: { kind: \"data\", type: \"any\", variadic: true },\n },\n outputs: {\n output: { kind: \"data\", type: \"array\" },\n },\n props: {\n append: { type: \"bool\", default: false },\n },\n} as const;\n\nconst selectDefinition = {\n apiVersion: 1,\n runsOn: \"portable\",\n label: \"Select\",\n description: \"Selects an array item by index\",\n icon: \"ListFilter\",\n inputs: {\n array: { kind: \"data\", type: \"array\", default: [] },\n },\n outputs: {\n item: { kind: \"data\", type: \"any\" },\n count: { kind: \"data\", type: \"int\" },\n },\n props: {\n index: { type: \"int\", default: 0, min: 0, step: 1 },\n wrap: { type: \"bool\", default: true },\n },\n} as const;\n\nconst nullDefinition = {\n apiVersion: 1,\n runsOn: \"portable\",\n label: \"Null\",\n description: \"Passes its input through unchanged\",\n icon: \"Circle\",\n inputs: {\n input: { kind: \"data\", type: \"any\", default: null },\n },\n outputs: {\n output: { kind: \"data\", type: \"any\" },\n },\n} as const;\n\nexport const switchRegistration: DefinitionNodeRegistration<typeof switchDefinition> = {\n kind: \"definition-v1\",\n moduleId: \"cascade.core.Switch\",\n definition: switchDefinition,\n loadExecute: async () => ({ inputs, outputs, props }) => {\n const values = inputs.inputs;\n if (!values.length) {\n outputs.output.set(null);\n return;\n }\n const index = Math.max(0, Math.min(props.index, values.length - 1));\n outputs.output.set(values[index]);\n },\n};\n\nexport const mergeRegistration: DefinitionNodeRegistration<typeof mergeDefinition> = {\n kind: \"definition-v1\",\n moduleId: \"cascade.core.Merge\",\n definition: mergeDefinition,\n loadExecute: async () => ({ inputs, outputs, props }) => {\n const values = inputs.inputs.filter((value) => value !== null);\n outputs.output.set(\n props.append && Array.isArray(values[0])\n ? [...values[0], ...values.slice(1)]\n : values,\n );\n },\n};\n\nexport const selectRegistration: DefinitionNodeRegistration<typeof selectDefinition> = {\n kind: \"definition-v1\",\n moduleId: \"cascade.core.Select\",\n definition: selectDefinition,\n loadExecute: async () => ({ inputs, outputs, props }) => {\n const count = inputs.array.length;\n outputs.count.set(count);\n if (!count) {\n outputs.item.set(null);\n return;\n }\n const index = props.wrap\n ? ((props.index % count) + count) % count\n : Math.max(0, Math.min(props.index, count - 1));\n outputs.item.set(inputs.array[index]);\n },\n};\n\nexport const nullRegistration: DefinitionNodeRegistration<typeof nullDefinition> = {\n kind: \"definition-v1\",\n moduleId: \"cascade.core.Null\",\n definition: nullDefinition,\n loadExecute: async () => ({ inputs, outputs }) => {\n outputs.output.set(inputs.input);\n },\n};\n", "import type { DefinitionNodeRegistration } from \"../../types.js\";\n\nconst inputDefinition = {\n apiVersion: 1,\n runsOn: \"portable\",\n label: \"Input\",\n description: \"Defines a public graph or subnet input\",\n icon: \"LogIn\",\n inputs: {\n value: { kind: \"data\", type: \"any\", default: null },\n },\n outputs: {\n output: { kind: \"data\", type: \"any\" },\n },\n props: {\n inputIndex: { type: \"int\", default: 0, min: 0, step: 1 },\n inputName: { type: \"string\", default: \"\" },\n dataType: { type: \"string\", default: \"any\" },\n },\n} as const;\n\nconst outputDefinition = {\n apiVersion: 1,\n runsOn: \"portable\",\n label: \"Output\",\n description: \"Defines a public graph or subnet output\",\n icon: \"LogOut\",\n inputs: {\n input: { kind: \"data\", type: \"any\", default: null },\n },\n outputs: {\n output: { kind: \"data\", type: \"any\" },\n },\n props: {\n outputIndex: { type: \"int\", default: 0, min: 0, step: 1 },\n outputName: { type: \"string\", default: \"\" },\n dataType: { type: \"string\", default: \"any\" },\n },\n} as const;\n\nconst subnetDefinition = {\n apiVersion: 1,\n runsOn: \"portable\",\n container: \"subnet\",\n label: \"Subnet\",\n description: \"Contains a nested deterministic graph\",\n icon: \"Folder\",\n} as const;\n\nexport const inputRegistration: DefinitionNodeRegistration<typeof inputDefinition> = {\n kind: \"definition-v1\",\n moduleId: \"cascade.core.Input\",\n definition: inputDefinition,\n loadExecute: async () => ({ inputs, outputs }) => outputs.output.set(inputs.value),\n};\n\nexport const outputRegistration: DefinitionNodeRegistration<typeof outputDefinition> = {\n kind: \"definition-v1\",\n moduleId: \"cascade.core.Output\",\n definition: outputDefinition,\n loadExecute: async () => ({ inputs, outputs }) => outputs.output.set(inputs.input),\n};\n\nexport const subnetRegistration: DefinitionNodeRegistration<typeof subnetDefinition> = {\n kind: \"definition-v1\",\n moduleId: \"cascade.core.Subnet\",\n definition: subnetDefinition,\n loadExecute: async () => () => {},\n};\n", "import type { DefinitionNodeRegistration } from \"../../types.js\";\nimport { randomRegistration } from \"./random.js\";\nimport { remapRegistration } from \"./remap.js\";\nimport { mergeRegistration, nullRegistration, selectRegistration, switchRegistration } from \"./routing.js\";\nimport { inputRegistration, outputRegistration, subnetRegistration } from \"./structural.js\";\n\nexport {\n inputRegistration,\n mergeRegistration,\n nullRegistration,\n outputRegistration,\n randomRegistration,\n remapRegistration,\n selectRegistration,\n subnetRegistration,\n switchRegistration,\n};\n\nexport const coreNodeRegistrations: readonly DefinitionNodeRegistration[] = Object.freeze([\n subnetRegistration,\n inputRegistration,\n outputRegistration,\n switchRegistration,\n mergeRegistration,\n nullRegistration,\n selectRegistration,\n randomRegistration,\n remapRegistration,\n]);\n\nconst registrationsById = new Map(\n coreNodeRegistrations.map((registration) => [registration.moduleId, registration]),\n);\n\nexport function coreNodeRegistration(moduleId: string): DefinitionNodeRegistration | undefined {\n return registrationsById.get(moduleId);\n}\n", "import type { NodeDefinition } from \"@cascade/contracts\";\n\nexport const rectangleDefinition = {\n apiVersion: 1,\n label: \"Rectangle\",\n description: \"A closed four-point polygon, counter-clockwise from bottom-left.\",\n icon: \"Square\",\n runsOn: \"portable\",\n inputs: {\n size: { kind: \"data\", type: \"vec2\", default: [1, 1] },\n center: { kind: \"data\", type: \"vec2\", default: [0, 0] },\n },\n outputs: { geometry: { kind: \"data\", type: \"geometry\" } },\n} as const satisfies NodeDefinition;\n\nexport const circleDefinition = {\n apiVersion: 1,\n label: \"Circle\",\n description:\n \"A closed circle, as one cubic Bezier chain or as a polygon of divisions segments.\",\n icon: \"Circle\",\n runsOn: \"portable\",\n inputs: {\n center: { kind: \"data\", type: \"vec2\", default: [0, 0] },\n radius: { kind: \"data\", type: \"vec2\", default: [1, 1] },\n divisions: {\n kind: \"data\",\n type: \"int\",\n default: 32,\n min: 3,\n step: 1,\n description: \"Segments of the polygonal form. Ignored by the Bezier form.\",\n },\n },\n outputs: { geometry: { kind: \"data\", type: \"geometry\" } },\n props: {\n type: {\n type: \"string\",\n default: \"bezier\",\n label: \"Primitive Type\",\n control: \"select\",\n options: [\"bezier\", \"poly\"],\n description:\n \"A Bezier circle is a circle; a polygon of any division count is visibly a polygon in print.\",\n },\n },\n} as const satisfies NodeDefinition;\n\nexport const transformDefinition = {\n apiVersion: 1,\n label: \"Transform\",\n description: \"Translate, rotate and scale geometry about a pivot.\",\n icon: \"Move\",\n runsOn: \"portable\",\n inputs: {\n geometry: { kind: \"data\", type: \"geometry\" },\n translate: { kind: \"data\", type: \"vec2\", default: [0, 0] },\n rotate: {\n kind: \"data\",\n type: \"float\",\n default: 0,\n description: \"Degrees, counter-clockwise.\",\n },\n scale: { kind: \"data\", type: \"vec2\", default: [1, 1] },\n pivot: { kind: \"data\", type: \"vec2\", default: [0, 0] },\n },\n outputs: { geometry: { kind: \"data\", type: \"geometry\" } },\n} as const satisfies NodeDefinition;\n\nexport const mergeDefinition = {\n apiVersion: 1,\n label: \"Merge\",\n description: \"Concatenate geometries, taking the union of their attributes.\",\n icon: \"GitMerge\",\n runsOn: \"portable\",\n inputs: { inputs: { kind: \"data\", type: \"geometry\", variadic: true } },\n outputs: { geometry: { kind: \"data\", type: \"geometry\" } },\n} as const satisfies NodeDefinition;\n\nexport const copyToPointsDefinition = {\n apiVersion: 1,\n label: \"Copy to Points\",\n description: \"Instance one geometry onto every point of another.\",\n icon: \"Copy\",\n runsOn: \"portable\",\n inputs: {\n source: { kind: \"data\", type: \"geometry\" },\n target: { kind: \"data\", type: \"geometry\" },\n },\n outputs: { geometry: { kind: \"data\", type: \"geometry\" } },\n props: {\n targetGroup: {\n type: \"string\",\n default: \"\",\n label: \"Target Group\",\n description: \"Copy onto this point group only; empty means every point.\",\n },\n useTargetOrientations: {\n type: \"bool\",\n default: true,\n label: \"Transform Using Target Point Orientations\",\n description: \"Read pscale and N from the target points.\",\n },\n },\n} as const satisfies NodeDefinition;\n\nexport const svgExportDefinition = {\n apiVersion: 1,\n label: \"SVG Export\",\n description: \"Write geometry as an SVG document, one group element per group.\",\n icon: \"FileDown\",\n runsOn: \"portable\",\n capabilities: [\"assets\"],\n inputs: { geometry: { kind: \"data\", type: \"geometry\" } },\n outputs: {\n svg: { kind: \"data\", type: \"string\" },\n asset: { kind: \"data\", type: \"asset\" },\n },\n props: {\n filename: { type: \"string\", default: \"geometry.svg\", label: \"Filename\" },\n width: {\n type: \"float\",\n default: 0,\n min: 0,\n label: \"Width\",\n description: \"0 derives the width from the geometry bounds.\",\n },\n height: { type: \"float\", default: 0, min: 0, label: \"Height\" },\n margin: { type: \"float\", default: 0, label: \"Margin\" },\n stroke: {\n type: \"color\",\n default: [0, 0, 0, 1],\n label: \"Stroke\",\n description: \"Fallback for a primitive with no Cd attribute.\",\n },\n strokeWidth: {\n type: \"float\",\n default: 1,\n min: 0,\n label: \"Stroke Width\",\n description: \"Fallback for a primitive with no width attribute.\",\n },\n opacity: {\n type: \"float\",\n default: 1,\n min: 0,\n max: 1,\n label: \"Opacity\",\n description: \"Fallback for a primitive with no opacity attribute.\",\n },\n fillMode: {\n type: \"string\",\n default: \"none\",\n label: \"Fill Mode\",\n control: \"select\",\n options: [\"none\", \"solid\"],\n description: \"none leaves primitives unfilled, which is what plotter work wants.\",\n },\n fill: {\n type: \"color\",\n default: [1, 1, 1, 1],\n label: \"Fill\",\n description: \"Fill colour, used only when Fill Mode is solid.\",\n },\n pointRadius: {\n type: \"float\",\n default: 0.5,\n min: 0,\n label: \"Point Radius\",\n description: \"Fallback radius for a loose point with no pscale.\",\n },\n precision: {\n type: \"int\",\n default: 3,\n min: 0,\n max: 15,\n step: 1,\n label: \"Precision\",\n description: \"Decimal places on emitted coordinates.\",\n },\n },\n} as const satisfies NodeDefinition;\n\nexport const geoNodeDefinitions = Object.freeze([\n [\"cascade.geo.Rectangle\", rectangleDefinition],\n [\"cascade.geo.Circle\", circleDefinition],\n [\"cascade.geo.Transform\", transformDefinition],\n [\"cascade.geo.Merge\", mergeDefinition],\n [\"cascade.geo.CopyToPoints\", copyToPointsDefinition],\n [\"cascade.geo.SvgExport\", svgExportDefinition],\n] as const);\n", "/**\n * The one place the geometry built-in namespace is written down.\n *\n * `cascade.geo.*` is reserved, decided 2026-09-04 by Marcus: *\"`.geo` is clear,\n * all good.\"* So the reserved surface grows from eight structural nodes to\n * those plus the geometry library, and the line that widening draws is worth\n * keeping in mind: `cascade.core.*` is the structure of a graph, while\n * `cascade.geo.*` is a medium.\n *\n * Every module id in this folder goes through `geoModuleId`, so renaming the\n * namespace is this constant and nothing else.\n */\nexport const GEO_NAMESPACE = \"cascade.geo\";\n\nexport function geoModuleId(name: string): string {\n return `${GEO_NAMESPACE}.${name}`;\n}\n", "import type { NodeExecutionContext } from \"@cascade/contracts\";\nimport { emptyGeometry } from \"@cascade/contracts\";\n\nimport { copyToPoints } from \"../../geometry/copy.js\";\nimport type { DefinitionNodeRegistration } from \"../../types.js\";\nimport { copyToPointsDefinition } from \"./definitions.js\";\nimport { geoModuleId } from \"./namespace.js\";\n\n/**\n * Copy to Points SOP: the source instanced onto every point of the target.\n *\n * Houdini's input names and parameter names, because a Houdini user should not\n * have to learn new words for the same idea: source, target points, target\n * group, and \"Transform Using Target Point Orientations\" for whether `pscale`\n * and `N` are read.\n *\n * This and `Merge` are the pair that fails loudly if the attribute model does\n * not compose, which is why both are in the first six rather than the second.\n */\nexport function executeCopyToPoints(\n context: NodeExecutionContext<typeof copyToPointsDefinition>,\n): void {\n const source = context.inputs.source;\n const target = context.inputs.target;\n if (source === undefined || target === undefined) {\n context.outputs.geometry.set(emptyGeometry(2));\n return;\n }\n context.outputs.geometry.set(\n copyToPoints(source, target, {\n targetGroup: context.props.targetGroup,\n useTargetOrientations: context.props.useTargetOrientations,\n }),\n );\n}\n\nexport const copyToPointsRegistration = {\n kind: \"definition-v1\",\n moduleId: geoModuleId(\"CopyToPoints\"),\n definition: copyToPointsDefinition,\n loadExecute: async () => executeCopyToPoints,\n} satisfies DefinitionNodeRegistration<typeof copyToPointsDefinition>;\n\nexport { copyToPointsDefinition } from \"./definitions.js\";\n", "import type { NodeExecutionContext } from \"@cascade/contracts\";\n\nimport { circleGeometry, rectangleGeometry } from \"../../geometry/generate.js\";\nimport type { DefinitionNodeRegistration } from \"../../types.js\";\nimport { circleDefinition, rectangleDefinition } from \"./definitions.js\";\nimport { geoModuleId } from \"./namespace.js\";\n\n/**\n * The two generators. Houdini has no Rectangle and its Grid with two rows does\n * the job, so `size` and `center` are Grid's parameter names; `Circle` takes\n * Houdini's Circle parameters, including its \"Primitive Type\", which is what\n * selects a B\u00E9zier circle over a polygonal one.\n *\n * Numeric parameters are data inputs rather than props, so a graph can drive\n * them, which is the Cascade equivalent of a Houdini parameter being animatable.\n * The enumerated choice is a prop, as `Remap`'s `clamp` is.\n */\nexport function executeRectangle(\n context: NodeExecutionContext<typeof rectangleDefinition>,\n): void {\n context.outputs.geometry.set(\n rectangleGeometry({\n size: context.inputs.size,\n center: context.inputs.center,\n }),\n );\n}\n\nexport const rectangleRegistration = {\n kind: \"definition-v1\",\n moduleId: geoModuleId(\"Rectangle\"),\n definition: rectangleDefinition,\n loadExecute: async () => executeRectangle,\n} satisfies DefinitionNodeRegistration<typeof rectangleDefinition>;\n\nexport function executeCircle(\n context: NodeExecutionContext<typeof circleDefinition>,\n): void {\n context.outputs.geometry.set(\n circleGeometry({\n center: context.inputs.center,\n radius: context.inputs.radius,\n divisions: context.inputs.divisions,\n type: context.props.type === \"poly\" ? \"poly\" : \"bezier\",\n }),\n );\n}\n\nexport const circleRegistration = {\n kind: \"definition-v1\",\n moduleId: geoModuleId(\"Circle\"),\n definition: circleDefinition,\n loadExecute: async () => executeCircle,\n} satisfies DefinitionNodeRegistration<typeof circleDefinition>;\n\nexport { circleDefinition, rectangleDefinition } from \"./definitions.js\";\n", "import type { NodeExecutionContext } from \"@cascade/contracts\";\n\nimport { mergeGeometries } from \"../../geometry/merge.js\";\nimport type { DefinitionNodeRegistration } from \"../../types.js\";\nimport { mergeDefinition } from \"./definitions.js\";\nimport { geoModuleId } from \"./namespace.js\";\n\n/**\n * Merge SOP: N geometries concatenated, with points, vertices and primitives\n * renumbered. The node that proves the format composes, which is why it is in\n * the first six.\n *\n * It is not `cascade.core.Merge` and cannot be: that one collects its variadic\n * inputs into an `array`, which is a different operation with the same name.\n * The widening rules for a colliding attribute name belong to `mergeGeometries`\n * and are not re-decided here.\n */\nexport function executeMerge(\n context: NodeExecutionContext<typeof mergeDefinition>,\n): void {\n context.outputs.geometry.set(\n mergeGeometries(context.inputs.inputs.filter((input) => input !== undefined)),\n );\n}\n\nexport const mergeRegistration = {\n kind: \"definition-v1\",\n moduleId: geoModuleId(\"Merge\"),\n definition: mergeDefinition,\n loadExecute: async () => executeMerge,\n} satisfies DefinitionNodeRegistration<typeof mergeDefinition>;\n\nexport { mergeDefinition } from \"./definitions.js\";\n", "import type { NodeExecutionContext } from \"@cascade/contracts\";\nimport { emptyGeometry } from \"@cascade/contracts\";\n\nimport { geometryToSvg, utf8Bytes } from \"../../geometry/svg.js\";\nimport type { DefinitionNodeRegistration } from \"../../types.js\";\nimport { svgExportDefinition } from \"./definitions.js\";\nimport { geoModuleId } from \"./namespace.js\";\n\n/**\n * The output end: an SVG document, as a string and as a written asset.\n *\n * It declares `assets` and nothing else. Writing is not optional and there is\n * no `write` prop, because an export node whose file is a choice is a node that\n * silently did nothing. `assets` is available to a `portable` node, so this\n * stays portable and needs no `files` capability: the host decides where an\n * asset lands, which is the whole point of the capability.\n *\n * The props are the fallbacks for `Cd`, `width` and `opacity`. A per-primitive\n * attribute wins where it exists; see `geometryToSvg`, which also owns the one\n * +Y-up-to-+Y-down flip in the system.\n *\n * `stroke` and `fill` are both `color`, which is a four-component vector with a\n * swatch control rather than a second colour representation. `fill` used to be\n * an SVG paint string so that `\"none\"` was expressible; Marcus ruled colour to\n * be a `vec4` everywhere, so the absence of a fill is now the separate\n * `fillMode` prop and the writer converts to text through `Color.toHex`. The\n * reason \"no fill\" is a mode rather than a zero alpha is in `SvgExportOptions`.\n */\nexport async function executeSvgExport(\n context: NodeExecutionContext<typeof svgExportDefinition>,\n): Promise<void> {\n const { props } = context;\n const svg = geometryToSvg(context.inputs.geometry ?? emptyGeometry(2), {\n width: props.width,\n height: props.height,\n margin: props.margin,\n stroke: props.stroke,\n strokeWidth: props.strokeWidth,\n opacity: props.opacity,\n fill: props.fill,\n fillMode: props.fillMode === \"solid\" ? \"solid\" : \"none\",\n pointRadius: props.pointRadius,\n precision: props.precision,\n });\n context.outputs.svg.set(svg);\n const asset = await context.capabilities.assets.write(\n utf8Bytes(svg),\n { mediaType: \"image/svg+xml\", suggestedName: props.filename },\n { signal: context.signal },\n );\n context.outputs.asset.set(asset);\n}\n\nexport const svgExportRegistration = {\n kind: \"definition-v1\",\n moduleId: geoModuleId(\"SvgExport\"),\n definition: svgExportDefinition,\n loadExecute: async () => executeSvgExport,\n} satisfies DefinitionNodeRegistration<typeof svgExportDefinition>;\n\nexport { svgExportDefinition } from \"./definitions.js\";\n", "import type { NodeExecutionContext } from \"@cascade/contracts\";\nimport { emptyGeometry } from \"@cascade/contracts\";\n\nimport { transformMatrix } from \"../../geometry/matrix.js\";\nimport { transformGeometry } from \"../../geometry/transform.js\";\nimport type { DefinitionNodeRegistration } from \"../../types.js\";\nimport { transformDefinition } from \"./definitions.js\";\nimport { geoModuleId } from \"./namespace.js\";\n\n/**\n * Transform SOP's parameters, by its names: translate, rotate, scale, pivot,\n * in Houdini's scale-rotate-translate order about the pivot. Rotation is in\n * degrees and counter-clockwise, because geometry is +Y up.\n *\n * The plan described this node as applying a `mat3`. It builds one instead: a\n * matrix-typed input is the primitive the operation wants and the wrong thing\n * to put in front of an artist, and the four parameters are what a Houdini user\n * reaches for.\n */\nexport function executeTransform(\n context: NodeExecutionContext<typeof transformDefinition>,\n): void {\n const geometry = context.inputs.geometry ?? emptyGeometry(2);\n context.outputs.geometry.set(\n transformGeometry(\n geometry,\n transformMatrix({\n translate: context.inputs.translate,\n rotate: context.inputs.rotate,\n scale: context.inputs.scale,\n pivot: context.inputs.pivot,\n }),\n ),\n );\n}\n\nexport const transformRegistration = {\n kind: \"definition-v1\",\n moduleId: geoModuleId(\"Transform\"),\n definition: transformDefinition,\n loadExecute: async () => executeTransform,\n} satisfies DefinitionNodeRegistration<typeof transformDefinition>;\n\nexport { transformDefinition } from \"./definitions.js\";\n", "import type { DefinitionNodeRegistration } from \"../../types.js\";\nimport { copyToPointsRegistration } from \"./copyToPoints.js\";\nimport { circleRegistration, rectangleRegistration } from \"./generators.js\";\nimport { mergeRegistration } from \"./merge.js\";\nimport { svgExportRegistration } from \"./svgExport.js\";\nimport { transformRegistration } from \"./transform.js\";\n\n/**\n * The six geometry built-ins that prove the format composes: two generators,\n * two operators, the instancer and the export.\n *\n * `Merge` and `CopyToPoints` are here rather than in a later batch because they\n * are the pair that fails loudly if the attribute model does not compose, so a\n * format mistake surfaces now rather than after twenty nodes are written against\n * it. `SvgExport` is here because it makes the result a file rather than an\n * assertion.\n *\n * The namespace lives in `namespace.ts`, once.\n */\nexport {\n circleRegistration,\n copyToPointsRegistration,\n mergeRegistration,\n rectangleRegistration,\n svgExportRegistration,\n transformRegistration,\n};\nexport { GEO_NAMESPACE, geoModuleId } from \"./namespace.js\";\n\nexport const geoNodeRegistrations: readonly DefinitionNodeRegistration[] =\n Object.freeze([\n rectangleRegistration,\n circleRegistration,\n transformRegistration,\n mergeRegistration,\n copyToPointsRegistration,\n svgExportRegistration,\n ]);\n\nconst registrationsById = new Map(\n geoNodeRegistrations.map((registration) => [\n registration.moduleId,\n registration,\n ]),\n);\n\nexport function geoNodeRegistration(\n moduleId: string,\n): DefinitionNodeRegistration | undefined {\n return registrationsById.get(moduleId);\n}\n", "import type { DefinitionNodeRegistration } from \"../types.js\";\nimport { coreNodeRegistrations } from \"./core/index.js\";\nimport { geoNodeRegistrations } from \"./geo/index.js\";\n\n/**\n * Every reserved built-in, in one list, so that a caller does not have to know\n * how many namespaces there are. `cascade.core.*` is structural and routing;\n * `cascade.geo.*` is the geometry set.\n */\nexport const builtinNodeRegistrations: readonly DefinitionNodeRegistration[] =\n Object.freeze([...coreNodeRegistrations, ...geoNodeRegistrations]);\n\nconst registrationsById = new Map(\n builtinNodeRegistrations.map((registration) => [\n registration.moduleId,\n registration,\n ]),\n);\n\nexport function builtinNodeRegistration(\n moduleId: string,\n): DefinitionNodeRegistration | undefined {\n return registrationsById.get(moduleId);\n}\n", "import {\n canConnectTypes,\n validateNodeDefinition,\n type CascadeAbortSignal,\n type CascadeType,\n type Diagnostic,\n type JsonValue,\n type NodeCapabilityName,\n type NodeDefinition,\n type NodeExecute,\n type ShellCapability,\n type ShellRunOptions,\n type TriggerEvent,\n} from \"@cascade/contracts\";\nimport { CascadeRuntimeError } from \"./error.js\";\nimport { builtinNodeRegistrations } from \"./builtins/index.js\";\nimport type {\n CascadeDocument,\n CascadeDocumentConnection,\n CascadeDocumentNode,\n CascadePreset,\n CascadeRuntime,\n ConnectionInspection,\n CreateRuntimeOptions,\n DefinitionNodeRegistration,\n GraphInspection,\n GraphState,\n LoadedCascadeGraph,\n NodeInspection,\n NodeRegistration,\n RunOptions,\n RunResult,\n RunTarget,\n RuntimeEvent,\n RuntimeHost,\n} from \"./types.js\";\n\ninterface RuntimeConnection extends ConnectionInspection {\n readonly kind: \"data\" | \"trigger\";\n readonly order: number;\n readonly variadicIndex?: number;\n}\ninterface RuntimeNode {\n readonly id: string;\n readonly moduleId: string;\n readonly parent?: string;\n readonly registration: DefinitionNodeRegistration;\n readonly definition: NodeDefinition;\n readonly inputs: Record<string, unknown>;\n readonly props: Record<string, unknown>;\n readonly outputs: Map<string, unknown>;\n execute?: NodeExecute;\n}\ninterface QueuedTrigger {\n readonly nodeId: string;\n readonly inputName: string;\n readonly event: TriggerEvent;\n}\ninterface ActiveRun {\n readonly runId: string;\n readonly signal: MutableAbortSignal;\n reason?: string;\n}\n\nclass MutableAbortSignal implements CascadeAbortSignal {\n aborted = false;\n reason?: unknown;\n private readonly listeners = new Set<() => void>();\n constructor(private readonly report: (diagnostic: Diagnostic) => void) {}\n addEventListener(\n _type: \"abort\",\n listener: () => void,\n options?: { once?: boolean },\n ): void {\n if (this.aborted) this.call(listener);\n else if (options?.once) {\n const once = () => {\n this.listeners.delete(once);\n listener();\n };\n this.listeners.add(once);\n } else this.listeners.add(listener);\n }\n removeEventListener(_type: \"abort\", listener: () => void): void {\n this.listeners.delete(listener);\n }\n abort(reason?: unknown): void {\n if (this.aborted) return;\n this.aborted = true;\n this.reason = reason;\n for (const listener of [...this.listeners]) this.call(listener);\n this.listeners.clear();\n }\n private call(listener: () => void): void {\n try {\n listener();\n } catch (error) {\n this.report({\n phase: \"run\",\n code: \"runtime/abort-listener-failed\",\n message: error instanceof Error ? error.message : String(error),\n });\n }\n }\n}\n\nexport function createRuntime(options: CreateRuntimeOptions): CascadeRuntime {\n return new Runtime(options.host, [...builtinNodeRegistrations, ...(options.nodes ?? [])]);\n}\n\nclass Runtime implements CascadeRuntime {\n private readonly registrations = new Map<string, NodeRegistration>();\n private readonly graphs = new Set<Graph>();\n private sealed = false;\n private disposed = false;\n constructor(\n private readonly host: RuntimeHost,\n registrations: readonly NodeRegistration[],\n ) {\n for (const registration of registrations) this.registerNode(registration);\n }\n registerNode(registration: NodeRegistration): void {\n if (this.sealed || this.disposed)\n misuse(\n \"runtime/registry-sealed\",\n \"Node registrations are sealed after the first load\",\n );\n if (this.registrations.has(registration.moduleId))\n misuse(\n \"runtime/duplicate-registration\",\n `Duplicate registration ${registration.moduleId}`,\n );\n this.registrations.set(\n registration.moduleId,\n snapshotRegistration(registration),\n );\n }\n async load(document: CascadeDocument): Promise<LoadedCascadeGraph> {\n if (this.disposed) misuse(\"runtime/disposed\", \"Runtime is disposed\");\n this.sealed = true;\n const nodes: RuntimeNode[] = [];\n const ids = new Set<string>();\n for (const authored of document.nodes) {\n if (!authored.id || ids.has(authored.id))\n misuse(\n \"runtime/invalid-node-id\",\n `Invalid or duplicate node id ${authored.id}`,\n );\n ids.add(authored.id);\n const moduleId = authored.module ?? authored.type;\n if (!moduleId)\n misuse(\"runtime/missing-module\", `Node ${authored.id} has no module`);\n const resolved =\n this.registrations.get(moduleId) ??\n (await this.host.modules.resolve(moduleId));\n if (!resolved)\n misuse(\n \"runtime/module-not-found\",\n `Module ${moduleId} was not registered`,\n );\n if (resolved.moduleId !== moduleId)\n misuse(\n \"runtime/module-identity\",\n `Resolver returned ${resolved.moduleId} for ${moduleId}`,\n );\n const snapshot = snapshotRegistration(resolved);\n if (snapshot.kind === \"legacy-dynamic\")\n misuse(\n \"runtime/legacy-adapter-required\",\n `Legacy module ${moduleId} requires the explicit legacy adapter`,\n );\n const registration = specializeCoreRegistration(\n snapshot,\n authored,\n document.nodes,\n );\n const diagnostics = validateNodeDefinition(registration.definition);\n if (diagnostics.length)\n throw new CascadeRuntimeError(\n \"runtime/definition-invalid\",\n diagnostics,\n );\n nodes.push(materialize(authored, registration));\n }\n const byId = new Map(nodes.map((node) => [node.id, node]));\n validateHierarchy(nodes, byId);\n const connections = (document.connections ?? []).map((connection, index) =>\n materializeConnection(connection, index, byId),\n );\n validateCardinality(byId, connections);\n validateTopology(nodes, connections);\n const graph = new Graph(\n this.host,\n nodes,\n connections,\n () => this.graphs.delete(graph),\n document.annotations,\n );\n this.graphs.add(graph);\n return graph;\n }\n async dispose(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n await Promise.all([...this.graphs].map((graph) => graph.dispose()));\n await this.host.legacyShell?.dispose?.();\n }\n}\n\nclass Graph implements LoadedCascadeGraph {\n private graphState: GraphState = \"ready\";\n private readonly byId: Map<string, RuntimeNode>;\n private readonly listeners = new Set<(event: RuntimeEvent) => void>();\n private readonly diagnostics: Diagnostic[] = [];\n private active?: ActiveRun;\n private activeRun?: Promise<RunResult>;\n private disposal?: Promise<void>;\n private runCounter = 0;\n private readonly authoredAnnotations: readonly Readonly<\n Record<string, unknown>\n >[];\n private readonly graphInputs: ReadonlyMap<string, RuntimeNode>;\n private readonly graphOutputs: ReadonlyMap<string, RuntimeNode>;\n constructor(\n private readonly host: RuntimeHost,\n private readonly nodes: readonly RuntimeNode[],\n private readonly connections: readonly RuntimeConnection[],\n private readonly onDispose: () => void,\n annotations: CascadeDocument[\"annotations\"] = [],\n ) {\n this.byId = new Map(nodes.map((node) => [node.id, node]));\n this.graphInputs = graphBoundaries(nodes, \"cascade.core.Input\", \"inputName\");\n this.graphOutputs = graphBoundaries(nodes, \"cascade.core.Output\", \"outputName\");\n this.authoredAnnotations = Object.freeze(\n annotations.map((annotation) => snapshot(annotation)),\n );\n }\n get state(): GraphState {\n return this.graphState;\n }\n inspect(): GraphInspection {\n const nodes: NodeInspection[] = this.nodes.map((node) => ({\n id: node.id,\n moduleId: node.moduleId,\n runsOn: node.definition.runsOn,\n ...(node.parent ? { parent: node.parent } : {}),\n inputs: Object.fromEntries(\n Object.entries(node.definition.inputs ?? {}).map(\n ([name, definition]) => [\n name,\n {\n kind: definition.kind,\n type: definition.kind === \"trigger\" ? \"trigger\" : definition.type,\n connected: this.connections.some(\n (connection) =>\n connection.target.nodeId === node.id &&\n connection.target.inputName === name,\n ),\n ...(definition.kind === \"data\"\n ? { value: snapshot(node.inputs[name]) }\n : {}),\n },\n ],\n ),\n ),\n outputs: Object.fromEntries(\n Object.entries(node.definition.outputs ?? {}).map(\n ([name, definition]) => [\n name,\n {\n kind: definition.kind,\n type: definition.kind === \"trigger\" ? \"trigger\" : definition.type,\n connected: this.connections.some(\n (connection) =>\n connection.source.nodeId === node.id &&\n connection.source.outputName === name,\n ),\n ...(definition.kind === \"data\" && node.outputs.has(name)\n ? { value: snapshot(node.outputs.get(name)) }\n : {}),\n },\n ],\n ),\n ),\n props: Object.fromEntries(\n Object.entries(node.definition.props ?? {}).map(\n ([name, definition]) => [\n name,\n { type: definition.type, value: snapshot(node.props[name]) },\n ],\n ),\n ),\n }));\n return Object.freeze({\n state: this.graphState,\n interface: Object.freeze({\n inputs: boundaryInspection(this.graphInputs, \"output\"),\n outputs: boundaryInspection(this.graphOutputs, \"output\"),\n }),\n nodes: Object.freeze(nodes),\n connections: Object.freeze(\n this.connections.map((connection) =>\n Object.freeze({\n source: Object.freeze({ ...connection.source }),\n target: Object.freeze({ ...connection.target }),\n }),\n ),\n ),\n diagnostics: Object.freeze([...this.diagnostics]),\n });\n }\n async setInput(\n nodeId: string,\n inputName: string,\n value: unknown,\n ): Promise<void> {\n this.requireReady();\n const node = this.requireNode(nodeId);\n const definition = node.definition.inputs?.[inputName];\n if (!definition || definition.kind !== \"data\")\n misuse(\n \"runtime/invalid-input\",\n `${nodeId}.${inputName} is not a data input`,\n );\n node.inputs[inputName] = runtimeValue(\n value,\n definition.type,\n !(\"default\" in definition),\n `${nodeId}.${inputName}`,\n );\n }\n setGraphInput(name: string, value: unknown): Promise<void> {\n const node = this.graphInputs.get(name);\n if (!node)\n return Promise.reject(runtimeError(\"runtime/graph-input-not-found\", `Unknown graph input ${name}`));\n return this.setInput(node.id, \"value\", value);\n }\n async setProp(\n nodeId: string,\n propName: string,\n value: unknown,\n ): Promise<void> {\n this.requireReady();\n const node = this.requireNode(nodeId);\n if (isStructuralProp(node, propName))\n misuse(\n \"runtime/structural-prop\",\n `${nodeId}.${propName} is structural and requires a graph reload`,\n );\n if (!node.definition.props?.[propName])\n misuse(\"runtime/invalid-prop\", `${nodeId}.${propName} is not a prop`);\n node.props[propName] = runtimeValue(\n value,\n node.definition.props[propName].type,\n false,\n `${nodeId}.${propName}`,\n );\n }\n async applyPreset(preset: CascadePreset): Promise<void> {\n this.requireReady();\n if (preset.version !== 1)\n misuse(\"runtime/invalid-preset\", \"Preset version must be 1\");\n const inputDrafts: Array<readonly [RuntimeNode, string, unknown]> = [];\n const propDrafts: Array<readonly [RuntimeNode, string, unknown]> = [];\n for (const [nodeId, values] of Object.entries(preset.nodes)) {\n const node = this.requireNode(nodeId);\n for (const [name, value] of Object.entries(values.inputs ?? {})) {\n const definition = node.definition.inputs?.[name];\n if (!definition || definition.kind !== \"data\")\n misuse(\n \"runtime/invalid-input\",\n `${nodeId}.${name} is not a data input`,\n );\n inputDrafts.push([\n node,\n name,\n runtimeValue(\n value,\n definition.type,\n !(\"default\" in definition),\n `${nodeId}.${name}`,\n ),\n ]);\n }\n for (const [name, value] of Object.entries(values.props ?? {})) {\n const definition = node.definition.props?.[name];\n if (!definition)\n misuse(\"runtime/invalid-prop\", `${nodeId}.${name} is not a prop`);\n if (isStructuralProp(node, name))\n misuse(\n \"runtime/structural-prop\",\n `${nodeId}.${name} is structural and cannot be changed by a preset`,\n );\n propDrafts.push([\n node,\n name,\n runtimeValue(value, definition.type, false, `${nodeId}.${name}`),\n ]);\n }\n }\n for (const [node, name, value] of inputDrafts) node.inputs[name] = value;\n for (const [node, name, value] of propDrafts) node.props[name] = value;\n }\n run(options: RunOptions = {}): Promise<RunResult> {\n return this.trackRun(\n options.target ?? { kind: \"all\" },\n options.signal,\n options.runId,\n );\n }\n trigger(\n nodeId: string,\n inputName: string,\n payload?: JsonValue,\n options: Readonly<{ signal?: CascadeAbortSignal; runId?: string }> = {},\n ): Promise<RunResult> {\n const node = this.requireNode(nodeId);\n if (node.definition.inputs?.[inputName]?.kind !== \"trigger\")\n return Promise.reject(\n runtimeError(\n \"runtime/invalid-trigger\",\n `${nodeId}.${inputName} is not a trigger input`,\n ),\n );\n return this.trackRun(\n { kind: \"node\", nodeId },\n options.signal,\n options.runId,\n { nodeId, inputName, payload },\n );\n }\n cancel(reason = \"Cancelled\"): void {\n if (!this.active || this.active.signal.aborted) return;\n this.graphState = \"cancelling\";\n this.active.reason = reason;\n this.active.signal.abort(reason);\n this.emit({ type: \"run:cancel\", runId: this.active.runId, reason });\n }\n subscribe(listener: (event: RuntimeEvent) => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n getOutput(nodeId: string, outputName: string): unknown {\n return snapshot(this.requireNode(nodeId).outputs.get(outputName));\n }\n getGraphOutput(name: string): unknown {\n const node = this.graphOutputs.get(name);\n if (!node)\n misuse(\"runtime/graph-output-not-found\", `Unknown graph output ${name}`);\n return this.getOutput(node.id, \"output\");\n }\n getOutputs(nodeId: string): ReadonlyMap<string, unknown> {\n return immutableMap(\n [...this.requireNode(nodeId).outputs].map(([name, value]) => [\n name,\n snapshot(value),\n ]),\n );\n }\n dispose(): Promise<void> {\n this.disposal ??= this.performDispose();\n return this.disposal;\n }\n\n private trackRun(\n target: RunTarget,\n signal?: CascadeAbortSignal,\n runId?: string,\n injection?: { nodeId: string; inputName: string; payload?: JsonValue },\n ): Promise<RunResult> {\n const running = this.executeRun(target, signal, runId, injection);\n this.activeRun = running;\n const clear = () => {\n if (this.activeRun === running) this.activeRun = undefined;\n };\n void running.then(clear, clear);\n return running;\n }\n\n private async performDispose(): Promise<void> {\n if (this.graphState === \"disposed\") return;\n this.cancel(\"Graph disposed\");\n try {\n await this.activeRun;\n } catch {\n // API/preflight failures are already exposed to the run caller.\n }\n this.graphState = \"disposed\";\n this.listeners.clear();\n this.onDispose();\n }\n\n private async executeRun(\n target: RunTarget,\n externalSignal?: CascadeAbortSignal,\n requestedId?: string,\n injection?: { nodeId: string; inputName: string; payload?: JsonValue },\n ): Promise<RunResult> {\n this.requireReady();\n const runId = requestedId ?? `run-${this.runCounter++}`;\n const signal = new MutableAbortSignal((diagnostic) =>\n this.host.report(diagnostic),\n );\n this.active = { runId, signal };\n this.graphState = \"running\";\n const startedAt = this.host.now();\n const runDiagnostics: Diagnostic[] = [];\n this.emit({ type: \"run:start\", runId, target });\n const relay = () =>\n this.cancel(\n typeof externalSignal?.reason === \"string\"\n ? externalSignal.reason\n : \"Cancelled by external signal\",\n );\n if (externalSignal?.aborted) relay();\n else externalSignal?.addEventListener(\"abort\", relay, { once: true });\n let executionStarted = false;\n try {\n const selection = injection\n ? {\n reachable: this.triggerReachable(injection.nodeId),\n initial: this.triggerDataAncestors(injection.nodeId),\n }\n : this.runSelection(target);\n const { reachable, initial } = selection;\n this.preflight(reachable);\n if (!signal.aborted)\n await Promise.all(\n reachable\n .filter((node) => !this.isRemote(node))\n .map((node) => this.loadExecute(node)),\n );\n executionStarted = true;\n const queue: QueuedTrigger[] = [];\n let sequence = 0;\n const enqueue = (\n nodeId: string,\n inputName: string,\n payload: JsonValue | undefined,\n source: TriggerEvent[\"source\"],\n ) => {\n const event = snapshot<TriggerEvent>({\n id: `${runId}:${sequence}`,\n runId,\n sequence: sequence++,\n ...(payload === undefined\n ? {}\n : { payload: snapshot(payload) as JsonValue }),\n source,\n });\n queue.push({ nodeId, inputName, event });\n this.emit({ type: \"trigger:queued\", runId, nodeId, inputName, event });\n };\n const ordered = topological(this.nodes, this.connections).filter((node) =>\n initial.includes(node),\n );\n for (const node of ordered) {\n if (signal.aborted) break;\n await this.executeNode(node, runId, signal, {}, enqueue);\n }\n if (injection && !signal.aborted)\n enqueue(injection.nodeId, injection.inputName, injection.payload, {\n kind: \"external\",\n });\n while (queue.length && !signal.aborted) {\n const next = queue.shift()!;\n this.emit({\n type: \"trigger:delivered\",\n runId,\n nodeId: next.nodeId,\n inputName: next.inputName,\n event: next.event,\n });\n await this.executeNode(\n this.requireNode(next.nodeId),\n runId,\n signal,\n { [next.inputName]: next.event },\n enqueue,\n );\n }\n return this.finish(\n runId,\n signal.aborted ? \"cancelled\" : \"completed\",\n startedAt,\n runDiagnostics,\n );\n } catch (error) {\n if (!executionStarted && error instanceof CascadeRuntimeError)\n throw error;\n const diagnostic: Diagnostic = {\n phase: \"run\",\n code: \"runtime/execution-failed\",\n message: error instanceof Error ? error.message : String(error),\n };\n runDiagnostics.push(diagnostic);\n this.diagnostics.push(diagnostic);\n this.emit({ type: \"diagnostic\", runId, diagnostic });\n return this.finish(\n runId,\n signal.aborted ? \"cancelled\" : \"failed\",\n startedAt,\n runDiagnostics,\n );\n } finally {\n externalSignal?.removeEventListener(\"abort\", relay);\n if (!this.isDisposed()) this.graphState = \"ready\";\n this.active = undefined;\n }\n }\n private async executeNode(\n node: RuntimeNode,\n runId: string,\n signal: MutableAbortSignal,\n triggers: Record<string, TriggerEvent>,\n enqueue: (\n nodeId: string,\n inputName: string,\n payload: JsonValue | undefined,\n source: TriggerEvent[\"source\"],\n ) => void,\n ): Promise<void> {\n this.emit({ type: \"node:start\", runId, nodeId: node.id });\n const inputs = Object.fromEntries(\n Object.entries(node.definition.inputs ?? {}).map(([name, definition]) => {\n if (definition.kind === \"trigger\") return [name, triggers[name]];\n if (\n node.moduleId === \"cascade.core.Input\" &&\n name === \"value\" &&\n node.parent\n ) {\n const parent = this.requireNode(node.parent);\n const index = integerProp(node.props.inputIndex);\n return [name, this.dataInputValue(parent, `input_${index}`)];\n }\n const connections = this.connections.filter(\n (item) =>\n item.kind === \"data\" &&\n item.target.nodeId === node.id &&\n item.target.inputName === name,\n ).sort((first, second) =>\n (first.variadicIndex ?? first.order) -\n (second.variadicIndex ?? second.order),\n );\n if (definition.variadic) {\n const values = connections.map((connection) =>\n this.requireNode(connection.source.nodeId).outputs.get(\n connection.source.outputName,\n ),\n );\n if (!values.length && node.inputs[name] !== undefined)\n values.push(node.inputs[name]);\n return [name, Object.freeze(values)];\n }\n const connection = connections[0];\n return [\n name,\n connection\n ? this.requireNode(connection.source.nodeId).outputs.get(\n connection.source.outputName,\n )\n : node.inputs[name],\n ];\n }),\n );\n Object.freeze(inputs);\n if (this.isRemote(node)) {\n const bridge = this.host.capabilities.serverBridge;\n if (!bridge)\n throw runtimeError(\n \"runtime/bridge-missing\",\n `No server bridge for ${node.moduleId}`,\n );\n const progress = {\n report: (event: {\n progress?: number;\n message?: string;\n detail?: JsonValue;\n }) =>\n this.emit({\n type: \"node:progress\",\n runId,\n nodeId: node.id,\n ...event,\n }),\n };\n const response = await bridge.execute(\n {\n moduleId: node.moduleId,\n nodeId: node.id,\n inputs: inputs as never,\n props: Object.freeze({ ...node.props }) as never,\n },\n { signal, progress },\n );\n for (const diagnostic of response.diagnostics) {\n this.diagnostics.push(diagnostic);\n this.emit({ type: \"diagnostic\", runId, diagnostic });\n }\n for (const name of Object.keys(node.definition.outputs ?? {}))\n if (name in response.outputs) {\n const definition = node.definition.outputs?.[name];\n if (!definition || definition.kind !== \"data\") continue;\n const value = runtimeValue(\n response.outputs[name],\n definition.type,\n false,\n `${node.id}.${name}`,\n );\n node.outputs.set(name, value);\n this.emit({\n type: \"node:output\",\n runId,\n nodeId: node.id,\n outputName: name,\n value,\n });\n }\n this.emit({ type: \"node:complete\", runId, nodeId: node.id });\n return;\n }\n if (!node.execute)\n throw runtimeError(\n \"runtime/executor-missing\",\n `Executor ${node.moduleId} was not loaded`,\n );\n const pendingData = new Map<string, unknown>();\n const pendingTriggers: { name: string; payload?: JsonValue }[] = [];\n const outputs = Object.fromEntries(\n Object.entries(node.definition.outputs ?? {}).map(\n ([name, definition]) => [\n name,\n definition.kind === \"trigger\"\n ? {\n trigger: (payload?: JsonValue) =>\n pendingTriggers.push({\n name,\n ...(payload === undefined\n ? {}\n : { payload: snapshot(payload) as JsonValue }),\n }),\n }\n : {\n set: (value: unknown) =>\n pendingData.set(\n name,\n runtimeValue(\n value,\n definition.type,\n false,\n `${node.id}.${name}`,\n ),\n ),\n },\n ],\n ),\n );\n const capabilities = Object.freeze(\n Object.fromEntries(\n (node.definition.capabilities ?? []).map((name) => [\n name,\n name === \"shell\"\n ? bindShellToRun(this.host.capabilities.shell, signal)\n : this.host.capabilities[name],\n ]),\n ),\n );\n const props = Object.freeze({ ...node.props });\n const progress = {\n report: (event: {\n progress?: number;\n message?: string;\n detail?: JsonValue;\n }) =>\n this.emit({ type: \"node:progress\", runId, nodeId: node.id, ...event }),\n };\n await node.execute({\n inputs,\n outputs,\n props,\n capabilities,\n signal,\n progress,\n } as never);\n if (signal.aborted) return;\n if (node.moduleId === \"cascade.core.Subnet\") {\n for (const child of this.nodes) {\n if (\n child.parent !== node.id ||\n child.moduleId !== \"cascade.core.Output\"\n ) continue;\n const name = `output_${integerProp(child.props.outputIndex)}`;\n if (node.definition.outputs?.[name]?.kind === \"data\")\n pendingData.set(name, child.outputs.get(\"output\"));\n }\n }\n for (const name of Object.keys(node.definition.outputs ?? {}))\n if (pendingData.has(name)) {\n const value = pendingData.get(name);\n node.outputs.set(name, value);\n this.emit({\n type: \"node:output\",\n runId,\n nodeId: node.id,\n outputName: name,\n value: snapshot(value),\n });\n }\n for (const emitted of pendingTriggers)\n for (const connection of this.connections) {\n if (\n connection.kind === \"trigger\" &&\n connection.source.nodeId === node.id &&\n connection.source.outputName === emitted.name\n )\n enqueue(\n connection.target.nodeId,\n connection.target.inputName,\n emitted.payload,\n { nodeId: node.id, outputName: emitted.name },\n );\n }\n this.emit({ type: \"node:complete\", runId, nodeId: node.id });\n }\n private preflight(nodes: readonly RuntimeNode[]): void {\n for (const node of nodes) {\n const remote = this.isRemote(node);\n const locationWorks =\n node.definition.runsOn === \"portable\" ||\n node.definition.runsOn === this.host.environment ||\n remote;\n if (!locationWorks)\n throw runtimeError(\n \"runtime/preflight-environment\",\n `${node.moduleId} requires ${node.definition.runsOn}`,\n );\n if (remote) {\n const hasTriggers = [\n ...Object.values(node.definition.inputs ?? {}),\n ...Object.values(node.definition.outputs ?? {}),\n ].some((port) => port.kind === \"trigger\");\n if (hasTriggers)\n throw runtimeError(\n \"runtime/preflight-bridge-trigger\",\n `${node.moduleId} cannot send triggers over the server bridge`,\n );\n const hasTexture = [\n ...Object.values(node.definition.inputs ?? {}),\n ...Object.values(node.definition.outputs ?? {}),\n ].some((port) => port.kind === \"data\" && port.type === \"texture\");\n if (hasTexture)\n throw runtimeError(\n \"runtime/preflight-bridge-texture\",\n `${node.moduleId} cannot send textures over the server bridge`,\n );\n } else\n for (const capability of node.definition.capabilities ?? [])\n if (!this.host.capabilities[capability as NodeCapabilityName])\n throw runtimeError(\n \"runtime/missing-capability\",\n `Missing capability ${capability} for ${node.moduleId}`,\n );\n }\n }\n private isRemote(node: RuntimeNode): boolean {\n return (\n this.host.environment === \"browser\" &&\n node.definition.runsOn === \"server\" &&\n !!this.host.capabilities.serverBridge\n );\n }\n private async loadExecute(node: RuntimeNode): Promise<void> {\n node.execute ??= (await node.registration.loadExecute(\n this.host.environment,\n )) as NodeExecute;\n }\n private runSelection(target: RunTarget): {\n readonly reachable: RuntimeNode[];\n readonly initial: RuntimeNode[];\n } {\n if (target.kind === \"all\") {\n const initial = this.nodes.filter(\n (node) => !isGated(node) && !this.hasGatedDataAncestor(node.id),\n );\n const ids = new Set(initial.map((node) => node.id));\n let changed = true;\n while (changed) {\n changed = false;\n for (const connection of this.connections) {\n if (\n connection.kind === \"trigger\" &&\n ids.has(connection.source.nodeId) &&\n !ids.has(connection.target.nodeId)\n ) {\n ids.add(connection.target.nodeId);\n for (const dependency of this.dataClosure(connection.target.nodeId))\n ids.add(dependency.id);\n changed = true;\n }\n }\n }\n return {\n initial,\n reachable: this.nodes.filter((node) => ids.has(node.id)),\n };\n }\n const root = this.requireNode(target.nodeId);\n if (\n target.kind === \"output\" &&\n !root.definition.outputs?.[target.outputName]\n )\n misuse(\n \"runtime/invalid-target\",\n `Unknown output ${target.nodeId}.${target.outputName}`,\n );\n const reachable = this.dataClosure(root.id);\n if (reachable.some(isGated))\n misuse(\n \"runtime/invalid-target\",\n `Target ${root.id} depends on a trigger event`,\n );\n return { reachable, initial: reachable };\n }\n private dataClosure(nodeId: string): RuntimeNode[] {\n const ids = new Set([nodeId]);\n const dependencies = dataDependencies(this.nodes, this.connections);\n let changed = true;\n while (changed) {\n changed = false;\n for (const dependency of dependencies)\n if (\n ids.has(dependency.targetId) &&\n !ids.has(dependency.sourceId)\n ) {\n ids.add(dependency.sourceId);\n changed = true;\n }\n }\n return this.nodes.filter((node) => ids.has(node.id));\n }\n private hasGatedDataAncestor(nodeId: string): boolean {\n return this.dataClosure(nodeId).some(isGated);\n }\n private triggerDataAncestors(nodeId: string): RuntimeNode[] {\n const dependencies = this.dataClosure(nodeId).filter(\n (node) => node.id !== nodeId,\n );\n if (dependencies.some(isGated))\n misuse(\n \"runtime/invalid-target\",\n `Trigger target ${nodeId} depends on another trigger event`,\n );\n return dependencies;\n }\n private triggerReachable(nodeId: string): RuntimeNode[] {\n const ids = new Set([this.requireNode(nodeId).id]);\n const dependencies = dataDependencies(this.nodes, this.connections);\n let changed = true;\n while (changed) {\n changed = false;\n for (const connection of this.connections) {\n if (\n connection.kind === \"trigger\" &&\n ids.has(connection.source.nodeId) &&\n !ids.has(connection.target.nodeId)\n ) {\n ids.add(connection.target.nodeId);\n changed = true;\n }\n }\n for (const dependency of dependencies)\n if (\n ids.has(dependency.targetId) &&\n !ids.has(dependency.sourceId)\n ) {\n ids.add(dependency.sourceId);\n changed = true;\n }\n }\n return this.nodes.filter((node) => ids.has(node.id));\n }\n private finish(\n runId: string,\n status: RunResult[\"status\"],\n startedAt: number,\n diagnostics: readonly Diagnostic[],\n ): RunResult {\n const finishedAt = this.host.now();\n const outputs = immutableMap(\n this.nodes.map((node) => [node.id, this.getOutputs(node.id)]),\n );\n const result: RunResult = Object.freeze({\n runId,\n status,\n outputs,\n diagnostics: Object.freeze([...diagnostics]),\n timings: Object.freeze({\n startedAt,\n finishedAt,\n durationMs: finishedAt - startedAt,\n }),\n });\n this.emit({ type: \"run:complete\", result });\n return result;\n }\n private emit(event: RuntimeEvent): void {\n for (const listener of [...this.listeners])\n try {\n listener(event);\n } catch (error) {\n this.host.report({\n phase: \"event\",\n code: \"runtime/listener-failed\",\n message: error instanceof Error ? error.message : String(error),\n });\n }\n }\n private requireReady(): void {\n if (this.graphState !== \"ready\")\n misuse(\"runtime/invalid-state\", `Graph is ${this.graphState}`);\n }\n private isDisposed(): boolean {\n return this.graphState === \"disposed\";\n }\n private requireNode(id: string): RuntimeNode {\n const node = this.byId.get(id);\n if (!node) misuse(\"runtime/node-not-found\", `Unknown node ${id}`);\n return node;\n }\n private dataInputValue(node: RuntimeNode, inputName: string): unknown {\n const connection = this.connections.find(\n (item) =>\n item.kind === \"data\" &&\n item.target.nodeId === node.id &&\n item.target.inputName === inputName,\n );\n return connection\n ? this.requireNode(connection.source.nodeId).outputs.get(\n connection.source.outputName,\n )\n : node.inputs[inputName];\n }\n}\n\nfunction bindShellToRun(\n shell: ShellCapability | undefined,\n runSignal: CascadeAbortSignal,\n): ShellCapability | undefined {\n if (!shell) return undefined;\n const options = (value?: ShellRunOptions): ShellRunOptions => ({\n ...value,\n signal: combineAbortSignals(runSignal, value?.signal),\n });\n return Object.freeze({\n run: (command: string, args?: readonly string[], value?: ShellRunOptions) =>\n shell.run(command, args, options(value)),\n runJson: <T = unknown>(command: string, args?: readonly string[], value?: ShellRunOptions) =>\n shell.runJson<T>(command, args, options(value)),\n });\n}\n\nfunction combineAbortSignals(\n first: CascadeAbortSignal,\n second?: CascadeAbortSignal,\n): CascadeAbortSignal {\n if (!second || first === second) return first;\n const wrappers = new Map<() => void, () => void>();\n return {\n get aborted() { return first.aborted || second.aborted; },\n get reason() { return first.aborted ? first.reason : second.reason; },\n addEventListener(_type, listener, options) {\n if (first.aborted || second.aborted) {\n listener();\n return;\n }\n const wrapped = () => {\n first.removeEventListener(\"abort\", wrapped);\n second.removeEventListener(\"abort\", wrapped);\n wrappers.delete(listener);\n listener();\n };\n wrappers.set(listener, wrapped);\n first.addEventListener(\"abort\", wrapped, options);\n second.addEventListener(\"abort\", wrapped, options);\n },\n removeEventListener(_type, listener) {\n const wrapped = wrappers.get(listener);\n if (!wrapped) return;\n first.removeEventListener(\"abort\", wrapped);\n second.removeEventListener(\"abort\", wrapped);\n wrappers.delete(listener);\n },\n };\n}\n\nfunction materialize(\n authored: CascadeDocumentNode,\n registration: DefinitionNodeRegistration,\n): RuntimeNode {\n const inputs: Record<string, unknown> = {};\n const props: Record<string, unknown> = {};\n for (const [name, definition] of Object.entries(\n registration.definition.inputs ?? {},\n ))\n if (definition.kind === \"data\" && \"default\" in definition)\n inputs[name] = runtimeValue(\n definition.default,\n definition.type,\n false,\n `${authored.id}.${name}`,\n );\n if (Array.isArray(authored.inputs))\n for (const saved of authored.inputs) {\n const definition = registration.definition.inputs?.[saved.name];\n if (definition?.kind === \"data\") {\n inputs[saved.name] = runtimeValue(\n \"defaultValue\" in saved ? saved.defaultValue : saved.value,\n definition.type,\n !(\"default\" in definition),\n `${authored.id}.${saved.name}`,\n );\n }\n }\n else if (authored.inputs)\n for (const [name, saved] of Object.entries(authored.inputs)) {\n const definition = registration.definition.inputs?.[name];\n if (definition?.kind === \"data\")\n inputs[name] = runtimeValue(\n saved,\n definition.type,\n !(\"default\" in definition),\n `${authored.id}.${name}`,\n );\n }\n for (const [name, definition] of Object.entries(\n registration.definition.props ?? {},\n ))\n props[name] = runtimeValue(\n definition.default,\n definition.type,\n false,\n `${authored.id}.${name}`,\n );\n for (const [name, saved] of Object.entries(authored.props ?? {})) {\n const definition = registration.definition.props?.[name];\n if (definition)\n props[name] = runtimeValue(\n saved && typeof saved === \"object\" && \"value\" in saved\n ? (saved as { value: unknown }).value\n : saved,\n definition.type,\n false,\n `${authored.id}.${name}`,\n );\n }\n return {\n id: authored.id,\n moduleId: registration.moduleId,\n ...(authored.parent ? { parent: authored.parent } : {}),\n registration,\n definition: registration.definition,\n inputs,\n props,\n outputs: new Map(),\n };\n}\n\nfunction specializeCoreRegistration(\n registration: DefinitionNodeRegistration,\n authored: CascadeDocumentNode,\n nodes: readonly CascadeDocumentNode[],\n): DefinitionNodeRegistration {\n if (\n registration.moduleId === \"cascade.core.Input\" ||\n registration.moduleId === \"cascade.core.Output\"\n ) {\n const type = savedDataType(authored.props?.dataType);\n const inputName = registration.moduleId === \"cascade.core.Input\" ? \"value\" : \"input\";\n return Object.freeze({\n ...registration,\n definition: Object.freeze({\n ...registration.definition,\n inputs: Object.freeze({\n [inputName]: dataInputDefinition(type),\n }),\n outputs: Object.freeze({\n output: { kind: \"data\", type },\n }),\n }) as NodeDefinition,\n });\n }\n if (registration.moduleId !== \"cascade.core.Subnet\") return registration;\n const children = nodes.filter((candidate) => candidate.parent === authored.id);\n const inputs = indexedBoundaryPorts(children, \"cascade.core.Input\", \"inputIndex\", \"input\");\n const outputs = indexedBoundaryPorts(children, \"cascade.core.Output\", \"outputIndex\", \"output\");\n return Object.freeze({\n ...registration,\n definition: Object.freeze({\n ...registration.definition,\n ...(Object.keys(inputs).length ? { inputs: Object.freeze(inputs) } : {}),\n ...(Object.keys(outputs).length ? { outputs: Object.freeze(outputs) } : {}),\n }) as NodeDefinition,\n });\n}\n\nfunction indexedBoundaryPorts(\n nodes: readonly CascadeDocumentNode[],\n moduleId: string,\n propName: string,\n prefix: string,\n): Record<string, { readonly kind: \"data\"; readonly type: CascadeType; readonly default?: null }> {\n const boundaries = nodes\n .filter((node) => (node.module ?? node.type) === moduleId)\n .map((node) => ({\n index: savedIntegerProp(node.props?.[propName]),\n type: savedDataType(node.props?.dataType),\n }))\n .filter((boundary) => boundary.index >= 0);\n const max = boundaries.length ? Math.max(...boundaries.map(({ index }) => index)) : -1;\n const types = new Map(boundaries.map(({ index, type }) => [index, type]));\n return Object.fromEntries(\n Array.from({ length: max + 1 }, (_, index) => [\n `${prefix}_${index}`,\n prefix === \"input\"\n ? dataInputDefinition(types.get(index) ?? \"any\")\n : { kind: \"data\", type: types.get(index) ?? \"any\" },\n ]),\n );\n}\n\nfunction dataInputDefinition(\n type: CascadeType,\n): { readonly kind: \"data\"; readonly type: CascadeType; readonly default?: null } {\n return type === \"any\"\n ? { kind: \"data\", type, default: null }\n : { kind: \"data\", type };\n}\n\nfunction savedDataType(value: unknown): CascadeType {\n const type = savedStringProp(value);\n return (type || \"any\") as CascadeType;\n}\n\nfunction savedStringProp(value: unknown): string {\n const unwrapped = value && typeof value === \"object\" && \"value\" in value\n ? (value as { value: unknown }).value\n : value;\n return typeof unwrapped === \"string\" ? unwrapped : \"\";\n}\n\nfunction savedIntegerProp(value: unknown): number {\n const unwrapped = value && typeof value === \"object\" && \"value\" in value\n ? (value as { value: unknown }).value\n : value;\n return typeof unwrapped === \"number\" && Number.isInteger(unwrapped)\n ? unwrapped\n : 0;\n}\n\nfunction integerProp(value: unknown): number {\n return typeof value === \"number\" && Number.isInteger(value) ? value : 0;\n}\n\nfunction graphBoundaries(\n nodes: readonly RuntimeNode[],\n moduleId: \"cascade.core.Input\" | \"cascade.core.Output\",\n nameProp: \"inputName\" | \"outputName\",\n): ReadonlyMap<string, RuntimeNode> {\n const boundaries = new Map<string, RuntimeNode>();\n for (const node of nodes) {\n if (node.parent || node.moduleId !== moduleId) continue;\n const name = savedStringProp(node.props[nameProp]).trim() || node.id;\n if (boundaries.has(name))\n misuse(\"runtime/duplicate-graph-boundary\", `Duplicate graph boundary name ${name}`);\n boundaries.set(name, node);\n }\n return boundaries;\n}\n\nfunction boundaryInspection(\n boundaries: ReadonlyMap<string, RuntimeNode>,\n portName: string,\n): Readonly<Record<string, Readonly<{ nodeId: string; type: string }>>> {\n return Object.freeze(Object.fromEntries(\n [...boundaries].map(([name, node]) => [\n name,\n Object.freeze({\n nodeId: node.id,\n type: node.definition.outputs?.[portName]?.kind === \"data\"\n ? node.definition.outputs[portName].type\n : \"any\",\n }),\n ]),\n ));\n}\n\nfunction isStructuralProp(node: RuntimeNode, name: string): boolean {\n if (node.moduleId === \"cascade.core.Input\")\n return name === \"inputIndex\" || name === \"inputName\" || name === \"dataType\";\n if (node.moduleId === \"cascade.core.Output\")\n return name === \"outputIndex\" || name === \"outputName\" || name === \"dataType\";\n return false;\n}\n\nfunction materializeConnection(\n connection: CascadeDocumentConnection,\n index: number,\n nodes: ReadonlyMap<string, RuntimeNode>,\n): RuntimeConnection {\n const endpoints: {\n source: { nodeId: string; outputName: string };\n target: { nodeId: string; inputName: string };\n } = Array.isArray(connection)\n ? {\n source: {\n nodeId: connection[0][0],\n outputName:\n connection[0][2] ??\n outputName(nodes.get(connection[0][0]), connection[0][1]),\n },\n target: {\n nodeId: connection[1][0],\n inputName:\n connection[1][2] ??\n inputName(nodes.get(connection[1][0]), connection[1][1]),\n },\n }\n : {\n source: {\n nodeId: (connection as Exclude<CascadeDocumentConnection, readonly unknown[]>).source.nodeId,\n outputName: (connection as Exclude<CascadeDocumentConnection, readonly unknown[]>).source.outputName,\n },\n target: {\n nodeId: (connection as Exclude<CascadeDocumentConnection, readonly unknown[]>).target.nodeId,\n inputName: (connection as Exclude<CascadeDocumentConnection, readonly unknown[]>).target.inputName,\n },\n };\n const source = nodes.get(endpoints.source.nodeId);\n const target = nodes.get(endpoints.target.nodeId);\n if (!source || !target)\n misuse(\n \"runtime/invalid-connection\",\n `Connection ${index} references an unknown node`,\n );\n const output = source.definition.outputs?.[endpoints.source.outputName];\n let input = target.definition.inputs?.[endpoints.target.inputName];\n let variadicIndex: number | undefined;\n if (!input && /^input_\\d+$/.test(endpoints.target.inputName)) {\n const variadic = variadicInputName(target);\n if (variadic !== undefined) {\n variadicIndex = Number(endpoints.target.inputName.slice(\"input_\".length));\n endpoints.target.inputName = variadic;\n input = target.definition.inputs?.[variadic];\n }\n }\n if (!output || !input)\n misuse(\n \"runtime/invalid-connection\",\n `Connection ${index} references an unknown port`,\n );\n if (output.kind !== input.kind)\n misuse(\n \"runtime/connection-kind\",\n `Connection ${index} mixes ${output.kind} and ${input.kind}`,\n );\n if (\n output.kind === \"data\" &&\n input.kind === \"data\" &&\n !canConnectTypes(output.type, input.type)\n )\n misuse(\n \"runtime/connection-type\",\n `Connection ${index} has incompatible types ${output.type} and ${input.type}`,\n );\n return Object.freeze({\n source: Object.freeze(endpoints.source),\n target: Object.freeze(endpoints.target),\n kind: output.kind,\n order: index,\n ...(variadicIndex === undefined ? {} : { variadicIndex }),\n });\n}\n\nfunction validateCardinality(\n nodes: ReadonlyMap<string, RuntimeNode>,\n connections: readonly RuntimeConnection[],\n): void {\n const counts = new Map<string, number>();\n for (const connection of connections) {\n if (connection.kind !== \"data\") continue;\n const key = `${connection.target.nodeId}\\0${connection.target.inputName}`;\n const count = (counts.get(key) ?? 0) + 1;\n counts.set(key, count);\n const input = nodes.get(connection.target.nodeId)?.definition.inputs?.[\n connection.target.inputName\n ];\n if (count > 1 && input?.kind === \"data\" && !input.variadic)\n misuse(\n \"runtime/input-cardinality\",\n `${connection.target.nodeId}.${connection.target.inputName} accepts one connection`,\n );\n }\n}\n\nfunction validateHierarchy(\n nodes: readonly RuntimeNode[],\n byId: ReadonlyMap<string, RuntimeNode>,\n): void {\n for (const node of nodes) {\n if (!node.parent) continue;\n const parent = byId.get(node.parent);\n if (!parent)\n misuse(\n \"runtime/parent-not-found\",\n `Node ${node.id} references missing parent ${node.parent}`,\n );\n if (parent.definition.container !== \"subnet\")\n misuse(\n \"runtime/parent-not-container\",\n `Node ${node.id} parent ${node.parent} is not a subnet container`,\n );\n }\n for (const node of nodes) {\n const visited = new Set<string>([node.id]);\n let parentId = node.parent;\n while (parentId) {\n if (visited.has(parentId))\n misuse(\n \"runtime/parent-cycle\",\n `Node hierarchy contains a cycle through ${parentId}`,\n );\n visited.add(parentId);\n parentId = byId.get(parentId)?.parent;\n }\n }\n}\n\nfunction snapshotRegistration(\n registration: NodeRegistration,\n): NodeRegistration {\n if (registration.kind === \"legacy-dynamic\")\n return Object.freeze({ ...registration });\n const definition = snapshot(registration.definition) as NodeDefinition;\n return Object.freeze({ ...registration, definition });\n}\n\nfunction isGated(node: RuntimeNode): boolean {\n return Object.values(node.definition.inputs ?? {}).some(\n (input) => input.kind === \"trigger\",\n );\n}\n\nfunction outputName(node: RuntimeNode | undefined, index: number): string {\n const name = Object.keys(node?.definition.outputs ?? {})[index];\n if (!name)\n misuse(\"runtime/invalid-connection\", `Unknown output index ${index}`);\n return name;\n}\n/**\n * The declared name of a node's variadic input, if it has exactly one.\n *\n * `input_0`, `input_1`, ... is the wire spelling for the Nth connection into a\n * variadic input: it is what Studio's port list produces and what saved graphs\n * carry, and it is not the port's declared name. Translating it used to be\n * conditional on the target being `cascade.core.Switch` or `cascade.core.Merge`,\n * which made variadic wiring a property of two module ids rather than of a\n * definition, so `cascade.geo.Merge` and any project node declaring\n * `variadic: true` could not be wired at all. Marcus called that a bug and asked\n * for the general fix, 2026-09-04.\n *\n * Derived from the definition, so a node whose input is declared variadic\n * accepts `input_N` whoever wrote it. Two variadic inputs on one definition make\n * `input_N` genuinely ambiguous, so nothing is guessed and the connection is\n * refused as an unknown port; no definition declares two today, and the honest\n * failure is better than picking the first one.\n */\nfunction variadicInputName(node: RuntimeNode): string | undefined {\n const names = Object.entries(node.definition.inputs ?? {})\n .filter(([, input]) => input.kind === \"data\" && input.variadic === true)\n .map(([name]) => name);\n return names.length === 1 ? names[0] : undefined;\n}\nfunction inputName(node: RuntimeNode | undefined, index: number): string {\n const name = Object.keys(node?.definition.inputs ?? {})[index];\n if (!name)\n misuse(\"runtime/invalid-connection\", `Unknown input index ${index}`);\n return name;\n}\nfunction validateTopology(\n nodes: readonly RuntimeNode[],\n connections: readonly RuntimeConnection[],\n): void {\n topological(nodes, connections);\n}\nfunction topological(\n nodes: readonly RuntimeNode[],\n connections: readonly RuntimeConnection[],\n): RuntimeNode[] {\n const indegree = new Map(nodes.map((node) => [node.id, 0]));\n const outgoing = new Map(nodes.map((node) => [node.id, [] as string[]]));\n for (const dependency of graphDependencies(nodes, connections)) {\n outgoing.get(dependency.sourceId)!.push(dependency.targetId);\n indegree.set(\n dependency.targetId,\n indegree.get(dependency.targetId)! + 1,\n );\n }\n const queue = nodes.filter((node) => indegree.get(node.id) === 0);\n const result: RuntimeNode[] = [];\n while (queue.length) {\n const node = queue.shift()!;\n result.push(node);\n for (const id of outgoing.get(node.id)!) {\n indegree.set(id, indegree.get(id)! - 1);\n if (indegree.get(id) === 0)\n queue.push(nodes.find((candidate) => candidate.id === id)!);\n }\n }\n if (result.length !== nodes.length)\n misuse(\"runtime/cycle\", \"Graph contains a data or trigger cycle\");\n return result;\n}\n\ninterface NodeDependency {\n readonly sourceId: string;\n readonly targetId: string;\n}\n\nfunction graphDependencies(\n nodes: readonly RuntimeNode[],\n connections: readonly RuntimeConnection[],\n): readonly NodeDependency[] {\n const dependencies = new Map<string, NodeDependency>();\n for (const connection of connections) {\n const dependency = {\n sourceId: connection.source.nodeId,\n targetId: connection.target.nodeId,\n };\n dependencies.set(`${dependency.sourceId}\\0${dependency.targetId}`, dependency);\n }\n for (const dependency of dataDependencies(nodes, connections))\n dependencies.set(`${dependency.sourceId}\\0${dependency.targetId}`, dependency);\n return [...dependencies.values()];\n}\n\nfunction dataDependencies(\n nodes: readonly RuntimeNode[],\n connections: readonly RuntimeConnection[],\n): readonly NodeDependency[] {\n const dependencies = new Map<string, NodeDependency>();\n for (const connection of connections) {\n if (connection.kind !== \"data\") continue;\n const dependency = {\n sourceId: connection.source.nodeId,\n targetId: connection.target.nodeId,\n };\n dependencies.set(`${dependency.sourceId}\\0${dependency.targetId}`, dependency);\n }\n for (const node of nodes) {\n if (!node.parent) continue;\n if (node.moduleId === \"cascade.core.Input\") {\n const inputName = `input_${integerProp(node.props.inputIndex)}`;\n const source = connections.find(\n (connection) =>\n connection.kind === \"data\" &&\n connection.target.nodeId === node.parent &&\n connection.target.inputName === inputName,\n );\n if (source) {\n const dependency = {\n sourceId: source.source.nodeId,\n targetId: node.id,\n };\n dependencies.set(`${dependency.sourceId}\\0${dependency.targetId}`, dependency);\n }\n } else if (node.moduleId === \"cascade.core.Output\") {\n const dependency = { sourceId: node.id, targetId: node.parent };\n dependencies.set(`${dependency.sourceId}\\0${dependency.targetId}`, dependency);\n }\n }\n return [...dependencies.values()];\n}\nfunction runtimeError(code: string, message: string): CascadeRuntimeError {\n return new CascadeRuntimeError(code, [{ phase: \"runtime\", code, message }]);\n}\nfunction misuse(code: string, message: string): never {\n throw runtimeError(code, message);\n}\nfunction snapshot<T>(value: T): T {\n return cloneValue(value, new WeakSet()) as T;\n}\n\nfunction immutableMap<K, V>(entries: Iterable<readonly [K, V]>): ReadonlyMap<K, V> {\n const source = new Map(entries);\n let view: ReadonlyMap<K, V>;\n view = Object.freeze({\n get size() { return source.size; },\n has(key: K) { return source.has(key); },\n get(key: K) { return source.get(key); },\n entries() { return source.entries(); },\n keys() { return source.keys(); },\n values() { return source.values(); },\n [Symbol.iterator]() { return source[Symbol.iterator](); },\n forEach(callback: (value: V, key: K, map: ReadonlyMap<K, V>) => void, thisArg?: unknown) {\n source.forEach((value, key) => callback.call(thisArg, value, key, view));\n },\n });\n return view;\n}\nfunction cloneValue(value: unknown, ancestors: WeakSet<object>): unknown {\n if (typeof value === \"number\" && !Number.isFinite(value))\n misuse(\"runtime/non-serializable-value\", \"Runtime numbers must be finite\");\n if (\n typeof value === \"function\" ||\n typeof value === \"symbol\" ||\n typeof value === \"bigint\"\n )\n misuse(\n \"runtime/non-serializable-value\",\n `Runtime values cannot contain ${typeof value}`,\n );\n if (value === undefined || value === null || typeof value !== \"object\")\n return value;\n const prototype = Object.getPrototypeOf(value);\n if (\n !Array.isArray(value) &&\n prototype !== Object.prototype &&\n prototype !== null\n )\n return value;\n if (ancestors.has(value))\n misuse(\n \"runtime/non-serializable-value\",\n \"Runtime values cannot contain cycles\",\n );\n ancestors.add(value);\n const clone = Array.isArray(value)\n ? value.map((item) => cloneValue(item, ancestors))\n : Object.fromEntries(\n Object.entries(value).map(([key, item]) => [\n key,\n cloneValue(item, ancestors),\n ]),\n );\n ancestors.delete(value);\n return Object.freeze(clone);\n}\n\nconst TUPLE_LENGTHS: Readonly<Record<string, number>> = {\n vec2: 2,\n vec3: 3,\n vec4: 4,\n vec2i: 2,\n vec3i: 3,\n vec4i: 4,\n mat2: 4,\n mat3: 9,\n mat4: 16,\n color: 4,\n};\n\nfunction runtimeValue(\n value: unknown,\n type: string,\n allowUndefined: boolean,\n path: string,\n): unknown {\n if (value === undefined) {\n if (allowUndefined) return undefined;\n misuse(\"runtime/value-type\", `${path} requires a ${type} value`);\n }\n const tupleLength = TUPLE_LENGTHS[type];\n const valid =\n (type === \"float\" && typeof value === \"number\" && Number.isFinite(value)) ||\n (type === \"int\" && typeof value === \"number\" && Number.isInteger(value)) ||\n (type === \"bool\" && typeof value === \"boolean\") ||\n (type === \"string\" && typeof value === \"string\") ||\n (tupleLength !== undefined &&\n Array.isArray(value) &&\n value.length === tupleLength &&\n value.every((item) =>\n type.endsWith(\"i\")\n ? typeof item === \"number\" && Number.isInteger(item)\n : typeof item === \"number\" && Number.isFinite(item),\n )) ||\n (!tupleLength &&\n type !== \"float\" &&\n type !== \"int\" &&\n type !== \"bool\" &&\n type !== \"string\");\n if (!valid) misuse(\"runtime/value-type\", `${path} is not a valid ${type}`);\n return snapshot(value);\n}\n", "import type { RuntimeHost } from \"./types.js\";\nimport type { NodeRuntimeHostOptions } from \"./types.js\";\n\nexport function createNodeRuntimeHost(\n options: NodeRuntimeHostOptions,\n): RuntimeHost {\n const {\n modules,\n legacyShell,\n now = () => Date.now(),\n report = () => {},\n ...capabilities\n } = options;\n return {\n environment: \"server\",\n modules,\n legacyShell,\n capabilities,\n now,\n report,\n };\n}\n", "import type * as TypeScript from \"typescript\";\nimport {\n validateNodeDefinition,\n type Diagnostic,\n type NodeDefinition,\n} from \"@cascade/contracts\";\n\nexport type DefinitionExtractionResult =\n | {\n readonly ok: true;\n readonly definition: NodeDefinition;\n readonly diagnostics: readonly [];\n }\n | { readonly ok: false; readonly diagnostics: readonly Diagnostic[] };\n\nconst MAX_DEPTH = 32;\nconst MAX_NODES = 10_000;\n\nexport function extractNodeDefinition(\n source: string,\n fileName: string,\n ts: typeof TypeScript,\n): DefinitionExtractionResult {\n const file = ts.createSourceFile(\n fileName,\n source,\n ts.ScriptTarget.Latest,\n true,\n ts.ScriptKind.TS,\n );\n const syntaxDiagnostics = (\n file as TypeScript.SourceFile & {\n readonly parseDiagnostics?: readonly TypeScript.Diagnostic[];\n }\n ).parseDiagnostics;\n if (syntaxDiagnostics?.length) {\n const syntax = syntaxDiagnostics[0];\n const start = syntax.start ?? 0;\n const point = file.getLineAndCharacterOfPosition(start);\n return {\n ok: false,\n diagnostics: [\n {\n phase: \"definition\",\n code: \"definition/syntax\",\n message: ts.flattenDiagnosticMessageText(syntax.messageText, \"\\n\"),\n file: fileName,\n line: point.line + 1,\n column: point.character + 1,\n },\n ],\n };\n }\n const declarations: TypeScript.VariableDeclaration[] = [];\n for (const statement of file.statements) {\n if (\n !ts.isVariableStatement(statement) ||\n !statement.modifiers?.some(\n (modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword,\n )\n )\n continue;\n if (!(statement.declarationList.flags & ts.NodeFlags.Const)) continue;\n for (const declaration of statement.declarationList.declarations) {\n if (\n ts.isIdentifier(declaration.name) &&\n declaration.name.text === \"definition\"\n )\n declarations.push(declaration);\n }\n }\n if (declarations.length !== 1)\n return failure(\n declarations[1] ?? declarations[0] ?? file,\n declarations.length\n ? \"definition/duplicate-export\"\n : \"definition/missing-export\",\n declarations.length\n ? \"Exactly one definition export is allowed\"\n : \"Missing exported const definition\",\n );\n const declaration = declarations[0];\n const initializer = declaration.initializer;\n if (!initializer)\n return failure(\n declaration,\n \"definition/non-literal\",\n \"definition requires a literal initializer\",\n );\n let visited = 0;\n try {\n const definition = read(initializer, \"$\", 0);\n const diagnostics = validateNodeDefinition(definition).map((item) => ({\n ...item,\n file: fileName,\n ...location(initializer),\n }));\n return diagnostics.length\n ? { ok: false, diagnostics }\n : { ok: true, definition: definition as NodeDefinition, diagnostics: [] };\n } catch (error) {\n return {\n ok: false,\n diagnostics: [(error as ExtractionFailure).diagnostic],\n };\n }\n\n function read(\n node: TypeScript.Expression,\n path: string,\n depth: number,\n ): unknown {\n if (++visited > MAX_NODES)\n throw extraction(\n node,\n \"definition/size-limit\",\n \"Definition exceeds 10,000 syntax nodes\",\n path,\n );\n if (depth > MAX_DEPTH)\n throw extraction(\n node,\n \"definition/depth-limit\",\n \"Definition exceeds 32 levels\",\n path,\n );\n if (ts.isParenthesizedExpression(node) || ts.isSatisfiesExpression(node))\n return read(node.expression, path, depth + 1);\n if (ts.isAsExpression(node)) {\n if (node.type.getText(file) !== \"const\")\n throw extraction(\n node.type,\n \"definition/non-literal\",\n \"Only 'as const' assertions are allowed\",\n path,\n );\n return read(node.expression, path, depth + 1);\n }\n if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node))\n return node.text;\n if (ts.isNumericLiteral(node)) return Number(node.text);\n if (node.kind === ts.SyntaxKind.TrueKeyword) return true;\n if (node.kind === ts.SyntaxKind.FalseKeyword) return false;\n if (node.kind === ts.SyntaxKind.NullKeyword) return null;\n if (\n ts.isPrefixUnaryExpression(node) &&\n node.operator === ts.SyntaxKind.MinusToken &&\n ts.isNumericLiteral(node.operand)\n )\n return -Number(node.operand.text);\n if (ts.isArrayLiteralExpression(node))\n return node.elements.map((element, index) => {\n if (ts.isSpreadElement(element))\n throw extraction(\n element,\n \"definition/spread\",\n \"Spreads are not allowed\",\n `${path}.${index}`,\n );\n return read(element, `${path}.${index}`, depth + 1);\n });\n if (ts.isObjectLiteralExpression(node)) {\n const object = Object.create(null) as Record<string, unknown>;\n const keys = new Set<string>();\n for (const property of node.properties) {\n if (ts.isSpreadAssignment(property))\n throw extraction(\n property,\n \"definition/spread\",\n \"Spreads are not allowed\",\n path,\n );\n if (\n !ts.isPropertyAssignment(property) ||\n (property.name && ts.isComputedPropertyName(property.name))\n )\n throw extraction(\n property,\n \"definition/non-literal\",\n \"Only explicit properties are allowed\",\n path,\n );\n const key =\n ts.isIdentifier(property.name) ||\n ts.isStringLiteral(property.name) ||\n ts.isNumericLiteral(property.name)\n ? property.name.text\n : undefined;\n if (key === undefined)\n throw extraction(\n property,\n \"definition/non-literal\",\n \"Property name must be literal\",\n path,\n );\n if (keys.has(key))\n throw extraction(\n property.name,\n \"definition/duplicate-key\",\n `Duplicate key ${key}`,\n `${path}.${key}`,\n );\n keys.add(key);\n object[key] = read(property.initializer, `${path}.${key}`, depth + 1);\n }\n return object;\n }\n throw extraction(\n node,\n \"definition/non-literal\",\n `Unsupported ${ts.SyntaxKind[node.kind]}`,\n path,\n );\n }\n function location(node: TypeScript.Node) {\n const point = file.getLineAndCharacterOfPosition(node.getStart(file));\n return { line: point.line + 1, column: point.character + 1 };\n }\n function extraction(\n node: TypeScript.Node,\n code: string,\n message: string,\n path?: string,\n ) {\n return new ExtractionFailure({\n phase: \"definition\",\n code,\n message,\n path,\n file: fileName,\n ...location(node),\n });\n }\n function failure(\n node: TypeScript.Node,\n code: string,\n message: string,\n ): DefinitionExtractionResult {\n return {\n ok: false,\n diagnostics: [extraction(node, code, message).diagnostic],\n };\n }\n}\n\nclass ExtractionFailure extends Error {\n constructor(readonly diagnostic: Diagnostic) {\n super(diagnostic.message);\n }\n}\n", "import type * as TypeScript from \"typescript\";\nimport type { Diagnostic } from \"@cascade/contracts\";\n\nconst AMBIENT_STATE = new Set([\n \"globalThis\",\n \"window\",\n \"document\",\n \"localStorage\",\n \"sessionStorage\",\n \"indexedDB\",\n \"process\",\n \"Bun\",\n \"Deno\",\n]);\n\n/**\n * Enforces the statically inspectable node-module boundary. This is an\n * architecture check for trusted project code, not a security sandbox.\n */\nexport function validateNodeModuleArchitecture(\n source: string,\n fileName: string,\n ts: typeof TypeScript,\n): readonly Diagnostic[] {\n const file = ts.createSourceFile(\n fileName,\n source,\n ts.ScriptTarget.Latest,\n true,\n ts.ScriptKind.TS,\n );\n const diagnostics: Diagnostic[] = [];\n\n for (const statement of file.statements) {\n if (ts.isVariableStatement(statement) && !isDefinition(statement)) {\n add(\n statement,\n \"module-state\",\n \"Node modules may not declare module-level values; use a pure function or pass state through ports, props, and declared capabilities\",\n );\n } else if (\n ts.isClassDeclaration(statement) ||\n ts.isEnumDeclaration(statement) ||\n ts.isModuleDeclaration(statement)\n ) {\n add(\n statement,\n \"module-state\",\n \"Node modules may not declare classes, enums, or namespaces because they can retain module-global state\",\n );\n } else if (ts.isExpressionStatement(statement)) {\n add(\n statement,\n \"top-level-effect\",\n \"Node modules may not run top-level effects\",\n );\n } else if (\n ts.isImportDeclaration(statement) &&\n !statement.importClause\n ) {\n add(\n statement,\n \"side-effect-import\",\n \"Side-effect imports are not allowed in node modules\",\n );\n } else if (\n ts.isImportDeclaration(statement) &&\n !statement.importClause?.isTypeOnly &&\n ts.isStringLiteral(statement.moduleSpecifier) &&\n importsSiblingNode(fileName, statement.moduleSpecifier.text)\n ) {\n add(\n statement.moduleSpecifier,\n \"node-import\",\n \"A node may not import another node implementation; connect the nodes with a graph wire\",\n );\n }\n }\n\n visit(file);\n return diagnostics;\n\n function visit(node: TypeScript.Node): void {\n if (ts.isTypeNode(node) || ts.isImportDeclaration(node)) return;\n if (\n ts.isIdentifier(node) &&\n AMBIENT_STATE.has(node.text) &&\n isReference(node)\n ) {\n add(\n node,\n \"ambient-state\",\n `${node.text} is ambient state; receive data through ports, props, or a declared capability`,\n );\n }\n if (\n ts.isCallExpression(node) &&\n node.expression.kind === ts.SyntaxKind.ImportKeyword\n ) {\n add(\n node,\n \"dynamic-import\",\n \"Dynamic imports are not allowed in deterministic node execution\",\n );\n }\n ts.forEachChild(node, visit);\n }\n\n function isReference(node: TypeScript.Identifier): boolean {\n const parent = node.parent;\n return !(\n (ts.isPropertyAccessExpression(parent) && parent.name === node) ||\n (ts.isPropertyAssignment(parent) && parent.name === node) ||\n (ts.isMethodDeclaration(parent) && parent.name === node) ||\n (ts.isPropertyDeclaration(parent) && parent.name === node)\n );\n }\n\n function isDefinition(statement: TypeScript.VariableStatement): boolean {\n return Boolean(statement.declarationList.flags & ts.NodeFlags.Const) &&\n Boolean(statement.modifiers?.some((item) => item.kind === ts.SyntaxKind.ExportKeyword)) &&\n statement.declarationList.declarations.length === 1 &&\n ts.isIdentifier(statement.declarationList.declarations[0].name) &&\n statement.declarationList.declarations[0].name.text === \"definition\";\n }\n\n function add(node: TypeScript.Node, code: string, message: string): void {\n const point = file.getLineAndCharacterOfPosition(node.getStart(file));\n diagnostics.push({\n phase: \"architecture\",\n code: `architecture/${code}`,\n message,\n file: fileName,\n line: point.line + 1,\n column: point.character + 1,\n });\n }\n}\n\nfunction importsSiblingNode(fileName: string, specifier: string): boolean {\n if (!specifier.startsWith(\".\")) return false;\n const file = normalize(fileName).split(\"/\");\n const nodesIndex = file.lastIndexOf(\"nodes\");\n if (nodesIndex < 0 || !file[nodesIndex + 1]) return false;\n const sourceNode = file[nodesIndex + 1];\n const resolved = normalize([...file.slice(0, -1), ...specifier.split(\"/\")].join(\"/\")).split(\"/\");\n const resolvedNodesIndex = resolved.lastIndexOf(\"nodes\");\n return resolvedNodesIndex >= 0 &&\n Boolean(resolved[resolvedNodesIndex + 1]) &&\n resolved[resolvedNodesIndex + 1] !== sourceNode;\n}\n\nfunction normalize(value: string): string {\n const output: string[] = [];\n // split/join rather than replaceAll: the root tsconfig targets ES2020, so\n // svelte-check rejects the ES2021 method even though this package targets ES2022.\n for (const part of value.split(\"\\\\\").join(\"/\").split(\"/\")) {\n if (!part || part === \".\") continue;\n if (part === \"..\") output.pop();\n else output.push(part);\n }\n return output.join(\"/\");\n}\n", "/**\n * `cascade/stage` \u2014 call a project's Python stage from either host.\n *\n * A project's heavy work lives in Python stages, and until now every project\n * hand-rolled its own bridge to them by posting to `/api/exec`. That works in\n * Studio and fails everywhere else: `cascade run` has no server to post to and\n * no origin to resolve a relative URL against, so any graph with a Python node\n * could not be rendered offline. Each project reimplementing the same fetch\n * also meant each project reimplementing the same response unwrapping, and\n * getting it subtly wrong.\n *\n * So the bridge belongs to Cascade, with one transport per host: the page posts\n * to the server, and a headless host installs `installStageBridge` before it\n * executes the graph. A node imports `runStage` and never learns which it got.\n *\n * The counterpart for files is `cascade/io`, which keeps the same rule: a port\n * carries a project-relative path, never pixels.\n */\n\nexport interface StageBridge {\n (stage: string, args: Record<string, unknown>): Promise<unknown>;\n}\n\nconst BRIDGE_KEY = '__cascadeStageBridge';\n\n/**\n * Install the local transport. Called by a host that can reach the filesystem \u2014\n * the CLI does this before running a graph. Returns a disposer so a host can\n * take it back down, which matters for tests more than for a one-shot run.\n */\nexport function installStageBridge(bridge: StageBridge | null): () => void {\n const globals = globalThis as Record<string, unknown>;\n const previous = globals[BRIDGE_KEY];\n globals[BRIDGE_KEY] = bridge ?? undefined;\n return () => {\n globals[BRIDGE_KEY] = previous;\n };\n}\n\nfunction localBridge(): StageBridge | null {\n const bridge = (globalThis as Record<string, unknown>)[BRIDGE_KEY];\n return typeof bridge === 'function' ? (bridge as StageBridge) : null;\n}\n\nlet capabilityPromise: Promise<string | null> | undefined;\n\nasync function discoverCapability(): Promise<string | null> {\n capabilityPromise ??= fetch('/api/exec/capability', { cache: 'no-store' })\n .then(async (response) => {\n if (response.status === 404) {\n capabilityPromise = undefined;\n return null;\n }\n if (!response.ok) throw new Error(`Cascade exec capability is unavailable (${response.status})`);\n const token = (await response.json() as { capability?: unknown }).capability;\n if (typeof token !== 'string' || !token) {\n throw new Error('Cascade exec capability response did not contain a capability');\n }\n return token;\n })\n .catch((error) => {\n capabilityPromise = undefined;\n throw error;\n });\n return capabilityPromise;\n}\n\nasync function capability(): Promise<string> {\n const token = await discoverCapability();\n if (token === null) throw new Error('Cascade exec capability is unavailable (404)');\n return token;\n}\n\nasync function overHttp<T>(stage: string, args: Record<string, unknown>): Promise<T> {\n const postStage = async () => fetch('/api/exec', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-Cascade-Exec-Capability': await capability() },\n body: JSON.stringify({ stage, args }),\n });\n\n let response = await postStage();\n if (response.status === 403) {\n capabilityPromise = undefined;\n response = await postStage();\n }\n\n const body = await response.json() as { ok?: boolean; stdout?: string; stderr?: string; error?: string };\n if (!response.ok || !body.ok) {\n throw new Error(`stage \"${stage}\" failed: ${body.stderr || body.error || 'unknown error'}`);\n }\n if (typeof body.stdout !== 'string') {\n throw new Error(`stage \"${stage}\" returned an invalid response`);\n }\n // The dispatcher's result is the last line it printed, so a stage that logs\n // on its way through does not corrupt its own return value.\n const lastLine = body.stdout.trim().split('\\n').pop() || '{}';\n return JSON.parse(lastLine) as T;\n}\n\n/** Whether this host has a local stage bridge or a browser-accessible stage\n * endpoint. A missing browser route is a supported \"not available\" result;\n * authorization and transport failures remain errors. */\nexport async function stageAvailable(): Promise<boolean> {\n if (localBridge()) return true;\n if (typeof document === 'undefined') return false;\n return (await discoverCapability()) !== null;\n}\n\n/**\n * Run a stage and return its parsed result.\n *\n * A headless host without a bridge installed gets a message that says so,\n * rather than a URL parse error from a fetch that was never going to work \u2014\n * which is what this whole file exists to stop happening.\n */\nexport async function runStage<T = unknown>(stage: string, args: Record<string, unknown> = {}): Promise<T> {\n const bridge = localBridge();\n if (bridge) return await bridge(stage, args) as T;\n if (typeof document === 'undefined') {\n throw new Error(\n `Cannot run stage \"${stage}\": no host bridge is installed and there is no page to post from. ` +\n 'A headless host must call installStageBridge() from cascade/stage before executing the graph.',\n );\n }\n return overHttp<T>(stage, args);\n}\n\n/** A scratch path for a node's output, scoped by node id so re-running a graph\n * does not clobber a sibling's file. */\nexport function cachePath(nodeId: string, suffix: string): string {\n return `.cascade-cache/${nodeId.replace(/[^a-zA-Z0-9_-]/g, '_')}${suffix}`;\n}\n", "#!/usr/bin/env node\n\nimport { runGraph } from './runner.js';\nimport * as path from 'path';\nimport * as fs from 'fs/promises';\nimport { readFileSync } from 'node:fs';\n\nconst VERSION = JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf8')).version as string;\n\nasync function main() {\n const args = process.argv.slice(2);\n\n // Project/Studio commands share the root executable. The server entry is\n // bundled into the published CLI, so installed projects never depend on the\n // private server package or workspace links.\n if (!['run', 'validate', 'check', 'inspect'].includes(args[0] ?? '') && !args.includes('--version') && !args.includes('--help') && !args.includes('-h')) {\n const { runStudioCli } = await import('../../server/src/cliCommands.js');\n await runStudioCli(args);\n return;\n }\n\n // Handle version flag\n if (args.includes('--version')) {\n console.log(`Cascade CLI v${VERSION}`);\n process.exit(0);\n }\n\n // Handle help flag\n if (args.includes('--help') || args.includes('-h')) {\n console.log(`\nCascade Graph Execution CLI\n\nUsage:\n cascade [project-directory | graph-file] [Studio options]\n cascade new <name>\n cascade node <Name> [project-directory]\n cascade projects [directory]\n cascade run <graph-file> [options]\n cascade validate <graph-file> [options]\n cascade check <graph-file> [options]\n cascade inspect <graph-file>\n\nCommands:\n new Create a Cascade project\n node Create a deterministic custom node\n projects Show or set the default projects directory\n run Execute a graph file\n validate Validate a graph file without executing\n check Statically check node definitions, types, and graph structure\n inspect Print a machine-readable graph and node-definition summary\n\nOptions:\n --host <address> Bind Studio to an address or hostname\n --port <number> Bind Studio HTTP to an explicit port\n --trusted-host <name> Allow an exact remote browser hostname (repeatable)\n --no-open Do not open Studio in a browser\n --entry-node <id> Execute from a specific entry node\n --validate-only Validate only (same as 'validate' command)\n --verbose, -v Show verbose output\n --version Show version\n --help, -h Show this help message\n\nExamples:\n cascade .\n cascade . --host KURO --port 3030\n cascade new my-artwork\n cascade node Multiply ./my-artwork\n cascade run graph.cascade\n cascade run graph.cascade --entry-node node_123\n cascade validate graph.cascade\n cascade run graph.cascade --verbose\n`);\n process.exit(0);\n }\n\n // Parse command\n const command = args[0];\n const fileArg = args[1];\n\n if (!command || !['run', 'validate', 'check', 'inspect'].includes(command)) {\n console.error('Error: Invalid command');\n console.error('Run \"cascade --help\" for usage information');\n process.exit(1);\n }\n\n if (!fileArg) {\n console.error('Error: Graph file path required');\n console.error('Run \"cascade --help\" for usage information');\n process.exit(1);\n }\n\n // Check if file exists\n try {\n await fs.access(fileArg);\n } catch {\n console.error(`Error: File not found: ${fileArg}`);\n process.exit(1);\n }\n\n // Parse options\n const options: {\n file: string;\n entryNode?: string;\n validateOnly?: boolean;\n checkOnly?: boolean;\n inspectOnly?: boolean;\n verbose?: boolean;\n } = {\n file: fileArg,\n validateOnly: command === 'validate',\n checkOnly: command === 'check',\n inspectOnly: command === 'inspect'\n };\n\n // Parse flags\n const verboseIndex = args.indexOf('--verbose') !== -1 ? args.indexOf('--verbose') : args.indexOf('-v');\n if (verboseIndex !== -1) {\n options.verbose = true;\n }\n\n const entryNodeIndex = args.indexOf('--entry-node');\n if (entryNodeIndex !== -1 && args[entryNodeIndex + 1]) {\n options.entryNode = args[entryNodeIndex + 1];\n }\n\n // Run graph\n try {\n await runGraph(options);\n } catch (error: any) {\n console.error(`Error: ${error.message}`);\n if (options.verbose && error.stack) {\n console.error(error.stack);\n }\n process.exit(1);\n }\n}\n\nmain().catch(error => {\n console.error('Unexpected error:', error);\n process.exit(1);\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["message", "fs", "path", "json", "fields", "fs", "path", "message", "fs", "os", "path", "stringRecord", "resolve", "sum", "fs", "path", "fs", "path", "build", "execFile", "fs", "path", "resolve", "MAX_BUFFER", "fs", "os", "path", "loadConfig", "indent", "trimmed", "execFile", "fssync", "path", "message", "Router", "path", "fs", "handleError", "fs", "path", "Router", "handleError", "Router", "handleError", "spawn", "resolve", "execFile", "Router", "message", "resolve", "MAX_BUFFER", "Router", "json", "Router", "json", "Router", "json", "parseRequest", "message", "Router", "fs", "path", "format", "fs", "express", "path", "fs", "fileURLToPath", "fs", "path", "fs", "path", "execFile", "loadConfig", "project", "port", "path", "paramName", "prop", "sum", "json", "path", "resolve", "exists", "path", "message", "path", "mask", "point", "positionSize", "mask", "message", "path", "isRecord", "fields", "CORE_TYPES", "resolve", "path", "resolve", "json", "port", "exists", "path", "fs", "path", "fs", "path", "message", "message", "path", "mask", "mask", "flat", "mask", "path", "commands", "clamp", "mergeDefinition", "mergeRegistration", "mergeDefinition", "mergeRegistration", "registrationsById", "registrationsById", "moduleId", "document", "moduleId", "snapshot", "Graph", "inputName", "outputName", "diagnostic", "connection", "progress", "message", "path", "ts", "declaration", "path", "message", "diagnostic", "ts", "message", "document", "path", "fs", "candidate", "within", "moduleId", "diagnostic", "fs", "fs", "runStudioCli"]
7
+ }