create-harness-vibe-coding 0.8.19 → 0.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (656) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/README-CN.md +4 -2
  3. package/README.md +23 -4
  4. package/package.json +17 -2
  5. package/src/generator.js +19 -6
  6. package/src/index.js +531 -38
  7. package/src/prompts.js +4 -4
  8. package/src/ui/dist/assets/AgentsRoute-BGGs90wH.js +7 -0
  9. package/src/ui/dist/assets/Assistant-Bold-gm-uSS1B.woff2 +0 -0
  10. package/src/ui/dist/assets/Assistant-Medium-DrcxCXg3.woff2 +0 -0
  11. package/src/ui/dist/assets/Assistant-Regular-DVxZuzxb.woff2 +0 -0
  12. package/src/ui/dist/assets/Assistant-SemiBold-SCI4bEL9.woff2 +0 -0
  13. package/src/ui/dist/assets/Combination-DhBLEmof.js +42 -0
  14. package/src/ui/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  15. package/src/ui/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  16. package/src/ui/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  17. package/src/ui/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  18. package/src/ui/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  19. package/src/ui/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  20. package/src/ui/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  21. package/src/ui/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  22. package/src/ui/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  23. package/src/ui/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  24. package/src/ui/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  25. package/src/ui/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  26. package/src/ui/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  27. package/src/ui/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  28. package/src/ui/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  29. package/src/ui/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  30. package/src/ui/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  31. package/src/ui/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  32. package/src/ui/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  33. package/src/ui/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  34. package/src/ui/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  35. package/src/ui/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  36. package/src/ui/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  37. package/src/ui/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  38. package/src/ui/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  39. package/src/ui/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  40. package/src/ui/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  41. package/src/ui/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  42. package/src/ui/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  43. package/src/ui/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  44. package/src/ui/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  45. package/src/ui/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  46. package/src/ui/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  47. package/src/ui/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  48. package/src/ui/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  49. package/src/ui/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  50. package/src/ui/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  51. package/src/ui/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  52. package/src/ui/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  53. package/src/ui/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  54. package/src/ui/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  55. package/src/ui/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  56. package/src/ui/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  57. package/src/ui/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  58. package/src/ui/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  59. package/src/ui/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  60. package/src/ui/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  61. package/src/ui/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  62. package/src/ui/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  63. package/src/ui/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  64. package/src/ui/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  65. package/src/ui/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  66. package/src/ui/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  67. package/src/ui/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  68. package/src/ui/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  69. package/src/ui/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  70. package/src/ui/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  71. package/src/ui/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  72. package/src/ui/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  73. package/src/ui/dist/assets/RolesRoute-DnodCSz0.js +2 -0
  74. package/src/ui/dist/assets/RuntimePicker-CucD8TGn.js +7 -0
  75. package/src/ui/dist/assets/SettingsRoute-DquMWjac.js +2 -0
  76. package/src/ui/dist/assets/TaskList-Bxc0Uktx.js +7 -0
  77. package/src/ui/dist/assets/TerminalDrawer-CDusYltc.js +36 -0
  78. package/src/ui/dist/assets/WorkflowRoute-BN8yHmUs.css +1 -0
  79. package/src/ui/dist/assets/WorkflowRoute-D-0wVDpY.js +334 -0
  80. package/src/ui/dist/assets/abnfDiagram-VRR7QNED-zkRKkaxO.js +2 -0
  81. package/src/ui/dist/assets/apl-B4CMkyY2.js +2 -0
  82. package/src/ui/dist/assets/ar-SA-G6X2FPQ2-BiHaArx5.js +11 -0
  83. package/src/ui/dist/assets/arc-CBnLtOFO.js +2 -0
  84. package/src/ui/dist/assets/architectureDiagram-ZJ3FMSHR-DWXRXsh1.js +37 -0
  85. package/src/ui/dist/assets/asciiarmor-Df11BRmG.js +2 -0
  86. package/src/ui/dist/assets/asn1-EdZsLKOL.js +2 -0
  87. package/src/ui/dist/assets/asterisk-B-8jnY81.js +2 -0
  88. package/src/ui/dist/assets/az-AZ-76LH7QW2-CiT05voO.js +2 -0
  89. package/src/ui/dist/assets/bg-BG-XCXSNQG7-L-UM9tNf.js +6 -0
  90. package/src/ui/dist/assets/blockDiagram-677ZJIJ3-BIyh3Bry.js +133 -0
  91. package/src/ui/dist/assets/bn-BD-2XOGV67Q-NdgbA0bC.js +6 -0
  92. package/src/ui/dist/assets/brainfuck-C4LP7Hcl.js +2 -0
  93. package/src/ui/dist/assets/c4Diagram-LMCZKHZV-CA54vWWM.js +11 -0
  94. package/src/ui/dist/assets/ca-ES-6MX7JW3Y-BKZZsQ5J.js +9 -0
  95. package/src/ui/dist/assets/channel-Da_-zcAu.js +2 -0
  96. package/src/ui/dist/assets/chunk-2Q5K7J3B-DE4cxr1v.js +2 -0
  97. package/src/ui/dist/assets/chunk-32BRIVSS-i7FwbEU9.js +2 -0
  98. package/src/ui/dist/assets/chunk-5VM5RSS4-BhIcOYSu.js +16 -0
  99. package/src/ui/dist/assets/chunk-EX3LRPZG-Ci9zZRIs.js +232 -0
  100. package/src/ui/dist/assets/chunk-JWPE2WC7-BFdkcz-G.js +2 -0
  101. package/src/ui/dist/assets/chunk-MOJQB5TN-Dzmapl_S.js +89 -0
  102. package/src/ui/dist/assets/chunk-RYQCIY6F-RTmp7FOy.js +2 -0
  103. package/src/ui/dist/assets/chunk-V7JOEXUC-DInU3v3D.js +207 -0
  104. package/src/ui/dist/assets/chunk-VR4S4FIN-BHoyGBQO.js +2 -0
  105. package/src/ui/dist/assets/chunk-XXDRQBXY-DfeLZNZx.js +2 -0
  106. package/src/ui/dist/assets/classDiagram-OUVF2IWQ-FKbUS0bu.js +2 -0
  107. package/src/ui/dist/assets/classDiagram-v2-EOCWNBFH-FKbUS0bu.js +2 -0
  108. package/src/ui/dist/assets/clike-B9uivgTg.js +2 -0
  109. package/src/ui/dist/assets/clojure-BMjYHr_A.js +2 -0
  110. package/src/ui/dist/assets/cmake-BQqOBYOt.js +2 -0
  111. package/src/ui/dist/assets/cobol-CWcv1MsR.js +2 -0
  112. package/src/ui/dist/assets/coffeescript-S37ZYGWr.js +2 -0
  113. package/src/ui/dist/assets/commonlisp-DBKNyK5s.js +2 -0
  114. package/src/ui/dist/assets/cose-bilkent-JH36ORCC-_5PUJ615.js +2 -0
  115. package/src/ui/dist/assets/crystal-SjHAIU92.js +2 -0
  116. package/src/ui/dist/assets/cs-CZ-2BRQDIVT-DnkfnhDU.js +12 -0
  117. package/src/ui/dist/assets/css-BnMrqG3P.js +2 -0
  118. package/src/ui/dist/assets/cynefin-VYW2F7L2-CmkcFv-b.js +179 -0
  119. package/src/ui/dist/assets/cynefinDiagram-TSTJHNR4-D72VZn8H.js +63 -0
  120. package/src/ui/dist/assets/cypher-C_CwsFkJ.js +2 -0
  121. package/src/ui/dist/assets/cytoscape.esm-DTSO7Bv0.js +332 -0
  122. package/src/ui/dist/assets/d-pRatUO7H.js +2 -0
  123. package/src/ui/dist/assets/da-DK-5WZEPLOC-C54tQUgd.js +6 -0
  124. package/src/ui/dist/assets/dagre-VKFMJZFB-0BsAkrmo.js +5 -0
  125. package/src/ui/dist/assets/de-DE-XR44H4JA-DGfZlR10.js +9 -0
  126. package/src/ui/dist/assets/defaultLocale-DX6XiGOO.js +2 -0
  127. package/src/ui/dist/assets/diagram-FQU43EPY-C1ZJDOca.js +4 -0
  128. package/src/ui/dist/assets/diagram-G47NLZAW-D3pr3FSP.js +25 -0
  129. package/src/ui/dist/assets/diagram-NH7WQ7WH-Bwry0NV-.js +25 -0
  130. package/src/ui/dist/assets/diagram-OA4YK3LP-L6g09cmV.js +31 -0
  131. package/src/ui/dist/assets/diagram-WEI45ONY-Bh1puYVX.js +42 -0
  132. package/src/ui/dist/assets/diff-DbItnlRl.js +2 -0
  133. package/src/ui/dist/assets/directory-open-01563666-DWU9wJ6I.js +2 -0
  134. package/src/ui/dist/assets/directory-open-4ed118d0-CunoC1EB.js +2 -0
  135. package/src/ui/dist/assets/dockerfile-BKs6k2Af.js +2 -0
  136. package/src/ui/dist/assets/dtd-DF_7sFjM.js +2 -0
  137. package/src/ui/dist/assets/dylan-DwRh75JA.js +2 -0
  138. package/src/ui/dist/assets/ebnf-CDyGwa7X.js +2 -0
  139. package/src/ui/dist/assets/ebnfDiagram-CCIWWBDH-BC_mBRR5.js +2 -0
  140. package/src/ui/dist/assets/ecl-Cabwm37j.js +2 -0
  141. package/src/ui/dist/assets/eiffel-CnydiIhH.js +2 -0
  142. package/src/ui/dist/assets/el-GR-BZB4AONW-DsnwWweL.js +11 -0
  143. package/src/ui/dist/assets/elm-vLlmbW-K.js +2 -0
  144. package/src/ui/dist/assets/erDiagram-Q63AITRT-Bkxam36l.js +86 -0
  145. package/src/ui/dist/assets/erlang-BNw1qcRV.js +2 -0
  146. package/src/ui/dist/assets/es-ES-U4NZUMDT-CRxBcQgC.js +10 -0
  147. package/src/ui/dist/assets/eu-ES-A7QVB2H4-CTd_E7YR.js +12 -0
  148. package/src/ui/dist/assets/excalidraw-default-bMWIgNCy.svg +1 -0
  149. package/src/ui/dist/assets/fa-IR-HGAKTJCU-DO56k7eG.js +9 -0
  150. package/src/ui/dist/assets/factor-kuTfRLto.js +2 -0
  151. package/src/ui/dist/assets/fcl-Kvtd6kyn.js +2 -0
  152. package/src/ui/dist/assets/fi-FI-Z5N7JZ37-DEDCF9WB.js +7 -0
  153. package/src/ui/dist/assets/file-open-002ab408-DIuFHtCF.js +2 -0
  154. package/src/ui/dist/assets/file-open-7c801643-684qeFg4.js +2 -0
  155. package/src/ui/dist/assets/file-save-3189631c-C1wFhQhH.js +2 -0
  156. package/src/ui/dist/assets/file-save-745eba88-Bb9F9Kg7.js +2 -0
  157. package/src/ui/dist/assets/flowDiagram-23GEKE2U-C3SAEao7.js +157 -0
  158. package/src/ui/dist/assets/forth-Ffai-XNe.js +2 -0
  159. package/src/ui/dist/assets/fortran-DYz_wnZ1.js +2 -0
  160. package/src/ui/dist/assets/fr-FR-RHASNOE6-DE2nPyDt.js +10 -0
  161. package/src/ui/dist/assets/ganttDiagram-NO4QXBWP-U-J_Xi-_.js +293 -0
  162. package/src/ui/dist/assets/gas-Bneqetm1.js +2 -0
  163. package/src/ui/dist/assets/gherkin-heZmZLOM.js +2 -0
  164. package/src/ui/dist/assets/gitGraphDiagram-IHSO6WYX-BADVbD-a.js +107 -0
  165. package/src/ui/dist/assets/gl-ES-HMX3MZ6V-mCqVgQHC.js +11 -0
  166. package/src/ui/dist/assets/graph-C9eacEi8.js +2 -0
  167. package/src/ui/dist/assets/groovy-D9Dt4D0W.js +2 -0
  168. package/src/ui/dist/assets/haskell-Cw1EW3IL.js +2 -0
  169. package/src/ui/dist/assets/haxe-H-WmDvRZ.js +2 -0
  170. package/src/ui/dist/assets/he-IL-6SHJWFNN-KnaLrCzw.js +11 -0
  171. package/src/ui/dist/assets/hi-IN-IWLTKZ5I-wuqiaaWt.js +5 -0
  172. package/src/ui/dist/assets/http-DBlCnlav.js +2 -0
  173. package/src/ui/dist/assets/hu-HU-A5ZG7DT2-DLg_zm22.js +8 -0
  174. package/src/ui/dist/assets/id-ID-SAP4L64H-MB2mXqcR.js +11 -0
  175. package/src/ui/dist/assets/idl-BEugSyMb.js +2 -0
  176. package/src/ui/dist/assets/image-blob-reduce.esm-HwCm7IZ0.js +8 -0
  177. package/src/ui/dist/assets/index-39SJtrt0.js +2 -0
  178. package/src/ui/dist/assets/index-BQ0LIrW-.js +2 -0
  179. package/src/ui/dist/assets/index-BcAUh2Nm.css +1 -0
  180. package/src/ui/dist/assets/index-BcThOK-i.js +331 -0
  181. package/src/ui/dist/assets/index-BnxV3k_S.js +3 -0
  182. package/src/ui/dist/assets/index-C7MZBHbT.js +117 -0
  183. package/src/ui/dist/assets/index-CCvKI2rM.js +2 -0
  184. package/src/ui/dist/assets/index-CZvmcCab.js +8 -0
  185. package/src/ui/dist/assets/index-Cp3hLKNl.js +2 -0
  186. package/src/ui/dist/assets/index-D7ayFxcx.js +2 -0
  187. package/src/ui/dist/assets/index-DAYxSQGU.js +2 -0
  188. package/src/ui/dist/assets/index-DD-HeMV0.css +1 -0
  189. package/src/ui/dist/assets/index-DPMxd3Qn.js +2 -0
  190. package/src/ui/dist/assets/index-DSe2jx3k.js +4 -0
  191. package/src/ui/dist/assets/index-DUirCkgW.js +2 -0
  192. package/src/ui/dist/assets/index-DaKPQ2hN.js +159 -0
  193. package/src/ui/dist/assets/index-DzpuR0Jg.js +2 -0
  194. package/src/ui/dist/assets/index-POndwsCI.js +2 -0
  195. package/src/ui/dist/assets/index-R8NM9I_9.js +2 -0
  196. package/src/ui/dist/assets/index-TCDuDhBj.js +2 -0
  197. package/src/ui/dist/assets/index-TckzASdM.js +2 -0
  198. package/src/ui/dist/assets/index-Yi5ytFFr.js +2 -0
  199. package/src/ui/dist/assets/infoDiagram-FWYZ7A6U-CiGBlFqH.js +3 -0
  200. package/src/ui/dist/assets/init-Gi6I4Gst.js +2 -0
  201. package/src/ui/dist/assets/ishikawaDiagram-FXEZZL3T-B1aheRbz.js +71 -0
  202. package/src/ui/dist/assets/it-IT-JPQ66NNP-DT3HSU7X.js +12 -0
  203. package/src/ui/dist/assets/ja-JP-DBVTYXUO-CsfJjjWt.js +9 -0
  204. package/src/ui/dist/assets/javascript-iXu5QeM3.js +2 -0
  205. package/src/ui/dist/assets/journeyDiagram-5HDEW3XC-DtnJPxub.js +140 -0
  206. package/src/ui/dist/assets/julia-DuME0IfC.js +2 -0
  207. package/src/ui/dist/assets/kaa-6HZHGXH3-DQz-1-Gn.js +2 -0
  208. package/src/ui/dist/assets/kab-KAB-ZGHBKWFO-CaH-LSoK.js +9 -0
  209. package/src/ui/dist/assets/kanban-definition-HUTT4EX6-CZatSm3e.js +90 -0
  210. package/src/ui/dist/assets/katex-C5jXJg4s.js +258 -0
  211. package/src/ui/dist/assets/kk-KZ-P5N5QNE5-BMXmcm55.js +2 -0
  212. package/src/ui/dist/assets/km-KH-HSX4SM5Z-ZeoJNBpN.js +12 -0
  213. package/src/ui/dist/assets/ko-KR-MTYHY66A-BeaLRKph.js +10 -0
  214. package/src/ui/dist/assets/ku-TR-6OUDTVRD-B_28KrkR.js +10 -0
  215. package/src/ui/dist/assets/layout-DEXfKzaS.js +2 -0
  216. package/src/ui/dist/assets/linear-CpEDnQRC.js +2 -0
  217. package/src/ui/dist/assets/livescript-BwQOo05w.js +2 -0
  218. package/src/ui/dist/assets/lt-LT-XHIRWOB4-BxDcnUhp.js +4 -0
  219. package/src/ui/dist/assets/lua-VAEuO923.js +2 -0
  220. package/src/ui/dist/assets/lv-LV-5QDEKY6T-DpKDl1_y.js +8 -0
  221. package/src/ui/dist/assets/map-Czzmt4hB.js +2 -0
  222. package/src/ui/dist/assets/mathematica-DTrFuWx2.js +2 -0
  223. package/src/ui/dist/assets/mbox-CNhZ1qSd.js +2 -0
  224. package/src/ui/dist/assets/mermaidLoader-CBO31t0J.js +305 -0
  225. package/src/ui/dist/assets/mermaidLoader-CEK31ho9.css +1 -0
  226. package/src/ui/dist/assets/mindmap-definition-LN4V7U3C-CQ0TccEr.js +97 -0
  227. package/src/ui/dist/assets/mirc-CjQqDB4T.js +2 -0
  228. package/src/ui/dist/assets/mllike-CXdrOF99.js +2 -0
  229. package/src/ui/dist/assets/modelica-Dc1JOy9r.js +2 -0
  230. package/src/ui/dist/assets/mr-IN-CRQNXWMA-BKCZT58p.js +14 -0
  231. package/src/ui/dist/assets/mscgen-BA5vi2Kp.js +2 -0
  232. package/src/ui/dist/assets/mumps-BT43cFF4.js +2 -0
  233. package/src/ui/dist/assets/my-MM-5M5IBNSE-D34k0G9T.js +2 -0
  234. package/src/ui/dist/assets/nb-NO-T6EIAALU-DXr_KW8J.js +11 -0
  235. package/src/ui/dist/assets/nginx-DdIZxoE0.js +2 -0
  236. package/src/ui/dist/assets/nl-NL-IS3SIHDZ-C1L0aVDR.js +9 -0
  237. package/src/ui/dist/assets/nn-NO-6E72VCQL-CLWVSxbZ.js +9 -0
  238. package/src/ui/dist/assets/nsis-LdVXkNf5.js +2 -0
  239. package/src/ui/dist/assets/ntriples-BfvgReVJ.js +2 -0
  240. package/src/ui/dist/assets/oc-FR-POXYY2M6-nf8_J3eR.js +9 -0
  241. package/src/ui/dist/assets/octave-Ck1zUtKM.js +2 -0
  242. package/src/ui/dist/assets/ordinal-Cboi1Yqb.js +2 -0
  243. package/src/ui/dist/assets/oz-BzwKVEFT.js +2 -0
  244. package/src/ui/dist/assets/pa-IN-N4M65BXN-CAMJ-xd6.js +5 -0
  245. package/src/ui/dist/assets/pascal--L3eBynH.js +2 -0
  246. package/src/ui/dist/assets/pegDiagram-2B236MQR-Bj2RcmRd.js +2 -0
  247. package/src/ui/dist/assets/percentages-BXMCSKIN-s9yWFdr6.js +160 -0
  248. package/src/ui/dist/assets/perl-CdXCOZ3F.js +2 -0
  249. package/src/ui/dist/assets/pica-BGv_AhAB.js +8 -0
  250. package/src/ui/dist/assets/pieDiagram-ENE6RG2P-obpzz8dC.js +40 -0
  251. package/src/ui/dist/assets/pig-CevX1Tat.js +2 -0
  252. package/src/ui/dist/assets/pl-PL-T2D74RX3-DKJ5H85v.js +10 -0
  253. package/src/ui/dist/assets/powershell-CFHJl5sT.js +2 -0
  254. package/src/ui/dist/assets/properties-C78fOPTZ.js +2 -0
  255. package/src/ui/dist/assets/protobuf-ChK-085T.js +2 -0
  256. package/src/ui/dist/assets/{proxy-D0vUbds5.js → proxy-BSmwef4H.js} +2 -2
  257. package/src/ui/dist/assets/pt-BR-5N22H2LF-B5kow-kN.js +10 -0
  258. package/src/ui/dist/assets/pt-PT-UZXXM6DQ-B2G34fso.js +10 -0
  259. package/src/ui/dist/assets/pug-DeIclll2.js +2 -0
  260. package/src/ui/dist/assets/puppet-DMA9R1ak.js +2 -0
  261. package/src/ui/dist/assets/python-BuPzkPfP.js +2 -0
  262. package/src/ui/dist/assets/q-pXgVlZs6.js +2 -0
  263. package/src/ui/dist/assets/quadrantDiagram-ABIIQ3AL-Cl-T7NkJ.js +8 -0
  264. package/src/ui/dist/assets/r-B6wPVr8A.js +2 -0
  265. package/src/ui/dist/assets/railroadDiagram-RFXS5EU6-DMq82RHg.js +2 -0
  266. package/src/ui/dist/assets/{refresh-cw-JNmExijd.js → refresh-cw-CbFd7guV.js} +2 -2
  267. package/src/ui/dist/assets/requirementDiagram-TGXJPOKE-tGInMDgU.js +85 -0
  268. package/src/ui/dist/assets/ro-RO-JPDTUUEW-BwLdZW91.js +12 -0
  269. package/src/ui/dist/assets/roundRect-0PYZxl1G.js +2 -0
  270. package/src/ui/dist/assets/rpm-CTu-6PCP.js +2 -0
  271. package/src/ui/dist/assets/ru-RU-B4JR7IUQ-DpdAgIJc.js +10 -0
  272. package/src/ui/dist/assets/ruby-B2Rjki9n.js +2 -0
  273. package/src/ui/dist/assets/runtimeBrand-BoKPimsz.js +2 -0
  274. package/src/ui/dist/assets/sankeyDiagram-HTMAVEWB-C7X-ET4m.js +41 -0
  275. package/src/ui/dist/assets/sas-B4kiWyti.js +2 -0
  276. package/src/ui/dist/assets/save-D1CXHwBw.js +12 -0
  277. package/src/ui/dist/assets/scheme-C41bIUwD.js +2 -0
  278. package/src/ui/dist/assets/sequenceDiagram-DBY2YBRQ-Bn24i_nY.js +163 -0
  279. package/src/ui/dist/assets/settings-2-DtSNAAcU.js +22 -0
  280. package/src/ui/dist/assets/shell-CjFT_Tl9.js +2 -0
  281. package/src/ui/dist/assets/shield-check-BVbJ8T_N.js +7 -0
  282. package/src/ui/dist/assets/si-LK-N5RQ5JYF-naJaUy5u.js +2 -0
  283. package/src/ui/dist/assets/sieve-C3Gn_uJK.js +2 -0
  284. package/src/ui/dist/assets/simple-mode-GW_nhZxv.js +2 -0
  285. package/src/ui/dist/assets/sizeCapture-X5ZJPWSS-DAQHfm82.js +2 -0
  286. package/src/ui/dist/assets/sk-SK-C5VTKIMK-1NPz1J_d.js +7 -0
  287. package/src/ui/dist/assets/sl-SI-NN7IZMDC-D8RfmNQw.js +7 -0
  288. package/src/ui/dist/assets/smalltalk-CnHTOXQT.js +2 -0
  289. package/src/ui/dist/assets/solr-DehyRSwq.js +2 -0
  290. package/src/ui/dist/assets/sparql-DkYu6x3z.js +2 -0
  291. package/src/ui/dist/assets/spreadsheet-BCZA_wO0.js +2 -0
  292. package/src/ui/dist/assets/sql-D0XecflT.js +2 -0
  293. package/src/ui/dist/assets/stateDiagram-2N3HPSRC-Ck48D1ck.js +2 -0
  294. package/src/ui/dist/assets/stateDiagram-v2-6OUMAXLB-CdfRCJAJ.js +2 -0
  295. package/src/ui/dist/assets/stex-C3f8Ysf7.js +2 -0
  296. package/src/ui/dist/assets/style-C3QI7VPf.css +1 -0
  297. package/src/ui/dist/assets/stylus-B533Al4x.js +2 -0
  298. package/src/ui/dist/assets/subset-shared.chunk-eAtLHmbi.js +85 -0
  299. package/src/ui/dist/assets/subset-worker.chunk-DeHCTnTk.js +2 -0
  300. package/src/ui/dist/assets/sv-SE-XGPEYMSR-BeOYCU-8.js +11 -0
  301. package/src/ui/dist/assets/swift-BzpIVaGY.js +2 -0
  302. package/src/ui/dist/assets/swimlanes-5IMT3BWC-DOy22UjP.js +3 -0
  303. package/src/ui/dist/assets/swimlanesDiagram-G3AALYLV-sicPbVOg.js +9 -0
  304. package/src/ui/dist/assets/ta-IN-2NMHFXQM-CtS68WDd.js +10 -0
  305. package/src/ui/dist/assets/tcl-DVfN8rqt.js +2 -0
  306. package/src/ui/dist/assets/{terminal-BBQvnOAK.js → terminal-DEby5Y_P.js} +2 -2
  307. package/src/ui/dist/assets/terminalControl-BkFeDVXo.js +134 -0
  308. package/src/ui/dist/assets/textile-CnDTJFAw.js +2 -0
  309. package/src/ui/dist/assets/th-TH-HPSO5L25-DCHY9-Co.js +3 -0
  310. package/src/ui/dist/assets/tiddlywiki-DO-Gjzrf.js +2 -0
  311. package/src/ui/dist/assets/tiki-DGYXhP31.js +2 -0
  312. package/src/ui/dist/assets/timeline-definition-FHXFAJF6-DVkG72qO.js +121 -0
  313. package/src/ui/dist/assets/toml-Bm5Em-hy.js +2 -0
  314. package/src/ui/dist/assets/tr-TR-DEFEU3FU-y5-vjTv8.js +8 -0
  315. package/src/ui/dist/assets/troff-wAsdV37c.js +2 -0
  316. package/src/ui/dist/assets/ttcn-CfJYG6tj.js +2 -0
  317. package/src/ui/dist/assets/ttcn-cfg-B9xdYoR4.js +2 -0
  318. package/src/ui/dist/assets/turtle-B1tBg_DP.js +2 -0
  319. package/src/ui/dist/assets/uk-UA-QMV73CPH-BRbR5It6.js +7 -0
  320. package/src/ui/dist/assets/useReducedMotion-D07XP52Q.js +12 -0
  321. package/src/ui/dist/assets/vb-CmGdzxic.js +2 -0
  322. package/src/ui/dist/assets/vbscript-BuJXcnF6.js +2 -0
  323. package/src/ui/dist/assets/velocity-D8B20fx6.js +2 -0
  324. package/src/ui/dist/assets/vennDiagram-L72KCM5P-DwMwBlf-.js +35 -0
  325. package/src/ui/dist/assets/verilog-C6RDOZhf.js +2 -0
  326. package/src/ui/dist/assets/vhdl-lSbBsy5d.js +2 -0
  327. package/src/ui/dist/assets/vi-VN-M7AON7JQ-s6wSBv2s.js +6 -0
  328. package/src/ui/dist/assets/wardleyDiagram-EHGQE667-CNuuvzEg.js +79 -0
  329. package/src/ui/dist/assets/webidl-ZXfAyPTL.js +2 -0
  330. package/src/ui/dist/assets/{x-DoIOGAJz.js → x-B84wq78k.js} +2 -2
  331. package/src/ui/dist/assets/xquery-DzFWVndE.js +2 -0
  332. package/src/ui/dist/assets/xychartDiagram-FW5EYKEG-dUpZxmn6.js +8 -0
  333. package/src/ui/dist/assets/yacas-BJ4BC0dw.js +2 -0
  334. package/src/ui/dist/assets/z80-Hz9HOZM7.js +2 -0
  335. package/src/ui/dist/assets/zh-CN-LNUGB5OW-Cu_-POQN.js +11 -0
  336. package/src/ui/dist/assets/zh-HK-E62DVLB3-BCx4W4qZ.js +2 -0
  337. package/src/ui/dist/assets/zh-TW-RAJ6MFWO-02wx_Mrj.js +10 -0
  338. package/src/ui/dist/icons/excalidraw.svg +1 -0
  339. package/src/ui/dist/icons/markdown.svg +1 -0
  340. package/src/ui/dist/index.html +2 -2
  341. package/src/ui/package.json +10 -0
  342. package/src/ui/playwright.config.ts +36 -0
  343. package/src/ui/pnpm-workspace.yaml +2 -0
  344. package/src/ui/public/icons/excalidraw.svg +1 -0
  345. package/src/ui/public/icons/markdown.svg +1 -0
  346. package/src/ui/tsconfig.json +2 -1
  347. package/src/ui/vite.config.ts +1 -0
  348. package/src/wf-ui-server/__tests__/a2a-store.test.mjs +432 -15
  349. package/src/wf-ui-server/__tests__/action-registry-loader.test.mjs +156 -0
  350. package/src/wf-ui-server/__tests__/claude-stream-json.test.mjs +397 -0
  351. package/src/wf-ui-server/__tests__/codex-appserver.test.mjs +392 -0
  352. package/src/wf-ui-server/__tests__/component-node-api.test.mjs +881 -0
  353. package/src/wf-ui-server/__tests__/component-node-store.test.mjs +401 -0
  354. package/src/wf-ui-server/__tests__/control-plane-acceptance.test.mjs +2027 -0
  355. package/src/wf-ui-server/__tests__/control-plane-cli-smoke.test.mjs +1014 -0
  356. package/src/wf-ui-server/__tests__/dispatch-lifecycle.test.mjs +330 -0
  357. package/src/wf-ui-server/__tests__/effort-compatibility-red-092.test.mjs +151 -0
  358. package/src/wf-ui-server/__tests__/graph-layout-agent-tree.test.mjs +254 -0
  359. package/src/wf-ui-server/__tests__/graph-layout-tidy.test.mjs +260 -0
  360. package/src/wf-ui-server/__tests__/graph-layout.test.mjs +84 -0
  361. package/src/wf-ui-server/__tests__/node-config-api.test.mjs +384 -0
  362. package/src/wf-ui-server/__tests__/opencode-server.test.mjs +526 -0
  363. package/src/wf-ui-server/__tests__/peer-capsule.test.mjs +2 -2
  364. package/src/wf-ui-server/__tests__/pty-adapter.test.mjs +71 -1
  365. package/src/wf-ui-server/__tests__/runtime-config.test.mjs +3 -3
  366. package/src/wf-ui-server/__tests__/runtime-detector.test.mjs +21 -0
  367. package/src/wf-ui-server/__tests__/runtime-review.test.mjs +828 -0
  368. package/src/wf-ui-server/__tests__/server.integration.test.mjs +1463 -11
  369. package/src/wf-ui-server/__tests__/session-cleanup.test.mjs +159 -0
  370. package/src/wf-ui-server/__tests__/session-registry.test.mjs +52 -3
  371. package/src/wf-ui-server/__tests__/settings.test.mjs +12 -2
  372. package/src/wf-ui-server/__tests__/spawn-gate.test.mjs +78 -0
  373. package/src/wf-ui-server/__tests__/task-group-parser.test.mjs +120 -0
  374. package/src/wf-ui-server/__tests__/task-group-tag.test.mjs +264 -0
  375. package/src/wf-ui-server/__tests__/task-parser.test.mjs +49 -3
  376. package/src/wf-ui-server/__tests__/terminal-context-hardening.test.mjs +122 -0
  377. package/src/wf-ui-server/__tests__/terminal-context.test.mjs +164 -0
  378. package/src/wf-ui-server/__tests__/terminal-store.test.mjs +4 -4
  379. package/src/wf-ui-server/__tests__/wf-browser-api.test.mjs +599 -0
  380. package/src/wf-ui-server/__tests__/wf-browser-store.test.mjs +184 -0
  381. package/src/wf-ui-server/__tests__/workflow-action-registry.test.mjs +282 -0
  382. package/src/wf-ui-server/__tests__/workflow-agent-communication.test.mjs +411 -0
  383. package/src/wf-ui-server/__tests__/workflow-agent-context.test.mjs +323 -0
  384. package/src/wf-ui-server/__tests__/workflow-agent-cooperation-permissions.test.mjs +318 -0
  385. package/src/wf-ui-server/__tests__/workflow-agent-messages-structured.test.mjs +458 -0
  386. package/src/wf-ui-server/__tests__/workflow-agent-routing.test.mjs +434 -0
  387. package/src/wf-ui-server/__tests__/workflow-agent-runtime.test.mjs +324 -0
  388. package/src/wf-ui-server/__tests__/workflow-api-integration.test.mjs +263 -0
  389. package/src/wf-ui-server/__tests__/workflow-api-phase3.test.mjs +1213 -0
  390. package/src/wf-ui-server/__tests__/workflow-claude-materialize.test.mjs +209 -0
  391. package/src/wf-ui-server/__tests__/workflow-cli-registry-manuals.test.mjs +173 -0
  392. package/src/wf-ui-server/__tests__/workflow-cli-surface.test.mjs +176 -0
  393. package/src/wf-ui-server/__tests__/workflow-codex-resume-id.test.mjs +556 -0
  394. package/src/wf-ui-server/__tests__/workflow-cooperation-enforcement.test.mjs +553 -0
  395. package/src/wf-ui-server/__tests__/workflow-depth-resume-dock.test.mjs +846 -0
  396. package/src/wf-ui-server/__tests__/workflow-display-node.test.mjs +150 -0
  397. package/src/wf-ui-server/__tests__/workflow-edge-update.test.mjs +296 -0
  398. package/src/wf-ui-server/__tests__/workflow-file-cache-lock-watch.test.mjs +380 -0
  399. package/src/wf-ui-server/__tests__/workflow-file-formats.test.mjs +994 -0
  400. package/src/wf-ui-server/__tests__/workflow-file-node-actions.test.mjs +294 -0
  401. package/src/wf-ui-server/__tests__/workflow-goal-actions.test.mjs +357 -0
  402. package/src/wf-ui-server/__tests__/workflow-goal-task-autoclose.test.mjs +256 -0
  403. package/src/wf-ui-server/__tests__/workflow-graceful-stop.test.mjs +108 -0
  404. package/src/wf-ui-server/__tests__/workflow-graph-undo.test.mjs +524 -0
  405. package/src/wf-ui-server/__tests__/workflow-layout.test.mjs +732 -0
  406. package/src/wf-ui-server/__tests__/workflow-magnetic-topology.test.mjs +222 -0
  407. package/src/wf-ui-server/__tests__/workflow-markdown-lock.test.mjs +359 -0
  408. package/src/wf-ui-server/__tests__/workflow-mcp-hub.test.mjs +174 -0
  409. package/src/wf-ui-server/__tests__/workflow-node-manual-schema.test.mjs +241 -0
  410. package/src/wf-ui-server/__tests__/workflow-node-runtime.test.mjs +1991 -0
  411. package/src/wf-ui-server/__tests__/workflow-node-store-utils.test.mjs +125 -0
  412. package/src/wf-ui-server/__tests__/workflow-registry-drift.test.mjs +296 -0
  413. package/src/wf-ui-server/__tests__/workflow-resource-handle-four-side.test.mjs +217 -0
  414. package/src/wf-ui-server/__tests__/workflow-role-profile.test.mjs +234 -0
  415. package/src/wf-ui-server/__tests__/workflow-set-model.test.mjs +261 -0
  416. package/src/wf-ui-server/__tests__/workflow-skill-group-context-enabled.test.mjs +131 -0
  417. package/src/wf-ui-server/__tests__/workflow-skill-group-enable-disable.test.mjs +186 -0
  418. package/src/wf-ui-server/__tests__/workflow-skills-hub.test.mjs +125 -0
  419. package/src/wf-ui-server/__tests__/workflow-state-reconcile.test.mjs +139 -0
  420. package/src/wf-ui-server/__tests__/workflow-subagent-strategy-matrix.test.mjs +529 -0
  421. package/src/wf-ui-server/__tests__/workflow-team-flow.test.mjs +278 -0
  422. package/src/wf-ui-server/__tests__/workflow-terminal-control-live.test.mjs +294 -0
  423. package/src/wf-ui-server/__tests__/workflow-terminal-control.test.mjs +631 -0
  424. package/src/wf-ui-server/__tests__/workflow-timer-wakeup.test.mjs +318 -0
  425. package/src/wf-ui-server/__tests__/workflow-unified-resume.test.mjs +537 -0
  426. package/src/wf-ui-server/__tests__/workspace-api-hardening.test.mjs +187 -0
  427. package/src/wf-ui-server/__tests__/workspace-api.test.mjs +382 -0
  428. package/src/wf-ui-server/__tests__/workspace-reveal.test.mjs +138 -0
  429. package/src/wf-ui-server/__tests__/workspace-store-hardening.test.mjs +255 -0
  430. package/src/wf-ui-server/__tests__/workspace-store.test.mjs +208 -0
  431. package/src/wf-ui-server/__tests__/ws-events.integration.test.mjs +52 -25
  432. package/src/wf-ui-server/__tests__/ws-terminal.integration.test.mjs +12 -6
  433. package/src/wf-ui-server/__tests__/ws-wf-browser.integration.test.mjs +488 -0
  434. package/src/wf-ui-server/a2a-store.mjs +3007 -89
  435. package/src/wf-ui-server/action-registry.mjs +277 -0
  436. package/src/wf-ui-server/bridge-store.mjs +276 -0
  437. package/src/wf-ui-server/chat-driver.mjs +220 -0
  438. package/src/wf-ui-server/chat-store.mjs +109 -0
  439. package/src/wf-ui-server/claude-transcript-materializer.mjs +235 -0
  440. package/src/wf-ui-server/codex-update-prompt.mjs +53 -0
  441. package/src/wf-ui-server/component-node-store.mjs +689 -0
  442. package/src/wf-ui-server/composition-api.mjs +436 -0
  443. package/src/wf-ui-server/control-plane-token.mjs +17 -0
  444. package/src/wf-ui-server/dispatch-contract.mjs +150 -0
  445. package/src/wf-ui-server/drivers/claude-stream-json.mjs +371 -0
  446. package/src/wf-ui-server/drivers/codex-appserver.mjs +513 -0
  447. package/src/wf-ui-server/drivers/opencode-server.mjs +486 -0
  448. package/src/wf-ui-server/excalidraw-svg.mjs +141 -0
  449. package/src/wf-ui-server/file-format-adapters.mjs +511 -0
  450. package/src/wf-ui-server/file-watcher.mjs +215 -0
  451. package/src/wf-ui-server/graph-layout.mjs +778 -0
  452. package/src/wf-ui-server/harness-env.mjs +46 -0
  453. package/src/wf-ui-server/json-store-utils.mjs +48 -0
  454. package/src/wf-ui-server/model-capability.mjs +773 -0
  455. package/src/wf-ui-server/node-config-store.mjs +233 -0
  456. package/src/wf-ui-server/node-store-utils.mjs +88 -0
  457. package/src/wf-ui-server/peer-capsule.mjs +56 -1
  458. package/src/wf-ui-server/pty-adapter.mjs +513 -11
  459. package/src/wf-ui-server/reveal-foreground.mjs +69 -0
  460. package/src/wf-ui-server/runtime-detector.mjs +52 -6
  461. package/src/wf-ui-server/server.mjs +5613 -403
  462. package/src/wf-ui-server/session-cleanup.mjs +363 -0
  463. package/src/wf-ui-server/session-registry.mjs +179 -3
  464. package/src/wf-ui-server/settings.mjs +25 -0
  465. package/src/wf-ui-server/spawn-gate.mjs +46 -0
  466. package/src/wf-ui-server/task-parser.mjs +88 -3
  467. package/src/wf-ui-server/terminal-store.mjs +225 -11
  468. package/src/wf-ui-server/timer-wakeup-scheduler.mjs +226 -0
  469. package/src/wf-ui-server/wf-browser-store.mjs +733 -0
  470. package/src/wf-ui-server/workflow-agent-context.mjs +1731 -0
  471. package/src/wf-ui-server/workflow-capability-node-store.mjs +676 -0
  472. package/src/wf-ui-server/workflow-event-node-store.mjs +623 -0
  473. package/src/wf-ui-server/workflow-goal-node-store.mjs +328 -0
  474. package/src/wf-ui-server/workflow-graph-store.mjs +623 -0
  475. package/src/wf-ui-server/workflow-mcp-hub.mjs +286 -0
  476. package/src/wf-ui-server/workflow-node-runtime.mjs +1767 -0
  477. package/src/wf-ui-server/workflow-node-settings-store.mjs +339 -0
  478. package/src/wf-ui-server/workflow-node-types/agent-node.mjs +920 -0
  479. package/src/wf-ui-server/workflow-node-types/display-node.mjs +151 -0
  480. package/src/wf-ui-server/workflow-node-types/excalidraw-node.mjs +145 -0
  481. package/src/wf-ui-server/workflow-node-types/file-node.mjs +484 -0
  482. package/src/wf-ui-server/workflow-node-types/github-trigger-node.mjs +207 -0
  483. package/src/wf-ui-server/workflow-node-types/goal-node.mjs +491 -0
  484. package/src/wf-ui-server/workflow-node-types/markdown-node.mjs +225 -0
  485. package/src/wf-ui-server/workflow-node-types/mcp-connector-node.mjs +71 -0
  486. package/src/wf-ui-server/workflow-node-types/role-profile-store.mjs +191 -0
  487. package/src/wf-ui-server/workflow-node-types/skill-group-node.mjs +98 -0
  488. package/src/wf-ui-server/workflow-node-types/timer-node.mjs +607 -0
  489. package/src/wf-ui-server/workflow-ontology.mjs +681 -0
  490. package/src/wf-ui-server/workflow-operation-store.mjs +115 -0
  491. package/src/wf-ui-server/workflow-skills-hub.mjs +366 -0
  492. package/src/wf-ui-server/workflow-skills-market.mjs +723 -0
  493. package/src/wf-ui-server/workspace-store.mjs +951 -0
  494. package/src/wf-ui-server/ws-chat.mjs +299 -0
  495. package/src/wf-ui-server/ws-events.mjs +45 -20
  496. package/src/wf-ui-server/ws-terminal.mjs +165 -22
  497. package/src/wf-ui-server/ws-wf-browser.mjs +419 -0
  498. package/templates/common/.claude/agents/review-manager.md +33 -29
  499. package/templates/common/.claude/commands/wf-browser.md +1 -1
  500. package/templates/common/.claude/commands/wf-help.md +5 -3
  501. package/templates/common/.claude/commands/wf-init.md +44 -0
  502. package/templates/common/.claude/commands/wf-learn.md +34 -8
  503. package/templates/common/.claude/commands/wf-max.md +19 -9
  504. package/templates/common/.claude/commands/wf-review.md +3 -3
  505. package/templates/common/.claude/commands/wf-search.md +55 -0
  506. package/templates/common/.claude/commands/wf-task-archive.md +5 -4
  507. package/templates/common/.claude/commands/wf-task-list.md +6 -3
  508. package/templates/common/.claude/commands/wf-task-record.md +10 -2
  509. package/templates/common/.claude/commands/wf-ui.md +12 -5
  510. package/templates/common/.claude/commands/wf-update.md +4 -0
  511. package/templates/common/.claude/commands/wf.md +12 -1
  512. package/templates/common/.claude/rules/ecc/common.md +10 -1
  513. package/templates/common/.claude/skills/wf/SKILL.md +36 -0
  514. package/templates/common/.claude/skills/wf-browser/SKILL.md +427 -122
  515. package/templates/common/.claude/skills/wf-browser/references/BROWSER_CONTROL_PATTERNS.md +43 -0
  516. package/templates/common/.claude/skills/wf-init/SKILL.md +33 -0
  517. package/templates/common/.claude/skills/wf-learn/SKILL.md +106 -26
  518. package/templates/common/.claude/skills/wf-max/SKILL.md +45 -11
  519. package/templates/common/.claude/skills/wf-review/SKILL.md +26 -54
  520. package/templates/common/.claude/skills/wf-search/SKILL.md +122 -0
  521. package/templates/common/.claude/skills/wf-search/references/evidence-contract.md +77 -0
  522. package/templates/common/.claude/skills/wf-search/references/policies/compare.md +38 -0
  523. package/templates/common/.claude/skills/wf-search/references/policies/fact.md +39 -0
  524. package/templates/common/.claude/skills/wf-search/references/policies/troubleshoot.md +39 -0
  525. package/templates/common/.claude/skills/wf-search/references/policies/verify.md +44 -0
  526. package/templates/common/.claude/skills/wf-search/references/source-routing.md +40 -0
  527. package/templates/common/.claude/skills/wf-search/references/tool-adapters.md +38 -0
  528. package/templates/common/.claude/skills/wf-ui/SKILL.md +146 -12
  529. package/templates/common/.claude/skills/wf-update/SKILL.md +5 -1
  530. package/templates/common/.harness-version +188 -85
  531. package/templates/common/.opencode/agents/review-manager.md +31 -27
  532. package/templates/common/.opencode/commands/wf-browser.md +1 -1
  533. package/templates/common/.opencode/commands/wf-help.md +5 -3
  534. package/templates/common/.opencode/commands/wf-init.md +44 -0
  535. package/templates/common/.opencode/commands/wf-learn.md +34 -8
  536. package/templates/common/.opencode/commands/wf-max.md +19 -9
  537. package/templates/common/.opencode/commands/wf-review.md +3 -3
  538. package/templates/common/.opencode/commands/wf-search.md +55 -0
  539. package/templates/common/.opencode/commands/wf-task-archive.md +5 -7
  540. package/templates/common/.opencode/commands/wf-task-list.md +6 -6
  541. package/templates/common/.opencode/commands/wf-task-record.md +10 -5
  542. package/templates/common/.opencode/commands/wf-ui.md +12 -5
  543. package/templates/common/.opencode/commands/wf-update.md +4 -0
  544. package/templates/common/.opencode/commands/wf.md +12 -1
  545. package/templates/common/CLAUDE.md +61 -3
  546. package/templates/common/Harness/MEMORY.md +8 -5
  547. package/templates/common/Harness/README.md +14 -10
  548. package/templates/common/Harness/a2a/action-registry.json +4397 -0
  549. package/templates/common/Harness/a2a/role-graph.json +16 -3
  550. package/templates/common/Harness/a2a/skills/terminal-control.json +45 -1
  551. package/templates/common/Harness/a2a/skills/wf-ui-map.json +50 -0
  552. package/templates/common/Harness/a2a/skills/workflow-agent-node.json +143 -0
  553. package/templates/common/Harness/a2a/skills/workflow-context.json +95 -0
  554. package/templates/common/Harness/a2a/skills/workflow-diagram-node.json +60 -0
  555. package/templates/common/Harness/a2a/skills/workflow-display-node.json +69 -0
  556. package/templates/common/Harness/a2a/skills/workflow-file-node.json +92 -0
  557. package/templates/common/Harness/a2a/skills/workflow-goal-node.json +76 -0
  558. package/templates/common/Harness/a2a/skills/workflow-markdown-node.json +79 -0
  559. package/templates/common/Harness/a2a/skills/workflow-mcp-connector-node.json +59 -0
  560. package/templates/common/Harness/a2a/skills/workflow-node-actions.json +105 -0
  561. package/templates/common/Harness/a2a/skills/workflow-node-map.json +71 -0
  562. package/templates/common/Harness/a2a/skills/workflow-ontology.json +54 -0
  563. package/templates/common/Harness/a2a/skills/workflow-resource-node.json +68 -0
  564. package/templates/common/Harness/a2a/skills/workflow-skill-group-node.json +56 -0
  565. package/templates/common/Harness/a2a/skills/workflow-timer-node.json +81 -0
  566. package/templates/common/Harness/a2a/workflows.json +33 -0
  567. package/templates/common/Harness/ownership.manifest.json +263 -2
  568. package/templates/common/Harness/project/architecture.md +499 -0
  569. package/templates/common/Harness/research/README.md +20 -0
  570. package/templates/common/Harness/scripts/README.md +70 -6
  571. package/templates/common/Harness/scripts/a2a-terminal.mjs +12 -4
  572. package/templates/common/Harness/scripts/context-budget.mjs +7 -3
  573. package/templates/common/Harness/scripts/lib/memory-context.mjs +400 -0
  574. package/templates/common/Harness/scripts/lib/path-scope.mjs +77 -0
  575. package/templates/common/Harness/scripts/lib/research-policy.mjs +99 -0
  576. package/templates/common/Harness/scripts/lib/wf-search.mjs +189 -0
  577. package/templates/common/Harness/scripts/memory-context.mjs +63 -0
  578. package/templates/common/Harness/scripts/research-policy.mjs +27 -0
  579. package/templates/common/Harness/scripts/task-context.mjs +547 -0
  580. package/templates/common/Harness/scripts/task-group-index.mjs +242 -0
  581. package/templates/common/Harness/scripts/task-state.mjs +659 -95
  582. package/templates/common/Harness/scripts/validate-harness.mjs +70 -28
  583. package/templates/common/Harness/scripts/wf-auto-update-prompt.mjs +24 -0
  584. package/templates/common/Harness/scripts/wf-remove.mjs +10 -0
  585. package/templates/common/Harness/scripts/wf-search.mjs +10 -0
  586. package/templates/common/Harness/scripts/wf-ui-control.mjs +3144 -0
  587. package/templates/common/Harness/scripts/wf-update-check.mjs +274 -51
  588. package/templates/common/Harness/scripts/wf-update-runner.mjs +53 -16
  589. package/templates/common/Harness/settings.json +10 -0
  590. package/templates/common/Harness/specs/guides/SETUP.md +4 -3
  591. package/templates/common/Harness/specs/protocols/HARNESS_BRIDGE.md +429 -48
  592. package/templates/common/Harness/specs/protocols/MEMORY_PROTOCOL.md +24 -0
  593. package/templates/common/Harness/specs/protocols/TASK_ARCHIVE.md +14 -11
  594. package/templates/common/Harness/specs/runtime/command-surface.json +28 -0
  595. package/templates/common/Harness/specs/runtime/context-loading.md +6 -0
  596. package/templates/common/Harness/specs/runtime/dispatch.md +9 -1
  597. package/templates/common/Harness/specs/runtime/subagents.md +20 -5
  598. package/templates/common/Harness/specs/workflows/WF-AUTO-SPARK.md +19 -0
  599. package/templates/common/Harness/specs/workflows/WF-AUTO.md +21 -0
  600. package/templates/common/Harness/specs/workflows/WF-KERNEL.md +4 -2
  601. package/templates/common/Harness/specs/workflows/WF-MAX.md +39 -12
  602. package/templates/common/Harness/specs/workflows/WF-STATE.md +62 -14
  603. package/templates/common/Harness/specs/workflows/WF.md +32 -0
  604. package/templates/common/Harness/tasks/INDEX.json +7 -0
  605. package/templates/common/Harness/tasks/INDEX.md +12 -0
  606. package/templates/common/Harness/tasks/_template/PLAN.md +6 -0
  607. package/templates/common/Harness/tasks/_template/PROGRESS.md +5 -0
  608. package/templates/common/Harness/tasks/_template/STATE.json +22 -0
  609. package/templates/common/Harness/templates/TEST_PLAN.template.md +5 -4
  610. package/templates/common/Harness/templates/UI_CONTRACT.template.md +7 -5
  611. package/templates/common/Harness/wf-browser/README.md +69 -0
  612. package/templates/common/README.md +17 -0
  613. package/src/ui/dist/assets/AgentsRoute-CuSKYmFu.js +0 -17
  614. package/src/ui/dist/assets/AgentsRoute-CuSKYmFu.js.map +0 -1
  615. package/src/ui/dist/assets/RolesRoute-DOzTYVRm.js +0 -7
  616. package/src/ui/dist/assets/RolesRoute-DOzTYVRm.js.map +0 -1
  617. package/src/ui/dist/assets/SettingsRoute-DPU7jSQm.js +0 -12
  618. package/src/ui/dist/assets/SettingsRoute-DPU7jSQm.js.map +0 -1
  619. package/src/ui/dist/assets/TaskList-BN4r8s1i.js +0 -50
  620. package/src/ui/dist/assets/TaskList-BN4r8s1i.js.map +0 -1
  621. package/src/ui/dist/assets/TerminalDrawer-Cej4PxsH.js +0 -74
  622. package/src/ui/dist/assets/TerminalDrawer-Cej4PxsH.js.map +0 -1
  623. package/src/ui/dist/assets/WorkflowRoute-BnuhLJ6X.css +0 -1
  624. package/src/ui/dist/assets/WorkflowRoute-C-clKe-j.js +0 -39
  625. package/src/ui/dist/assets/WorkflowRoute-C-clKe-j.js.map +0 -1
  626. package/src/ui/dist/assets/index-BOVYWntB.js +0 -117
  627. package/src/ui/dist/assets/index-BOVYWntB.js.map +0 -1
  628. package/src/ui/dist/assets/index-DaUObq0H.css +0 -1
  629. package/src/ui/dist/assets/maximize-2-LNrr_rKr.js +0 -7
  630. package/src/ui/dist/assets/maximize-2-LNrr_rKr.js.map +0 -1
  631. package/src/ui/dist/assets/plus-QuTJyoT3.js +0 -7
  632. package/src/ui/dist/assets/plus-QuTJyoT3.js.map +0 -1
  633. package/src/ui/dist/assets/proxy-D0vUbds5.js.map +0 -1
  634. package/src/ui/dist/assets/refresh-cw-JNmExijd.js.map +0 -1
  635. package/src/ui/dist/assets/terminal-BBQvnOAK.js.map +0 -1
  636. package/src/ui/dist/assets/useReducedMotion-BqmH0Tf7.js +0 -7
  637. package/src/ui/dist/assets/useReducedMotion-BqmH0Tf7.js.map +0 -1
  638. package/src/ui/dist/assets/x-DoIOGAJz.js.map +0 -1
  639. package/src/ui/pnpm-lock.yaml +0 -1582
  640. package/src/ui/src/App.tsx +0 -86
  641. package/src/ui/src/api.ts +0 -93
  642. package/src/ui/src/components/AgentsRoute.tsx +0 -503
  643. package/src/ui/src/components/Footer.tsx +0 -69
  644. package/src/ui/src/components/Header.tsx +0 -175
  645. package/src/ui/src/components/LoadingView.tsx +0 -22
  646. package/src/ui/src/components/RolesRoute.tsx +0 -169
  647. package/src/ui/src/components/SettingsRoute.tsx +0 -166
  648. package/src/ui/src/components/TaskList.tsx +0 -388
  649. package/src/ui/src/components/TerminalDrawer.tsx +0 -611
  650. package/src/ui/src/components/WorkflowRoute.tsx +0 -670
  651. package/src/ui/src/hooks/useReducedMotion.ts +0 -17
  652. package/src/ui/src/hooks/useServerConnection.ts +0 -114
  653. package/src/ui/src/index.css +0 -281
  654. package/src/ui/src/main.tsx +0 -11
  655. package/src/ui/src/types.ts +0 -108
  656. /package/src/ui/dist/assets/{TerminalDrawer-6GBZ9nXN.css → terminalControl-6GBZ9nXN.css} +0 -0
@@ -0,0 +1,4397 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "description": "Registry of typed workflow node actions implemented by the wf-ui backend (documentation-of-record; consumers arrive in later waves).",
4
+ "actions": [
5
+ {
6
+ "id": "markdown.read",
7
+ "nodeType": "markdown",
8
+ "category": "resource",
9
+ "summary": "Read the markdown content, revision, and title of a markdown node.",
10
+ "params": [],
11
+ "actor": {
12
+ "spawnGate": null,
13
+ "edgeRequired": false,
14
+ "agentAuthored": true
15
+ },
16
+ "cli": {
17
+ "command": "workflow-node-action",
18
+ "flags": [
19
+ {
20
+ "flag": "--node",
21
+ "value": "<graphNodeIdOrSessionId>"
22
+ },
23
+ {
24
+ "flag": "--action",
25
+ "value": "markdown.read"
26
+ },
27
+ {
28
+ "flag": "--payload",
29
+ "value": "<json>"
30
+ }
31
+ ]
32
+ },
33
+ "implementation": {
34
+ "adapter": "markdown",
35
+ "export": "read",
36
+ "special": false
37
+ },
38
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action markdown.read --project ."
39
+ },
40
+ {
41
+ "id": "markdown.patch",
42
+ "nodeType": "markdown",
43
+ "category": "resource",
44
+ "summary": "Apply a diff operation (append, insert, or replace) to markdown content with an optional revision/lock guard.",
45
+ "params": [
46
+ {
47
+ "name": "diff",
48
+ "type": "object",
49
+ "required": true,
50
+ "description": "Diff descriptor: {op: 'append'|'insert'|'replace', text, offset?, length?} — append adds text at end; insert places text at offset; replace swaps length chars at offset with text."
51
+ },
52
+ {
53
+ "name": "expectedRevision",
54
+ "type": "number",
55
+ "required": false,
56
+ "description": "Expected current node revision; mismatch yields markdown_conflict."
57
+ },
58
+ {
59
+ "name": "lockId",
60
+ "type": "string",
61
+ "required": false,
62
+ "description": "Lock id to present when the node is leased (mandatory exclusion while held)."
63
+ },
64
+ {
65
+ "name": "lockOwner",
66
+ "type": "string",
67
+ "required": false,
68
+ "description": "Lock holder name to present when the node is leased."
69
+ }
70
+ ],
71
+ "actor": {
72
+ "spawnGate": null,
73
+ "edgeRequired": false,
74
+ "agentAuthored": true
75
+ },
76
+ "cli": {
77
+ "command": "workflow-node-action",
78
+ "flags": [
79
+ {
80
+ "flag": "--node",
81
+ "value": "<graphNodeIdOrSessionId>"
82
+ },
83
+ {
84
+ "flag": "--action",
85
+ "value": "markdown.patch"
86
+ },
87
+ {
88
+ "flag": "--payload",
89
+ "value": "<json>"
90
+ }
91
+ ]
92
+ },
93
+ "implementation": {
94
+ "adapter": "markdown",
95
+ "export": "patch",
96
+ "special": false
97
+ },
98
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action markdown.patch --payload \"{\\\"diff\\\":{\\\"op\\\":\\\"insert\\\",\\\"text\\\":\\\"# Title\\\",\\\"offset\\\":0}}\" --project ."
99
+ },
100
+ {
101
+ "id": "markdown.replace",
102
+ "nodeType": "markdown",
103
+ "category": "resource",
104
+ "summary": "Replace the entire markdown content of a node.",
105
+ "params": [
106
+ {
107
+ "name": "markdown",
108
+ "type": "string",
109
+ "required": true,
110
+ "description": "Full new markdown content."
111
+ },
112
+ {
113
+ "name": "expectedRevision",
114
+ "type": "number",
115
+ "required": false,
116
+ "description": "Expected current node revision; mismatch yields markdown_conflict."
117
+ },
118
+ {
119
+ "name": "lockId",
120
+ "type": "string",
121
+ "required": false,
122
+ "description": "Lock id to present when the node is leased."
123
+ },
124
+ {
125
+ "name": "lockOwner",
126
+ "type": "string",
127
+ "required": false,
128
+ "description": "Lock holder name to present when the node is leased."
129
+ }
130
+ ],
131
+ "actor": {
132
+ "spawnGate": null,
133
+ "edgeRequired": false,
134
+ "agentAuthored": true
135
+ },
136
+ "cli": {
137
+ "command": "workflow-node-action",
138
+ "flags": [
139
+ {
140
+ "flag": "--node",
141
+ "value": "<graphNodeIdOrSessionId>"
142
+ },
143
+ {
144
+ "flag": "--action",
145
+ "value": "markdown.replace"
146
+ },
147
+ {
148
+ "flag": "--payload",
149
+ "value": "<json>"
150
+ }
151
+ ]
152
+ },
153
+ "implementation": {
154
+ "adapter": "markdown",
155
+ "export": "replace",
156
+ "special": false
157
+ },
158
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action markdown.replace --payload \"{\\\"markdown\\\":\\\"# Plan\\n\\\"}\" --project ."
159
+ },
160
+ {
161
+ "id": "markdown.append",
162
+ "nodeType": "markdown",
163
+ "category": "resource",
164
+ "summary": "Append text to the end of a markdown node's content.",
165
+ "params": [
166
+ {
167
+ "name": "markdown",
168
+ "type": "string",
169
+ "required": true,
170
+ "description": "Text to append to the current content."
171
+ },
172
+ {
173
+ "name": "expectedRevision",
174
+ "type": "number",
175
+ "required": false,
176
+ "description": "Expected current node revision; mismatch yields markdown_conflict."
177
+ },
178
+ {
179
+ "name": "lockId",
180
+ "type": "string",
181
+ "required": false,
182
+ "description": "Lock id to present when the node is leased."
183
+ },
184
+ {
185
+ "name": "lockOwner",
186
+ "type": "string",
187
+ "required": false,
188
+ "description": "Lock holder name to present when the node is leased."
189
+ }
190
+ ],
191
+ "actor": {
192
+ "spawnGate": null,
193
+ "edgeRequired": false,
194
+ "agentAuthored": true
195
+ },
196
+ "cli": {
197
+ "command": "workflow-node-action",
198
+ "flags": [
199
+ {
200
+ "flag": "--node",
201
+ "value": "<graphNodeIdOrSessionId>"
202
+ },
203
+ {
204
+ "flag": "--action",
205
+ "value": "markdown.append"
206
+ },
207
+ {
208
+ "flag": "--payload",
209
+ "value": "<json>"
210
+ }
211
+ ]
212
+ },
213
+ "implementation": {
214
+ "adapter": "markdown",
215
+ "export": "append",
216
+ "special": false
217
+ },
218
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action markdown.append --payload \"{\\\"markdown\\\":\\\"- done\\n\\\"}\" --project ."
219
+ },
220
+ {
221
+ "id": "markdown.find",
222
+ "nodeType": "markdown",
223
+ "category": "discovery",
224
+ "summary": "Find markdown nodes by exact nodeId or case-insensitive title substring; returns metadata only, never content.",
225
+ "params": [
226
+ {
227
+ "name": "nodeId",
228
+ "type": "string",
229
+ "required": false,
230
+ "description": "Exact node id to match."
231
+ },
232
+ {
233
+ "name": "title",
234
+ "type": "string",
235
+ "required": false,
236
+ "description": "Case-insensitive title substring to match."
237
+ }
238
+ ],
239
+ "actor": {
240
+ "spawnGate": null,
241
+ "edgeRequired": false,
242
+ "agentAuthored": true
243
+ },
244
+ "cli": {
245
+ "command": "workflow-node-action",
246
+ "flags": [
247
+ {
248
+ "flag": "--node",
249
+ "value": "<graphNodeIdOrSessionId>"
250
+ },
251
+ {
252
+ "flag": "--action",
253
+ "value": "markdown.find"
254
+ },
255
+ {
256
+ "flag": "--payload",
257
+ "value": "<json>"
258
+ }
259
+ ]
260
+ },
261
+ "implementation": {
262
+ "adapter": "markdown",
263
+ "export": "find",
264
+ "special": false
265
+ },
266
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action markdown.find --payload \"{\\\"title\\\":\\\"plan\\\"}\" --project ."
267
+ },
268
+ {
269
+ "id": "markdown.acquireLock",
270
+ "nodeType": "markdown",
271
+ "category": "resource",
272
+ "summary": "Acquire (or renew with an existing lockId) a write lease on a markdown node.",
273
+ "params": [
274
+ {
275
+ "name": "lockOwner",
276
+ "type": "string",
277
+ "required": true,
278
+ "description": "Owner name recorded as the lease holder."
279
+ },
280
+ {
281
+ "name": "ttlSeconds",
282
+ "type": "number",
283
+ "required": false,
284
+ "description": "Lease TTL in seconds (default 30, capped at 300)."
285
+ },
286
+ {
287
+ "name": "lockId",
288
+ "type": "string",
289
+ "required": false,
290
+ "description": "Existing lock id to renew; omit to create a new lease."
291
+ }
292
+ ],
293
+ "actor": {
294
+ "spawnGate": null,
295
+ "edgeRequired": false,
296
+ "agentAuthored": true
297
+ },
298
+ "cli": {
299
+ "command": "workflow-node-action",
300
+ "flags": [
301
+ {
302
+ "flag": "--node",
303
+ "value": "<graphNodeIdOrSessionId>"
304
+ },
305
+ {
306
+ "flag": "--action",
307
+ "value": "markdown.acquireLock"
308
+ },
309
+ {
310
+ "flag": "--payload",
311
+ "value": "<json>"
312
+ }
313
+ ]
314
+ },
315
+ "implementation": {
316
+ "adapter": "markdown",
317
+ "export": "acquireLock",
318
+ "special": false
319
+ },
320
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action markdown.acquireLock --payload \"{\\\"lockOwner\\\":\\\"agent-x\\\",\\\"ttlSeconds\\\":60}\" --project ."
321
+ },
322
+ {
323
+ "id": "markdown.releaseLock",
324
+ "nodeType": "markdown",
325
+ "category": "resource",
326
+ "summary": "Release a write lease on a markdown node; only the holder may release.",
327
+ "params": [
328
+ {
329
+ "name": "lockOwner",
330
+ "type": "string",
331
+ "required": true,
332
+ "description": "Owner name of the lease being released."
333
+ },
334
+ {
335
+ "name": "lockId",
336
+ "type": "string",
337
+ "required": false,
338
+ "description": "Lock id to release (matches holder ownership)."
339
+ }
340
+ ],
341
+ "actor": {
342
+ "spawnGate": null,
343
+ "edgeRequired": false,
344
+ "agentAuthored": true
345
+ },
346
+ "cli": {
347
+ "command": "workflow-node-action",
348
+ "flags": [
349
+ {
350
+ "flag": "--node",
351
+ "value": "<graphNodeIdOrSessionId>"
352
+ },
353
+ {
354
+ "flag": "--action",
355
+ "value": "markdown.releaseLock"
356
+ },
357
+ {
358
+ "flag": "--payload",
359
+ "value": "<json>"
360
+ }
361
+ ]
362
+ },
363
+ "implementation": {
364
+ "adapter": "markdown",
365
+ "export": "releaseLock",
366
+ "special": false
367
+ },
368
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action markdown.releaseLock --payload \"{\\\"lockOwner\\\":\\\"agent-x\\\"}\" --project ."
369
+ },
370
+ {
371
+ "id": "markdown.save",
372
+ "nodeType": "markdown",
373
+ "category": "resource",
374
+ "summary": "Save full markdown content to a node (alias of markdown.replace without revision guard).",
375
+ "params": [
376
+ {
377
+ "name": "markdown",
378
+ "type": "string",
379
+ "required": true,
380
+ "description": "Full new markdown content."
381
+ }
382
+ ],
383
+ "actor": {
384
+ "spawnGate": null,
385
+ "edgeRequired": false,
386
+ "agentAuthored": true
387
+ },
388
+ "cli": {
389
+ "command": "workflow-node-action",
390
+ "flags": [
391
+ {
392
+ "flag": "--node",
393
+ "value": "<graphNodeIdOrSessionId>"
394
+ },
395
+ {
396
+ "flag": "--action",
397
+ "value": "markdown.save"
398
+ },
399
+ {
400
+ "flag": "--payload",
401
+ "value": "<json>"
402
+ }
403
+ ]
404
+ },
405
+ "implementation": {
406
+ "adapter": "markdown",
407
+ "export": "save",
408
+ "special": false
409
+ },
410
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action markdown.save --payload \"{\\\"markdown\\\":\\\"# Plan\\n\\\"}\" --project .",
411
+ "notes": [
412
+ "markdown.save delegates to markdown.replace (no lock/revision guard)."
413
+ ]
414
+ },
415
+ {
416
+ "id": "display.write",
417
+ "nodeType": "display",
418
+ "category": "resource",
419
+ "summary": "Write a full HTML report to a Display node. The user views it fullscreen on the canvas; fully-open JS by user decision (agent-authored content carries the same trust as the agent terminal).",
420
+ "params": [
421
+ {
422
+ "name": "html",
423
+ "type": "string",
424
+ "required": true,
425
+ "description": "Full self-contained HTML document."
426
+ },
427
+ {
428
+ "name": "expectedRevision",
429
+ "type": "number",
430
+ "required": false,
431
+ "description": "Optional revision guard; write fails on mismatch."
432
+ }
433
+ ],
434
+ "actor": {
435
+ "spawnGate": null,
436
+ "edgeRequired": false,
437
+ "agentAuthored": true
438
+ },
439
+ "cli": {
440
+ "command": "workflow-node-action",
441
+ "flags": [
442
+ {
443
+ "flag": "--node",
444
+ "value": "<graphNodeIdOrSessionId>"
445
+ },
446
+ {
447
+ "flag": "--action",
448
+ "value": "display.write"
449
+ },
450
+ {
451
+ "flag": "--payload",
452
+ "value": "<json>"
453
+ }
454
+ ]
455
+ },
456
+ "implementation": {
457
+ "adapter": "display",
458
+ "export": "write",
459
+ "special": false
460
+ },
461
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action display.write --payload \"{\"html\":\"<html>...</html>\"}\" --project .",
462
+ "notes": [
463
+ "Use {{excalidraw:<nodeId>}} placeholders to embed Excalidraw scenes as inline SVG."
464
+ ]
465
+ },
466
+ {
467
+ "id": "display.read",
468
+ "nodeType": "display",
469
+ "category": "resource",
470
+ "summary": "Read the current HTML report of a Display node, plus the built-in usage guide.",
471
+ "params": [],
472
+ "actor": {
473
+ "spawnGate": null,
474
+ "edgeRequired": false,
475
+ "agentAuthored": true
476
+ },
477
+ "cli": {
478
+ "command": "workflow-node-action",
479
+ "flags": [
480
+ {
481
+ "flag": "--node",
482
+ "value": "<graphNodeIdOrSessionId>"
483
+ },
484
+ {
485
+ "flag": "--action",
486
+ "value": "display.read"
487
+ },
488
+ {
489
+ "flag": "--payload",
490
+ "value": "<json>"
491
+ }
492
+ ]
493
+ },
494
+ "implementation": {
495
+ "adapter": "display",
496
+ "export": "read",
497
+ "special": false
498
+ },
499
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action display.read --project .",
500
+ "notes": []
501
+ },
502
+ {
503
+ "id": "excalidraw.readScene",
504
+ "nodeType": "excalidraw",
505
+ "category": "resource",
506
+ "summary": "Read the full excalidraw scene, revision, and title of an excalidraw node.",
507
+ "params": [],
508
+ "actor": {
509
+ "spawnGate": null,
510
+ "edgeRequired": false,
511
+ "agentAuthored": true
512
+ },
513
+ "cli": {
514
+ "command": "workflow-node-action",
515
+ "flags": [
516
+ {
517
+ "flag": "--node",
518
+ "value": "<graphNodeIdOrSessionId>"
519
+ },
520
+ {
521
+ "flag": "--action",
522
+ "value": "excalidraw.readScene"
523
+ },
524
+ {
525
+ "flag": "--payload",
526
+ "value": "<json>"
527
+ }
528
+ ]
529
+ },
530
+ "implementation": {
531
+ "adapter": "excalidraw",
532
+ "export": "readScene",
533
+ "special": false
534
+ },
535
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action excalidraw.readScene --project ."
536
+ },
537
+ {
538
+ "id": "excalidraw.patchScene",
539
+ "nodeType": "excalidraw",
540
+ "category": "resource",
541
+ "summary": "Shallow-merge a plain-object patch into the current scene (elements, appState, files, ...).",
542
+ "params": [
543
+ {
544
+ "name": "patch",
545
+ "type": "object",
546
+ "required": true,
547
+ "description": "Plain object merged into the stored scene (top-level keys only)."
548
+ }
549
+ ],
550
+ "actor": {
551
+ "spawnGate": null,
552
+ "edgeRequired": false,
553
+ "agentAuthored": true
554
+ },
555
+ "cli": {
556
+ "command": "workflow-node-action",
557
+ "flags": [
558
+ {
559
+ "flag": "--node",
560
+ "value": "<graphNodeIdOrSessionId>"
561
+ },
562
+ {
563
+ "flag": "--action",
564
+ "value": "excalidraw.patchScene"
565
+ },
566
+ {
567
+ "flag": "--payload",
568
+ "value": "<json>"
569
+ }
570
+ ]
571
+ },
572
+ "implementation": {
573
+ "adapter": "excalidraw",
574
+ "export": "patchScene",
575
+ "special": false
576
+ },
577
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action excalidraw.patchScene --payload \"{\\\"patch\\\":{\\\"appState\\\":{\\\"name\\\":\\\"diagram\\\"}}}\" --project ."
578
+ },
579
+ {
580
+ "id": "excalidraw.saveScene",
581
+ "nodeType": "excalidraw",
582
+ "category": "resource",
583
+ "summary": "Replace the entire scene; the payload must be an object with elements, appState, and files.",
584
+ "params": [
585
+ {
586
+ "name": "scene",
587
+ "type": "object",
588
+ "required": true,
589
+ "description": "Full scene object: {elements: [], appState: {}, files: {}}."
590
+ }
591
+ ],
592
+ "actor": {
593
+ "spawnGate": null,
594
+ "edgeRequired": false,
595
+ "agentAuthored": true
596
+ },
597
+ "cli": {
598
+ "command": "workflow-node-action",
599
+ "flags": [
600
+ {
601
+ "flag": "--node",
602
+ "value": "<graphNodeIdOrSessionId>"
603
+ },
604
+ {
605
+ "flag": "--action",
606
+ "value": "excalidraw.saveScene"
607
+ },
608
+ {
609
+ "flag": "--payload",
610
+ "value": "<json>"
611
+ }
612
+ ]
613
+ },
614
+ "implementation": {
615
+ "adapter": "excalidraw",
616
+ "export": "saveScene",
617
+ "special": false
618
+ },
619
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action excalidraw.saveScene --payload \"{\\\"scene\\\":{\\\"elements\\\":[],\\\"appState\\\":{},\\\"files\\\":{}}}\" --project ."
620
+ },
621
+ {
622
+ "id": "excalidraw.renderPreview",
623
+ "nodeType": "excalidraw",
624
+ "category": "resource",
625
+ "summary": "Compute a normalized viewport preview of the scene (bounding box, scale, element count).",
626
+ "params": [],
627
+ "actor": {
628
+ "spawnGate": null,
629
+ "edgeRequired": false,
630
+ "agentAuthored": true
631
+ },
632
+ "cli": {
633
+ "command": "workflow-node-action",
634
+ "flags": [
635
+ {
636
+ "flag": "--node",
637
+ "value": "<graphNodeIdOrSessionId>"
638
+ },
639
+ {
640
+ "flag": "--action",
641
+ "value": "excalidraw.renderPreview"
642
+ },
643
+ {
644
+ "flag": "--payload",
645
+ "value": "<json>"
646
+ }
647
+ ]
648
+ },
649
+ "implementation": {
650
+ "adapter": "excalidraw",
651
+ "export": "renderPreview",
652
+ "special": false
653
+ },
654
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action excalidraw.renderPreview --project ."
655
+ },
656
+ {
657
+ "id": "file.readMeta",
658
+ "nodeType": "file",
659
+ "category": "workspace",
660
+ "summary": "Read metadata of the workspace file bound to a file node (path, name, mime, size, exists, stale).",
661
+ "params": [],
662
+ "actor": {
663
+ "spawnGate": null,
664
+ "edgeRequired": false,
665
+ "agentAuthored": true
666
+ },
667
+ "cli": {
668
+ "command": "workflow-node-action",
669
+ "flags": [
670
+ {
671
+ "flag": "--node",
672
+ "value": "<graphNodeIdOrSessionId>"
673
+ },
674
+ {
675
+ "flag": "--action",
676
+ "value": "file.readMeta"
677
+ },
678
+ {
679
+ "flag": "--payload",
680
+ "value": "<json>"
681
+ }
682
+ ]
683
+ },
684
+ "implementation": {
685
+ "adapter": "file",
686
+ "export": "readMeta",
687
+ "special": false
688
+ },
689
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action file.readMeta --project ."
690
+ },
691
+ {
692
+ "id": "file.readText",
693
+ "nodeType": "file",
694
+ "category": "workspace",
695
+ "summary": "Read a bounded UTF-8 text window of the bound file (preview limits apply).",
696
+ "params": [
697
+ {
698
+ "name": "offset",
699
+ "type": "number",
700
+ "required": false,
701
+ "description": "Byte offset to start reading from."
702
+ },
703
+ {
704
+ "name": "limit",
705
+ "type": "number",
706
+ "required": false,
707
+ "description": "Maximum bytes to read."
708
+ }
709
+ ],
710
+ "actor": {
711
+ "spawnGate": null,
712
+ "edgeRequired": false,
713
+ "agentAuthored": true
714
+ },
715
+ "cli": {
716
+ "command": "workflow-node-action",
717
+ "flags": [
718
+ {
719
+ "flag": "--node",
720
+ "value": "<graphNodeIdOrSessionId>"
721
+ },
722
+ {
723
+ "flag": "--action",
724
+ "value": "file.readText"
725
+ },
726
+ {
727
+ "flag": "--payload",
728
+ "value": "<json>"
729
+ }
730
+ ]
731
+ },
732
+ "implementation": {
733
+ "adapter": "file",
734
+ "export": "readText",
735
+ "special": false
736
+ },
737
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action file.readText --payload \"{\\\"limit\\\":4096}\" --project ."
738
+ },
739
+ {
740
+ "id": "file.readBytes",
741
+ "nodeType": "file",
742
+ "category": "workspace",
743
+ "summary": "Read file metadata with etag; byte-range content is served by GET /api/workspace/file, not this adapter.",
744
+ "params": [],
745
+ "actor": {
746
+ "spawnGate": null,
747
+ "edgeRequired": false,
748
+ "agentAuthored": true
749
+ },
750
+ "cli": {
751
+ "command": "workflow-node-action",
752
+ "flags": [
753
+ {
754
+ "flag": "--node",
755
+ "value": "<graphNodeIdOrSessionId>"
756
+ },
757
+ {
758
+ "flag": "--action",
759
+ "value": "file.readBytes"
760
+ },
761
+ {
762
+ "flag": "--payload",
763
+ "value": "<json>"
764
+ }
765
+ ]
766
+ },
767
+ "implementation": {
768
+ "adapter": "file",
769
+ "export": "readBytes",
770
+ "special": false
771
+ },
772
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action file.readBytes --project .",
773
+ "notes": [
774
+ "Returns file metadata (path, name, mime, size, etag) only; actual byte-range reads go through the workspace file HTTP route."
775
+ ]
776
+ },
777
+ {
778
+ "id": "file.refresh",
779
+ "nodeType": "file",
780
+ "category": "workspace",
781
+ "summary": "Refresh the node-bound file reference against the workspace (size, mtime, etag, exists).",
782
+ "params": [],
783
+ "actor": {
784
+ "spawnGate": null,
785
+ "edgeRequired": false,
786
+ "agentAuthored": true
787
+ },
788
+ "cli": {
789
+ "command": "workflow-node-action",
790
+ "flags": [
791
+ {
792
+ "flag": "--node",
793
+ "value": "<graphNodeIdOrSessionId>"
794
+ },
795
+ {
796
+ "flag": "--action",
797
+ "value": "file.refresh"
798
+ },
799
+ {
800
+ "flag": "--payload",
801
+ "value": "<json>"
802
+ }
803
+ ]
804
+ },
805
+ "implementation": {
806
+ "adapter": "file",
807
+ "export": "refresh",
808
+ "special": false
809
+ },
810
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action file.refresh --project ."
811
+ },
812
+ {
813
+ "id": "file.writeText",
814
+ "nodeType": "file",
815
+ "category": "workspace",
816
+ "summary": "Write UTF-8 text content to the bound file through the workspace op log (full-file writes only).",
817
+ "params": [
818
+ {
819
+ "name": "content",
820
+ "type": "string",
821
+ "required": true,
822
+ "description": "Full text content to write."
823
+ },
824
+ {
825
+ "name": "offset",
826
+ "type": "number",
827
+ "required": false,
828
+ "description": "Must be 0 or omitted; partial writes are rejected."
829
+ }
830
+ ],
831
+ "actor": {
832
+ "spawnGate": null,
833
+ "edgeRequired": false,
834
+ "agentAuthored": true
835
+ },
836
+ "cli": {
837
+ "command": "workflow-node-action",
838
+ "flags": [
839
+ {
840
+ "flag": "--node",
841
+ "value": "<graphNodeIdOrSessionId>"
842
+ },
843
+ {
844
+ "flag": "--action",
845
+ "value": "file.writeText"
846
+ },
847
+ {
848
+ "flag": "--payload",
849
+ "value": "<json>"
850
+ }
851
+ ]
852
+ },
853
+ "implementation": {
854
+ "adapter": "file",
855
+ "export": "writeText",
856
+ "special": false
857
+ },
858
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action file.writeText --payload \"{\\\"content\\\":\\\"hello\\\"}\" --project ."
859
+ },
860
+ {
861
+ "id": "file.preview",
862
+ "nodeType": "file",
863
+ "category": "workspace",
864
+ "summary": "Single-call preview metadata (previewKind, mime, size, textSnippet for text files) for the bound file.",
865
+ "params": [],
866
+ "actor": {
867
+ "spawnGate": null,
868
+ "edgeRequired": false,
869
+ "agentAuthored": true
870
+ },
871
+ "cli": {
872
+ "command": "workflow-node-action",
873
+ "flags": [
874
+ {
875
+ "flag": "--node",
876
+ "value": "<graphNodeIdOrSessionId>"
877
+ },
878
+ {
879
+ "flag": "--action",
880
+ "value": "file.preview"
881
+ },
882
+ {
883
+ "flag": "--payload",
884
+ "value": "<json>"
885
+ }
886
+ ]
887
+ },
888
+ "implementation": {
889
+ "adapter": "file",
890
+ "export": "preview",
891
+ "special": false
892
+ },
893
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action file.preview --project ."
894
+ },
895
+ {
896
+ "id": "file.acquireLock",
897
+ "nodeType": "file",
898
+ "category": "workspace",
899
+ "summary": "Acquire (or renew with an existing lockId) a write lease on a file node; persisted and TTL-expiring, refused under a foreign lease.",
900
+ "params": [
901
+ {
902
+ "name": "holder",
903
+ "type": "string",
904
+ "required": true,
905
+ "description": "Owner name recorded as the lease holder."
906
+ },
907
+ {
908
+ "name": "ttlMs",
909
+ "type": "number",
910
+ "required": false,
911
+ "description": "Lease TTL in milliseconds (default 30000, capped at 300000)."
912
+ },
913
+ {
914
+ "name": "lockId",
915
+ "type": "string",
916
+ "required": false,
917
+ "description": "Existing lock id to renew; omit to create a new lease."
918
+ }
919
+ ],
920
+ "actor": {
921
+ "spawnGate": null,
922
+ "edgeRequired": false,
923
+ "agentAuthored": true
924
+ },
925
+ "cli": {
926
+ "command": "workflow-node-action",
927
+ "flags": [
928
+ {
929
+ "flag": "--node",
930
+ "value": "<graphNodeIdOrSessionId>"
931
+ },
932
+ {
933
+ "flag": "--action",
934
+ "value": "file.acquireLock"
935
+ },
936
+ {
937
+ "flag": "--payload",
938
+ "value": "<json>"
939
+ }
940
+ ]
941
+ },
942
+ "implementation": {
943
+ "adapter": "file",
944
+ "export": "acquireLock",
945
+ "special": false
946
+ },
947
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action file.acquireLock --payload \"{\\\"holder\\\":\\\"agent-x\\\",\\\"ttlMs\\\":60000}\" --project ."
948
+ },
949
+ {
950
+ "id": "file.releaseLock",
951
+ "nodeType": "file",
952
+ "category": "workspace",
953
+ "summary": "Release a write lease on a file node; only the holder may release.",
954
+ "params": [
955
+ {
956
+ "name": "holder",
957
+ "type": "string",
958
+ "required": true,
959
+ "description": "Owner name of the lease being released."
960
+ },
961
+ {
962
+ "name": "lockId",
963
+ "type": "string",
964
+ "required": false,
965
+ "description": "Lock id to release (matches holder ownership)."
966
+ }
967
+ ],
968
+ "actor": {
969
+ "spawnGate": null,
970
+ "edgeRequired": false,
971
+ "agentAuthored": true
972
+ },
973
+ "cli": {
974
+ "command": "workflow-node-action",
975
+ "flags": [
976
+ {
977
+ "flag": "--node",
978
+ "value": "<graphNodeIdOrSessionId>"
979
+ },
980
+ {
981
+ "flag": "--action",
982
+ "value": "file.releaseLock"
983
+ },
984
+ {
985
+ "flag": "--payload",
986
+ "value": "<json>"
987
+ }
988
+ ]
989
+ },
990
+ "implementation": {
991
+ "adapter": "file",
992
+ "export": "releaseLock",
993
+ "special": false
994
+ },
995
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action file.releaseLock --payload \"{\\\"holder\\\":\\\"agent-x\\\"}\" --project ."
996
+ },
997
+ {
998
+ "id": "file.readXlsx",
999
+ "nodeType": "file",
1000
+ "category": "workspace",
1001
+ "summary": "List the sheet names of the bound Excel workbook (.xlsx).",
1002
+ "params": [],
1003
+ "actor": {
1004
+ "spawnGate": null,
1005
+ "edgeRequired": false,
1006
+ "agentAuthored": true
1007
+ },
1008
+ "cli": {
1009
+ "command": "workflow-node-action",
1010
+ "flags": [
1011
+ {
1012
+ "flag": "--node",
1013
+ "value": "<graphNodeIdOrSessionId>"
1014
+ },
1015
+ {
1016
+ "flag": "--action",
1017
+ "value": "file.readXlsx"
1018
+ },
1019
+ {
1020
+ "flag": "--payload",
1021
+ "value": "<json>"
1022
+ }
1023
+ ]
1024
+ },
1025
+ "implementation": {
1026
+ "adapter": "file",
1027
+ "export": "readXlsx",
1028
+ "special": false
1029
+ },
1030
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action file.readXlsx --project ."
1031
+ },
1032
+ {
1033
+ "id": "file.readXlsxSheet",
1034
+ "nodeType": "file",
1035
+ "category": "workspace",
1036
+ "summary": "Read one Excel sheet paged: column headers plus the requested page of data rows (never the whole sheet).",
1037
+ "params": [
1038
+ {
1039
+ "name": "sheet",
1040
+ "type": "string",
1041
+ "required": false,
1042
+ "description": "Sheet name or 1-based index; defaults to the first sheet."
1043
+ },
1044
+ {
1045
+ "name": "page",
1046
+ "type": "number",
1047
+ "required": false,
1048
+ "description": "1-based page number (default 1)."
1049
+ },
1050
+ {
1051
+ "name": "pageSize",
1052
+ "type": "number",
1053
+ "required": false,
1054
+ "description": "Data rows per page (default 100)."
1055
+ }
1056
+ ],
1057
+ "actor": {
1058
+ "spawnGate": null,
1059
+ "edgeRequired": false,
1060
+ "agentAuthored": true
1061
+ },
1062
+ "cli": {
1063
+ "command": "workflow-node-action",
1064
+ "flags": [
1065
+ {
1066
+ "flag": "--node",
1067
+ "value": "<graphNodeIdOrSessionId>"
1068
+ },
1069
+ {
1070
+ "flag": "--action",
1071
+ "value": "file.readXlsxSheet"
1072
+ },
1073
+ {
1074
+ "flag": "--payload",
1075
+ "value": "<json>"
1076
+ }
1077
+ ]
1078
+ },
1079
+ "implementation": {
1080
+ "adapter": "file",
1081
+ "export": "readXlsxSheet",
1082
+ "special": false
1083
+ },
1084
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action file.readXlsxSheet --payload \"{\\\"sheet\\\":\\\"Data\\\",\\\"page\\\":1,\\\"pageSize\\\":100}\" --project ."
1085
+ },
1086
+ {
1087
+ "id": "file.readPdf",
1088
+ "nodeType": "file",
1089
+ "category": "workspace",
1090
+ "summary": "Read the bound PDF's total page count and document metadata (title, author, subject, ...).",
1091
+ "params": [],
1092
+ "actor": {
1093
+ "spawnGate": null,
1094
+ "edgeRequired": false,
1095
+ "agentAuthored": true
1096
+ },
1097
+ "cli": {
1098
+ "command": "workflow-node-action",
1099
+ "flags": [
1100
+ {
1101
+ "flag": "--node",
1102
+ "value": "<graphNodeIdOrSessionId>"
1103
+ },
1104
+ {
1105
+ "flag": "--action",
1106
+ "value": "file.readPdf"
1107
+ },
1108
+ {
1109
+ "flag": "--payload",
1110
+ "value": "<json>"
1111
+ }
1112
+ ]
1113
+ },
1114
+ "implementation": {
1115
+ "adapter": "file",
1116
+ "export": "readPdf",
1117
+ "special": false
1118
+ },
1119
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action file.readPdf --project ."
1120
+ },
1121
+ {
1122
+ "id": "file.readPdfPage",
1123
+ "nodeType": "file",
1124
+ "category": "workspace",
1125
+ "summary": "Extract a PDF page range as text with the isEvalSupported:false security baseline.",
1126
+ "params": [
1127
+ {
1128
+ "name": "page",
1129
+ "type": "number",
1130
+ "required": false,
1131
+ "description": "1-based first page (default 1)."
1132
+ },
1133
+ {
1134
+ "name": "pageCount",
1135
+ "type": "number",
1136
+ "required": false,
1137
+ "description": "Number of pages to extract starting at page (default 1)."
1138
+ }
1139
+ ],
1140
+ "actor": {
1141
+ "spawnGate": null,
1142
+ "edgeRequired": false,
1143
+ "agentAuthored": true
1144
+ },
1145
+ "cli": {
1146
+ "command": "workflow-node-action",
1147
+ "flags": [
1148
+ {
1149
+ "flag": "--node",
1150
+ "value": "<graphNodeIdOrSessionId>"
1151
+ },
1152
+ {
1153
+ "flag": "--action",
1154
+ "value": "file.readPdfPage"
1155
+ },
1156
+ {
1157
+ "flag": "--payload",
1158
+ "value": "<json>"
1159
+ }
1160
+ ]
1161
+ },
1162
+ "implementation": {
1163
+ "adapter": "file",
1164
+ "export": "readPdfPage",
1165
+ "special": false
1166
+ },
1167
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action file.readPdfPage --payload \"{\\\"page\\\":1,\\\"pageCount\\\":2}\" --project ."
1168
+ },
1169
+ {
1170
+ "id": "file.readZipEntries",
1171
+ "nodeType": "file",
1172
+ "category": "workspace",
1173
+ "summary": "List the bound ZIP archive's entries (name, size, compressedSize, directory flag, UTF-8 flag); streamed, never a whole-archive read.",
1174
+ "params": [],
1175
+ "actor": {
1176
+ "spawnGate": null,
1177
+ "edgeRequired": false,
1178
+ "agentAuthored": true
1179
+ },
1180
+ "cli": {
1181
+ "command": "workflow-node-action",
1182
+ "flags": [
1183
+ {
1184
+ "flag": "--node",
1185
+ "value": "<graphNodeIdOrSessionId>"
1186
+ },
1187
+ {
1188
+ "flag": "--action",
1189
+ "value": "file.readZipEntries"
1190
+ },
1191
+ {
1192
+ "flag": "--payload",
1193
+ "value": "<json>"
1194
+ }
1195
+ ]
1196
+ },
1197
+ "implementation": {
1198
+ "adapter": "file",
1199
+ "export": "readZipEntries",
1200
+ "special": false
1201
+ },
1202
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action file.readZipEntries --project ."
1203
+ },
1204
+ {
1205
+ "id": "file.readZipEntry",
1206
+ "nodeType": "file",
1207
+ "category": "workspace",
1208
+ "summary": "Preview a single text entry of the bound ZIP with a maxBytes bound (truncated flag when capped); binary entries are refused.",
1209
+ "params": [
1210
+ {
1211
+ "name": "entryName",
1212
+ "type": "string",
1213
+ "required": true,
1214
+ "description": "Entry name inside the archive (exact, after GBK/UTF-8 decoding)."
1215
+ },
1216
+ {
1217
+ "name": "maxBytes",
1218
+ "type": "number",
1219
+ "required": false,
1220
+ "description": "Preview byte cap (default 65536); larger entries are truncated and flagged."
1221
+ }
1222
+ ],
1223
+ "actor": {
1224
+ "spawnGate": null,
1225
+ "edgeRequired": false,
1226
+ "agentAuthored": true
1227
+ },
1228
+ "cli": {
1229
+ "command": "workflow-node-action",
1230
+ "flags": [
1231
+ {
1232
+ "flag": "--node",
1233
+ "value": "<graphNodeIdOrSessionId>"
1234
+ },
1235
+ {
1236
+ "flag": "--action",
1237
+ "value": "file.readZipEntry"
1238
+ },
1239
+ {
1240
+ "flag": "--payload",
1241
+ "value": "<json>"
1242
+ }
1243
+ ]
1244
+ },
1245
+ "implementation": {
1246
+ "adapter": "file",
1247
+ "export": "readZipEntry",
1248
+ "special": false
1249
+ },
1250
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action file.readZipEntry --payload \"{\\\"entryName\\\":\\\"readme.txt\\\"}\" --project ."
1251
+ },
1252
+ {
1253
+ "id": "file.extractZipEntry",
1254
+ "nodeType": "file",
1255
+ "category": "workspace",
1256
+ "summary": "Extract a single ZIP entry into a workspace-controlled destDir; Zip Slip traversal entries are rejected.",
1257
+ "params": [
1258
+ {
1259
+ "name": "entryName",
1260
+ "type": "string",
1261
+ "required": true,
1262
+ "description": "Entry name inside the archive; ../ and ..\\ segments or absolute paths are rejected (ZIP_SLIP)."
1263
+ },
1264
+ {
1265
+ "name": "destDir",
1266
+ "type": "string",
1267
+ "required": false,
1268
+ "description": "Workspace-relative extraction directory (default Harness/a2a/file-extracts/<nodeId>/); escapes outside the workspace are rejected."
1269
+ }
1270
+ ],
1271
+ "actor": {
1272
+ "spawnGate": null,
1273
+ "edgeRequired": false,
1274
+ "agentAuthored": true
1275
+ },
1276
+ "cli": {
1277
+ "command": "workflow-node-action",
1278
+ "flags": [
1279
+ {
1280
+ "flag": "--node",
1281
+ "value": "<graphNodeIdOrSessionId>"
1282
+ },
1283
+ {
1284
+ "flag": "--action",
1285
+ "value": "file.extractZipEntry"
1286
+ },
1287
+ {
1288
+ "flag": "--payload",
1289
+ "value": "<json>"
1290
+ }
1291
+ ]
1292
+ },
1293
+ "implementation": {
1294
+ "adapter": "file",
1295
+ "export": "extractZipEntry",
1296
+ "special": false
1297
+ },
1298
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action file.extractZipEntry --payload \"{\\\"entryName\\\":\\\"readme.txt\\\",\\\"destDir\\\":\\\"Harness/a2a/file-extracts\\\"}\" --project ."
1299
+ },
1300
+ {
1301
+ "id": "agent.readOutput",
1302
+ "nodeType": "agent",
1303
+ "category": "terminal-io",
1304
+ "summary": "Read the latest terminal output window of an agent node's session.",
1305
+ "params": [
1306
+ {
1307
+ "name": "tail",
1308
+ "type": "number",
1309
+ "required": false,
1310
+ "description": "Last n entries (default 50)."
1311
+ },
1312
+ {
1313
+ "name": "fromSeq",
1314
+ "type": "number",
1315
+ "required": false,
1316
+ "description": "Start sequence number."
1317
+ },
1318
+ {
1319
+ "name": "toSeq",
1320
+ "type": "number",
1321
+ "required": false,
1322
+ "description": "End sequence number."
1323
+ }
1324
+ ],
1325
+ "actor": {
1326
+ "spawnGate": null,
1327
+ "edgeRequired": false,
1328
+ "agentAuthored": true
1329
+ },
1330
+ "cli": {
1331
+ "command": "read-agent",
1332
+ "flags": [
1333
+ {
1334
+ "flag": "--node",
1335
+ "value": "<agentNodeId>"
1336
+ },
1337
+ {
1338
+ "flag": "--action",
1339
+ "value": "output"
1340
+ },
1341
+ {
1342
+ "flag": "--tail",
1343
+ "value": "<n>"
1344
+ }
1345
+ ]
1346
+ },
1347
+ "implementation": {
1348
+ "adapter": "agent",
1349
+ "export": "readOutput",
1350
+ "special": false
1351
+ },
1352
+ "example": "wf-ui-control.mjs read-agent --node <agentNodeId> --action output --tail 50"
1353
+ },
1354
+ {
1355
+ "id": "agent.sendInput",
1356
+ "nodeType": "agent",
1357
+ "category": "terminal-io",
1358
+ "summary": "Write terminal input to an agent node's PTY session (server control-plane route; raw or prompt-submit).",
1359
+ "params": [
1360
+ {
1361
+ "name": "data",
1362
+ "type": "string",
1363
+ "required": true,
1364
+ "description": "Input text (aliases: input, text)."
1365
+ },
1366
+ {
1367
+ "name": "submit",
1368
+ "type": "boolean",
1369
+ "required": false,
1370
+ "description": "Prompt-submit mode: char-by-char typing plus a single enter after the prompt marker."
1371
+ },
1372
+ {
1373
+ "name": "promptSubmit",
1374
+ "type": "boolean",
1375
+ "required": false,
1376
+ "description": "Alias of submit."
1377
+ },
1378
+ {
1379
+ "name": "raw",
1380
+ "type": "boolean",
1381
+ "required": false,
1382
+ "description": "Send bytes exactly as given (used by the send-key wrapper)."
1383
+ },
1384
+ {
1385
+ "name": "fromSessionId",
1386
+ "type": "string",
1387
+ "required": false,
1388
+ "description": "Actor session id (aliases: actorSessionId, sourceSessionId)."
1389
+ },
1390
+ {
1391
+ "name": "fromNodeId",
1392
+ "type": "string",
1393
+ "required": false,
1394
+ "description": "Actor workflow node id (aliases: sourceNodeId)."
1395
+ }
1396
+ ],
1397
+ "actor": {
1398
+ "spawnGate": null,
1399
+ "edgeRequired": false,
1400
+ "agentAuthored": true
1401
+ },
1402
+ "cli": {
1403
+ "command": "send-input",
1404
+ "flags": [
1405
+ {
1406
+ "flag": "--session",
1407
+ "value": "<sessionId>"
1408
+ },
1409
+ {
1410
+ "flag": "--text",
1411
+ "value": "<text>"
1412
+ },
1413
+ {
1414
+ "flag": "--raw",
1415
+ "value": ""
1416
+ }
1417
+ ]
1418
+ },
1419
+ "implementation": {
1420
+ "special": true
1421
+ },
1422
+ "example": "wf-ui-control.mjs send-input --session <sessionId> --text \"/model\"",
1423
+ "notes": [
1424
+ "Server-special-cased in server.mjs: routed to sendRuntimeSessionInput before adapter dispatch.",
1425
+ "CLI wrappers: send-input (--session/--text/--raw), send-key (raw keystroke bytes), delegate-agent (typed agent.sendInput via workflow-node-action)."
1426
+ ]
1427
+ },
1428
+ {
1429
+ "id": "agent.sendMessage",
1430
+ "nodeType": "agent",
1431
+ "category": "communication",
1432
+ "summary": "Send a structured 1-to-1 message with envelope fields to one recipient agent node.",
1433
+ "params": [
1434
+ {
1435
+ "name": "to",
1436
+ "type": "string",
1437
+ "required": true,
1438
+ "description": "Recipient agent node id or session id."
1439
+ },
1440
+ {
1441
+ "name": "text",
1442
+ "type": "string",
1443
+ "required": true,
1444
+ "description": "Message text (aliases: data, message, input)."
1445
+ },
1446
+ {
1447
+ "name": "topic",
1448
+ "type": "string",
1449
+ "required": false,
1450
+ "description": "Message topic."
1451
+ },
1452
+ {
1453
+ "name": "threadId",
1454
+ "type": "string",
1455
+ "required": false,
1456
+ "description": "Thread id for correlation."
1457
+ },
1458
+ {
1459
+ "name": "requestId",
1460
+ "type": "string",
1461
+ "required": false,
1462
+ "description": "Correlation request id."
1463
+ },
1464
+ {
1465
+ "name": "replyTo",
1466
+ "type": "string",
1467
+ "required": false,
1468
+ "description": "Reply to a prior message id."
1469
+ },
1470
+ {
1471
+ "name": "contextRefs",
1472
+ "type": "array",
1473
+ "required": false,
1474
+ "description": "Markdown node references shared with the recipient (referenced by nodeId only)."
1475
+ },
1476
+ {
1477
+ "name": "raw",
1478
+ "type": "boolean",
1479
+ "required": false,
1480
+ "description": "Mark the message raw (no envelope processing)."
1481
+ },
1482
+ {
1483
+ "name": "force",
1484
+ "type": "boolean",
1485
+ "required": false,
1486
+ "description": "Allow delivery without a graph connection to the recipient."
1487
+ }
1488
+ ],
1489
+ "actor": {
1490
+ "spawnGate": null,
1491
+ "edgeRequired": true,
1492
+ "agentAuthored": true
1493
+ },
1494
+ "cli": {
1495
+ "command": "send-agent-message",
1496
+ "flags": [
1497
+ {
1498
+ "flag": "--node",
1499
+ "value": "<senderNodeId>"
1500
+ },
1501
+ {
1502
+ "flag": "--to",
1503
+ "value": "<targetNodeId>"
1504
+ },
1505
+ {
1506
+ "flag": "--text",
1507
+ "value": "<text>"
1508
+ },
1509
+ {
1510
+ "flag": "--request-id",
1511
+ "value": "<requestId>"
1512
+ }
1513
+ ]
1514
+ },
1515
+ "implementation": {
1516
+ "adapter": "agent",
1517
+ "export": "sendMessage",
1518
+ "special": false
1519
+ },
1520
+ "example": "wf-ui-control.mjs send-agent-message --node <senderNodeId> --to <targetNodeId> --text \"task\" --request-id r1",
1521
+ "notes": [
1522
+ "Requires an existing connection between sender and recipient unless force is set (NOT_CONNECTED 403)."
1523
+ ]
1524
+ },
1525
+ {
1526
+ "id": "agent.dispatchProgress",
1527
+ "nodeType": "agent",
1528
+ "category": "event",
1529
+ "summary": "Report explicit progress for a dispatched runtime by dispatchId without interpreting PTY output.",
1530
+ "params": [
1531
+ {
1532
+ "name": "dispatchId",
1533
+ "type": "string",
1534
+ "required": true,
1535
+ "description": "Dispatch identifier returned by POST /api/sessions."
1536
+ },
1537
+ {
1538
+ "name": "progress",
1539
+ "type": "string",
1540
+ "required": true,
1541
+ "description": "Non-empty progress message."
1542
+ },
1543
+ {
1544
+ "name": "taskId",
1545
+ "type": "string",
1546
+ "required": false,
1547
+ "description": "Task identifier; defaults to HARNESS_PEER_TASK_ID in the CLI."
1548
+ },
1549
+ {
1550
+ "name": "sessionId",
1551
+ "type": "string",
1552
+ "required": false,
1553
+ "description": "Dispatch session identifier; defaults to HARNESS_PEER_SESSION_ID in the CLI."
1554
+ },
1555
+ {
1556
+ "name": "requestId",
1557
+ "type": "string",
1558
+ "required": false,
1559
+ "description": "Typed envelope correlation requestId."
1560
+ },
1561
+ {
1562
+ "name": "replyTo",
1563
+ "type": "string",
1564
+ "required": false,
1565
+ "description": "Typed envelope correlation replyTo."
1566
+ }
1567
+ ],
1568
+ "actor": {
1569
+ "spawnGate": null,
1570
+ "edgeRequired": false,
1571
+ "agentAuthored": true
1572
+ },
1573
+ "cli": {
1574
+ "command": "dispatch-progress",
1575
+ "flags": [
1576
+ {
1577
+ "flag": "--dispatch-id",
1578
+ "value": "<dispatchId>"
1579
+ },
1580
+ {
1581
+ "flag": "--text",
1582
+ "value": "<progress>"
1583
+ },
1584
+ {
1585
+ "flag": "--request-id",
1586
+ "value": "<requestId>"
1587
+ }
1588
+ ]
1589
+ },
1590
+ "implementation": {
1591
+ "special": true
1592
+ },
1593
+ "example": "wf-ui-control.mjs dispatch-progress --dispatch-id <dispatchId> --text \"Writing files\""
1594
+ },
1595
+ {
1596
+ "id": "agent.dispatchResult",
1597
+ "nodeType": "agent",
1598
+ "category": "lifecycle",
1599
+ "summary": "Deliver one explicit terminal result for a dispatched runtime by dispatchId.",
1600
+ "params": [
1601
+ {
1602
+ "name": "dispatchId",
1603
+ "type": "string",
1604
+ "required": true,
1605
+ "description": "Dispatch identifier returned by POST /api/sessions."
1606
+ },
1607
+ {
1608
+ "name": "status",
1609
+ "type": "string",
1610
+ "required": true,
1611
+ "description": "Terminal status: succeeded, failed, or cancelled."
1612
+ },
1613
+ {
1614
+ "name": "result",
1615
+ "type": "object",
1616
+ "required": false,
1617
+ "description": "Structured completion evidence; may be omitted when output is supplied."
1618
+ },
1619
+ {
1620
+ "name": "output",
1621
+ "type": "string",
1622
+ "required": false,
1623
+ "description": "Text completion evidence when no structured result is supplied."
1624
+ },
1625
+ {
1626
+ "name": "taskId",
1627
+ "type": "string",
1628
+ "required": false,
1629
+ "description": "Task identifier; defaults to HARNESS_PEER_TASK_ID in the CLI."
1630
+ },
1631
+ {
1632
+ "name": "sessionId",
1633
+ "type": "string",
1634
+ "required": false,
1635
+ "description": "Dispatch session identifier; defaults to HARNESS_PEER_SESSION_ID in the CLI."
1636
+ },
1637
+ {
1638
+ "name": "requestId",
1639
+ "type": "string",
1640
+ "required": false,
1641
+ "description": "Typed envelope correlation requestId."
1642
+ },
1643
+ {
1644
+ "name": "replyTo",
1645
+ "type": "string",
1646
+ "required": false,
1647
+ "description": "Typed envelope correlation replyTo."
1648
+ }
1649
+ ],
1650
+ "actor": {
1651
+ "spawnGate": null,
1652
+ "edgeRequired": false,
1653
+ "agentAuthored": true
1654
+ },
1655
+ "cli": {
1656
+ "command": "dispatch-result",
1657
+ "flags": [
1658
+ {
1659
+ "flag": "--dispatch-id",
1660
+ "value": "<dispatchId>"
1661
+ },
1662
+ {
1663
+ "flag": "--status",
1664
+ "value": "<succeeded|failed|cancelled>"
1665
+ },
1666
+ {
1667
+ "flag": "--result",
1668
+ "value": "<json|string>"
1669
+ },
1670
+ {
1671
+ "flag": "--reply-to",
1672
+ "value": "<requestId>"
1673
+ }
1674
+ ]
1675
+ },
1676
+ "implementation": {
1677
+ "special": true
1678
+ },
1679
+ "example": "wf-ui-control.mjs dispatch-result --dispatch-id <dispatchId> --status succeeded --result \"{\\\"files\\\":[\\\"out.txt\\\"]}\""
1680
+ },
1681
+ {
1682
+ "id": "agent.broadcastMessage",
1683
+ "nodeType": "agent",
1684
+ "category": "communication",
1685
+ "summary": "Send one structured message with envelope fields to many recipient agent nodes.",
1686
+ "params": [
1687
+ {
1688
+ "name": "to",
1689
+ "type": "array",
1690
+ "required": false,
1691
+ "description": "Recipient agent node ids or session ids; defaults to all connected agents."
1692
+ },
1693
+ {
1694
+ "name": "text",
1695
+ "type": "string",
1696
+ "required": true,
1697
+ "description": "Message text (aliases: data, message, input)."
1698
+ },
1699
+ {
1700
+ "name": "topic",
1701
+ "type": "string",
1702
+ "required": false,
1703
+ "description": "Message topic."
1704
+ },
1705
+ {
1706
+ "name": "threadId",
1707
+ "type": "string",
1708
+ "required": false,
1709
+ "description": "Thread id for correlation."
1710
+ },
1711
+ {
1712
+ "name": "requestId",
1713
+ "type": "string",
1714
+ "required": false,
1715
+ "description": "Correlation request id."
1716
+ },
1717
+ {
1718
+ "name": "contextRefs",
1719
+ "type": "array",
1720
+ "required": false,
1721
+ "description": "Markdown node references shared with recipients (referenced by nodeId only)."
1722
+ },
1723
+ {
1724
+ "name": "raw",
1725
+ "type": "boolean",
1726
+ "required": false,
1727
+ "description": "Mark the message raw (no envelope processing)."
1728
+ },
1729
+ {
1730
+ "name": "force",
1731
+ "type": "boolean",
1732
+ "required": false,
1733
+ "description": "Allow delivery without graph connections to the recipients."
1734
+ }
1735
+ ],
1736
+ "actor": {
1737
+ "spawnGate": null,
1738
+ "edgeRequired": false,
1739
+ "agentAuthored": true
1740
+ },
1741
+ "cli": {
1742
+ "command": "broadcast-agent-message",
1743
+ "flags": [
1744
+ {
1745
+ "flag": "--node",
1746
+ "value": "<senderNodeId>"
1747
+ },
1748
+ {
1749
+ "flag": "--to",
1750
+ "value": "<a,b,c>"
1751
+ },
1752
+ {
1753
+ "flag": "--text",
1754
+ "value": "<text>"
1755
+ }
1756
+ ]
1757
+ },
1758
+ "implementation": {
1759
+ "adapter": "agent",
1760
+ "export": "broadcastMessage",
1761
+ "special": false
1762
+ },
1763
+ "example": "wf-ui-control.mjs broadcast-agent-message --node <senderNodeId> --to a,b,c --text \"All hands\""
1764
+ },
1765
+ {
1766
+ "id": "agent.readMessages",
1767
+ "nodeType": "agent",
1768
+ "category": "communication",
1769
+ "summary": "Read the recorded conversation with a peer agent, aggregated by requestId, or wakeup messages.",
1770
+ "params": [
1771
+ {
1772
+ "name": "peer",
1773
+ "type": "string",
1774
+ "required": false,
1775
+ "description": "Peer agent node id or session id (aliases: to, from, target, node)."
1776
+ },
1777
+ {
1778
+ "name": "requestId",
1779
+ "type": "string",
1780
+ "required": false,
1781
+ "description": "Aggregate all replies in this request thread across peers."
1782
+ },
1783
+ {
1784
+ "name": "threadId",
1785
+ "type": "string",
1786
+ "required": false,
1787
+ "description": "Thread id filter."
1788
+ },
1789
+ {
1790
+ "name": "wakeup",
1791
+ "type": "boolean",
1792
+ "required": false,
1793
+ "description": "Read wakeup-delivery messages instead of the peer conversation."
1794
+ },
1795
+ {
1796
+ "name": "limit",
1797
+ "type": "number",
1798
+ "required": false,
1799
+ "description": "Max entries (default 200; alias: tail)."
1800
+ }
1801
+ ],
1802
+ "actor": {
1803
+ "spawnGate": null,
1804
+ "edgeRequired": false,
1805
+ "agentAuthored": true
1806
+ },
1807
+ "cli": {
1808
+ "command": "read-agent-messages",
1809
+ "flags": [
1810
+ {
1811
+ "flag": "--node",
1812
+ "value": "<senderNodeId>"
1813
+ },
1814
+ {
1815
+ "flag": "--peer",
1816
+ "value": "<peerNodeId>"
1817
+ },
1818
+ {
1819
+ "flag": "--tail",
1820
+ "value": "<n>"
1821
+ }
1822
+ ]
1823
+ },
1824
+ "implementation": {
1825
+ "adapter": "agent",
1826
+ "export": "readMessages",
1827
+ "special": false
1828
+ },
1829
+ "example": "wf-ui-control.mjs read-agent-messages --node <senderNodeId> --peer <peerNodeId>"
1830
+ },
1831
+ {
1832
+ "id": "agent.readTranscript",
1833
+ "nodeType": "agent",
1834
+ "category": "discovery",
1835
+ "summary": "Read the agent's terminal transcript window from disk.",
1836
+ "params": [
1837
+ {
1838
+ "name": "tail",
1839
+ "type": "number",
1840
+ "required": false,
1841
+ "description": "Last n entries (default 200)."
1842
+ },
1843
+ {
1844
+ "name": "fromSeq",
1845
+ "type": "number",
1846
+ "required": false,
1847
+ "description": "Start sequence number."
1848
+ },
1849
+ {
1850
+ "name": "toSeq",
1851
+ "type": "number",
1852
+ "required": false,
1853
+ "description": "End sequence number."
1854
+ }
1855
+ ],
1856
+ "actor": {
1857
+ "spawnGate": null,
1858
+ "edgeRequired": false,
1859
+ "agentAuthored": true
1860
+ },
1861
+ "cli": {
1862
+ "command": "read-agent",
1863
+ "flags": [
1864
+ {
1865
+ "flag": "--node",
1866
+ "value": "<agentNodeId>"
1867
+ },
1868
+ {
1869
+ "flag": "--action",
1870
+ "value": "transcript"
1871
+ },
1872
+ {
1873
+ "flag": "--tail",
1874
+ "value": "<n>"
1875
+ }
1876
+ ]
1877
+ },
1878
+ "implementation": {
1879
+ "adapter": "agent",
1880
+ "export": "readTranscript",
1881
+ "special": false
1882
+ },
1883
+ "example": "wf-ui-control.mjs read-agent --node <agentNodeId> --action transcript --tail 50"
1884
+ },
1885
+ {
1886
+ "id": "agent.start",
1887
+ "nodeType": "agent",
1888
+ "category": "lifecycle",
1889
+ "summary": "Start an agent node's PTY session through the server control plane (createRuntimeSession).",
1890
+ "params": [
1891
+ {
1892
+ "name": "forceRestart",
1893
+ "type": "boolean",
1894
+ "required": false,
1895
+ "description": "Restart even if the session is already live."
1896
+ },
1897
+ {
1898
+ "name": "runtime",
1899
+ "type": "string",
1900
+ "required": false,
1901
+ "description": "Peer runtime id (default: session/node runtime)."
1902
+ },
1903
+ {
1904
+ "name": "role",
1905
+ "type": "string",
1906
+ "required": false,
1907
+ "description": "Agent role title."
1908
+ },
1909
+ {
1910
+ "name": "objective",
1911
+ "type": "string",
1912
+ "required": false,
1913
+ "description": "Agent objective text."
1914
+ },
1915
+ {
1916
+ "name": "taskId",
1917
+ "type": "string",
1918
+ "required": false,
1919
+ "description": "Task capsule id."
1920
+ },
1921
+ {
1922
+ "name": "cwd",
1923
+ "type": "string",
1924
+ "required": false,
1925
+ "description": "Working directory (default: project root)."
1926
+ },
1927
+ {
1928
+ "name": "model",
1929
+ "type": "string",
1930
+ "required": false,
1931
+ "description": "Model id."
1932
+ },
1933
+ {
1934
+ "name": "provider",
1935
+ "type": "string",
1936
+ "required": false,
1937
+ "description": "Model provider."
1938
+ },
1939
+ {
1940
+ "name": "subagentMode",
1941
+ "type": "string",
1942
+ "required": false,
1943
+ "description": "built-in-subagents | wf-node-subagents."
1944
+ },
1945
+ {
1946
+ "name": "workflowMode",
1947
+ "type": "string",
1948
+ "required": false,
1949
+ "description": "Workflow mode (wf, wf-max, ...)."
1950
+ },
1951
+ {
1952
+ "name": "initialPrompt",
1953
+ "type": "string",
1954
+ "required": false,
1955
+ "description": "First task prompt auto-submitted by the runtime TUI."
1956
+ },
1957
+ {
1958
+ "name": "initialInput",
1959
+ "type": "string",
1960
+ "required": false,
1961
+ "description": "Initial terminal input."
1962
+ },
1963
+ {
1964
+ "name": "deferPtySpawn",
1965
+ "type": "boolean",
1966
+ "required": false,
1967
+ "description": "Defer PTY spawn."
1968
+ },
1969
+ {
1970
+ "name": "parentAgentId",
1971
+ "type": "string",
1972
+ "required": false,
1973
+ "description": "Parent agent session id."
1974
+ },
1975
+ {
1976
+ "name": "parentNodeId",
1977
+ "type": "string",
1978
+ "required": false,
1979
+ "description": "Parent workflow node id."
1980
+ }
1981
+ ],
1982
+ "actor": {
1983
+ "spawnGate": null,
1984
+ "edgeRequired": false,
1985
+ "agentAuthored": true
1986
+ },
1987
+ "cli": {
1988
+ "command": "create-agent",
1989
+ "flags": [
1990
+ {
1991
+ "flag": "--role",
1992
+ "value": "<roleTitle>"
1993
+ },
1994
+ {
1995
+ "flag": "--runtime",
1996
+ "value": "<runtime>"
1997
+ },
1998
+ {
1999
+ "flag": "--initial-prompt",
2000
+ "value": "<text>"
2001
+ },
2002
+ {
2003
+ "flag": "--model",
2004
+ "value": "<model>"
2005
+ }
2006
+ ]
2007
+ },
2008
+ "implementation": {
2009
+ "special": true
2010
+ },
2011
+ "example": "wf-ui-control.mjs create-agent --role implementer --initial-prompt \"Implement X\"",
2012
+ "notes": [
2013
+ "Server-special-cased in server.mjs: routed to startWorkflowGraphNode (session registry + PTY spawn). The agent adapter export only throws USE_A2A_START.",
2014
+ "CLI create-agent is the primary path for creating agent nodes (POST /api/sessions)."
2015
+ ]
2016
+ },
2017
+ {
2018
+ "id": "agent.stop",
2019
+ "nodeType": "agent",
2020
+ "category": "lifecycle",
2021
+ "summary": "Stop an agent node's session and kill its PTY process.",
2022
+ "params": [],
2023
+ "actor": {
2024
+ "spawnGate": null,
2025
+ "edgeRequired": false,
2026
+ "agentAuthored": true
2027
+ },
2028
+ "cli": null,
2029
+ "implementation": {
2030
+ "special": true
2031
+ },
2032
+ "example": "POST /api/workflow/nodes/<nodeId>/actions/agent.stop",
2033
+ "notes": [
2034
+ "Server-special-cased in server.mjs: routed to stopRuntimeSession. The agent adapter export stops the PTY directly when reached in-process."
2035
+ ]
2036
+ },
2037
+ {
2038
+ "id": "agent.restart",
2039
+ "nodeType": "agent",
2040
+ "category": "lifecycle",
2041
+ "summary": "Restart an agent node: start a fresh session and stop the previous one.",
2042
+ "params": [
2043
+ {
2044
+ "name": "runtime",
2045
+ "type": "string",
2046
+ "required": false,
2047
+ "description": "Peer runtime id (default: session/node runtime)."
2048
+ },
2049
+ {
2050
+ "name": "role",
2051
+ "type": "string",
2052
+ "required": false,
2053
+ "description": "Agent role title."
2054
+ },
2055
+ {
2056
+ "name": "objective",
2057
+ "type": "string",
2058
+ "required": false,
2059
+ "description": "Agent objective text."
2060
+ },
2061
+ {
2062
+ "name": "taskId",
2063
+ "type": "string",
2064
+ "required": false,
2065
+ "description": "Task capsule id."
2066
+ },
2067
+ {
2068
+ "name": "model",
2069
+ "type": "string",
2070
+ "required": false,
2071
+ "description": "Model id."
2072
+ },
2073
+ {
2074
+ "name": "provider",
2075
+ "type": "string",
2076
+ "required": false,
2077
+ "description": "Model provider."
2078
+ },
2079
+ {
2080
+ "name": "subagentMode",
2081
+ "type": "string",
2082
+ "required": false,
2083
+ "description": "built-in-subagents | wf-node-subagents."
2084
+ },
2085
+ {
2086
+ "name": "initialPrompt",
2087
+ "type": "string",
2088
+ "required": false,
2089
+ "description": "First task prompt auto-submitted by the runtime TUI."
2090
+ },
2091
+ {
2092
+ "name": "initialInput",
2093
+ "type": "string",
2094
+ "required": false,
2095
+ "description": "Initial terminal input."
2096
+ }
2097
+ ],
2098
+ "actor": {
2099
+ "spawnGate": null,
2100
+ "edgeRequired": false,
2101
+ "agentAuthored": true
2102
+ },
2103
+ "cli": null,
2104
+ "implementation": {
2105
+ "special": true
2106
+ },
2107
+ "example": "POST /api/workflow/nodes/<nodeId>/actions/agent.restart",
2108
+ "notes": [
2109
+ "Server-special-cased in server.mjs: routed to restartWorkflowGraphNode (forceRestart is forced internally). The agent adapter export only throws USE_A2A_START."
2110
+ ]
2111
+ },
2112
+ {
2113
+ "id": "agent.deleteAgentNode",
2114
+ "nodeType": "agent",
2115
+ "category": "lifecycle",
2116
+ "summary": "Delete an agent node from the workflow graph (must be stopped first).",
2117
+ "params": [],
2118
+ "actor": {
2119
+ "spawnGate": null,
2120
+ "edgeRequired": false,
2121
+ "agentAuthored": true
2122
+ },
2123
+ "cli": null,
2124
+ "implementation": {
2125
+ "adapter": "agent",
2126
+ "export": "deleteAgentNode",
2127
+ "special": false
2128
+ },
2129
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action agent.deleteAgentNode --project .",
2130
+ "notes": [
2131
+ "Rejects deletion of running/starting agents (NODE_LIVE 409); also exported as adapter suffix 'delete' (agent.delete)."
2132
+ ]
2133
+ },
2134
+ {
2135
+ "id": "agent.delete",
2136
+ "nodeType": "agent",
2137
+ "category": "lifecycle",
2138
+ "summary": "Delete an agent node (alias export of deleteAgentNode under the adapter suffix 'delete').",
2139
+ "params": [],
2140
+ "actor": {
2141
+ "spawnGate": null,
2142
+ "edgeRequired": false,
2143
+ "agentAuthored": true
2144
+ },
2145
+ "cli": {
2146
+ "command": "workflow-node-action",
2147
+ "flags": [
2148
+ {
2149
+ "flag": "--node",
2150
+ "value": "<graphNodeIdOrSessionId>"
2151
+ },
2152
+ {
2153
+ "flag": "--action",
2154
+ "value": "agent.delete"
2155
+ },
2156
+ {
2157
+ "flag": "--payload",
2158
+ "value": "<json>"
2159
+ }
2160
+ ]
2161
+ },
2162
+ "implementation": {
2163
+ "adapter": "agent",
2164
+ "export": "delete",
2165
+ "special": false
2166
+ },
2167
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action agent.delete --project .",
2168
+ "notes": [
2169
+ "Routed alias of agent.deleteAgentNode (agent-node.mjs exports deleteAgentNode as delete)."
2170
+ ]
2171
+ },
2172
+ {
2173
+ "id": "agent.readContext",
2174
+ "nodeType": "agent",
2175
+ "category": "discovery",
2176
+ "summary": "Build an agent node's workflow context: identity, connected peers, and available actions.",
2177
+ "params": [],
2178
+ "actor": {
2179
+ "spawnGate": null,
2180
+ "edgeRequired": false,
2181
+ "agentAuthored": true
2182
+ },
2183
+ "cli": {
2184
+ "command": "read-agent",
2185
+ "flags": [
2186
+ {
2187
+ "flag": "--node",
2188
+ "value": "<agentNodeId>"
2189
+ },
2190
+ {
2191
+ "flag": "--action",
2192
+ "value": "context"
2193
+ }
2194
+ ]
2195
+ },
2196
+ "implementation": {
2197
+ "special": true
2198
+ },
2199
+ "example": "wf-ui-control.mjs read-agent --node <agentNodeId> --action context",
2200
+ "notes": [
2201
+ "Special-cased route in workflow-node-runtime executeNodeAction: delegates to getNodeContext (component, agent, event, capability, goal nodes all supported)."
2202
+ ]
2203
+ },
2204
+ {
2205
+ "id": "agent.setModel",
2206
+ "nodeType": "agent",
2207
+ "category": "config",
2208
+ "summary": "Switch an agent node's model by writing the project-scope runtime config file (restart required).",
2209
+ "params": [
2210
+ {
2211
+ "name": "model",
2212
+ "type": "string",
2213
+ "required": true,
2214
+ "description": "Model id to write into the project config (max 100 chars)."
2215
+ },
2216
+ {
2217
+ "name": "actorSessionId",
2218
+ "type": "string",
2219
+ "required": false,
2220
+ "description": "Actor session id (aliases: fromSessionId, sourceSessionId)."
2221
+ }
2222
+ ],
2223
+ "actor": {
2224
+ "spawnGate": null,
2225
+ "edgeRequired": false,
2226
+ "agentAuthored": true
2227
+ },
2228
+ "cli": null,
2229
+ "implementation": {
2230
+ "special": true
2231
+ },
2232
+ "example": "POST /api/workflow/nodes/<nodeId>/actions/agent.setModel --data '{\"model\":\"claude-sonnet-4-5\"}'",
2233
+ "notes": [
2234
+ "Server-special-cased in server.mjs: routed to setWorkflowNodeModel; only PROJECT-scope config files are written, and a missing config file is refused (409).",
2235
+ "No CLI command yet."
2236
+ ]
2237
+ },
2238
+ {
2239
+ "id": "agent.layout",
2240
+ "nodeType": "agent",
2241
+ "category": "graph",
2242
+ "summary": "Auto-layout all non-docked workflow graph node positions (tree or grid) as a Main Agent actor.",
2243
+ "params": [
2244
+ {
2245
+ "name": "mode",
2246
+ "type": "string",
2247
+ "required": false,
2248
+ "description": "Layout mode: 'tree' (default) or 'grid'."
2249
+ },
2250
+ {
2251
+ "name": "originX",
2252
+ "type": "number",
2253
+ "required": false,
2254
+ "description": "Origin x (default 260)."
2255
+ },
2256
+ {
2257
+ "name": "originY",
2258
+ "type": "number",
2259
+ "required": false,
2260
+ "description": "Origin y (default 220)."
2261
+ },
2262
+ {
2263
+ "name": "gapX",
2264
+ "type": "number",
2265
+ "required": false,
2266
+ "description": "Horizontal gap (default 420)."
2267
+ },
2268
+ {
2269
+ "name": "gapY",
2270
+ "type": "number",
2271
+ "required": false,
2272
+ "description": "Vertical gap (default 140)."
2273
+ },
2274
+ {
2275
+ "name": "actorNodeId",
2276
+ "type": "string",
2277
+ "required": false,
2278
+ "description": "Actor node id (must be a Main Agent node)."
2279
+ }
2280
+ ],
2281
+ "actor": {
2282
+ "spawnGate": null,
2283
+ "edgeRequired": false,
2284
+ "agentAuthored": true
2285
+ },
2286
+ "cli": {
2287
+ "command": "node-map",
2288
+ "flags": [
2289
+ {
2290
+ "flag": "--action",
2291
+ "value": "layout"
2292
+ },
2293
+ {
2294
+ "flag": "--layout-mode",
2295
+ "value": "<grid|tree>"
2296
+ }
2297
+ ]
2298
+ },
2299
+ "implementation": {
2300
+ "special": true
2301
+ },
2302
+ "example": "wf-ui-control.mjs node-map --action layout --actor <graphNodeId> --layout-mode tree",
2303
+ "notes": [
2304
+ "Server-special-cased in server.mjs: routed to executeGraphLayoutAction; requires a Main Agent graph node actor (MAIN_AGENT_REQUIRED 403)."
2305
+ ]
2306
+ },
2307
+ {
2308
+ "id": "timer.read",
2309
+ "nodeType": "timer",
2310
+ "category": "event",
2311
+ "summary": "Read a timer node's full state: schedule, heartbeat, loop, whileGuard, taskBinding, controlPolicy, payloadTemplate.",
2312
+ "params": [],
2313
+ "actor": {
2314
+ "spawnGate": null,
2315
+ "edgeRequired": false,
2316
+ "agentAuthored": true
2317
+ },
2318
+ "cli": {
2319
+ "command": "workflow-node-action",
2320
+ "flags": [
2321
+ {
2322
+ "flag": "--node",
2323
+ "value": "<graphNodeIdOrSessionId>"
2324
+ },
2325
+ {
2326
+ "flag": "--action",
2327
+ "value": "timer.read"
2328
+ },
2329
+ {
2330
+ "flag": "--payload",
2331
+ "value": "<json>"
2332
+ }
2333
+ ]
2334
+ },
2335
+ "implementation": {
2336
+ "adapter": "timer",
2337
+ "export": "read",
2338
+ "special": false
2339
+ },
2340
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action timer.read --project ."
2341
+ },
2342
+ {
2343
+ "id": "timer.fire",
2344
+ "nodeType": "timer",
2345
+ "category": "event",
2346
+ "summary": "Record a fired event on the timer (backend-internal; scheduler-owned).",
2347
+ "params": [
2348
+ {
2349
+ "name": "payload",
2350
+ "type": "object",
2351
+ "required": false,
2352
+ "description": "Event payload; defaults to the timer's payloadTemplate."
2353
+ }
2354
+ ],
2355
+ "actor": {
2356
+ "spawnGate": null,
2357
+ "edgeRequired": false,
2358
+ "agentAuthored": false
2359
+ },
2360
+ "cli": null,
2361
+ "implementation": {
2362
+ "adapter": "timer",
2363
+ "export": "fire",
2364
+ "special": false
2365
+ },
2366
+ "example": "(internal) timer-wakeup-scheduler.mjs invokes timer-node fire() directly",
2367
+ "notes": [
2368
+ "Backend-internal action: the HTTP surface denies every actor except the main/controller agent and the internal scheduler marker (F1/F3)."
2369
+ ]
2370
+ },
2371
+ {
2372
+ "id": "timer.configure",
2373
+ "nodeType": "timer",
2374
+ "category": "config",
2375
+ "summary": "Configure a timer node (title, enabled, schedule, heartbeat); agent actors cannot mutate policy/template/loop/binding fields.",
2376
+ "params": [
2377
+ {
2378
+ "name": "title",
2379
+ "type": "string",
2380
+ "required": false,
2381
+ "description": "Node title."
2382
+ },
2383
+ {
2384
+ "name": "enabled",
2385
+ "type": "boolean",
2386
+ "required": false,
2387
+ "description": "Whether the timer is enabled."
2388
+ },
2389
+ {
2390
+ "name": "schedule",
2391
+ "type": "object",
2392
+ "required": false,
2393
+ "description": "Schedule: {intervalSeconds, mode} (mode: manual|once|interval|cron|loop|adaptive|watchdog|while|task)."
2394
+ },
2395
+ {
2396
+ "name": "heartbeat",
2397
+ "type": "object",
2398
+ "required": false,
2399
+ "description": "Heartbeat: {watchdog: {enabled, intervalSeconds, timeoutSeconds}}."
2400
+ },
2401
+ {
2402
+ "name": "controlPolicy",
2403
+ "type": "object",
2404
+ "required": false,
2405
+ "description": "Control policy (main-only; agent configure is denied CONTROL_DENIED 403)."
2406
+ },
2407
+ {
2408
+ "name": "payloadTemplate",
2409
+ "type": "object",
2410
+ "required": false,
2411
+ "description": "Default event payload (main-only)."
2412
+ },
2413
+ {
2414
+ "name": "loop",
2415
+ "type": "object",
2416
+ "required": false,
2417
+ "description": "Loop guard config (main-only)."
2418
+ },
2419
+ {
2420
+ "name": "whileGuard",
2421
+ "type": "object",
2422
+ "required": false,
2423
+ "description": "While guard config (main-only)."
2424
+ },
2425
+ {
2426
+ "name": "taskBinding",
2427
+ "type": "object",
2428
+ "required": false,
2429
+ "description": "Task binding (main-only)."
2430
+ },
2431
+ {
2432
+ "name": "actorNodeId",
2433
+ "type": "string",
2434
+ "required": false,
2435
+ "description": "When present, agent policy checks are applied (enable/disable/setInterval/setMode/ackWatchdog)."
2436
+ }
2437
+ ],
2438
+ "actor": {
2439
+ "spawnGate": null,
2440
+ "edgeRequired": true,
2441
+ "agentAuthored": true
2442
+ },
2443
+ "cli": {
2444
+ "command": "workflow-node-action",
2445
+ "flags": [
2446
+ {
2447
+ "flag": "--node",
2448
+ "value": "<graphNodeIdOrSessionId>"
2449
+ },
2450
+ {
2451
+ "flag": "--action",
2452
+ "value": "timer.configure"
2453
+ },
2454
+ {
2455
+ "flag": "--payload",
2456
+ "value": "<json>"
2457
+ }
2458
+ ]
2459
+ },
2460
+ "implementation": {
2461
+ "adapter": "timer",
2462
+ "export": "configure",
2463
+ "special": false
2464
+ },
2465
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action timer.configure --payload \"{\\\"enabled\\\":true,\\\"schedule\\\":{\\\"intervalSeconds\\\":60}}\" --project ."
2466
+ },
2467
+ {
2468
+ "id": "timer.enable",
2469
+ "nodeType": "timer",
2470
+ "category": "event",
2471
+ "summary": "Enable a timer node (schedule + base heartbeat).",
2472
+ "params": [],
2473
+ "actor": {
2474
+ "spawnGate": null,
2475
+ "edgeRequired": true,
2476
+ "agentAuthored": true
2477
+ },
2478
+ "cli": {
2479
+ "command": "workflow-node-action",
2480
+ "flags": [
2481
+ {
2482
+ "flag": "--node",
2483
+ "value": "<graphNodeIdOrSessionId>"
2484
+ },
2485
+ {
2486
+ "flag": "--action",
2487
+ "value": "timer.enable"
2488
+ },
2489
+ {
2490
+ "flag": "--payload",
2491
+ "value": "<json>"
2492
+ }
2493
+ ]
2494
+ },
2495
+ "implementation": {
2496
+ "adapter": "timer",
2497
+ "export": "enable",
2498
+ "special": false
2499
+ },
2500
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action timer.enable --project ."
2501
+ },
2502
+ {
2503
+ "id": "timer.disable",
2504
+ "nodeType": "timer",
2505
+ "category": "event",
2506
+ "summary": "Disable a timer node (subject to control policy).",
2507
+ "params": [],
2508
+ "actor": {
2509
+ "spawnGate": null,
2510
+ "edgeRequired": true,
2511
+ "agentAuthored": true
2512
+ },
2513
+ "cli": {
2514
+ "command": "workflow-node-action",
2515
+ "flags": [
2516
+ {
2517
+ "flag": "--node",
2518
+ "value": "<graphNodeIdOrSessionId>"
2519
+ },
2520
+ {
2521
+ "flag": "--action",
2522
+ "value": "timer.disable"
2523
+ },
2524
+ {
2525
+ "flag": "--payload",
2526
+ "value": "<json>"
2527
+ }
2528
+ ]
2529
+ },
2530
+ "implementation": {
2531
+ "adapter": "timer",
2532
+ "export": "disable",
2533
+ "special": false
2534
+ },
2535
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action timer.disable --project ."
2536
+ },
2537
+ {
2538
+ "id": "timer.setInterval",
2539
+ "nodeType": "timer",
2540
+ "category": "config",
2541
+ "summary": "Set the timer interval seconds (clamped by control policy; lane selects base or watchdog).",
2542
+ "params": [
2543
+ {
2544
+ "name": "intervalSeconds",
2545
+ "type": "number",
2546
+ "required": false,
2547
+ "description": "Interval in seconds (clamped to policy min/max)."
2548
+ },
2549
+ {
2550
+ "name": "lane",
2551
+ "type": "string",
2552
+ "required": false,
2553
+ "description": "'base' (default) or 'watchdog' heartbeat lane."
2554
+ }
2555
+ ],
2556
+ "actor": {
2557
+ "spawnGate": null,
2558
+ "edgeRequired": true,
2559
+ "agentAuthored": true
2560
+ },
2561
+ "cli": {
2562
+ "command": "workflow-node-action",
2563
+ "flags": [
2564
+ {
2565
+ "flag": "--node",
2566
+ "value": "<graphNodeIdOrSessionId>"
2567
+ },
2568
+ {
2569
+ "flag": "--action",
2570
+ "value": "timer.setInterval"
2571
+ },
2572
+ {
2573
+ "flag": "--payload",
2574
+ "value": "<json>"
2575
+ }
2576
+ ]
2577
+ },
2578
+ "implementation": {
2579
+ "adapter": "timer",
2580
+ "export": "setInterval",
2581
+ "special": false
2582
+ },
2583
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action timer.setInterval --payload \"{\\\"intervalSeconds\\\":120}\" --project ."
2584
+ },
2585
+ {
2586
+ "id": "timer.setMode",
2587
+ "nodeType": "timer",
2588
+ "category": "config",
2589
+ "summary": "Set the timer schedule mode (manual|once|interval|cron|loop|adaptive|watchdog|while|task).",
2590
+ "params": [
2591
+ {
2592
+ "name": "mode",
2593
+ "type": "string",
2594
+ "required": false,
2595
+ "description": "Schedule mode; invalid values keep the current mode."
2596
+ }
2597
+ ],
2598
+ "actor": {
2599
+ "spawnGate": null,
2600
+ "edgeRequired": true,
2601
+ "agentAuthored": true
2602
+ },
2603
+ "cli": {
2604
+ "command": "workflow-node-action",
2605
+ "flags": [
2606
+ {
2607
+ "flag": "--node",
2608
+ "value": "<graphNodeIdOrSessionId>"
2609
+ },
2610
+ {
2611
+ "flag": "--action",
2612
+ "value": "timer.setMode"
2613
+ },
2614
+ {
2615
+ "flag": "--payload",
2616
+ "value": "<json>"
2617
+ }
2618
+ ]
2619
+ },
2620
+ "implementation": {
2621
+ "adapter": "timer",
2622
+ "export": "setMode",
2623
+ "special": false
2624
+ },
2625
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action timer.setMode --payload \"{\\\"mode\\\":\\\"interval\\\"}\" --project ."
2626
+ },
2627
+ {
2628
+ "id": "timer.ackWatchdog",
2629
+ "nodeType": "timer",
2630
+ "category": "event",
2631
+ "summary": "Acknowledge the timer watchdog heartbeat (marks state ok with lastAckAt).",
2632
+ "params": [
2633
+ {
2634
+ "name": "now",
2635
+ "type": "string",
2636
+ "required": false,
2637
+ "description": "ISO timestamp override (default: current time)."
2638
+ }
2639
+ ],
2640
+ "actor": {
2641
+ "spawnGate": null,
2642
+ "edgeRequired": true,
2643
+ "agentAuthored": true
2644
+ },
2645
+ "cli": {
2646
+ "command": "workflow-node-action",
2647
+ "flags": [
2648
+ {
2649
+ "flag": "--node",
2650
+ "value": "<graphNodeIdOrSessionId>"
2651
+ },
2652
+ {
2653
+ "flag": "--action",
2654
+ "value": "timer.ackWatchdog"
2655
+ },
2656
+ {
2657
+ "flag": "--payload",
2658
+ "value": "<json>"
2659
+ }
2660
+ ]
2661
+ },
2662
+ "implementation": {
2663
+ "adapter": "timer",
2664
+ "export": "ackWatchdog",
2665
+ "special": false
2666
+ },
2667
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action timer.ackWatchdog --project ."
2668
+ },
2669
+ {
2670
+ "id": "timer.resetWatchdog",
2671
+ "nodeType": "timer",
2672
+ "category": "event",
2673
+ "summary": "Reset the timer watchdog heartbeat (clears missed count and last ping).",
2674
+ "params": [
2675
+ {
2676
+ "name": "now",
2677
+ "type": "string",
2678
+ "required": false,
2679
+ "description": "ISO timestamp override (default: current time)."
2680
+ }
2681
+ ],
2682
+ "actor": {
2683
+ "spawnGate": null,
2684
+ "edgeRequired": true,
2685
+ "agentAuthored": true
2686
+ },
2687
+ "cli": {
2688
+ "command": "workflow-node-action",
2689
+ "flags": [
2690
+ {
2691
+ "flag": "--node",
2692
+ "value": "<graphNodeIdOrSessionId>"
2693
+ },
2694
+ {
2695
+ "flag": "--action",
2696
+ "value": "timer.resetWatchdog"
2697
+ },
2698
+ {
2699
+ "flag": "--payload",
2700
+ "value": "<json>"
2701
+ }
2702
+ ]
2703
+ },
2704
+ "implementation": {
2705
+ "adapter": "timer",
2706
+ "export": "resetWatchdog",
2707
+ "special": false
2708
+ },
2709
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action timer.resetWatchdog --project ."
2710
+ },
2711
+ {
2712
+ "id": "timer.dispatchWakeup",
2713
+ "nodeType": "timer",
2714
+ "category": "event",
2715
+ "summary": "Compose the wakeup envelope and append it to the message queue of every agent in the timer's magnetic group (backend-internal).",
2716
+ "params": [
2717
+ {
2718
+ "name": "firedAt",
2719
+ "type": "string",
2720
+ "required": false,
2721
+ "description": "ISO fired timestamp."
2722
+ },
2723
+ {
2724
+ "name": "scheduledAt",
2725
+ "type": "string",
2726
+ "required": false,
2727
+ "description": "ISO scheduled timestamp."
2728
+ },
2729
+ {
2730
+ "name": "intervalSeconds",
2731
+ "type": "number",
2732
+ "required": false,
2733
+ "description": "Interval reported in the wakeup envelope."
2734
+ }
2735
+ ],
2736
+ "actor": {
2737
+ "spawnGate": null,
2738
+ "edgeRequired": false,
2739
+ "agentAuthored": false
2740
+ },
2741
+ "cli": null,
2742
+ "implementation": {
2743
+ "adapter": "timer",
2744
+ "export": "dispatchWakeup",
2745
+ "special": false
2746
+ },
2747
+ "example": "(internal) timer-wakeup-scheduler.mjs invokes timer-node dispatchWakeup() directly",
2748
+ "notes": [
2749
+ "Backend-internal: wakeups land in the message store only (never PTY stdin); agents read them on their next turn. HTTP surface is main/controller or internal-scheduler only."
2750
+ ]
2751
+ },
2752
+ {
2753
+ "id": "timer.tick",
2754
+ "nodeType": "timer",
2755
+ "category": "event",
2756
+ "summary": "Advance the timer heartbeat (base due events and watchdog timeouts); scheduler-owned.",
2757
+ "params": [
2758
+ {
2759
+ "name": "now",
2760
+ "type": "string",
2761
+ "required": false,
2762
+ "description": "ISO timestamp override (default: current time)."
2763
+ }
2764
+ ],
2765
+ "actor": {
2766
+ "spawnGate": null,
2767
+ "edgeRequired": false,
2768
+ "agentAuthored": false
2769
+ },
2770
+ "cli": null,
2771
+ "implementation": {
2772
+ "adapter": "timer",
2773
+ "export": "tick",
2774
+ "special": false
2775
+ },
2776
+ "example": "(internal) timer-wakeup-scheduler.mjs invokes timer-node tick() directly",
2777
+ "notes": [
2778
+ "Backend-internal action: HTTP surface is main/controller or internal-scheduler only (F1/F3)."
2779
+ ]
2780
+ },
2781
+ {
2782
+ "id": "github-trigger.read",
2783
+ "nodeType": "github-trigger",
2784
+ "category": "event",
2785
+ "summary": "Read a github-trigger node's state: repository, eventFilters, payloadTemplate, delivery counters, last event.",
2786
+ "params": [],
2787
+ "actor": {
2788
+ "spawnGate": null,
2789
+ "edgeRequired": false,
2790
+ "agentAuthored": true
2791
+ },
2792
+ "cli": {
2793
+ "command": "workflow-node-action",
2794
+ "flags": [
2795
+ {
2796
+ "flag": "--node",
2797
+ "value": "<graphNodeIdOrSessionId>"
2798
+ },
2799
+ {
2800
+ "flag": "--action",
2801
+ "value": "github-trigger.read"
2802
+ },
2803
+ {
2804
+ "flag": "--payload",
2805
+ "value": "<json>"
2806
+ }
2807
+ ]
2808
+ },
2809
+ "implementation": {
2810
+ "adapter": "github-trigger",
2811
+ "export": "read",
2812
+ "special": false
2813
+ },
2814
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action github-trigger.read --project ."
2815
+ },
2816
+ {
2817
+ "id": "github-trigger.receive",
2818
+ "nodeType": "github-trigger",
2819
+ "category": "event",
2820
+ "summary": "Record an inbound GitHub webhook delivery event (runtime action; webhook intake).",
2821
+ "params": [
2822
+ {
2823
+ "name": "event",
2824
+ "type": "string",
2825
+ "required": false,
2826
+ "description": "GitHub event name (aliases: githubEvent, name)."
2827
+ },
2828
+ {
2829
+ "name": "action",
2830
+ "type": "string",
2831
+ "required": false,
2832
+ "description": "Event action (e.g. opened, closed)."
2833
+ },
2834
+ {
2835
+ "name": "repository",
2836
+ "type": "object",
2837
+ "required": false,
2838
+ "description": "Repository: {owner, name, fullName} (or {full_name})."
2839
+ },
2840
+ {
2841
+ "name": "deliveryId",
2842
+ "type": "string",
2843
+ "required": false,
2844
+ "description": "Webhook delivery id (aliases: deliveryID, id)."
2845
+ },
2846
+ {
2847
+ "name": "pullRequest",
2848
+ "type": "object",
2849
+ "required": false,
2850
+ "description": "Pull request: {number, title, url} (alias: pull_request)."
2851
+ },
2852
+ {
2853
+ "name": "issue",
2854
+ "type": "object",
2855
+ "required": false,
2856
+ "description": "Issue: {number, title, url}."
2857
+ },
2858
+ {
2859
+ "name": "release",
2860
+ "type": "object",
2861
+ "required": false,
2862
+ "description": "Release: {tagName, name, url} (alias: tag_name)."
2863
+ },
2864
+ {
2865
+ "name": "workflowRun",
2866
+ "type": "object",
2867
+ "required": false,
2868
+ "description": "Workflow run: {id, name, status, conclusion, url} (alias: workflow_run)."
2869
+ },
2870
+ {
2871
+ "name": "ref",
2872
+ "type": "string",
2873
+ "required": false,
2874
+ "description": "Git ref."
2875
+ },
2876
+ {
2877
+ "name": "sender",
2878
+ "type": "object",
2879
+ "required": false,
2880
+ "description": "Sender login (or plain string)."
2881
+ },
2882
+ {
2883
+ "name": "dedupeKey",
2884
+ "type": "string",
2885
+ "required": false,
2886
+ "description": "Dedupe key; defaults to a composition of event/repo/ref."
2887
+ }
2888
+ ],
2889
+ "actor": {
2890
+ "spawnGate": null,
2891
+ "edgeRequired": false,
2892
+ "agentAuthored": false
2893
+ },
2894
+ "cli": null,
2895
+ "implementation": {
2896
+ "adapter": "github-trigger",
2897
+ "export": "receive",
2898
+ "special": false
2899
+ },
2900
+ "example": "(webhook) POST to the github-trigger node action route with the delivery payload",
2901
+ "notes": [
2902
+ "Runtime action in the ontology; designed for webhook intake rather than agent-authored calls."
2903
+ ]
2904
+ },
2905
+ {
2906
+ "id": "github-trigger.configure",
2907
+ "nodeType": "github-trigger",
2908
+ "category": "config",
2909
+ "summary": "Configure a github-trigger node (title, enabled, repository, eventFilters, payloadTemplate).",
2910
+ "params": [
2911
+ {
2912
+ "name": "title",
2913
+ "type": "string",
2914
+ "required": false,
2915
+ "description": "Node title."
2916
+ },
2917
+ {
2918
+ "name": "enabled",
2919
+ "type": "boolean",
2920
+ "required": false,
2921
+ "description": "Whether the trigger is enabled."
2922
+ },
2923
+ {
2924
+ "name": "repository",
2925
+ "type": "object",
2926
+ "required": false,
2927
+ "description": "Repository binding: {owner, name}."
2928
+ },
2929
+ {
2930
+ "name": "eventFilters",
2931
+ "type": "array",
2932
+ "required": false,
2933
+ "description": "Filtered event names/actions."
2934
+ },
2935
+ {
2936
+ "name": "payloadTemplate",
2937
+ "type": "object",
2938
+ "required": false,
2939
+ "description": "Default delivery payload template."
2940
+ }
2941
+ ],
2942
+ "actor": {
2943
+ "spawnGate": null,
2944
+ "edgeRequired": false,
2945
+ "agentAuthored": true
2946
+ },
2947
+ "cli": {
2948
+ "command": "workflow-node-action",
2949
+ "flags": [
2950
+ {
2951
+ "flag": "--node",
2952
+ "value": "<graphNodeIdOrSessionId>"
2953
+ },
2954
+ {
2955
+ "flag": "--action",
2956
+ "value": "github-trigger.configure"
2957
+ },
2958
+ {
2959
+ "flag": "--payload",
2960
+ "value": "<json>"
2961
+ }
2962
+ ]
2963
+ },
2964
+ "implementation": {
2965
+ "adapter": "github-trigger",
2966
+ "export": "configure",
2967
+ "special": false
2968
+ },
2969
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action github-trigger.configure --payload \"{\\\"enabled\\\":true}\" --project ."
2970
+ },
2971
+ {
2972
+ "id": "skill-group.read",
2973
+ "nodeType": "skill-group",
2974
+ "category": "capability",
2975
+ "summary": "Read a skill-group node: description, sourceGroup, skills, skillNames, skillCount, nodeSemantics.",
2976
+ "params": [],
2977
+ "actor": {
2978
+ "spawnGate": null,
2979
+ "edgeRequired": false,
2980
+ "agentAuthored": true
2981
+ },
2982
+ "cli": {
2983
+ "command": "workflow-node-action",
2984
+ "flags": [
2985
+ {
2986
+ "flag": "--node",
2987
+ "value": "<graphNodeIdOrSessionId>"
2988
+ },
2989
+ {
2990
+ "flag": "--action",
2991
+ "value": "skill-group.read"
2992
+ },
2993
+ {
2994
+ "flag": "--payload",
2995
+ "value": "<json>"
2996
+ }
2997
+ ]
2998
+ },
2999
+ "implementation": {
3000
+ "adapter": "skill-group",
3001
+ "export": "read",
3002
+ "special": false
3003
+ },
3004
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action skill-group.read --project ."
3005
+ },
3006
+ {
3007
+ "id": "skill-group.setSkillEnabled",
3008
+ "nodeType": "skill-group",
3009
+ "category": "capability",
3010
+ "summary": "Enable or disable a single skill within a skill-group node.",
3011
+ "params": [
3012
+ {
3013
+ "name": "skillId",
3014
+ "type": "string",
3015
+ "required": true,
3016
+ "description": "Skill id to toggle (alias: skill)."
3017
+ },
3018
+ {
3019
+ "name": "enabled",
3020
+ "type": "boolean",
3021
+ "required": true,
3022
+ "description": "true to enable, false to disable."
3023
+ }
3024
+ ],
3025
+ "actor": {
3026
+ "spawnGate": null,
3027
+ "edgeRequired": false,
3028
+ "agentAuthored": true
3029
+ },
3030
+ "cli": {
3031
+ "command": "workflow-node-action",
3032
+ "flags": [
3033
+ {
3034
+ "flag": "--node",
3035
+ "value": "<graphNodeIdOrSessionId>"
3036
+ },
3037
+ {
3038
+ "flag": "--action",
3039
+ "value": "skill-group.setSkillEnabled"
3040
+ },
3041
+ {
3042
+ "flag": "--payload",
3043
+ "value": "<json>"
3044
+ }
3045
+ ]
3046
+ },
3047
+ "implementation": {
3048
+ "adapter": "skill-group",
3049
+ "export": "setSkillEnabled",
3050
+ "special": false
3051
+ },
3052
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action skill-group.setSkillEnabled --payload \"{\\\"skillId\\\":\\\"wf-ui\\\",\\\"enabled\\\":true}\" --project ."
3053
+ },
3054
+ {
3055
+ "id": "skill-group.configure",
3056
+ "nodeType": "skill-group",
3057
+ "category": "config",
3058
+ "summary": "Configure a skill-group node (title, description, sourceGroup, skills).",
3059
+ "params": [
3060
+ {
3061
+ "name": "title",
3062
+ "type": "string",
3063
+ "required": false,
3064
+ "description": "Node title."
3065
+ },
3066
+ {
3067
+ "name": "description",
3068
+ "type": "string",
3069
+ "required": false,
3070
+ "description": "Group description."
3071
+ },
3072
+ {
3073
+ "name": "sourceGroup",
3074
+ "type": "string",
3075
+ "required": false,
3076
+ "description": "Source group id."
3077
+ },
3078
+ {
3079
+ "name": "skills",
3080
+ "type": "array",
3081
+ "required": false,
3082
+ "description": "Replacement skills list."
3083
+ }
3084
+ ],
3085
+ "actor": {
3086
+ "spawnGate": null,
3087
+ "edgeRequired": false,
3088
+ "agentAuthored": true
3089
+ },
3090
+ "cli": {
3091
+ "command": "workflow-node-action",
3092
+ "flags": [
3093
+ {
3094
+ "flag": "--node",
3095
+ "value": "<graphNodeIdOrSessionId>"
3096
+ },
3097
+ {
3098
+ "flag": "--action",
3099
+ "value": "skill-group.configure"
3100
+ },
3101
+ {
3102
+ "flag": "--payload",
3103
+ "value": "<json>"
3104
+ }
3105
+ ]
3106
+ },
3107
+ "implementation": {
3108
+ "adapter": "skill-group",
3109
+ "export": "configure",
3110
+ "special": false
3111
+ },
3112
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action skill-group.configure --payload \"{\\\"description\\\":\\\"team skills\\\"}\" --project ."
3113
+ },
3114
+ {
3115
+ "id": "mcp-connector.read",
3116
+ "nodeType": "mcp-connector",
3117
+ "category": "capability",
3118
+ "summary": "Read an mcp-connector node: servers, serverNames, transports, envKeyNames, redactedFieldCount.",
3119
+ "params": [],
3120
+ "actor": {
3121
+ "spawnGate": null,
3122
+ "edgeRequired": false,
3123
+ "agentAuthored": true
3124
+ },
3125
+ "cli": {
3126
+ "command": "workflow-node-action",
3127
+ "flags": [
3128
+ {
3129
+ "flag": "--node",
3130
+ "value": "<graphNodeIdOrSessionId>"
3131
+ },
3132
+ {
3133
+ "flag": "--action",
3134
+ "value": "mcp-connector.read"
3135
+ },
3136
+ {
3137
+ "flag": "--payload",
3138
+ "value": "<json>"
3139
+ }
3140
+ ]
3141
+ },
3142
+ "implementation": {
3143
+ "adapter": "mcp-connector",
3144
+ "export": "read",
3145
+ "special": false
3146
+ },
3147
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action mcp-connector.read --project ."
3148
+ },
3149
+ {
3150
+ "id": "mcp-connector.configure",
3151
+ "nodeType": "mcp-connector",
3152
+ "category": "config",
3153
+ "summary": "Configure an mcp-connector node (title, description, sourceGroup, servers, server).",
3154
+ "params": [
3155
+ {
3156
+ "name": "title",
3157
+ "type": "string",
3158
+ "required": false,
3159
+ "description": "Node title."
3160
+ },
3161
+ {
3162
+ "name": "description",
3163
+ "type": "string",
3164
+ "required": false,
3165
+ "description": "Connector description."
3166
+ },
3167
+ {
3168
+ "name": "sourceGroup",
3169
+ "type": "string",
3170
+ "required": false,
3171
+ "description": "Source group id."
3172
+ },
3173
+ {
3174
+ "name": "servers",
3175
+ "type": "array",
3176
+ "required": false,
3177
+ "description": "Replacement MCP server metadata list."
3178
+ },
3179
+ {
3180
+ "name": "server",
3181
+ "type": "object",
3182
+ "required": false,
3183
+ "description": "Single server metadata to attach."
3184
+ }
3185
+ ],
3186
+ "actor": {
3187
+ "spawnGate": null,
3188
+ "edgeRequired": false,
3189
+ "agentAuthored": true
3190
+ },
3191
+ "cli": {
3192
+ "command": "workflow-node-action",
3193
+ "flags": [
3194
+ {
3195
+ "flag": "--node",
3196
+ "value": "<graphNodeIdOrSessionId>"
3197
+ },
3198
+ {
3199
+ "flag": "--action",
3200
+ "value": "mcp-connector.configure"
3201
+ },
3202
+ {
3203
+ "flag": "--payload",
3204
+ "value": "<json>"
3205
+ }
3206
+ ]
3207
+ },
3208
+ "implementation": {
3209
+ "adapter": "mcp-connector",
3210
+ "export": "configure",
3211
+ "special": false
3212
+ },
3213
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action mcp-connector.configure --payload \"{\\\"description\\\":\\\"db tools\\\"}\" --project ."
3214
+ },
3215
+ {
3216
+ "id": "goal.read",
3217
+ "nodeType": "goal",
3218
+ "category": "discovery",
3219
+ "summary": "Read a goal node's full state (objective, planItems, acceptance, wdt, confirmation, status).",
3220
+ "params": [],
3221
+ "actor": {
3222
+ "spawnGate": null,
3223
+ "edgeRequired": false,
3224
+ "agentAuthored": true
3225
+ },
3226
+ "cli": {
3227
+ "command": "workflow-node-action",
3228
+ "flags": [
3229
+ {
3230
+ "flag": "--node",
3231
+ "value": "<graphNodeIdOrSessionId>"
3232
+ },
3233
+ {
3234
+ "flag": "--action",
3235
+ "value": "goal.read"
3236
+ },
3237
+ {
3238
+ "flag": "--payload",
3239
+ "value": "<json>"
3240
+ }
3241
+ ]
3242
+ },
3243
+ "implementation": {
3244
+ "adapter": "goal",
3245
+ "export": "read",
3246
+ "special": false
3247
+ },
3248
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action goal.read --project ."
3249
+ },
3250
+ {
3251
+ "id": "goal.update",
3252
+ "nodeType": "goal",
3253
+ "category": "resource",
3254
+ "summary": "Patch a goal node's title, objective, nextAction, acceptance, planItems, or wdt fields.",
3255
+ "params": [
3256
+ {
3257
+ "name": "title",
3258
+ "type": "string",
3259
+ "required": false,
3260
+ "description": "Goal title (max 400 chars)."
3261
+ },
3262
+ {
3263
+ "name": "objective",
3264
+ "type": "string",
3265
+ "required": false,
3266
+ "description": "Goal objective (max 2000 chars)."
3267
+ },
3268
+ {
3269
+ "name": "nextAction",
3270
+ "type": "string",
3271
+ "required": false,
3272
+ "description": "Next action hint (max 1000 chars)."
3273
+ },
3274
+ {
3275
+ "name": "acceptance",
3276
+ "type": "array",
3277
+ "required": false,
3278
+ "description": "Acceptance items (strings or {text, status})."
3279
+ },
3280
+ {
3281
+ "name": "planItems",
3282
+ "type": "array",
3283
+ "required": false,
3284
+ "description": "Plan items (strings or {text, status})."
3285
+ },
3286
+ {
3287
+ "name": "wdt",
3288
+ "type": "object",
3289
+ "required": false,
3290
+ "description": "Watchdog timer state: {enabled, state, timerNodeId, lastAckAt}."
3291
+ }
3292
+ ],
3293
+ "actor": {
3294
+ "spawnGate": null,
3295
+ "edgeRequired": true,
3296
+ "agentAuthored": true
3297
+ },
3298
+ "cli": {
3299
+ "command": "workflow-node-action",
3300
+ "flags": [
3301
+ {
3302
+ "flag": "--node",
3303
+ "value": "<graphNodeIdOrSessionId>"
3304
+ },
3305
+ {
3306
+ "flag": "--action",
3307
+ "value": "goal.update"
3308
+ },
3309
+ {
3310
+ "flag": "--payload",
3311
+ "value": "<json>"
3312
+ }
3313
+ ]
3314
+ },
3315
+ "implementation": {
3316
+ "adapter": "goal",
3317
+ "export": "update",
3318
+ "special": false
3319
+ },
3320
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action goal.update --payload \"{\\\"nextAction\\\":\\\"verify tests\\\"}\" --project ."
3321
+ },
3322
+ {
3323
+ "id": "goal.requestCompletion",
3324
+ "nodeType": "goal",
3325
+ "category": "lifecycle",
3326
+ "summary": "Propose goal completion (status proposed-complete) with evidence refs and a note.",
3327
+ "params": [
3328
+ {
3329
+ "name": "evidenceRefs",
3330
+ "type": "array",
3331
+ "required": false,
3332
+ "description": "Evidence reference strings."
3333
+ },
3334
+ {
3335
+ "name": "note",
3336
+ "type": "string",
3337
+ "required": false,
3338
+ "description": "Completion note (max 1000 chars)."
3339
+ },
3340
+ {
3341
+ "name": "actorNodeId",
3342
+ "type": "string",
3343
+ "required": false,
3344
+ "description": "Proposing agent node id."
3345
+ },
3346
+ {
3347
+ "name": "now",
3348
+ "type": "string",
3349
+ "required": false,
3350
+ "description": "ISO timestamp override."
3351
+ }
3352
+ ],
3353
+ "actor": {
3354
+ "spawnGate": null,
3355
+ "edgeRequired": true,
3356
+ "agentAuthored": true
3357
+ },
3358
+ "cli": {
3359
+ "command": "workflow-node-action",
3360
+ "flags": [
3361
+ {
3362
+ "flag": "--node",
3363
+ "value": "<graphNodeIdOrSessionId>"
3364
+ },
3365
+ {
3366
+ "flag": "--action",
3367
+ "value": "goal.requestCompletion"
3368
+ },
3369
+ {
3370
+ "flag": "--payload",
3371
+ "value": "<json>"
3372
+ }
3373
+ ]
3374
+ },
3375
+ "implementation": {
3376
+ "adapter": "goal",
3377
+ "export": "requestCompletion",
3378
+ "special": false
3379
+ },
3380
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action goal.requestCompletion --payload \"{\\\"evidenceRefs\\\":[\\\"commit abc\\\"]}\" --project ."
3381
+ },
3382
+ {
3383
+ "id": "goal.returnToWork",
3384
+ "nodeType": "goal",
3385
+ "category": "lifecycle",
3386
+ "summary": "Return a proposed-complete goal to active work (status active, confirmation returned).",
3387
+ "params": [
3388
+ {
3389
+ "name": "evidenceRefs",
3390
+ "type": "array",
3391
+ "required": false,
3392
+ "description": "Evidence reference strings."
3393
+ },
3394
+ {
3395
+ "name": "note",
3396
+ "type": "string",
3397
+ "required": false,
3398
+ "description": "Return note (max 1000 chars)."
3399
+ },
3400
+ {
3401
+ "name": "actorNodeId",
3402
+ "type": "string",
3403
+ "required": false,
3404
+ "description": "Returning agent node id."
3405
+ },
3406
+ {
3407
+ "name": "now",
3408
+ "type": "string",
3409
+ "required": false,
3410
+ "description": "ISO timestamp override."
3411
+ }
3412
+ ],
3413
+ "actor": {
3414
+ "spawnGate": null,
3415
+ "edgeRequired": true,
3416
+ "agentAuthored": true
3417
+ },
3418
+ "cli": {
3419
+ "command": "workflow-node-action",
3420
+ "flags": [
3421
+ {
3422
+ "flag": "--node",
3423
+ "value": "<graphNodeIdOrSessionId>"
3424
+ },
3425
+ {
3426
+ "flag": "--action",
3427
+ "value": "goal.returnToWork"
3428
+ },
3429
+ {
3430
+ "flag": "--payload",
3431
+ "value": "<json>"
3432
+ }
3433
+ ]
3434
+ },
3435
+ "implementation": {
3436
+ "adapter": "goal",
3437
+ "export": "returnToWork",
3438
+ "special": false
3439
+ },
3440
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action goal.returnToWork --payload \"{\\\"note\\\":\\\"more work needed\\\"}\" --project ."
3441
+ },
3442
+ {
3443
+ "id": "goal.add",
3444
+ "nodeType": "goal",
3445
+ "category": "resource",
3446
+ "summary": "Append plan items (P-*) and acceptance items (AC-*) to a goal node.",
3447
+ "params": [
3448
+ {
3449
+ "name": "planItems",
3450
+ "type": "array",
3451
+ "required": false,
3452
+ "description": "Plan items to append (strings or {text, status}); max 100."
3453
+ },
3454
+ {
3455
+ "name": "acceptance",
3456
+ "type": "array",
3457
+ "required": false,
3458
+ "description": "Acceptance items to append (strings or {text, status}); max 100."
3459
+ }
3460
+ ],
3461
+ "actor": {
3462
+ "spawnGate": null,
3463
+ "edgeRequired": true,
3464
+ "agentAuthored": true
3465
+ },
3466
+ "cli": {
3467
+ "command": "workflow-node-action",
3468
+ "flags": [
3469
+ {
3470
+ "flag": "--node",
3471
+ "value": "<graphNodeIdOrSessionId>"
3472
+ },
3473
+ {
3474
+ "flag": "--action",
3475
+ "value": "goal.add"
3476
+ },
3477
+ {
3478
+ "flag": "--payload",
3479
+ "value": "<json>"
3480
+ }
3481
+ ]
3482
+ },
3483
+ "implementation": {
3484
+ "adapter": "goal",
3485
+ "export": "add",
3486
+ "special": false
3487
+ },
3488
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action goal.add --payload \"{\\\"planItems\\\":[\\\"step 1\\\"]}\" --project ."
3489
+ },
3490
+ {
3491
+ "id": "goal.delete",
3492
+ "nodeType": "goal",
3493
+ "category": "resource",
3494
+ "summary": "Remove plan items and/or acceptance items by id (implemented as the removeItems helper alias).",
3495
+ "params": [
3496
+ {
3497
+ "name": "planItemIds",
3498
+ "type": "array",
3499
+ "required": false,
3500
+ "description": "Plan item ids to remove (e.g. P-001)."
3501
+ },
3502
+ {
3503
+ "name": "acceptanceIds",
3504
+ "type": "array",
3505
+ "required": false,
3506
+ "description": "Acceptance item ids to remove (e.g. AC-001)."
3507
+ }
3508
+ ],
3509
+ "actor": {
3510
+ "spawnGate": null,
3511
+ "edgeRequired": true,
3512
+ "agentAuthored": true
3513
+ },
3514
+ "cli": {
3515
+ "command": "workflow-node-action",
3516
+ "flags": [
3517
+ {
3518
+ "flag": "--node",
3519
+ "value": "<graphNodeIdOrSessionId>"
3520
+ },
3521
+ {
3522
+ "flag": "--action",
3523
+ "value": "goal.delete"
3524
+ },
3525
+ {
3526
+ "flag": "--payload",
3527
+ "value": "<json>"
3528
+ }
3529
+ ]
3530
+ },
3531
+ "implementation": {
3532
+ "adapter": "goal",
3533
+ "export": "delete",
3534
+ "special": false
3535
+ },
3536
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action goal.delete --payload \"{\\\"planItemIds\\\":[\\\"P-001\\\"]}\" --project .",
3537
+ "notes": [
3538
+ "goal-node.mjs exports removeItems as delete (adapter suffix 'delete'); unknown ids are returned in skipped."
3539
+ ]
3540
+ },
3541
+ {
3542
+ "id": "goal.replace",
3543
+ "nodeType": "goal",
3544
+ "category": "resource",
3545
+ "summary": "Replace the entire planItems and/or acceptance lists of a goal node.",
3546
+ "params": [
3547
+ {
3548
+ "name": "planItems",
3549
+ "type": "array",
3550
+ "required": false,
3551
+ "description": "Full replacement plan items (strings or {id, text, status}); max 100."
3552
+ },
3553
+ {
3554
+ "name": "acceptance",
3555
+ "type": "array",
3556
+ "required": false,
3557
+ "description": "Full replacement acceptance items (strings or {id, text, status}); max 100."
3558
+ }
3559
+ ],
3560
+ "actor": {
3561
+ "spawnGate": null,
3562
+ "edgeRequired": true,
3563
+ "agentAuthored": true
3564
+ },
3565
+ "cli": {
3566
+ "command": "workflow-node-action",
3567
+ "flags": [
3568
+ {
3569
+ "flag": "--node",
3570
+ "value": "<graphNodeIdOrSessionId>"
3571
+ },
3572
+ {
3573
+ "flag": "--action",
3574
+ "value": "goal.replace"
3575
+ },
3576
+ {
3577
+ "flag": "--payload",
3578
+ "value": "<json>"
3579
+ }
3580
+ ]
3581
+ },
3582
+ "implementation": {
3583
+ "adapter": "goal",
3584
+ "export": "replace",
3585
+ "special": false
3586
+ },
3587
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action goal.replace --payload \"{\\\"planItems\\\":[\\\"a\\\",\\\"b\\\"]}\" --project ."
3588
+ },
3589
+ {
3590
+ "id": "goal.check",
3591
+ "nodeType": "goal",
3592
+ "category": "resource",
3593
+ "summary": "Mark plan items done by id (status done, records updatedBy/updatedAt).",
3594
+ "params": [
3595
+ {
3596
+ "name": "planItemIds",
3597
+ "type": "array",
3598
+ "required": true,
3599
+ "description": "Plan item ids to check (e.g. P-001)."
3600
+ },
3601
+ {
3602
+ "name": "actorNodeId",
3603
+ "type": "string",
3604
+ "required": false,
3605
+ "description": "Acting agent node id."
3606
+ },
3607
+ {
3608
+ "name": "now",
3609
+ "type": "string",
3610
+ "required": false,
3611
+ "description": "ISO timestamp override."
3612
+ }
3613
+ ],
3614
+ "actor": {
3615
+ "spawnGate": null,
3616
+ "edgeRequired": true,
3617
+ "agentAuthored": true
3618
+ },
3619
+ "cli": {
3620
+ "command": "workflow-node-action",
3621
+ "flags": [
3622
+ {
3623
+ "flag": "--node",
3624
+ "value": "<graphNodeIdOrSessionId>"
3625
+ },
3626
+ {
3627
+ "flag": "--action",
3628
+ "value": "goal.check"
3629
+ },
3630
+ {
3631
+ "flag": "--payload",
3632
+ "value": "<json>"
3633
+ }
3634
+ ]
3635
+ },
3636
+ "implementation": {
3637
+ "adapter": "goal",
3638
+ "export": "check",
3639
+ "special": false
3640
+ },
3641
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action goal.check --payload \"{\\\"planItemIds\\\":[\\\"P-001\\\"]}\" --project ."
3642
+ },
3643
+ {
3644
+ "id": "goal.uncheck",
3645
+ "nodeType": "goal",
3646
+ "category": "resource",
3647
+ "summary": "Mark plan items back to todo by id (records updatedBy/updatedAt).",
3648
+ "params": [
3649
+ {
3650
+ "name": "planItemIds",
3651
+ "type": "array",
3652
+ "required": true,
3653
+ "description": "Plan item ids to uncheck (e.g. P-001)."
3654
+ },
3655
+ {
3656
+ "name": "actorNodeId",
3657
+ "type": "string",
3658
+ "required": false,
3659
+ "description": "Acting agent node id."
3660
+ },
3661
+ {
3662
+ "name": "now",
3663
+ "type": "string",
3664
+ "required": false,
3665
+ "description": "ISO timestamp override."
3666
+ }
3667
+ ],
3668
+ "actor": {
3669
+ "spawnGate": null,
3670
+ "edgeRequired": true,
3671
+ "agentAuthored": true
3672
+ },
3673
+ "cli": {
3674
+ "command": "workflow-node-action",
3675
+ "flags": [
3676
+ {
3677
+ "flag": "--node",
3678
+ "value": "<graphNodeIdOrSessionId>"
3679
+ },
3680
+ {
3681
+ "flag": "--action",
3682
+ "value": "goal.uncheck"
3683
+ },
3684
+ {
3685
+ "flag": "--payload",
3686
+ "value": "<json>"
3687
+ }
3688
+ ]
3689
+ },
3690
+ "implementation": {
3691
+ "adapter": "goal",
3692
+ "export": "uncheck",
3693
+ "special": false
3694
+ },
3695
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action goal.uncheck --payload \"{\\\"planItemIds\\\":[\\\"P-001\\\"]}\" --project ."
3696
+ },
3697
+ {
3698
+ "id": "goal.complete",
3699
+ "nodeType": "goal",
3700
+ "category": "lifecycle",
3701
+ "summary": "Propose goal completion once all plan items are done (rejects with goal_items_pending otherwise).",
3702
+ "params": [
3703
+ {
3704
+ "name": "evidenceRefs",
3705
+ "type": "array",
3706
+ "required": false,
3707
+ "description": "Evidence reference strings."
3708
+ },
3709
+ {
3710
+ "name": "note",
3711
+ "type": "string",
3712
+ "required": false,
3713
+ "description": "Completion note (max 1000 chars)."
3714
+ },
3715
+ {
3716
+ "name": "actorNodeId",
3717
+ "type": "string",
3718
+ "required": false,
3719
+ "description": "Proposing agent node id."
3720
+ },
3721
+ {
3722
+ "name": "now",
3723
+ "type": "string",
3724
+ "required": false,
3725
+ "description": "ISO timestamp override."
3726
+ }
3727
+ ],
3728
+ "actor": {
3729
+ "spawnGate": null,
3730
+ "edgeRequired": true,
3731
+ "agentAuthored": true
3732
+ },
3733
+ "cli": {
3734
+ "command": "workflow-node-action",
3735
+ "flags": [
3736
+ {
3737
+ "flag": "--node",
3738
+ "value": "<graphNodeIdOrSessionId>"
3739
+ },
3740
+ {
3741
+ "flag": "--action",
3742
+ "value": "goal.complete"
3743
+ },
3744
+ {
3745
+ "flag": "--payload",
3746
+ "value": "<json>"
3747
+ }
3748
+ ]
3749
+ },
3750
+ "implementation": {
3751
+ "adapter": "goal",
3752
+ "export": "complete",
3753
+ "special": false
3754
+ },
3755
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action goal.complete --payload \"{\\\"evidenceRefs\\\":[\\\"test pass\\\"]}\" --project ."
3756
+ },
3757
+ {
3758
+ "id": "goal.reopen",
3759
+ "nodeType": "goal",
3760
+ "category": "lifecycle",
3761
+ "summary": "Reopen a completed goal back to active status with confirmation state returned.",
3762
+ "params": [
3763
+ {
3764
+ "name": "evidenceRefs",
3765
+ "type": "array",
3766
+ "required": false,
3767
+ "description": "Evidence reference strings."
3768
+ },
3769
+ {
3770
+ "name": "note",
3771
+ "type": "string",
3772
+ "required": false,
3773
+ "description": "Reopen note (max 1000 chars)."
3774
+ },
3775
+ {
3776
+ "name": "actorNodeId",
3777
+ "type": "string",
3778
+ "required": false,
3779
+ "description": "Reopening agent node id."
3780
+ },
3781
+ {
3782
+ "name": "now",
3783
+ "type": "string",
3784
+ "required": false,
3785
+ "description": "ISO timestamp override."
3786
+ }
3787
+ ],
3788
+ "actor": {
3789
+ "spawnGate": null,
3790
+ "edgeRequired": true,
3791
+ "agentAuthored": true
3792
+ },
3793
+ "cli": {
3794
+ "command": "workflow-node-action",
3795
+ "flags": [
3796
+ {
3797
+ "flag": "--node",
3798
+ "value": "<graphNodeIdOrSessionId>"
3799
+ },
3800
+ {
3801
+ "flag": "--action",
3802
+ "value": "goal.reopen"
3803
+ },
3804
+ {
3805
+ "flag": "--payload",
3806
+ "value": "<json>"
3807
+ }
3808
+ ]
3809
+ },
3810
+ "implementation": {
3811
+ "adapter": "goal",
3812
+ "export": "reopen",
3813
+ "special": false
3814
+ },
3815
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action goal.reopen --payload \"{\\\"note\\\":\\\"scope grew\\\"}\" --project ."
3816
+ },
3817
+ {
3818
+ "id": "goal.ackWatchdog",
3819
+ "nodeType": "goal",
3820
+ "category": "event",
3821
+ "summary": "Acknowledge the goal watchdog timer (wdt state ok with lastAckAt and timerNodeId).",
3822
+ "params": [
3823
+ {
3824
+ "name": "timerNodeId",
3825
+ "type": "string",
3826
+ "required": false,
3827
+ "description": "Timer node id recorded in the wdt state."
3828
+ },
3829
+ {
3830
+ "name": "now",
3831
+ "type": "string",
3832
+ "required": false,
3833
+ "description": "ISO timestamp override."
3834
+ }
3835
+ ],
3836
+ "actor": {
3837
+ "spawnGate": null,
3838
+ "edgeRequired": true,
3839
+ "agentAuthored": true
3840
+ },
3841
+ "cli": {
3842
+ "command": "workflow-node-action",
3843
+ "flags": [
3844
+ {
3845
+ "flag": "--node",
3846
+ "value": "<graphNodeIdOrSessionId>"
3847
+ },
3848
+ {
3849
+ "flag": "--action",
3850
+ "value": "goal.ackWatchdog"
3851
+ },
3852
+ {
3853
+ "flag": "--payload",
3854
+ "value": "<json>"
3855
+ }
3856
+ ]
3857
+ },
3858
+ "implementation": {
3859
+ "adapter": "goal",
3860
+ "export": "ackWatchdog",
3861
+ "special": false
3862
+ },
3863
+ "example": "wf-ui-control.mjs workflow-node-action --node <nodeId> --action goal.ackWatchdog --payload \"{\\\"timerNodeId\\\":\\\"timer-1\\\"}\" --project ."
3864
+ },
3865
+ {
3866
+ "id": "node.delete",
3867
+ "nodeType": "node",
3868
+ "category": "graph",
3869
+ "summary": "Delete any workflow node (component, event, capability, goal) by id; live agent nodes must be stopped first.",
3870
+ "params": [],
3871
+ "actor": {
3872
+ "spawnGate": null,
3873
+ "edgeRequired": false,
3874
+ "agentAuthored": true
3875
+ },
3876
+ "cli": null,
3877
+ "implementation": {
3878
+ "special": true
3879
+ },
3880
+ "example": "POST /api/workflow/nodes/<nodeId>/actions/node.delete",
3881
+ "notes": [
3882
+ "Server-special-cased in workflow-node-runtime executeNodeAction: routed to deleteNode before adapter dispatch. Agent graph nodes use agent.deleteNode/agent.deleteNodes (graph category)."
3883
+ ]
3884
+ },
3885
+ {
3886
+ "id": "node.restore",
3887
+ "nodeType": "node",
3888
+ "category": "graph",
3889
+ "summary": "Restore a previously deleted workflow node from its snapshot (state recovery + graph restore).",
3890
+ "params": [
3891
+ {
3892
+ "name": "recovery",
3893
+ "type": "object",
3894
+ "required": false,
3895
+ "description": "Recovery payload: {graphId, node: {type, nodeId, componentState|eventState|capabilityState}} or the snapshot fields flattened."
3896
+ },
3897
+ {
3898
+ "name": "graphId",
3899
+ "type": "string",
3900
+ "required": false,
3901
+ "description": "Graph node id to restore (top-level alias)."
3902
+ }
3903
+ ],
3904
+ "actor": {
3905
+ "spawnGate": null,
3906
+ "edgeRequired": false,
3907
+ "agentAuthored": true
3908
+ },
3909
+ "cli": null,
3910
+ "implementation": {
3911
+ "special": true
3912
+ },
3913
+ "example": "POST /api/workflow/nodes/<nodeId>/actions/node.restore --data '{\"node\": {\"type\": \"markdown\", \"nodeId\": \"md-1\", \"componentState\": {...}}}'",
3914
+ "notes": [
3915
+ "Server-special-cased in workflow-node-runtime executeNodeAction: routed to restoreNode (restoreComponentNode/restoreEventNode/restoreCapabilityNode by node kind)."
3916
+ ]
3917
+ },
3918
+ {
3919
+ "id": "agent.createNode",
3920
+ "nodeType": "graph",
3921
+ "category": "graph",
3922
+ "summary": "Create a workflow graph node (component, event, capability, or goal) as a Main Agent actor.",
3923
+ "params": [
3924
+ {
3925
+ "name": "type",
3926
+ "type": "string",
3927
+ "required": true,
3928
+ "description": "Node type: markdown, excalidraw, file, timer, github-trigger (needs experimental: true), skill-group, mcp-connector, goal."
3929
+ },
3930
+ {
3931
+ "name": "title",
3932
+ "type": "string",
3933
+ "required": false,
3934
+ "description": "Node title."
3935
+ },
3936
+ {
3937
+ "name": "position",
3938
+ "type": "object",
3939
+ "required": false,
3940
+ "description": "Graph position: {x, y}."
3941
+ },
3942
+ {
3943
+ "name": "node",
3944
+ "type": "object",
3945
+ "required": false,
3946
+ "description": "Nested node payload: {type, title, position, ...type-specific fields}."
3947
+ },
3948
+ {
3949
+ "name": "markdown",
3950
+ "type": "string",
3951
+ "required": false,
3952
+ "description": "Initial content for markdown nodes."
3953
+ },
3954
+ {
3955
+ "name": "mcpServerId",
3956
+ "type": "string",
3957
+ "required": false,
3958
+ "description": "MCP server id to attach for mcp-connector nodes."
3959
+ },
3960
+ {
3961
+ "name": "experimental",
3962
+ "type": "boolean",
3963
+ "required": false,
3964
+ "description": "Required true for github-trigger creation (PLANNED_NODE_REQUIRES_EXPERIMENTAL otherwise)."
3965
+ }
3966
+ ],
3967
+ "actor": {
3968
+ "spawnGate": "root",
3969
+ "edgeRequired": false,
3970
+ "agentAuthored": true
3971
+ },
3972
+ "cli": {
3973
+ "command": "node-map",
3974
+ "flags": [
3975
+ {
3976
+ "flag": "--action",
3977
+ "value": "createNode"
3978
+ },
3979
+ {
3980
+ "flag": "--type",
3981
+ "value": "<nodeType>"
3982
+ },
3983
+ {
3984
+ "flag": "--title",
3985
+ "value": "<title>"
3986
+ }
3987
+ ]
3988
+ },
3989
+ "implementation": {
3990
+ "special": true
3991
+ },
3992
+ "example": "wf-ui-control.mjs node-map --action createNode --type markdown --title \"Plan\" --actor <graphNodeId>",
3993
+ "notes": [
3994
+ "Server-special-cased: routed to executeAgentGraphAction (Main Agent actors only, assertMainAgentGraphActor). To create agent nodes (PTY sessions) use the create-agent CLI / agent.start instead."
3995
+ ]
3996
+ },
3997
+ {
3998
+ "id": "agent.connectNodes",
3999
+ "nodeType": "graph",
4000
+ "category": "graph",
4001
+ "summary": "Connect two workflow nodes with a typed edge (Single-Goal rule enforced) as a Main Agent actor.",
4002
+ "params": [
4003
+ {
4004
+ "name": "to",
4005
+ "type": "string",
4006
+ "required": true,
4007
+ "description": "Target node or session (aliases: target, targetNodeId)."
4008
+ },
4009
+ {
4010
+ "name": "from",
4011
+ "type": "string",
4012
+ "required": false,
4013
+ "description": "Source node or session (aliases: source, sourceNodeId; default: actor)."
4014
+ },
4015
+ {
4016
+ "name": "relation",
4017
+ "type": "string",
4018
+ "required": false,
4019
+ "description": "Edge relation (default: delegation; e.g. context, event, control, goal, capability, wf-bridge)."
4020
+ },
4021
+ {
4022
+ "name": "sourceHandle",
4023
+ "type": "string",
4024
+ "required": false,
4025
+ "description": "Source handle."
4026
+ },
4027
+ {
4028
+ "name": "targetHandle",
4029
+ "type": "string",
4030
+ "required": false,
4031
+ "description": "Target handle."
4032
+ },
4033
+ {
4034
+ "name": "direction",
4035
+ "type": "string",
4036
+ "required": false,
4037
+ "description": "Edge direction (default: bidirectional)."
4038
+ }
4039
+ ],
4040
+ "actor": {
4041
+ "spawnGate": null,
4042
+ "edgeRequired": false,
4043
+ "agentAuthored": true
4044
+ },
4045
+ "cli": {
4046
+ "command": "connect",
4047
+ "flags": [
4048
+ {
4049
+ "flag": "--from",
4050
+ "value": "<nodeOrSession>"
4051
+ },
4052
+ {
4053
+ "flag": "--to",
4054
+ "value": "<nodeOrSession>"
4055
+ },
4056
+ {
4057
+ "flag": "--relation",
4058
+ "value": "<relation>"
4059
+ }
4060
+ ]
4061
+ },
4062
+ "implementation": {
4063
+ "special": true
4064
+ },
4065
+ "example": "wf-ui-control.mjs connect --actor <actorNodeId> --from <nodeId> --to <nodeId> --relation delegation",
4066
+ "notes": [
4067
+ "Server-special-cased: routed to executeAgentGraphAction (Main Agent actors only); also reachable via node-map --action connectNodes."
4068
+ ]
4069
+ },
4070
+ {
4071
+ "id": "agent.disconnectNodes",
4072
+ "nodeType": "graph",
4073
+ "category": "graph",
4074
+ "summary": "Remove an edge between two workflow nodes by edge id as a Main Agent actor.",
4075
+ "params": [
4076
+ {
4077
+ "name": "edgeId",
4078
+ "type": "string",
4079
+ "required": true,
4080
+ "description": "Edge id to disconnect (alias: id)."
4081
+ }
4082
+ ],
4083
+ "actor": {
4084
+ "spawnGate": null,
4085
+ "edgeRequired": false,
4086
+ "agentAuthored": true
4087
+ },
4088
+ "cli": {
4089
+ "command": "node-map",
4090
+ "flags": [
4091
+ {
4092
+ "flag": "--action",
4093
+ "value": "disconnectNodes"
4094
+ },
4095
+ {
4096
+ "flag": "--edge",
4097
+ "value": "<edgeId>"
4098
+ }
4099
+ ]
4100
+ },
4101
+ "implementation": {
4102
+ "special": true
4103
+ },
4104
+ "example": "wf-ui-control.mjs node-map --action disconnectNodes --edge <edgeId> --actor <graphNodeId>",
4105
+ "notes": [
4106
+ "Server-special-cased: routed to executeAgentGraphAction (Main Agent actors only)."
4107
+ ]
4108
+ },
4109
+ {
4110
+ "id": "agent.moveNode",
4111
+ "nodeType": "graph",
4112
+ "category": "graph",
4113
+ "summary": "Move a workflow node to a new graph position as a Main Agent actor.",
4114
+ "params": [
4115
+ {
4116
+ "name": "targetNodeId",
4117
+ "type": "string",
4118
+ "required": true,
4119
+ "description": "Node to move (aliases: nodeId, id)."
4120
+ },
4121
+ {
4122
+ "name": "position",
4123
+ "type": "object",
4124
+ "required": true,
4125
+ "description": "New position: {x, y} (or pass x/y directly in the payload)."
4126
+ }
4127
+ ],
4128
+ "actor": {
4129
+ "spawnGate": null,
4130
+ "edgeRequired": false,
4131
+ "agentAuthored": true
4132
+ },
4133
+ "cli": {
4134
+ "command": "node-map",
4135
+ "flags": [
4136
+ {
4137
+ "flag": "--action",
4138
+ "value": "moveNode"
4139
+ },
4140
+ {
4141
+ "flag": "--node",
4142
+ "value": "<nodeId>"
4143
+ },
4144
+ {
4145
+ "flag": "--x",
4146
+ "value": "<number>"
4147
+ },
4148
+ {
4149
+ "flag": "--y",
4150
+ "value": "<number>"
4151
+ }
4152
+ ]
4153
+ },
4154
+ "implementation": {
4155
+ "special": true
4156
+ },
4157
+ "example": "wf-ui-control.mjs node-map --action moveNode --node <nodeId> --x 400 --y 300 --actor <graphNodeId>",
4158
+ "notes": [
4159
+ "Server-special-cased: routed to executeAgentGraphAction (Main Agent actors only)."
4160
+ ]
4161
+ },
4162
+ {
4163
+ "id": "agent.deleteNode",
4164
+ "nodeType": "graph",
4165
+ "category": "graph",
4166
+ "summary": "Delete a single workflow graph node as a Main Agent actor (live agent nodes require allowLiveAgentDelete/force).",
4167
+ "params": [
4168
+ {
4169
+ "name": "nodeId",
4170
+ "type": "string",
4171
+ "required": true,
4172
+ "description": "Node to delete (aliases: node, id)."
4173
+ },
4174
+ {
4175
+ "name": "force",
4176
+ "type": "boolean",
4177
+ "required": false,
4178
+ "description": "Force deletion."
4179
+ },
4180
+ {
4181
+ "name": "allowLiveAgentDelete",
4182
+ "type": "boolean",
4183
+ "required": false,
4184
+ "description": "Allow deleting live agent nodes."
4185
+ }
4186
+ ],
4187
+ "actor": {
4188
+ "spawnGate": null,
4189
+ "edgeRequired": false,
4190
+ "agentAuthored": true
4191
+ },
4192
+ "cli": {
4193
+ "command": "delete-node",
4194
+ "flags": [
4195
+ {
4196
+ "flag": "--node",
4197
+ "value": "<graphNodeIdOrSessionId>"
4198
+ },
4199
+ {
4200
+ "flag": "--actor",
4201
+ "value": "<actorNodeId>"
4202
+ }
4203
+ ]
4204
+ },
4205
+ "implementation": {
4206
+ "special": true
4207
+ },
4208
+ "example": "wf-ui-control.mjs delete-node --node <graphNodeIdOrSessionId> --actor <actorNodeId>",
4209
+ "notes": [
4210
+ "Server-special-cased: routed to executeAgentGraphAction (Main Agent actors only); also reachable via node-map --action deleteNode."
4211
+ ]
4212
+ },
4213
+ {
4214
+ "id": "agent.deleteNodes",
4215
+ "nodeType": "graph",
4216
+ "category": "graph",
4217
+ "summary": "Delete multiple workflow graph nodes (or all non-actor nodes) as a Main Agent actor.",
4218
+ "params": [
4219
+ {
4220
+ "name": "nodeIds",
4221
+ "type": "array",
4222
+ "required": false,
4223
+ "description": "Target node ids (aliases: nodes)."
4224
+ },
4225
+ {
4226
+ "name": "all",
4227
+ "type": "boolean",
4228
+ "required": false,
4229
+ "description": "Delete all non-actor nodes."
4230
+ },
4231
+ {
4232
+ "name": "force",
4233
+ "type": "boolean",
4234
+ "required": false,
4235
+ "description": "Force deletion."
4236
+ },
4237
+ {
4238
+ "name": "allowLiveAgentDelete",
4239
+ "type": "boolean",
4240
+ "required": false,
4241
+ "description": "Allow deleting live agent nodes."
4242
+ }
4243
+ ],
4244
+ "actor": {
4245
+ "spawnGate": null,
4246
+ "edgeRequired": false,
4247
+ "agentAuthored": true
4248
+ },
4249
+ "cli": {
4250
+ "command": "node-map",
4251
+ "flags": [
4252
+ {
4253
+ "flag": "--action",
4254
+ "value": "deleteNodes"
4255
+ },
4256
+ {
4257
+ "flag": "--nodes",
4258
+ "value": "<nodeId,...>"
4259
+ },
4260
+ {
4261
+ "flag": "--all",
4262
+ "value": ""
4263
+ }
4264
+ ]
4265
+ },
4266
+ "implementation": {
4267
+ "special": true
4268
+ },
4269
+ "example": "wf-ui-control.mjs node-map --action deleteNodes --nodes a,b,c --actor <graphNodeId>",
4270
+ "notes": [
4271
+ "Server-special-cased: routed to executeAgentGraphAction (Main Agent actors only)."
4272
+ ]
4273
+ },
4274
+ {
4275
+ "id": "agent.readGraph",
4276
+ "nodeType": "graph",
4277
+ "category": "graph",
4278
+ "summary": "Read the full workflow graph snapshot (nodes, edges, positions, capsule dock links) as a Main Agent actor.",
4279
+ "params": [],
4280
+ "actor": {
4281
+ "spawnGate": null,
4282
+ "edgeRequired": false,
4283
+ "agentAuthored": true
4284
+ },
4285
+ "cli": {
4286
+ "command": "node-map",
4287
+ "flags": [
4288
+ {
4289
+ "flag": "--action",
4290
+ "value": "readGraph"
4291
+ },
4292
+ {
4293
+ "flag": "--actor",
4294
+ "value": "<graphNodeIdOrSessionId>"
4295
+ }
4296
+ ]
4297
+ },
4298
+ "implementation": {
4299
+ "special": true
4300
+ },
4301
+ "example": "wf-ui-control.mjs node-map --action readGraph --actor <graphNodeId>",
4302
+ "notes": [
4303
+ "Server-special-cased: routed to executeAgentGraphAction (Main Agent actors only)."
4304
+ ]
4305
+ },
4306
+ {
4307
+ "id": "graph.undo",
4308
+ "nodeType": "graph",
4309
+ "category": "graph",
4310
+ "summary": "Undo the most recent graph operation (moveNode/connectNodes/disconnectNodes/updateEdge/attachDock/detachDock/setDockSide/layout/deleteNode/createNode) by replaying its inverse slice; human and agent edits share one server-owned history.",
4311
+ "params": [
4312
+ {
4313
+ "name": "scope",
4314
+ "type": "string",
4315
+ "required": false,
4316
+ "description": "Scope selector; 'graph' (default) applies the workflow graph history."
4317
+ },
4318
+ {
4319
+ "name": "expectedVersion",
4320
+ "type": "number",
4321
+ "required": false,
4322
+ "description": "Optional graph version guard; mismatch yields STALE_GRAPH_VERSION (409)."
4323
+ }
4324
+ ],
4325
+ "actor": {
4326
+ "spawnGate": null,
4327
+ "edgeRequired": false,
4328
+ "agentAuthored": true
4329
+ },
4330
+ "cli": {
4331
+ "command": "node-map",
4332
+ "flags": [
4333
+ {
4334
+ "flag": "--action",
4335
+ "value": "undo"
4336
+ },
4337
+ {
4338
+ "flag": "--actor",
4339
+ "value": "<graphNodeIdOrSessionId>"
4340
+ }
4341
+ ]
4342
+ },
4343
+ "implementation": {
4344
+ "special": true
4345
+ },
4346
+ "example": "wf-ui-control.mjs node-map --action undo --actor <graphNodeId>",
4347
+ "notes": [
4348
+ "Server-special-cased in server.mjs: routed to undoGraphOp; requires an Agent graph node actor; empty stack is idempotent ({ok:true, applied:null})."
4349
+ ]
4350
+ },
4351
+ {
4352
+ "id": "graph.redo",
4353
+ "nodeType": "graph",
4354
+ "category": "graph",
4355
+ "summary": "Redo the most recently undone graph operation by replaying its forward slice.",
4356
+ "params": [
4357
+ {
4358
+ "name": "scope",
4359
+ "type": "string",
4360
+ "required": false,
4361
+ "description": "Scope selector; 'graph' (default) applies the workflow graph history."
4362
+ },
4363
+ {
4364
+ "name": "expectedVersion",
4365
+ "type": "number",
4366
+ "required": false,
4367
+ "description": "Optional graph version guard; mismatch yields STALE_GRAPH_VERSION (409)."
4368
+ }
4369
+ ],
4370
+ "actor": {
4371
+ "spawnGate": null,
4372
+ "edgeRequired": false,
4373
+ "agentAuthored": true
4374
+ },
4375
+ "cli": {
4376
+ "command": "node-map",
4377
+ "flags": [
4378
+ {
4379
+ "flag": "--action",
4380
+ "value": "redo"
4381
+ },
4382
+ {
4383
+ "flag": "--actor",
4384
+ "value": "<graphNodeIdOrSessionId>"
4385
+ }
4386
+ ]
4387
+ },
4388
+ "implementation": {
4389
+ "special": true
4390
+ },
4391
+ "example": "wf-ui-control.mjs node-map --action redo --actor <graphNodeId>",
4392
+ "notes": [
4393
+ "Server-special-cased in server.mjs: routed to redoGraphOp; requires an Agent graph node actor; empty stack is idempotent ({ok:true, applied:null})."
4394
+ ]
4395
+ }
4396
+ ]
4397
+ }