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,529 @@
1
+ // workflow-subagent-strategy-matrix.test.mjs
2
+ //
3
+ // 2x2 subagent strategy matrix for the wf-ui control plane backend:
4
+ // - Default & Value Propagation (A1-A7): default subagentMode, explicit
5
+ // wf-node-subagents, legacy wf-subagents normalization, graph node
6
+ // serialization, snapshot catalog + per-node values, legacy snapshot exposure
7
+ // - Init Prompt & Context (B1-B4): init.md Subagent Strategy section,
8
+ // HARNESS_SUBAGENT_MODE spawn record, workflow-context subagentMode field
9
+ // - Mode Selection (C1-C4): create with each mode, empty-input
10
+ // defaulting, agent.start settings update
11
+ // - Backward Compat (D1-D2): legacy id absent from the catalog,
12
+ // legacy input round-trips through create, context, and snapshot
13
+ // - Codex Runtime Scenarios (E1-E5): Codex default mode, Codex init
14
+ // prompt guidance for both modes (AC-MATRIX-003/004), Codex main creating
15
+ // a Claude Code worker through the typed API, and the runtime-detector
16
+ // capability status plus degradation documentation
17
+ // - NL Routing / Prompt Detect (F1-F3): init prompt NL trigger phrases for
18
+ // both modes and the unspecified default (AC-NL-001/002/003)
19
+ //
20
+ // Pattern: node:test + assert/strict, in-process HTTP server on port 0, temp
21
+ // roots from makeHarnessTempRoot(). Every behavior is exercised through the
22
+ // typed HTTP API surface (POST /api/sessions, GET /api/workflow/context/:node,
23
+ // GET /api/a2a/snapshot, GET /api/a2a/graph-map, agent.start action) plus the
24
+ // durable artifacts the backend writes for spawned nodes (init.md, events.jsonl),
25
+ // mirroring control-plane-acceptance.test.mjs.
26
+ import { describe, it, beforeEach, afterEach } from 'node:test';
27
+ import assert from 'node:assert/strict';
28
+ import fs from 'node:fs';
29
+ import path from 'node:path';
30
+ import http from 'node:http';
31
+ import { makeHarnessTempRoot } from '../../../tests/support/temp-root.js';
32
+ import { startServer, stopServer } from '../server.mjs';
33
+ import { SessionRegistry } from '../session-registry.mjs';
34
+
35
+ // ── HTTP helper ──
36
+ function jsonRequest(baseUrl, route, { method = 'GET', body, token = '' } = {}) {
37
+ return new Promise((resolve, reject) => {
38
+ const url = new URL(route, baseUrl);
39
+ const payload = body ? JSON.stringify(body) : null;
40
+ const req = http.request({
41
+ hostname: url.hostname,
42
+ port: url.port,
43
+ path: `${url.pathname}${url.search}`,
44
+ method,
45
+ headers: {
46
+ ...(payload ? { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(payload) } : {}),
47
+ ...(token ? { Authorization: `Bearer ${token}` } : {}),
48
+ },
49
+ }, (res) => {
50
+ let data = '';
51
+ res.on('data', chunk => { data += chunk; });
52
+ res.on('end', () => {
53
+ try { resolve({ status: res.statusCode, body: JSON.parse(data) }); }
54
+ catch { resolve({ status: res.statusCode, body: data }); }
55
+ });
56
+ });
57
+ req.on('error', reject);
58
+ if (payload) req.write(payload);
59
+ req.end();
60
+ });
61
+ }
62
+
63
+ function seedRoot(prefix) {
64
+ const root = makeHarnessTempRoot(prefix);
65
+ fs.mkdirSync(path.join(root, 'Harness', 'tasks'), { recursive: true });
66
+ fs.mkdirSync(path.join(root, 'Harness', 'a2a'), { recursive: true });
67
+ return root;
68
+ }
69
+
70
+ // ── Suite ──
71
+ describe('Subagent Strategy Matrix (2x2)', () => {
72
+ let root;
73
+ let registry;
74
+ let server;
75
+ let baseUrl;
76
+
77
+ beforeEach(async () => {
78
+ root = seedRoot('subagent-matrix-');
79
+ registry = new SessionRegistry();
80
+ const started = await startServer({
81
+ projectRoot: root,
82
+ host: '127.0.0.1',
83
+ port: 0,
84
+ sessionRegistry: registry,
85
+ eventsWs: false,
86
+ });
87
+ server = started.server;
88
+ baseUrl = `http://127.0.0.1:${started.port}`;
89
+ });
90
+
91
+ afterEach(async () => {
92
+ if (server) {
93
+ await stopServer(server);
94
+ server = null;
95
+ }
96
+ if (root) {
97
+ fs.rmSync(root, { recursive: true, force: true, maxRetries: 10, retryDelay: 100 });
98
+ root = null;
99
+ }
100
+ });
101
+
102
+ // ── Suite-local helpers ──
103
+ async function createSessionViaApi(extra = {}) {
104
+ const res = await jsonRequest(baseUrl, '/api/sessions', {
105
+ method: 'POST',
106
+ body: {
107
+ runtime: 'claude',
108
+ agentKind: 'subagent',
109
+ role: 'Subagent',
110
+ roleTitle: 'implementer',
111
+ displayName: 'Strategy Worker',
112
+ responsibility: 'Subagent strategy matrix worker',
113
+ capabilities: ['terminal'],
114
+ objective: 'Subagent strategy matrix',
115
+ attachGraphNode: true,
116
+ deferPtySpawn: true,
117
+ ...extra,
118
+ },
119
+ });
120
+ assert.equal(res.status, 201, JSON.stringify(res.body));
121
+ return res.body;
122
+ }
123
+
124
+ function snapshotNode(snapshotBody, sessionId) {
125
+ return (snapshotBody.nodes || []).find(n => n.sessionId === sessionId);
126
+ }
127
+
128
+ function graphMapNode(graphBody, sessionId) {
129
+ return (graphBody.nodes || []).find(n => n.sessionId === sessionId);
130
+ }
131
+
132
+ // ══════════════════════════════════════════════════════════════════
133
+ // Group A: Default & Value Propagation (A1-A7)
134
+ // ══════════════════════════════════════════════════════════════════
135
+ describe('Default & Value Propagation (A1-A7)', () => {
136
+ it('A1 - sessions created without subagentMode default to built-in-subagents', async () => {
137
+ const session = await createSessionViaApi();
138
+ assert.equal(session.subagentMode, 'built-in-subagents');
139
+ });
140
+
141
+ it('A2 - sessions created with explicit wf-node-subagents store it unchanged', async () => {
142
+ const session = await createSessionViaApi({ subagentMode: 'wf-node-subagents' });
143
+ assert.equal(session.subagentMode, 'wf-node-subagents');
144
+ });
145
+
146
+ it('A3 - legacy wf-subagents input is normalized to wf-node-subagents at create', async () => {
147
+ const session = await createSessionViaApi({ subagentMode: 'wf-subagents' });
148
+ assert.equal(session.subagentMode, 'wf-node-subagents');
149
+ });
150
+
151
+ it('A4 - graph node serialization carries subagentMode in the graph map and snapshot', async () => {
152
+ const session = await createSessionViaApi({ subagentMode: 'wf-node-subagents' });
153
+ const graph = await jsonRequest(baseUrl, '/api/a2a/graph-map');
154
+ assert.equal(graph.status, 200, JSON.stringify(graph.body));
155
+ const node = graphMapNode(graph.body, session.sessionId);
156
+ assert.ok(node, `graph map must contain the created node: ${JSON.stringify(graph.body.nodes)}`);
157
+ assert.equal(node.subagentMode, 'wf-node-subagents');
158
+
159
+ const snapshot = await jsonRequest(baseUrl, '/api/a2a/snapshot');
160
+ assert.equal(snapshot.status, 200);
161
+ const snapshotEntry = snapshotNode(snapshot.body, session.sessionId);
162
+ assert.ok(snapshotEntry, 'snapshot must contain the created node');
163
+ assert.equal(snapshotEntry.subagentMode, 'wf-node-subagents');
164
+ });
165
+
166
+ it('A5 - snapshot subagentModes catalog lists both modes with canonical labels', async () => {
167
+ const snapshot = await jsonRequest(baseUrl, '/api/a2a/snapshot');
168
+ assert.equal(snapshot.status, 200);
169
+ assert.deepEqual(snapshot.body.subagentModes, [
170
+ { id: 'built-in-subagents', label: 'Built-in Subagents' },
171
+ { id: 'wf-node-subagents', label: 'WF Node Subagents' },
172
+ ]);
173
+ });
174
+
175
+ it('A6 - snapshot per-node subagentMode uses the stored normalized value', async () => {
176
+ const defaultSession = await createSessionViaApi();
177
+ const nodeSession = await createSessionViaApi({ subagentMode: 'wf-node-subagents' });
178
+ const snapshot = await jsonRequest(baseUrl, '/api/a2a/snapshot');
179
+ assert.equal(snapshot.status, 200);
180
+ const defaultEntry = snapshotNode(snapshot.body, defaultSession.sessionId);
181
+ const nodeEntry = snapshotNode(snapshot.body, nodeSession.sessionId);
182
+ assert.ok(defaultEntry && nodeEntry, 'both sessions must appear in the snapshot');
183
+ assert.equal(defaultEntry.subagentMode, 'built-in-subagents');
184
+ assert.equal(nodeEntry.subagentMode, 'wf-node-subagents');
185
+ });
186
+
187
+ it('A7 - legacy wf-subagents sessions surface as wf-node-subagents in the snapshot', async () => {
188
+ const session = await createSessionViaApi({ subagentMode: 'wf-subagents' });
189
+ const snapshot = await jsonRequest(baseUrl, '/api/a2a/snapshot');
190
+ assert.equal(snapshot.status, 200);
191
+ const entry = snapshotNode(snapshot.body, session.sessionId);
192
+ assert.ok(entry, 'legacy session must appear in the snapshot');
193
+ assert.equal(entry.subagentMode, 'wf-node-subagents');
194
+ assert.equal(
195
+ (snapshot.body.nodes || []).filter(n => n.subagentMode === 'wf-subagents').length,
196
+ 0,
197
+ 'no snapshot node may expose the legacy wf-subagents id',
198
+ );
199
+ });
200
+ });
201
+
202
+ // ══════════════════════════════════════════════════════════════════
203
+ // Group B: Init Prompt & Context (B1-B4)
204
+ // ══════════════════════════════════════════════════════════════════
205
+ describe('Init Prompt & Context (B1-B4)', () => {
206
+ it('B1 - agent init.md includes the Subagent Strategy section with both modes', async () => {
207
+ const session = await createSessionViaApi();
208
+ const initPath = path.join(root, 'Harness', 'a2a', 'nodes', session.sessionId, 'init.md');
209
+ assert.ok(fs.existsSync(initPath), 'init.md must be written to the node home');
210
+ const init = fs.readFileSync(initPath, 'utf8');
211
+ assert.match(init, /## Subagent Strategy/);
212
+ assert.match(init, /- subagentMode: <built-in-subagents\|wf-node-subagents>/);
213
+ assert.match(init, /- When subagentMode is `built-in-subagents`:/);
214
+ assert.match(init, /- When subagentMode is `wf-node-subagents`:/);
215
+ assert.match(init, /- Default when unspecified: built-in-subagents/);
216
+ });
217
+
218
+ it('B2 - the spawn record and init prompt carry the HARNESS_SUBAGENT_MODE value for PTY spawn', async () => {
219
+ const session = await createSessionViaApi({ subagentMode: 'wf-node-subagents' });
220
+ // The backend maps session.subagentMode to HARNESS_SUBAGENT_MODE in the
221
+ // PTY process env at spawn time (pty-adapter.mjs). In this environment
222
+ // node-pty is not installed, so the literal spawn env is not observable;
223
+ // the durable artifacts the backend writes when preparing a session for
224
+ // spawn pin the same value: the session.created event (the exact value
225
+ // passed to spawnPty) and the init.md env line (what the spawned agent
226
+ // reads back).
227
+ const eventsPath = path.join(root, 'Harness', 'a2a', 'sessions', session.sessionId, 'events.jsonl');
228
+ assert.ok(fs.existsSync(eventsPath), 'events.jsonl must be recorded for the session');
229
+ const events = fs.readFileSync(eventsPath, 'utf8')
230
+ .split(/\r?\n/)
231
+ .filter(Boolean)
232
+ .map(line => JSON.parse(line));
233
+ const createdEvent = events.find(event => event.type === 'session.created');
234
+ assert.ok(createdEvent, `session.created event must exist: ${JSON.stringify(events)}`);
235
+ assert.equal(createdEvent.subagentMode, 'wf-node-subagents');
236
+
237
+ const initPath = path.join(root, 'Harness', 'a2a', 'nodes', session.sessionId, 'init.md');
238
+ const init = fs.readFileSync(initPath, 'utf8');
239
+ assert.match(init, /- Env subagent mode: HARNESS_SUBAGENT_MODE=wf-node-subagents/);
240
+ });
241
+
242
+ it('B3 - workflow-context includes subagentMode normalized from legacy input', async () => {
243
+ const session = await createSessionViaApi({ subagentMode: 'wf-subagents' });
244
+ const ctx = await jsonRequest(baseUrl, `/api/workflow/context/${encodeURIComponent(`session-${session.sessionId}`)}`);
245
+ assert.equal(ctx.status, 200, JSON.stringify(ctx.body));
246
+ assert.equal(ctx.body.context.subagentMode, 'wf-node-subagents');
247
+ });
248
+
249
+ it('B4 - workflow-context returns built-in-subagents for default sessions', async () => {
250
+ const session = await createSessionViaApi();
251
+ const ctx = await jsonRequest(baseUrl, `/api/workflow/context/${encodeURIComponent(`session-${session.sessionId}`)}`);
252
+ assert.equal(ctx.status, 200, JSON.stringify(ctx.body));
253
+ assert.equal(ctx.body.context.subagentMode, 'built-in-subagents');
254
+ });
255
+ });
256
+
257
+ // ══════════════════════════════════════════════════════════════════
258
+ // Group C: Mode Selection (C1-C4)
259
+ // ══════════════════════════════════════════════════════════════════
260
+ describe('Mode Selection (C1-C4)', () => {
261
+ it('C1 - creating an agent with built-in-subagents stores it in the response and graph', async () => {
262
+ const session = await createSessionViaApi({ subagentMode: 'built-in-subagents' });
263
+ assert.equal(session.subagentMode, 'built-in-subagents');
264
+ const graph = await jsonRequest(baseUrl, '/api/a2a/graph-map');
265
+ const node = graphMapNode(graph.body, session.sessionId);
266
+ assert.ok(node, 'graph map must contain the created node');
267
+ assert.equal(node.subagentMode, 'built-in-subagents');
268
+ });
269
+
270
+ it('C2 - creating an agent with wf-node-subagents stores it in the response and graph', async () => {
271
+ const session = await createSessionViaApi({ subagentMode: 'wf-node-subagents' });
272
+ assert.equal(session.subagentMode, 'wf-node-subagents');
273
+ const graph = await jsonRequest(baseUrl, '/api/a2a/graph-map');
274
+ const node = graphMapNode(graph.body, session.sessionId);
275
+ assert.ok(node, 'graph map must contain the created node');
276
+ assert.equal(node.subagentMode, 'wf-node-subagents');
277
+ });
278
+
279
+ it('C3 - an empty subagentMode input is defaulted to built-in-subagents, not rejected', async () => {
280
+ const session = await createSessionViaApi({ subagentMode: '' });
281
+ assert.equal(session.subagentMode, 'built-in-subagents');
282
+ const ctx = await jsonRequest(baseUrl, `/api/workflow/context/${encodeURIComponent(`session-${session.sessionId}`)}`);
283
+ assert.equal(ctx.status, 200, JSON.stringify(ctx.body));
284
+ assert.equal(ctx.body.context.subagentMode, 'built-in-subagents');
285
+ });
286
+
287
+ it('C4 - agent.start with a new subagentMode restarts the node with the new mode', async () => {
288
+ const session = await createSessionViaApi({ subagentMode: 'built-in-subagents' });
289
+ const nodeId = `session-${session.sessionId}`;
290
+
291
+ const started = await jsonRequest(baseUrl, `/api/workflow/nodes/${encodeURIComponent(nodeId)}/actions/agent.start`, {
292
+ method: 'POST',
293
+ body: { subagentMode: 'wf-node-subagents', deferPtySpawn: true },
294
+ });
295
+ assert.equal(started.status, 200, JSON.stringify(started.body));
296
+ assert.equal(started.body.ok, true);
297
+ assert.equal(started.body.action, 'agent.start');
298
+ assert.equal(started.body.result.alreadyRunning, false);
299
+ assert.equal(started.body.result.started.subagentMode, 'wf-node-subagents');
300
+
301
+ // The typed snapshot derives per-node mode from the live session, so the
302
+ // restarted node exposes the new mode.
303
+ const snapshot = await jsonRequest(baseUrl, '/api/a2a/snapshot');
304
+ assert.equal(snapshot.status, 200);
305
+ const newEntry = snapshotNode(snapshot.body, started.body.result.started.sessionId);
306
+ assert.ok(newEntry, 'restarted session must appear in the snapshot');
307
+ assert.equal(newEntry.subagentMode, 'wf-node-subagents');
308
+ assert.equal(newEntry.graphNodeId, nodeId, 'node id must survive the restart');
309
+ assert.equal(
310
+ (snapshot.body.nodes || []).some(n => n.sessionId === session.sessionId),
311
+ false,
312
+ 'the old session must leave the snapshot after the restart',
313
+ );
314
+ });
315
+ });
316
+
317
+ // ══════════════════════════════════════════════════════════════════
318
+ // Group D: Backward Compat (D1-D2)
319
+ // ══════════════════════════════════════════════════════════════════
320
+ describe('Backward Compat (D1-D2)', () => {
321
+ it('D1 - the legacy wf-subagents id is absent from the snapshot catalog', async () => {
322
+ const snapshot = await jsonRequest(baseUrl, '/api/a2a/snapshot');
323
+ assert.equal(snapshot.status, 200);
324
+ assert.equal(snapshot.body.subagentModes.some(mode => mode.id === 'wf-subagents'), false);
325
+ });
326
+
327
+ it('D2 - a legacy wf-subagents session survives the round-trip normalized everywhere', async () => {
328
+ const session = await createSessionViaApi({ subagentMode: 'wf-subagents' });
329
+ assert.equal(session.subagentMode, 'wf-node-subagents', 'create response is normalized');
330
+
331
+ const ctx = await jsonRequest(baseUrl, `/api/workflow/context/${encodeURIComponent(`session-${session.sessionId}`)}`);
332
+ assert.equal(ctx.status, 200, JSON.stringify(ctx.body));
333
+ assert.equal(ctx.body.context.subagentMode, 'wf-node-subagents', 'context is normalized');
334
+
335
+ const snapshot = await jsonRequest(baseUrl, '/api/a2a/snapshot');
336
+ const entry = snapshotNode(snapshot.body, session.sessionId);
337
+ assert.ok(entry, 'session must appear in the snapshot');
338
+ assert.equal(entry.subagentMode, 'wf-node-subagents', 'snapshot is normalized');
339
+
340
+ const graph = await jsonRequest(baseUrl, '/api/a2a/graph-map');
341
+ const node = graphMapNode(graph.body, session.sessionId);
342
+ assert.ok(node, 'session must appear in the graph map');
343
+ assert.equal(node.subagentMode, 'wf-node-subagents', 'graph node is normalized');
344
+ });
345
+ });
346
+
347
+ // ══════════════════════════════════════════════════════════════════
348
+ // Group E: Codex Runtime Scenarios (E1-E5)
349
+ // AC-MATRIX-003: Codex main + built-in-subagents — native
350
+ // subagent/tool/role path OR clear degradation evidence
351
+ // AC-MATRIX-004: Codex main + wf-node-subagents — create/connect
352
+ // Claude Code implementer, send task, reply, aggregate
353
+ // ══════════════════════════════════════════════════════════════════
354
+ describe('Codex Runtime Scenarios (E1-E5)', () => {
355
+ function readInit(sessionId) {
356
+ const initPath = path.join(root, 'Harness', 'a2a', 'nodes', sessionId, 'init.md');
357
+ assert.ok(fs.existsSync(initPath), `init.md must be written to the node home for ${sessionId}`);
358
+ return fs.readFileSync(initPath, 'utf8');
359
+ }
360
+
361
+ it('E1 - Codex sessions without an explicit subagentMode default to built-in-subagents (AC-NL-003)', async () => {
362
+ const session = await createSessionViaApi({
363
+ runtime: 'codex',
364
+ agentKind: 'main',
365
+ role: 'Main Agent',
366
+ roleTitle: 'ceo',
367
+ });
368
+ assert.equal(session.runtime, 'codex');
369
+ assert.equal(session.subagentMode, 'built-in-subagents');
370
+ });
371
+
372
+ it('E2 - Codex + built-in-subagents init prompt guides the native tool/role path and never instructs WF canvas node creation (AC-MATRIX-003)', async () => {
373
+ const session = await createSessionViaApi({
374
+ runtime: 'codex',
375
+ agentKind: 'main',
376
+ role: 'Main Agent',
377
+ roleTitle: 'ceo',
378
+ subagentMode: 'built-in-subagents',
379
+ });
380
+ const init = readInit(session.sessionId);
381
+ // The built-in guidance must describe the Codex-native subagent path
382
+ // (codex_implement / tool-role path), not only Claude Code's Agent tool.
383
+ assert.match(init, /codex_implement|tool\/role path/i,
384
+ 'built-in guidance must name the Codex native subagent/tool/role path');
385
+ // For a built-in session the init prompt must not instruct the agent to
386
+ // create WF canvas worker nodes.
387
+ assert.doesNotMatch(init, /wf-ui-control\.mjs create-agent/,
388
+ 'built-in init prompt must not instruct creating WF canvas nodes');
389
+ });
390
+
391
+ it('E3 - Codex + wf-node-subagents init prompt guides WF Agent nodes, Claude Code implementer workers, and mailbox flow (AC-MATRIX-004)', async () => {
392
+ const session = await createSessionViaApi({
393
+ runtime: 'codex',
394
+ agentKind: 'main',
395
+ role: 'Main Agent',
396
+ roleTitle: 'ceo',
397
+ subagentMode: 'wf-node-subagents',
398
+ });
399
+ const init = readInit(session.sessionId);
400
+ assert.match(init, /create-agent/, 'init prompt must instruct creating/connecting WF Agent nodes');
401
+ assert.match(init, /create\/connect WF Agent nodes/i,
402
+ 'init prompt must describe the create/connect flow for WF Agent nodes');
403
+ assert.match(init, /Claude Code implementer/i,
404
+ 'Codex main must be told that a Claude Code implementer is the valid worker target');
405
+ assert.match(init, /sendMessage/, 'init prompt must mention sendMessage mailbox communication');
406
+ assert.match(init, /readMessages/, 'init prompt must mention readMessages mailbox aggregation');
407
+ });
408
+
409
+ it('E4 - Codex main creates a Claude Code worker through the typed API: runtime/agentKind, snapshot, and edge (AC-MATRIX-004)', async () => {
410
+ const main = await createSessionViaApi({
411
+ runtime: 'codex',
412
+ agentKind: 'main',
413
+ role: 'Main Agent',
414
+ roleTitle: 'ceo',
415
+ subagentMode: 'wf-node-subagents',
416
+ });
417
+ assert.equal(main.runtime, 'codex');
418
+ assert.equal(main.agentKind, 'main');
419
+ assert.equal(main.subagentMode, 'wf-node-subagents');
420
+
421
+ const worker = await createSessionViaApi({
422
+ runtime: 'claude',
423
+ agentKind: 'subagent',
424
+ role: 'Subagent',
425
+ roleTitle: 'implementer',
426
+ parentAgentId: main.sessionId,
427
+ });
428
+ assert.equal(worker.runtime, 'claude');
429
+ assert.equal(worker.agentKind, 'subagent');
430
+
431
+ const mainNodeId = `session-${main.sessionId}`;
432
+ const workerNodeId = `session-${worker.sessionId}`;
433
+ const connected = await jsonRequest(baseUrl, '/api/workflow/edges', {
434
+ method: 'POST',
435
+ body: { from: mainNodeId, to: workerNodeId, relation: 'delegation', direction: 'bidirectional' },
436
+ });
437
+ assert.equal(connected.status, 201, JSON.stringify(connected.body));
438
+
439
+ const snapshot = await jsonRequest(baseUrl, '/api/a2a/snapshot');
440
+ assert.equal(snapshot.status, 200);
441
+ const mainEntry = snapshotNode(snapshot.body, main.sessionId);
442
+ const workerEntry = snapshotNode(snapshot.body, worker.sessionId);
443
+ assert.ok(mainEntry && workerEntry, 'snapshot must contain both the Codex main and the Claude Code worker');
444
+ assert.equal(mainEntry.runtime, 'codex');
445
+ assert.equal(workerEntry.runtime, 'claude');
446
+ assert.equal(workerEntry.agentKind, 'subagent');
447
+ assert.equal(workerEntry.parentAgentId, main.sessionId, 'worker must record its Codex main parent');
448
+
449
+ const graph = await jsonRequest(baseUrl, '/api/a2a/graph-map');
450
+ assert.equal(graph.status, 200);
451
+ const edges = graph.body.edges || [];
452
+ assert.ok(
453
+ edges.some(edge => edge.from === mainNodeId && edge.to === workerNodeId),
454
+ `an edge from the Codex main to the Claude Code worker must exist: ${JSON.stringify(edges)}`,
455
+ );
456
+ });
457
+
458
+ it('E5 - Codex built-in-subagents capability status is reported and the degradation path is documented (AC-MATRIX-003)', async () => {
459
+ // The runtime detector reports Codex's built-in-subagents capability
460
+ // status through the typed runtimes endpoint; includeMissing lists the
461
+ // definition even when the binary is not installed.
462
+ const runtimes = await jsonRequest(baseUrl, '/api/runtimes?all=1');
463
+ assert.equal(runtimes.status, 200, JSON.stringify(runtimes.body));
464
+ const codex = (runtimes.body || []).find(entry => entry.id === 'codex');
465
+ assert.ok(codex, 'the runtime detector must report the codex definition');
466
+ assert.ok(Array.isArray(codex.capabilities), 'the codex definition must expose a capabilities list');
467
+ const builtInStatus = codex.capabilities.includes('built-in-subagents');
468
+ assert.equal(typeof builtInStatus, 'boolean',
469
+ `built-in-subagents capability status must be a boolean (currently: ${builtInStatus})`);
470
+
471
+ // Whatever the probe reports, the init prompt must tell a Codex
472
+ // built-in session what to do when native subagents are unavailable.
473
+ const session = await createSessionViaApi({
474
+ runtime: 'codex',
475
+ agentKind: 'main',
476
+ role: 'Main Agent',
477
+ roleTitle: 'ceo',
478
+ subagentMode: 'built-in-subagents',
479
+ });
480
+ const init = readInit(session.sessionId);
481
+ assert.match(init, /degrad/i,
482
+ 'init prompt must document the degradation path when Codex native subagents are unavailable');
483
+ });
484
+ });
485
+
486
+ // ══════════════════════════════════════════════════════════════════
487
+ // Group F: NL Routing / Prompt Detection (F1-F3)
488
+ // AC-NL-001: NL phrases '内部助手/内置子代理' route to built-in-subagents
489
+ // AC-NL-002: NL phrases '画布节点/WF node协作' route to wf-node-subagents
490
+ // AC-NL-003: Unspecified defaults to built-in-subagents
491
+ // ══════════════════════════════════════════════════════════════════
492
+ describe('NL Routing / Prompt Detection (F1-F3)', () => {
493
+ function readInit(sessionId) {
494
+ const initPath = path.join(root, 'Harness', 'a2a', 'nodes', sessionId, 'init.md');
495
+ assert.ok(fs.existsSync(initPath), `init.md must be written to the node home for ${sessionId}`);
496
+ return fs.readFileSync(initPath, 'utf8');
497
+ }
498
+
499
+ it('F1 - init prompt carries built-in-subagents NL trigger phrases regardless of session mode (AC-NL-001)', async () => {
500
+ // Created in wf-node mode on purpose: the routing table must stay
501
+ // present so the agent can route an override request back to built-in.
502
+ const session = await createSessionViaApi({ subagentMode: 'wf-node-subagents' });
503
+ const init = readInit(session.sessionId);
504
+ for (const phrase of ['内部助手', '内置子代理', 'native subagent', 'built-in']) {
505
+ assert.ok(init.includes(phrase), `init.md must contain NL trigger phrase: ${phrase}`);
506
+ }
507
+ const mappingLine = init.split(/\r?\n/).find(line => line.includes('内部助手'));
508
+ assert.ok(mappingLine && mappingLine.includes('built-in-subagents'),
509
+ `trigger phrases must map to built-in-subagents: ${mappingLine}`);
510
+ });
511
+
512
+ it('F2 - init prompt carries wf-node-subagents NL trigger phrases regardless of session mode (AC-NL-002)', async () => {
513
+ const session = await createSessionViaApi({ subagentMode: 'built-in-subagents' });
514
+ const init = readInit(session.sessionId);
515
+ for (const phrase of ['画布Agent节点', 'WF node协作', 'canvas worker']) {
516
+ assert.ok(init.includes(phrase), `init.md must contain NL trigger phrase: ${phrase}`);
517
+ }
518
+ const mappingLine = init.split(/\r?\n/).find(line => line.includes('画布Agent节点'));
519
+ assert.ok(mappingLine && mappingLine.includes('wf-node-subagents'),
520
+ `trigger phrases must map to wf-node-subagents: ${mappingLine}`);
521
+ });
522
+
523
+ it('F3 - init prompt states that an unspecified mode defaults to built-in-subagents (AC-NL-003)', async () => {
524
+ const session = await createSessionViaApi();
525
+ const init = readInit(session.sessionId);
526
+ assert.match(init, /Default when unspecified: built-in-subagents/);
527
+ });
528
+ });
529
+ });