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
@@ -51,7 +51,7 @@ function appendJsonl(filePath, row) {
51
51
  function allSessionDirs(projectRoot) {
52
52
  const tasksRoot = path.join(projectRoot, 'Harness', 'tasks');
53
53
  let tasks = [];
54
- try { tasks = fs.readdirSync(tasksRoot, { withFileTypes: true }); } catch { return []; }
54
+ try { tasks = fs.readdirSync(tasksRoot, { withFileTypes: true }); } catch { tasks = []; }
55
55
  const out = [];
56
56
  for (const task of tasks) {
57
57
  if (!task.isDirectory() || task.name.startsWith('_')) continue;
@@ -62,6 +62,12 @@ function allSessionDirs(projectRoot) {
62
62
  if (session.isDirectory()) out.push({ taskId: task.name, sessionId: session.name, dir: path.join(sessionsRoot, session.name) });
63
63
  }
64
64
  }
65
+ const a2aSessionsRoot = path.join(projectRoot, 'Harness', 'a2a', 'sessions');
66
+ let a2aSessions = [];
67
+ try { a2aSessions = fs.readdirSync(a2aSessionsRoot, { withFileTypes: true }); } catch { a2aSessions = []; }
68
+ for (const session of a2aSessions) {
69
+ if (session.isDirectory()) out.push({ taskId: null, sessionId: session.name, dir: path.join(a2aSessionsRoot, session.name) });
70
+ }
65
71
  return out;
66
72
  }
67
73
 
@@ -112,7 +118,9 @@ function globEvents(projectRoot, flags) {
112
118
  const rows = [];
113
119
  for (const session of allSessionDirs(projectRoot)) {
114
120
  for (const filename of ['events.jsonl', 'terminal.jsonl', 'input-requests.jsonl']) {
115
- const rel = `Harness/tasks/${session.taskId}/sessions/${session.sessionId}/${filename}`;
121
+ const rel = session.taskId
122
+ ? `Harness/tasks/${session.taskId}/sessions/${session.sessionId}/${filename}`
123
+ : `Harness/a2a/sessions/${session.sessionId}/${filename}`;
116
124
  if (!regex.test(rel)) continue;
117
125
  for (const row of readJsonl(path.join(session.dir, filename))) {
118
126
  const tsMs = row.ts ? new Date(row.ts).getTime() : 0;
@@ -136,7 +144,7 @@ function postInput(urlText, token, sessionId, text) {
136
144
  headers: {
137
145
  'Content-Type': 'application/json',
138
146
  'Content-Length': Buffer.byteLength(body),
139
- Authorization: `Bearer ${token}`,
147
+ ...(token ? { Authorization: `Bearer ${token}` } : {}),
140
148
  },
141
149
  }, (res) => {
142
150
  let data = '';
@@ -157,7 +165,7 @@ async function sendInput(projectRoot, flags) {
157
165
  const text = flags.text || '';
158
166
  const url = flags.url || process.env.WF_UI_URL;
159
167
  const token = flags.token || process.env.WF_UI_TOKEN;
160
- if (url && token) return postInput(url, token, sessionId, text);
168
+ if (url) return postInput(url, token, sessionId, text);
161
169
 
162
170
  const found = findSession(projectRoot, sessionId);
163
171
  if (!found) throw new Error(`Session not found: ${sessionId}`);
@@ -9,10 +9,14 @@ const root = rootArgIndex !== -1 && process.argv[rootArgIndex + 1]
9
9
  : process.cwd();
10
10
  const json = args.has('--json');
11
11
 
12
+ // maxBytes baselines track the current generated doc sizes (measured via
13
+ // --json at the last re-baseline) plus ~10% headroom. Growth is intentional
14
+ // as registry/manual discovery content is added; re-baseline by updating the
15
+ // constants when a route is deliberately extended.
12
16
  const routes = [
13
17
  {
14
18
  id: 'thin-startup',
15
- maxBytes: 12500,
19
+ maxBytes: 16000,
16
20
  paths: [
17
21
  'CLAUDE.md',
18
22
  'Harness/memory/startup-hints.md',
@@ -20,7 +24,7 @@ const routes = [
20
24
  },
21
25
  {
22
26
  id: 'wf-router-prefix',
23
- maxBytes: 43000,
27
+ maxBytes: 50000,
24
28
  paths: [
25
29
  'CLAUDE.md',
26
30
  'Harness/MEMORY.md',
@@ -29,7 +33,7 @@ const routes = [
29
33
  },
30
34
  {
31
35
  id: 'wf-light-prefix',
32
- maxBytes: 58000,
36
+ maxBytes: 66500,
33
37
  paths: [
34
38
  'CLAUDE.md',
35
39
  'Harness/MEMORY.md',
@@ -0,0 +1,400 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import {
4
+ scopedGlobalRoot,
5
+ scopedPath,
6
+ scopedProject,
7
+ scopedTaskDirectory,
8
+ } from './path-scope.mjs';
9
+
10
+ const MEMORY_MARKER = /^\s*<!--\s*harness-memory:\s*(\{.*\})\s*-->\s*$/i;
11
+ const WHEN_BULLET = /^\s*-\s+When\s+(.+?):\s+(.+)$/i;
12
+ const VALID_SCOPES = new Set(['project', 'global', 'task']);
13
+ const VALID_KINDS = new Set(['method', 'preference']);
14
+ const VALID_STATUSES = new Set(['active', 'inactive', 'superseded']);
15
+
16
+ export function projectRoot(value) {
17
+ return scopedProject(value, { label: '--project' });
18
+ }
19
+
20
+ function readJsonInput(value, root = null) {
21
+ if (!value) throw new Error('--input JSON is required');
22
+ const candidate = root && !path.isAbsolute(String(value)) ? path.resolve(root, String(value)) : String(value);
23
+ const inputFile = fs.existsSync(candidate) && fs.statSync(candidate).isFile() ? path.resolve(candidate) : null;
24
+ if (inputFile && root) scopedPath(root, inputFile, { mustExist: true, label: '--input' });
25
+ const raw = inputFile ? fs.readFileSync(inputFile, 'utf8') : value;
26
+ try {
27
+ return JSON.parse(raw);
28
+ } catch (error) {
29
+ throw new Error(`Invalid JSON input: ${error.message}`);
30
+ }
31
+ }
32
+
33
+ function walkMarkdown(root, dir, result = []) {
34
+ if (!fs.existsSync(dir)) return result;
35
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
36
+ const file = path.join(dir, entry.name);
37
+ if (entry.isDirectory()) walkMarkdown(root, file, result);
38
+ else if (entry.isFile() && entry.name.toLowerCase().endsWith('.md')) {
39
+ result.push(scopedPath(root, file, { mustExist: true, label: 'Memory file' }));
40
+ }
41
+ }
42
+ return result;
43
+ }
44
+
45
+ function safeRelative(root, file) {
46
+ return path.relative(root, file).replaceAll('\\', '/');
47
+ }
48
+
49
+ function parseBullet(line) {
50
+ const match = line.match(WHEN_BULLET);
51
+ if (!match) return null;
52
+ let body = match[2].trim();
53
+ let avoid = '';
54
+ let signals = [];
55
+ const avoidMatch = body.match(/\s+Avoid\s*:\s*(.*?)(?=\s+Signals\s*:|$)/i);
56
+ if (avoidMatch) {
57
+ avoid = avoidMatch[1].trim().replace(/[.]$/, '');
58
+ body = body.replace(avoidMatch[0], '').trim();
59
+ }
60
+ const signalsMatch = body.match(/\s+Signals\s*:\s*(.*)$/i);
61
+ if (signalsMatch) {
62
+ signals = signalsMatch[1].replace(/[.]$/, '').split(',').map(s => s.trim()).filter(Boolean);
63
+ body = body.replace(signalsMatch[0], '').trim();
64
+ }
65
+ return { when: match[1].trim(), rule: body.replace(/[.]$/, ''), avoid, signals };
66
+ }
67
+
68
+ function parseEntries(root, files) {
69
+ const entries = [];
70
+ for (const file of files) {
71
+ const lines = fs.readFileSync(file, 'utf8').split(/\r?\n/);
72
+ let pending = null;
73
+ let pendingMarkerLine = null;
74
+ for (let index = 0; index < lines.length; index += 1) {
75
+ const line = lines[index];
76
+ const marker = line.match(MEMORY_MARKER);
77
+ if (marker) {
78
+ try { pending = JSON.parse(marker[1]); pendingMarkerLine = index; } catch { pending = null; pendingMarkerLine = null; }
79
+ continue;
80
+ }
81
+ const bullet = parseBullet(line);
82
+ if (!bullet) {
83
+ pending = null;
84
+ pendingMarkerLine = null;
85
+ continue;
86
+ }
87
+ const metadata = pending && typeof pending === 'object' ? { ...pending } : null;
88
+ const value = metadata ? { ...bullet, ...metadata } : { ...bullet };
89
+ const id = String(value.id || `${safeRelative(root, file)}:${index + 1}`);
90
+ entries.push({
91
+ ...value,
92
+ metadataValue: metadata,
93
+ id,
94
+ path: safeRelative(root, file),
95
+ line: index + 1,
96
+ metadata: Boolean(metadata),
97
+ raw: line,
98
+ markerLine: metadata ? pendingMarkerLine : null,
99
+ file,
100
+ sourceBytes: Buffer.byteLength(metadata
101
+ ? `${lines[index - 1] || ''}\n${line}\n`
102
+ : `${line}\n`, 'utf8'),
103
+ });
104
+ pending = null;
105
+ pendingMarkerLine = null;
106
+ }
107
+ }
108
+ return entries;
109
+ }
110
+
111
+ function statusReason(entry) {
112
+ if (entry.status === 'inactive') return 'inactive memory entry';
113
+ if (entry.status === 'superseded') {
114
+ return entry.supersededBy
115
+ ? `superseded by ${entry.supersededBy}`
116
+ : 'superseded memory entry';
117
+ }
118
+ if (entry.recheckAfter) {
119
+ const time = Date.parse(entry.recheckAfter);
120
+ if (Number.isFinite(time) && time <= Date.now()) {
121
+ return `recheckAfter ${entry.recheckAfter} has passed; verification required`;
122
+ }
123
+ }
124
+ return null;
125
+ }
126
+
127
+ function scopeMatches(entry, scope, taskId) {
128
+ if (scope === 'task') {
129
+ if (entry.scope && entry.scope !== 'task') return false;
130
+ return !taskId || entry.path.includes(`/tasks/${taskId}/`) || entry.path.includes(`tasks/${taskId}/`);
131
+ }
132
+ if (!entry.scope) return scope === 'project';
133
+ return entry.scope === scope;
134
+ }
135
+
136
+ function explain(entry, terms) {
137
+ const matches = terms.filter(term => {
138
+ const haystack = `${entry.when} ${entry.rule} ${entry.avoid || ''} ${(entry.signals || []).join(' ')}`.toLowerCase();
139
+ return haystack.includes(term);
140
+ });
141
+ const parts = [entry.metadata ? 'metadata-backed' : 'legacy entry without harness-memory metadata'];
142
+ if (matches.length) parts.push(`matched ${matches.join(', ')}`);
143
+ if (entry.conflictsWith) parts.push(`conflictsWith ${[].concat(entry.conflictsWith).join(', ')}`);
144
+ if (entry.recheckAfter) parts.push(`recheckAfter ${entry.recheckAfter}`);
145
+ return parts.join('; ');
146
+ }
147
+
148
+ export function queryMemory({ root, globalRoot = null, text = '', scope = 'project', taskId, topK = 5, budgetBytes = 8192 }) {
149
+ if (!VALID_SCOPES.has(scope)) throw new Error(`Invalid scope "${scope}". Valid: project, global, task`);
150
+ const storageRoot = scope === 'global' ? scopedGlobalRoot(globalRoot, root) : root;
151
+ const memoryDir = scopedPath(storageRoot, path.join(storageRoot, 'Harness', 'memory'), { label: 'Harness/memory' });
152
+ const taskDir = scopedPath(root, path.join(root, 'Harness', 'tasks'), { mustExist: true, label: 'Harness/tasks' });
153
+ if (scope === 'task' && taskId) scopedTaskDirectory(root, taskId);
154
+ const dirs = scope === 'task' ? [taskDir] : [memoryDir];
155
+ const files = dirs.flatMap(dir => walkMarkdown(scope === 'task' ? root : storageRoot, dir));
156
+ const entries = parseEntries(scope === 'task' ? root : storageRoot, files);
157
+ const terms = String(text).toLowerCase().split(/\s+/).map(s => s.trim()).filter(Boolean);
158
+ const skipped = [];
159
+ const candidates = [];
160
+ for (const entry of entries) {
161
+ if (!scopeMatches(entry, scope, taskId)) {
162
+ skipped.push({ id: entry.id, reason: `scope ${entry.scope || 'project'} is not applicable to ${scope}` });
163
+ continue;
164
+ }
165
+ const inactiveReason = statusReason(entry);
166
+ if (inactiveReason) {
167
+ skipped.push({ id: entry.id, reason: inactiveReason });
168
+ continue;
169
+ }
170
+ const haystack = `${entry.when} ${entry.rule} ${entry.avoid || ''} ${(entry.signals || []).join(' ')}`.toLowerCase();
171
+ const matched = terms.length === 0 || terms.every(term => haystack.includes(term)) || terms.some(term => haystack.includes(term));
172
+ if (!matched) continue;
173
+ const score = terms.reduce((sum, term) => sum + (haystack.includes(term) ? 1 : 0), 0);
174
+ candidates.push({ entry, score });
175
+ }
176
+ candidates.sort((a, b) => b.score - a.score || a.entry.path.localeCompare(b.entry.path) || a.entry.line - b.entry.line);
177
+ const limit = nonNegativeInteger(budgetBytes, '--budget-bytes', 8192);
178
+ const count = nonNegativeInteger(topK, '--top-k', 5);
179
+ let usedBytes = 0;
180
+ const hits = [];
181
+ for (const { entry, score } of candidates) {
182
+ if (hits.length >= count) {
183
+ skipped.push({ id: entry.id, reason: `top-k limit ${count} reached` });
184
+ continue;
185
+ }
186
+ if (usedBytes + entry.sourceBytes > limit) {
187
+ skipped.push({ id: entry.id, reason: `byte budget ${limit} exceeded` });
188
+ continue;
189
+ }
190
+ usedBytes += entry.sourceBytes;
191
+ hits.push({
192
+ id: entry.id,
193
+ rule: String(entry.rule || ''),
194
+ reason: explain(entry, terms),
195
+ path: entry.path,
196
+ score,
197
+ status: entry.status || 'unknown',
198
+ verified: entry.metadata && validateCandidate(entry.metadataValue).valid
199
+ && entry.verification?.status === 'passed',
200
+ ...(entry.conflictsWith ? { conflictsWith: entry.conflictsWith } : {}),
201
+ ...(entry.recheckAfter ? { recheckAfter: entry.recheckAfter } : {}),
202
+ });
203
+ }
204
+ const boundedSkipped = boundSkipped(skipped, limit);
205
+ const skippedBytes = Buffer.byteLength(JSON.stringify(boundedSkipped), 'utf8');
206
+ const entryBytes = usedBytes;
207
+ const contentBytes = entryBytes + skippedBytes;
208
+ return {
209
+ hits,
210
+ skipped: boundedSkipped,
211
+ budget: {
212
+ limitBytes: limit,
213
+ // usedBytes is the charged portion of hits plus the bounded skipped
214
+ // summary; envelope metadata is reported separately.
215
+ usedBytes: Math.min(limit, contentBytes),
216
+ entryBytes,
217
+ contentBytes,
218
+ skippedBytes,
219
+ metadataBytes: Buffer.byteLength(JSON.stringify({ hits: [], skipped: [], budget: { limitBytes: limit, usedBytes: 0 } }), 'utf8'),
220
+ truncated: contentBytes > limit,
221
+ },
222
+ };
223
+ }
224
+
225
+ function nonNegativeInteger(value, field, fallback) {
226
+ if (value === undefined || value === null || value === '') return fallback;
227
+ if (!/^\d+$/.test(String(value))) throw new Error(`${field} must be a non-negative integer`);
228
+ const result = Number(value);
229
+ if (!Number.isSafeInteger(result)) throw new Error(`${field} is out of range`);
230
+ return result;
231
+ }
232
+
233
+ function boundSkipped(items, limit) {
234
+ const maxBytes = Math.max(96, Math.min(2048, limit || 256));
235
+ const output = [];
236
+ let bytes = 0;
237
+ for (const item of items) {
238
+ const next = {
239
+ id: String(item.id || '').slice(0, 120),
240
+ reason: String(item.reason || '').slice(0, 120),
241
+ };
242
+ const nextBytes = Buffer.byteLength(JSON.stringify(next), 'utf8') + (output.length ? 1 : 0);
243
+ if (output.length >= 8 || bytes + nextBytes > maxBytes) break;
244
+ output.push(next);
245
+ bytes += nextBytes;
246
+ }
247
+ const remaining = items.length - output.length;
248
+ if (remaining > 0) output.push({
249
+ id: '__skipped__',
250
+ count: remaining,
251
+ summary: `${remaining} skipped entries omitted from the response summary`,
252
+ truncated: true,
253
+ });
254
+ return output;
255
+ }
256
+
257
+ function stringField(value, field, errors) {
258
+ if (typeof value !== 'string' || !value.trim()) errors.push(`${field} must be a non-empty string`);
259
+ }
260
+
261
+ export function validateCandidate(candidate) {
262
+ const errors = [];
263
+ if (!candidate || typeof candidate !== 'object' || Array.isArray(candidate)) {
264
+ return { valid: false, errors: ['candidate must be a JSON object'] };
265
+ }
266
+ for (const field of ['id', 'kind', 'scope', 'when', 'rule', 'avoid', 'status']) stringField(candidate[field], field, errors);
267
+ if (!VALID_KINDS.has(candidate.kind)) errors.push('kind must be method or preference');
268
+ if (!VALID_SCOPES.has(candidate.scope)) errors.push('scope must be project, global, or task');
269
+ if (!VALID_STATUSES.has(candidate.status)) errors.push('status must be active, inactive, or superseded');
270
+ if (!Array.isArray(candidate.signals)) errors.push('signals must be an array');
271
+ if (!Array.isArray(candidate.evidenceRefs)) errors.push('evidenceRefs must be an array');
272
+ if (candidate.kind === 'method') {
273
+ if (!Array.isArray(candidate.evidenceRefs) || candidate.evidenceRefs.length === 0) errors.push('method requires evidenceRefs');
274
+ if (!candidate.counterexample || typeof candidate.counterexample !== 'object') errors.push('method requires counterexample');
275
+ else {
276
+ stringField(candidate.counterexample.scenario, 'counterexample.scenario', errors);
277
+ stringField(candidate.counterexample.outcome, 'counterexample.outcome', errors);
278
+ }
279
+ if (!candidate.verification || typeof candidate.verification !== 'object') errors.push('method requires verification');
280
+ else {
281
+ if (candidate.verification.status !== 'passed') errors.push('verification.status must be passed');
282
+ stringField(candidate.verification.method, 'verification.method', errors);
283
+ stringField(candidate.verification.evidenceRef, 'verification.evidenceRef', errors);
284
+ }
285
+ }
286
+ return { valid: errors.length === 0, errors };
287
+ }
288
+
289
+ function stable(value) {
290
+ if (Array.isArray(value)) return `[${value.map(stable).join(',')}]`;
291
+ if (value && typeof value === 'object') return `{${Object.keys(value).sort().map(k => `${JSON.stringify(k)}:${stable(value[k])}`).join(',')}}`;
292
+ return JSON.stringify(value);
293
+ }
294
+
295
+ function relation(candidate) {
296
+ const values = [candidate.supersedes, candidate.supersedesId, candidate.supersedesIds]
297
+ .flatMap(value => Array.isArray(value) ? value : value ? [value] : [])
298
+ .map(String);
299
+ return new Set(values);
300
+ }
301
+
302
+ function metadataLine(candidate) {
303
+ return `<!-- harness-memory: ${JSON.stringify(candidate)} -->`;
304
+ }
305
+
306
+ function block(candidate) {
307
+ const avoid = candidate.avoid ? ` Avoid: ${candidate.avoid}.` : '';
308
+ const signals = candidate.signals?.length ? ` Signals: ${candidate.signals.join(', ')}.` : '';
309
+ return `${metadataLine(candidate)}\n- When ${candidate.when}: ${candidate.rule}.${avoid}${signals}\n`;
310
+ }
311
+
312
+ function replaceMetadataAt(file, lineNumber, next) {
313
+ const lines = fs.readFileSync(file, 'utf8').split(/\r?\n/);
314
+ const index = lineNumber - 1;
315
+ if (index < 0 || index >= lines.length) throw new Error(`Metadata line no longer exists: ${file}:${lineNumber}`);
316
+ lines[index] = metadataLine(next);
317
+ fs.writeFileSync(file, lines.join('\n'), 'utf8');
318
+ }
319
+
320
+ function appendAtomic(file, text) {
321
+ const current = fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : '';
322
+ const prefix = current && !current.endsWith('\n') ? '\n' : '';
323
+ fs.mkdirSync(path.dirname(file), { recursive: true });
324
+ fs.writeFileSync(file, current + prefix + text, 'utf8');
325
+ }
326
+
327
+ function allEntries(root) {
328
+ const dirs = [scopedPath(root, path.join(root, 'Harness', 'memory'), { label: 'Harness/memory' })];
329
+ return parseEntries(root, dirs.flatMap(dir => walkMarkdown(root, dir)));
330
+ }
331
+
332
+ export function applyCandidate({ root, globalRoot = null, candidate, apply = false }) {
333
+ const validation = validateCandidate(candidate);
334
+ if (!validation.valid) return { ok: false, errors: validation.errors, dryRun: !apply };
335
+ const storageRoot = candidate.scope === 'global' ? scopedGlobalRoot(globalRoot, root) : root;
336
+ if (!apply) return { ok: false, dryRun: true, errors: ['Dry run only. Re-run with --apply to write memory.'] };
337
+ const memoryDir = scopedPath(storageRoot, path.join(storageRoot, 'Harness', 'memory'), { label: 'Memory storage' });
338
+ const targetName = candidate.kind === 'preference' ? 'user-corrections-preferences.md' : 'agent-lessons-patterns.md';
339
+ const target = scopedPath(storageRoot, path.join(memoryDir, targetName), { label: 'Memory target' });
340
+ const entries = allEntries(storageRoot);
341
+ const same = entries.find(entry => entry.id === candidate.id);
342
+ if (same) {
343
+ if (same.metadataValue && stable(same.metadataValue) === stable(candidate)) return { ok: true, action: 'duplicate', id: candidate.id, path: same.path };
344
+ if (!relation(candidate).has(candidate.id)) {
345
+ return { ok: false, errors: [`Conflict for memory id ${candidate.id}; provide an explicit supersedes relation.`] };
346
+ }
347
+ const next = { ...candidate };
348
+ replaceMetadataAt(same.file, same.markerLine + 1, next);
349
+ return { ok: true, action: 'updated', id: candidate.id, path: same.path };
350
+ }
351
+ const conflicts = entries.filter(entry => entry.metadata && entry.status !== 'superseded'
352
+ && entry.when?.toLowerCase() === candidate.when.toLowerCase() && entry.rule !== candidate.rule);
353
+ const supersedes = relation(candidate);
354
+ const uncovered = conflicts.filter(entry => !supersedes.has(entry.id));
355
+ if (uncovered.length) {
356
+ return { ok: false, errors: [`Conflict with ${uncovered.map(entry => entry.id).join(', ')}; provide supersedes.`] };
357
+ }
358
+ for (const entry of conflicts.filter(item => supersedes.has(item.id))) {
359
+ const next = { ...entry };
360
+ delete next.file; delete next.raw; delete next.markerLine; delete next.line; delete next.path; delete next.metadata; delete next.sourceBytes; delete next.metadataValue;
361
+ next.status = 'superseded';
362
+ next.supersededBy = candidate.id;
363
+ replaceMetadataAt(entry.file, entry.markerLine + 1, next);
364
+ }
365
+ appendAtomic(target, block(candidate));
366
+ return { ok: true, action: 'created', id: candidate.id, path: safeRelative(storageRoot, target) };
367
+ }
368
+
369
+ export function setMemoryStatus({ root, id, status, supersededBy, apply = false }) {
370
+ if (!id) return { ok: false, errors: ['--id is required'], dryRun: !apply };
371
+ if (!VALID_STATUSES.has(status)) return { ok: false, errors: ['status must be inactive, superseded, or active'], dryRun: !apply };
372
+ const entries = allEntries(root).filter(entry => entry.id === id);
373
+ if (!entries.length) return { ok: false, errors: [`Memory id not found: ${id}`], dryRun: !apply };
374
+ if (!apply) return { ok: false, dryRun: true, errors: ['Dry run only. Re-run with --apply to write memory.'] };
375
+ for (const entry of entries) {
376
+ const next = { ...entry };
377
+ for (const field of ['file', 'raw', 'markerLine', 'line', 'path', 'metadata', 'sourceBytes', 'metadataValue']) delete next[field];
378
+ next.status = status;
379
+ if (status === 'superseded' && supersededBy) next.supersededBy = supersededBy;
380
+ if (status === 'active') delete next.supersededBy;
381
+ replaceMetadataAt(entry.file, entry.markerLine + 1, next);
382
+ }
383
+ return { ok: true, action: 'status-updated', id, status, count: entries.length };
384
+ }
385
+
386
+ export function writeFeedback({ root, taskId, entry, outcome, reason, apply = false }) {
387
+ if (!taskId || !entry || !reason) return { ok: false, errors: ['--task, --entry, and --reason are required'], dryRun: !apply };
388
+ if (!['useful', 'unused', 'incorrect'].includes(outcome)) return { ok: false, errors: ['outcome must be useful, unused, or incorrect'], dryRun: !apply };
389
+ let taskDir;
390
+ try { taskDir = scopedTaskDirectory(root, taskId); }
391
+ catch (error) { return { ok: false, errors: [error.message], dryRun: !apply }; }
392
+ const target = scopedPath(root, path.join(taskDir, 'evidence', 'memory-feedback.md'), { label: 'Feedback target' });
393
+ if (!apply) return { ok: false, dryRun: true, errors: ['Dry run only. Re-run with --apply to write task-local evidence.'] };
394
+ const safeReason = String(reason).replace(/[\r\n]+/g, ' ').trim();
395
+ appendAtomic(target, `## Memory feedback: ${entry}\n- Outcome: ${outcome}\n- Reason: ${safeReason}\n`);
396
+ return { ok: true, action: 'feedback-recorded', taskId, entry, path: safeRelative(root, target) };
397
+ }
398
+
399
+ export function readInput(value, root = null) { return readJsonInput(value, root); }
400
+ export { VALID_KINDS, VALID_SCOPES, VALID_STATUSES };
@@ -0,0 +1,77 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+
4
+ function isWithin(root, candidate, allowRoot = false) {
5
+ const relative = path.relative(root, candidate);
6
+ return (allowRoot && relative === '') || (relative !== '' && !relative.startsWith('..') && !path.isAbsolute(relative));
7
+ }
8
+
9
+ function realpath(value, label) {
10
+ try { return fs.realpathSync(value); }
11
+ catch (error) { throw new Error(`${label || 'Path'} cannot be resolved: ${error.message}`); }
12
+ }
13
+
14
+ // Check lexical containment first, then anchor the check to the real project
15
+ // root. For a not-yet-created output, resolve its nearest existing parent so
16
+ // a symlinked parent cannot redirect the write outside the allowed root.
17
+ export function scopedPath(root, candidate, { allowRoot = false, mustExist = false, label = 'Path' } = {}) {
18
+ const lexicalRoot = path.resolve(String(root));
19
+ const lexicalCandidate = path.resolve(String(candidate));
20
+ if (!isWithin(lexicalRoot, lexicalCandidate, allowRoot)) {
21
+ throw new Error(`${label} escapes allowed root: ${lexicalCandidate}`);
22
+ }
23
+ if (mustExist && !fs.existsSync(lexicalCandidate)) {
24
+ throw new Error(`${label} does not exist: ${lexicalCandidate}`);
25
+ }
26
+ const realRoot = realpath(lexicalRoot, 'Allowed root');
27
+ let realCandidate;
28
+ if (fs.existsSync(lexicalCandidate)) {
29
+ realCandidate = realpath(lexicalCandidate, label);
30
+ } else {
31
+ let cursor = lexicalCandidate;
32
+ const suffix = [];
33
+ while (!fs.existsSync(cursor)) {
34
+ const parent = path.dirname(cursor);
35
+ if (parent === cursor) throw new Error(`${label} has no existing parent: ${lexicalCandidate}`);
36
+ suffix.unshift(path.basename(cursor));
37
+ cursor = parent;
38
+ }
39
+ realCandidate = path.join(realpath(cursor, label), ...suffix);
40
+ }
41
+ if (!isWithin(realRoot, realCandidate, allowRoot)) {
42
+ throw new Error(`${label} resolves outside allowed root: ${realCandidate}`);
43
+ }
44
+ return lexicalCandidate;
45
+ }
46
+
47
+ export function scopedProject(value, { label = 'Project root' } = {}) {
48
+ if (!value || !path.isAbsolute(String(value))) throw new Error(`${label} must be an absolute path`);
49
+ const root = path.resolve(String(value));
50
+ if (!fs.existsSync(root) || !fs.statSync(root).isDirectory()) throw new Error(`${label} does not exist: ${root}`);
51
+ scopedPath(root, root, { allowRoot: true, mustExist: true, label });
52
+ return root;
53
+ }
54
+
55
+ export function scopedTaskDirectory(root, taskId, { requireState = true } = {}) {
56
+ if (!taskId || !/^[A-Za-z0-9][A-Za-z0-9_-]*$/.test(String(taskId))
57
+ || new Set(['_template', '_archive', 'continuous']).has(String(taskId))) {
58
+ throw new Error(`Invalid task id "${taskId || ''}"; path traversal is not allowed`);
59
+ }
60
+ const tasks = scopedPath(root, path.join(root, 'Harness', 'tasks'), { mustExist: true, label: 'Harness/tasks' });
61
+ const taskDir = scopedPath(tasks, path.join(tasks, String(taskId)), { mustExist: true, label: 'Task directory' });
62
+ if (!fs.statSync(taskDir).isDirectory()) throw new Error(`Task is not a directory: ${taskId}`);
63
+ if (requireState) scopedPath(tasks, path.join(taskDir, 'STATE.json'), { mustExist: true, label: 'Task STATE.json' });
64
+ return taskDir;
65
+ }
66
+
67
+ export function scopedGlobalRoot(value, projectRoot) {
68
+ const global = scopedProject(value, { label: '--global-root' });
69
+ const globalReal = realpath(global, '--global-root');
70
+ const projectReal = projectRoot ? realpath(projectRoot, '--project') : null;
71
+ if (projectReal && (isWithin(projectReal, globalReal, true) || isWithin(globalReal, projectReal, true))) {
72
+ throw new Error('--global-root must be a different isolated root from --project');
73
+ }
74
+ return global;
75
+ }
76
+
77
+ export { isWithin };
@@ -0,0 +1,99 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { scopedPath, scopedProject, scopedTaskDirectory } from './path-scope.mjs';
4
+
5
+ const TRIGGERS = new Map([
6
+ ['capability-gap', 'A capability gap should be checked against current primary sources.'],
7
+ ['volatile-api', 'API behavior or version information may have changed.'],
8
+ ['user-request', 'The user explicitly requested external verification.'],
9
+ ['repeated-failure', 'Repeated failure is a signal to inspect current guidance and known fixes.'],
10
+ ['benchmark-gap', 'A benchmark gap needs an evidence-backed comparison before changing the harness.'],
11
+ ]);
12
+ const DECISIONS = new Set(['adopt', 'adapt', 'reject']);
13
+ const SOURCE_TYPES = new Set(['official', 'author']);
14
+
15
+ export function projectRoot(value) {
16
+ return scopedProject(value, { label: '--project' });
17
+ }
18
+
19
+ function readJsonInput(value, root = null) {
20
+ if (!value) throw new Error('--input JSON is required');
21
+ const candidate = root && !path.isAbsolute(String(value)) ? path.resolve(root, String(value)) : String(value);
22
+ const inputFile = fs.existsSync(candidate) && fs.statSync(candidate).isFile() ? path.resolve(candidate) : null;
23
+ if (inputFile && root) scopedPath(root, inputFile, { mustExist: true, label: '--input' });
24
+ const raw = inputFile ? fs.readFileSync(inputFile, 'utf8') : value;
25
+ try { return JSON.parse(raw); } catch (error) { throw new Error(`Invalid JSON input: ${error.message}`); }
26
+ }
27
+
28
+ export function decide({ trigger, taskType = 'chore' }) {
29
+ const reasons = [];
30
+ if (trigger) {
31
+ const values = (Array.isArray(trigger) ? trigger : [trigger])
32
+ .flatMap(value => String(value).split(',')).map(value => value.trim()).filter(Boolean);
33
+ for (const value of values) {
34
+ if (!TRIGGERS.has(value)) throw new Error(`Invalid trigger "${value}". Valid: ${[...TRIGGERS.keys()].join(', ')}`);
35
+ reasons.push(TRIGGERS.get(value));
36
+ }
37
+ }
38
+ return { search: reasons.length > 0, reasons, addDependency: false, taskType };
39
+ }
40
+
41
+ export function validateReference(value) {
42
+ const errors = [];
43
+ if (!value || typeof value !== 'object' || Array.isArray(value)) return { valid: false, errors: ['reference must be a JSON object'] };
44
+ for (const field of ['url', 'title', 'version', 'license', 'reason', 'checkedAt']) {
45
+ if (typeof value[field] !== 'string' || !value[field].trim()) errors.push(`${field} must be a non-empty string`);
46
+ }
47
+ try {
48
+ const url = new URL(value.url);
49
+ if (!['http:', 'https:'].includes(url.protocol)) errors.push('url must use http or https');
50
+ } catch { errors.push('url must be an absolute http(s) URL'); }
51
+ if (!SOURCE_TYPES.has(value.sourceType)) errors.push('sourceType must be official or author');
52
+ if (!DECISIONS.has(value.decision)) errors.push('decision must be adopt, adapt, or reject');
53
+ if (!Array.isArray(value.acIds)) errors.push('acIds must be an array');
54
+ for (const field of ['counterexample', 'recheckTrigger', 'recheckAfter']) {
55
+ if (value[field] !== undefined && (typeof value[field] !== 'string' || !value[field].trim())) {
56
+ errors.push(`${field} must be a non-empty string`);
57
+ }
58
+ }
59
+ if (value.decision === 'adopt' && !String(value.license || '').trim()) errors.push('adopting a code dependency requires a license');
60
+ if (value.checkedAt && Number.isNaN(Date.parse(value.checkedAt))) errors.push('checkedAt must be an ISO date');
61
+ return { valid: errors.length === 0, errors };
62
+ }
63
+
64
+ export function recordReference({ root, taskId, reference, apply = false }) {
65
+ const validation = validateReference(reference);
66
+ if (!validation.valid) return { ok: false, errors: validation.errors, dryRun: !apply };
67
+ if (!taskId) return { ok: false, errors: ['--task is required'], dryRun: !apply };
68
+ let taskDir;
69
+ // Legacy capsules may predate STATE.json; the task id and canonical capsule
70
+ // directory are still checked, and REFERENCES.md is the record target.
71
+ try { taskDir = scopedTaskDirectory(root, taskId, { requireState: false }); }
72
+ catch (error) { return { ok: false, errors: [error.message], dryRun: !apply }; }
73
+ const target = scopedPath(root, path.join(taskDir, 'REFERENCES.md'), { label: 'References target' });
74
+ if (!fs.existsSync(target)) return { ok: false, errors: [`Task references not found: ${taskId}`], dryRun: !apply };
75
+ const current = fs.existsSync(target) ? fs.readFileSync(target, 'utf8') : '# Research references\n';
76
+ if (!apply) return { ok: false, dryRun: true, errors: ['Dry run only. Re-run with --apply to write references.'] };
77
+ if (current.includes(reference.url)) return { ok: true, action: 'duplicate', taskId, path: path.relative(root, target).replaceAll('\\', '/') };
78
+ const acIds = reference.acIds.length ? reference.acIds.join(', ') : 'none';
79
+ const block = [
80
+ `\n## ${reference.title}`,
81
+ `- URL: ${reference.url}`,
82
+ `- Source type: ${reference.sourceType}`,
83
+ `- Version: ${reference.version}`,
84
+ `- License: ${reference.license}`,
85
+ `- Decision: ${reference.decision}`,
86
+ `- Reason: ${String(reference.reason).replace(/[\r\n]+/g, ' ').trim()}`,
87
+ `- AC IDs: ${acIds}`,
88
+ `- Checked at: ${reference.checkedAt}`,
89
+ ...(reference.counterexample ? [`- Counterexample: ${String(reference.counterexample).replace(/[\r\n]+/g, ' ').trim()}`] : []),
90
+ ...((reference.recheckTrigger || reference.recheckAfter) ? [`- Recheck trigger: ${String(reference.recheckTrigger || reference.recheckAfter).replace(/[\r\n]+/g, ' ').trim()}`] : []),
91
+ '',
92
+ ].join('\n');
93
+ fs.mkdirSync(path.dirname(target), { recursive: true });
94
+ fs.writeFileSync(target, current + (current.endsWith('\n') ? '' : '\n') + block, 'utf8');
95
+ return { ok: true, action: 'recorded', taskId, path: path.relative(root, target).replaceAll('\\', '/') };
96
+ }
97
+
98
+ export function readInput(value, root = null) { return readJsonInput(value, root); }
99
+ export { TRIGGERS, DECISIONS, SOURCE_TYPES };