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.
- package/CHANGELOG.md +49 -0
- package/README-CN.md +4 -2
- package/README.md +23 -4
- package/package.json +17 -2
- package/src/generator.js +19 -6
- package/src/index.js +531 -38
- package/src/prompts.js +4 -4
- package/src/ui/dist/assets/AgentsRoute-BGGs90wH.js +7 -0
- package/src/ui/dist/assets/Assistant-Bold-gm-uSS1B.woff2 +0 -0
- package/src/ui/dist/assets/Assistant-Medium-DrcxCXg3.woff2 +0 -0
- package/src/ui/dist/assets/Assistant-Regular-DVxZuzxb.woff2 +0 -0
- package/src/ui/dist/assets/Assistant-SemiBold-SCI4bEL9.woff2 +0 -0
- package/src/ui/dist/assets/Combination-DhBLEmof.js +42 -0
- package/src/ui/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/src/ui/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/src/ui/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/src/ui/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/src/ui/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/src/ui/dist/assets/RolesRoute-DnodCSz0.js +2 -0
- package/src/ui/dist/assets/RuntimePicker-CucD8TGn.js +7 -0
- package/src/ui/dist/assets/SettingsRoute-DquMWjac.js +2 -0
- package/src/ui/dist/assets/TaskList-Bxc0Uktx.js +7 -0
- package/src/ui/dist/assets/TerminalDrawer-CDusYltc.js +36 -0
- package/src/ui/dist/assets/WorkflowRoute-BN8yHmUs.css +1 -0
- package/src/ui/dist/assets/WorkflowRoute-D-0wVDpY.js +334 -0
- package/src/ui/dist/assets/abnfDiagram-VRR7QNED-zkRKkaxO.js +2 -0
- package/src/ui/dist/assets/apl-B4CMkyY2.js +2 -0
- package/src/ui/dist/assets/ar-SA-G6X2FPQ2-BiHaArx5.js +11 -0
- package/src/ui/dist/assets/arc-CBnLtOFO.js +2 -0
- package/src/ui/dist/assets/architectureDiagram-ZJ3FMSHR-DWXRXsh1.js +37 -0
- package/src/ui/dist/assets/asciiarmor-Df11BRmG.js +2 -0
- package/src/ui/dist/assets/asn1-EdZsLKOL.js +2 -0
- package/src/ui/dist/assets/asterisk-B-8jnY81.js +2 -0
- package/src/ui/dist/assets/az-AZ-76LH7QW2-CiT05voO.js +2 -0
- package/src/ui/dist/assets/bg-BG-XCXSNQG7-L-UM9tNf.js +6 -0
- package/src/ui/dist/assets/blockDiagram-677ZJIJ3-BIyh3Bry.js +133 -0
- package/src/ui/dist/assets/bn-BD-2XOGV67Q-NdgbA0bC.js +6 -0
- package/src/ui/dist/assets/brainfuck-C4LP7Hcl.js +2 -0
- package/src/ui/dist/assets/c4Diagram-LMCZKHZV-CA54vWWM.js +11 -0
- package/src/ui/dist/assets/ca-ES-6MX7JW3Y-BKZZsQ5J.js +9 -0
- package/src/ui/dist/assets/channel-Da_-zcAu.js +2 -0
- package/src/ui/dist/assets/chunk-2Q5K7J3B-DE4cxr1v.js +2 -0
- package/src/ui/dist/assets/chunk-32BRIVSS-i7FwbEU9.js +2 -0
- package/src/ui/dist/assets/chunk-5VM5RSS4-BhIcOYSu.js +16 -0
- package/src/ui/dist/assets/chunk-EX3LRPZG-Ci9zZRIs.js +232 -0
- package/src/ui/dist/assets/chunk-JWPE2WC7-BFdkcz-G.js +2 -0
- package/src/ui/dist/assets/chunk-MOJQB5TN-Dzmapl_S.js +89 -0
- package/src/ui/dist/assets/chunk-RYQCIY6F-RTmp7FOy.js +2 -0
- package/src/ui/dist/assets/chunk-V7JOEXUC-DInU3v3D.js +207 -0
- package/src/ui/dist/assets/chunk-VR4S4FIN-BHoyGBQO.js +2 -0
- package/src/ui/dist/assets/chunk-XXDRQBXY-DfeLZNZx.js +2 -0
- package/src/ui/dist/assets/classDiagram-OUVF2IWQ-FKbUS0bu.js +2 -0
- package/src/ui/dist/assets/classDiagram-v2-EOCWNBFH-FKbUS0bu.js +2 -0
- package/src/ui/dist/assets/clike-B9uivgTg.js +2 -0
- package/src/ui/dist/assets/clojure-BMjYHr_A.js +2 -0
- package/src/ui/dist/assets/cmake-BQqOBYOt.js +2 -0
- package/src/ui/dist/assets/cobol-CWcv1MsR.js +2 -0
- package/src/ui/dist/assets/coffeescript-S37ZYGWr.js +2 -0
- package/src/ui/dist/assets/commonlisp-DBKNyK5s.js +2 -0
- package/src/ui/dist/assets/cose-bilkent-JH36ORCC-_5PUJ615.js +2 -0
- package/src/ui/dist/assets/crystal-SjHAIU92.js +2 -0
- package/src/ui/dist/assets/cs-CZ-2BRQDIVT-DnkfnhDU.js +12 -0
- package/src/ui/dist/assets/css-BnMrqG3P.js +2 -0
- package/src/ui/dist/assets/cynefin-VYW2F7L2-CmkcFv-b.js +179 -0
- package/src/ui/dist/assets/cynefinDiagram-TSTJHNR4-D72VZn8H.js +63 -0
- package/src/ui/dist/assets/cypher-C_CwsFkJ.js +2 -0
- package/src/ui/dist/assets/cytoscape.esm-DTSO7Bv0.js +332 -0
- package/src/ui/dist/assets/d-pRatUO7H.js +2 -0
- package/src/ui/dist/assets/da-DK-5WZEPLOC-C54tQUgd.js +6 -0
- package/src/ui/dist/assets/dagre-VKFMJZFB-0BsAkrmo.js +5 -0
- package/src/ui/dist/assets/de-DE-XR44H4JA-DGfZlR10.js +9 -0
- package/src/ui/dist/assets/defaultLocale-DX6XiGOO.js +2 -0
- package/src/ui/dist/assets/diagram-FQU43EPY-C1ZJDOca.js +4 -0
- package/src/ui/dist/assets/diagram-G47NLZAW-D3pr3FSP.js +25 -0
- package/src/ui/dist/assets/diagram-NH7WQ7WH-Bwry0NV-.js +25 -0
- package/src/ui/dist/assets/diagram-OA4YK3LP-L6g09cmV.js +31 -0
- package/src/ui/dist/assets/diagram-WEI45ONY-Bh1puYVX.js +42 -0
- package/src/ui/dist/assets/diff-DbItnlRl.js +2 -0
- package/src/ui/dist/assets/directory-open-01563666-DWU9wJ6I.js +2 -0
- package/src/ui/dist/assets/directory-open-4ed118d0-CunoC1EB.js +2 -0
- package/src/ui/dist/assets/dockerfile-BKs6k2Af.js +2 -0
- package/src/ui/dist/assets/dtd-DF_7sFjM.js +2 -0
- package/src/ui/dist/assets/dylan-DwRh75JA.js +2 -0
- package/src/ui/dist/assets/ebnf-CDyGwa7X.js +2 -0
- package/src/ui/dist/assets/ebnfDiagram-CCIWWBDH-BC_mBRR5.js +2 -0
- package/src/ui/dist/assets/ecl-Cabwm37j.js +2 -0
- package/src/ui/dist/assets/eiffel-CnydiIhH.js +2 -0
- package/src/ui/dist/assets/el-GR-BZB4AONW-DsnwWweL.js +11 -0
- package/src/ui/dist/assets/elm-vLlmbW-K.js +2 -0
- package/src/ui/dist/assets/erDiagram-Q63AITRT-Bkxam36l.js +86 -0
- package/src/ui/dist/assets/erlang-BNw1qcRV.js +2 -0
- package/src/ui/dist/assets/es-ES-U4NZUMDT-CRxBcQgC.js +10 -0
- package/src/ui/dist/assets/eu-ES-A7QVB2H4-CTd_E7YR.js +12 -0
- package/src/ui/dist/assets/excalidraw-default-bMWIgNCy.svg +1 -0
- package/src/ui/dist/assets/fa-IR-HGAKTJCU-DO56k7eG.js +9 -0
- package/src/ui/dist/assets/factor-kuTfRLto.js +2 -0
- package/src/ui/dist/assets/fcl-Kvtd6kyn.js +2 -0
- package/src/ui/dist/assets/fi-FI-Z5N7JZ37-DEDCF9WB.js +7 -0
- package/src/ui/dist/assets/file-open-002ab408-DIuFHtCF.js +2 -0
- package/src/ui/dist/assets/file-open-7c801643-684qeFg4.js +2 -0
- package/src/ui/dist/assets/file-save-3189631c-C1wFhQhH.js +2 -0
- package/src/ui/dist/assets/file-save-745eba88-Bb9F9Kg7.js +2 -0
- package/src/ui/dist/assets/flowDiagram-23GEKE2U-C3SAEao7.js +157 -0
- package/src/ui/dist/assets/forth-Ffai-XNe.js +2 -0
- package/src/ui/dist/assets/fortran-DYz_wnZ1.js +2 -0
- package/src/ui/dist/assets/fr-FR-RHASNOE6-DE2nPyDt.js +10 -0
- package/src/ui/dist/assets/ganttDiagram-NO4QXBWP-U-J_Xi-_.js +293 -0
- package/src/ui/dist/assets/gas-Bneqetm1.js +2 -0
- package/src/ui/dist/assets/gherkin-heZmZLOM.js +2 -0
- package/src/ui/dist/assets/gitGraphDiagram-IHSO6WYX-BADVbD-a.js +107 -0
- package/src/ui/dist/assets/gl-ES-HMX3MZ6V-mCqVgQHC.js +11 -0
- package/src/ui/dist/assets/graph-C9eacEi8.js +2 -0
- package/src/ui/dist/assets/groovy-D9Dt4D0W.js +2 -0
- package/src/ui/dist/assets/haskell-Cw1EW3IL.js +2 -0
- package/src/ui/dist/assets/haxe-H-WmDvRZ.js +2 -0
- package/src/ui/dist/assets/he-IL-6SHJWFNN-KnaLrCzw.js +11 -0
- package/src/ui/dist/assets/hi-IN-IWLTKZ5I-wuqiaaWt.js +5 -0
- package/src/ui/dist/assets/http-DBlCnlav.js +2 -0
- package/src/ui/dist/assets/hu-HU-A5ZG7DT2-DLg_zm22.js +8 -0
- package/src/ui/dist/assets/id-ID-SAP4L64H-MB2mXqcR.js +11 -0
- package/src/ui/dist/assets/idl-BEugSyMb.js +2 -0
- package/src/ui/dist/assets/image-blob-reduce.esm-HwCm7IZ0.js +8 -0
- package/src/ui/dist/assets/index-39SJtrt0.js +2 -0
- package/src/ui/dist/assets/index-BQ0LIrW-.js +2 -0
- package/src/ui/dist/assets/index-BcAUh2Nm.css +1 -0
- package/src/ui/dist/assets/index-BcThOK-i.js +331 -0
- package/src/ui/dist/assets/index-BnxV3k_S.js +3 -0
- package/src/ui/dist/assets/index-C7MZBHbT.js +117 -0
- package/src/ui/dist/assets/index-CCvKI2rM.js +2 -0
- package/src/ui/dist/assets/index-CZvmcCab.js +8 -0
- package/src/ui/dist/assets/index-Cp3hLKNl.js +2 -0
- package/src/ui/dist/assets/index-D7ayFxcx.js +2 -0
- package/src/ui/dist/assets/index-DAYxSQGU.js +2 -0
- package/src/ui/dist/assets/index-DD-HeMV0.css +1 -0
- package/src/ui/dist/assets/index-DPMxd3Qn.js +2 -0
- package/src/ui/dist/assets/index-DSe2jx3k.js +4 -0
- package/src/ui/dist/assets/index-DUirCkgW.js +2 -0
- package/src/ui/dist/assets/index-DaKPQ2hN.js +159 -0
- package/src/ui/dist/assets/index-DzpuR0Jg.js +2 -0
- package/src/ui/dist/assets/index-POndwsCI.js +2 -0
- package/src/ui/dist/assets/index-R8NM9I_9.js +2 -0
- package/src/ui/dist/assets/index-TCDuDhBj.js +2 -0
- package/src/ui/dist/assets/index-TckzASdM.js +2 -0
- package/src/ui/dist/assets/index-Yi5ytFFr.js +2 -0
- package/src/ui/dist/assets/infoDiagram-FWYZ7A6U-CiGBlFqH.js +3 -0
- package/src/ui/dist/assets/init-Gi6I4Gst.js +2 -0
- package/src/ui/dist/assets/ishikawaDiagram-FXEZZL3T-B1aheRbz.js +71 -0
- package/src/ui/dist/assets/it-IT-JPQ66NNP-DT3HSU7X.js +12 -0
- package/src/ui/dist/assets/ja-JP-DBVTYXUO-CsfJjjWt.js +9 -0
- package/src/ui/dist/assets/javascript-iXu5QeM3.js +2 -0
- package/src/ui/dist/assets/journeyDiagram-5HDEW3XC-DtnJPxub.js +140 -0
- package/src/ui/dist/assets/julia-DuME0IfC.js +2 -0
- package/src/ui/dist/assets/kaa-6HZHGXH3-DQz-1-Gn.js +2 -0
- package/src/ui/dist/assets/kab-KAB-ZGHBKWFO-CaH-LSoK.js +9 -0
- package/src/ui/dist/assets/kanban-definition-HUTT4EX6-CZatSm3e.js +90 -0
- package/src/ui/dist/assets/katex-C5jXJg4s.js +258 -0
- package/src/ui/dist/assets/kk-KZ-P5N5QNE5-BMXmcm55.js +2 -0
- package/src/ui/dist/assets/km-KH-HSX4SM5Z-ZeoJNBpN.js +12 -0
- package/src/ui/dist/assets/ko-KR-MTYHY66A-BeaLRKph.js +10 -0
- package/src/ui/dist/assets/ku-TR-6OUDTVRD-B_28KrkR.js +10 -0
- package/src/ui/dist/assets/layout-DEXfKzaS.js +2 -0
- package/src/ui/dist/assets/linear-CpEDnQRC.js +2 -0
- package/src/ui/dist/assets/livescript-BwQOo05w.js +2 -0
- package/src/ui/dist/assets/lt-LT-XHIRWOB4-BxDcnUhp.js +4 -0
- package/src/ui/dist/assets/lua-VAEuO923.js +2 -0
- package/src/ui/dist/assets/lv-LV-5QDEKY6T-DpKDl1_y.js +8 -0
- package/src/ui/dist/assets/map-Czzmt4hB.js +2 -0
- package/src/ui/dist/assets/mathematica-DTrFuWx2.js +2 -0
- package/src/ui/dist/assets/mbox-CNhZ1qSd.js +2 -0
- package/src/ui/dist/assets/mermaidLoader-CBO31t0J.js +305 -0
- package/src/ui/dist/assets/mermaidLoader-CEK31ho9.css +1 -0
- package/src/ui/dist/assets/mindmap-definition-LN4V7U3C-CQ0TccEr.js +97 -0
- package/src/ui/dist/assets/mirc-CjQqDB4T.js +2 -0
- package/src/ui/dist/assets/mllike-CXdrOF99.js +2 -0
- package/src/ui/dist/assets/modelica-Dc1JOy9r.js +2 -0
- package/src/ui/dist/assets/mr-IN-CRQNXWMA-BKCZT58p.js +14 -0
- package/src/ui/dist/assets/mscgen-BA5vi2Kp.js +2 -0
- package/src/ui/dist/assets/mumps-BT43cFF4.js +2 -0
- package/src/ui/dist/assets/my-MM-5M5IBNSE-D34k0G9T.js +2 -0
- package/src/ui/dist/assets/nb-NO-T6EIAALU-DXr_KW8J.js +11 -0
- package/src/ui/dist/assets/nginx-DdIZxoE0.js +2 -0
- package/src/ui/dist/assets/nl-NL-IS3SIHDZ-C1L0aVDR.js +9 -0
- package/src/ui/dist/assets/nn-NO-6E72VCQL-CLWVSxbZ.js +9 -0
- package/src/ui/dist/assets/nsis-LdVXkNf5.js +2 -0
- package/src/ui/dist/assets/ntriples-BfvgReVJ.js +2 -0
- package/src/ui/dist/assets/oc-FR-POXYY2M6-nf8_J3eR.js +9 -0
- package/src/ui/dist/assets/octave-Ck1zUtKM.js +2 -0
- package/src/ui/dist/assets/ordinal-Cboi1Yqb.js +2 -0
- package/src/ui/dist/assets/oz-BzwKVEFT.js +2 -0
- package/src/ui/dist/assets/pa-IN-N4M65BXN-CAMJ-xd6.js +5 -0
- package/src/ui/dist/assets/pascal--L3eBynH.js +2 -0
- package/src/ui/dist/assets/pegDiagram-2B236MQR-Bj2RcmRd.js +2 -0
- package/src/ui/dist/assets/percentages-BXMCSKIN-s9yWFdr6.js +160 -0
- package/src/ui/dist/assets/perl-CdXCOZ3F.js +2 -0
- package/src/ui/dist/assets/pica-BGv_AhAB.js +8 -0
- package/src/ui/dist/assets/pieDiagram-ENE6RG2P-obpzz8dC.js +40 -0
- package/src/ui/dist/assets/pig-CevX1Tat.js +2 -0
- package/src/ui/dist/assets/pl-PL-T2D74RX3-DKJ5H85v.js +10 -0
- package/src/ui/dist/assets/powershell-CFHJl5sT.js +2 -0
- package/src/ui/dist/assets/properties-C78fOPTZ.js +2 -0
- package/src/ui/dist/assets/protobuf-ChK-085T.js +2 -0
- package/src/ui/dist/assets/{proxy-D0vUbds5.js → proxy-BSmwef4H.js} +2 -2
- package/src/ui/dist/assets/pt-BR-5N22H2LF-B5kow-kN.js +10 -0
- package/src/ui/dist/assets/pt-PT-UZXXM6DQ-B2G34fso.js +10 -0
- package/src/ui/dist/assets/pug-DeIclll2.js +2 -0
- package/src/ui/dist/assets/puppet-DMA9R1ak.js +2 -0
- package/src/ui/dist/assets/python-BuPzkPfP.js +2 -0
- package/src/ui/dist/assets/q-pXgVlZs6.js +2 -0
- package/src/ui/dist/assets/quadrantDiagram-ABIIQ3AL-Cl-T7NkJ.js +8 -0
- package/src/ui/dist/assets/r-B6wPVr8A.js +2 -0
- package/src/ui/dist/assets/railroadDiagram-RFXS5EU6-DMq82RHg.js +2 -0
- package/src/ui/dist/assets/{refresh-cw-JNmExijd.js → refresh-cw-CbFd7guV.js} +2 -2
- package/src/ui/dist/assets/requirementDiagram-TGXJPOKE-tGInMDgU.js +85 -0
- package/src/ui/dist/assets/ro-RO-JPDTUUEW-BwLdZW91.js +12 -0
- package/src/ui/dist/assets/roundRect-0PYZxl1G.js +2 -0
- package/src/ui/dist/assets/rpm-CTu-6PCP.js +2 -0
- package/src/ui/dist/assets/ru-RU-B4JR7IUQ-DpdAgIJc.js +10 -0
- package/src/ui/dist/assets/ruby-B2Rjki9n.js +2 -0
- package/src/ui/dist/assets/runtimeBrand-BoKPimsz.js +2 -0
- package/src/ui/dist/assets/sankeyDiagram-HTMAVEWB-C7X-ET4m.js +41 -0
- package/src/ui/dist/assets/sas-B4kiWyti.js +2 -0
- package/src/ui/dist/assets/save-D1CXHwBw.js +12 -0
- package/src/ui/dist/assets/scheme-C41bIUwD.js +2 -0
- package/src/ui/dist/assets/sequenceDiagram-DBY2YBRQ-Bn24i_nY.js +163 -0
- package/src/ui/dist/assets/settings-2-DtSNAAcU.js +22 -0
- package/src/ui/dist/assets/shell-CjFT_Tl9.js +2 -0
- package/src/ui/dist/assets/shield-check-BVbJ8T_N.js +7 -0
- package/src/ui/dist/assets/si-LK-N5RQ5JYF-naJaUy5u.js +2 -0
- package/src/ui/dist/assets/sieve-C3Gn_uJK.js +2 -0
- package/src/ui/dist/assets/simple-mode-GW_nhZxv.js +2 -0
- package/src/ui/dist/assets/sizeCapture-X5ZJPWSS-DAQHfm82.js +2 -0
- package/src/ui/dist/assets/sk-SK-C5VTKIMK-1NPz1J_d.js +7 -0
- package/src/ui/dist/assets/sl-SI-NN7IZMDC-D8RfmNQw.js +7 -0
- package/src/ui/dist/assets/smalltalk-CnHTOXQT.js +2 -0
- package/src/ui/dist/assets/solr-DehyRSwq.js +2 -0
- package/src/ui/dist/assets/sparql-DkYu6x3z.js +2 -0
- package/src/ui/dist/assets/spreadsheet-BCZA_wO0.js +2 -0
- package/src/ui/dist/assets/sql-D0XecflT.js +2 -0
- package/src/ui/dist/assets/stateDiagram-2N3HPSRC-Ck48D1ck.js +2 -0
- package/src/ui/dist/assets/stateDiagram-v2-6OUMAXLB-CdfRCJAJ.js +2 -0
- package/src/ui/dist/assets/stex-C3f8Ysf7.js +2 -0
- package/src/ui/dist/assets/style-C3QI7VPf.css +1 -0
- package/src/ui/dist/assets/stylus-B533Al4x.js +2 -0
- package/src/ui/dist/assets/subset-shared.chunk-eAtLHmbi.js +85 -0
- package/src/ui/dist/assets/subset-worker.chunk-DeHCTnTk.js +2 -0
- package/src/ui/dist/assets/sv-SE-XGPEYMSR-BeOYCU-8.js +11 -0
- package/src/ui/dist/assets/swift-BzpIVaGY.js +2 -0
- package/src/ui/dist/assets/swimlanes-5IMT3BWC-DOy22UjP.js +3 -0
- package/src/ui/dist/assets/swimlanesDiagram-G3AALYLV-sicPbVOg.js +9 -0
- package/src/ui/dist/assets/ta-IN-2NMHFXQM-CtS68WDd.js +10 -0
- package/src/ui/dist/assets/tcl-DVfN8rqt.js +2 -0
- package/src/ui/dist/assets/{terminal-BBQvnOAK.js → terminal-DEby5Y_P.js} +2 -2
- package/src/ui/dist/assets/terminalControl-BkFeDVXo.js +134 -0
- package/src/ui/dist/assets/textile-CnDTJFAw.js +2 -0
- package/src/ui/dist/assets/th-TH-HPSO5L25-DCHY9-Co.js +3 -0
- package/src/ui/dist/assets/tiddlywiki-DO-Gjzrf.js +2 -0
- package/src/ui/dist/assets/tiki-DGYXhP31.js +2 -0
- package/src/ui/dist/assets/timeline-definition-FHXFAJF6-DVkG72qO.js +121 -0
- package/src/ui/dist/assets/toml-Bm5Em-hy.js +2 -0
- package/src/ui/dist/assets/tr-TR-DEFEU3FU-y5-vjTv8.js +8 -0
- package/src/ui/dist/assets/troff-wAsdV37c.js +2 -0
- package/src/ui/dist/assets/ttcn-CfJYG6tj.js +2 -0
- package/src/ui/dist/assets/ttcn-cfg-B9xdYoR4.js +2 -0
- package/src/ui/dist/assets/turtle-B1tBg_DP.js +2 -0
- package/src/ui/dist/assets/uk-UA-QMV73CPH-BRbR5It6.js +7 -0
- package/src/ui/dist/assets/useReducedMotion-D07XP52Q.js +12 -0
- package/src/ui/dist/assets/vb-CmGdzxic.js +2 -0
- package/src/ui/dist/assets/vbscript-BuJXcnF6.js +2 -0
- package/src/ui/dist/assets/velocity-D8B20fx6.js +2 -0
- package/src/ui/dist/assets/vennDiagram-L72KCM5P-DwMwBlf-.js +35 -0
- package/src/ui/dist/assets/verilog-C6RDOZhf.js +2 -0
- package/src/ui/dist/assets/vhdl-lSbBsy5d.js +2 -0
- package/src/ui/dist/assets/vi-VN-M7AON7JQ-s6wSBv2s.js +6 -0
- package/src/ui/dist/assets/wardleyDiagram-EHGQE667-CNuuvzEg.js +79 -0
- package/src/ui/dist/assets/webidl-ZXfAyPTL.js +2 -0
- package/src/ui/dist/assets/{x-DoIOGAJz.js → x-B84wq78k.js} +2 -2
- package/src/ui/dist/assets/xquery-DzFWVndE.js +2 -0
- package/src/ui/dist/assets/xychartDiagram-FW5EYKEG-dUpZxmn6.js +8 -0
- package/src/ui/dist/assets/yacas-BJ4BC0dw.js +2 -0
- package/src/ui/dist/assets/z80-Hz9HOZM7.js +2 -0
- package/src/ui/dist/assets/zh-CN-LNUGB5OW-Cu_-POQN.js +11 -0
- package/src/ui/dist/assets/zh-HK-E62DVLB3-BCx4W4qZ.js +2 -0
- package/src/ui/dist/assets/zh-TW-RAJ6MFWO-02wx_Mrj.js +10 -0
- package/src/ui/dist/icons/excalidraw.svg +1 -0
- package/src/ui/dist/icons/markdown.svg +1 -0
- package/src/ui/dist/index.html +2 -2
- package/src/ui/package.json +10 -0
- package/src/ui/playwright.config.ts +36 -0
- package/src/ui/pnpm-workspace.yaml +2 -0
- package/src/ui/public/icons/excalidraw.svg +1 -0
- package/src/ui/public/icons/markdown.svg +1 -0
- package/src/ui/tsconfig.json +2 -1
- package/src/ui/vite.config.ts +1 -0
- package/src/wf-ui-server/__tests__/a2a-store.test.mjs +432 -15
- package/src/wf-ui-server/__tests__/action-registry-loader.test.mjs +156 -0
- package/src/wf-ui-server/__tests__/claude-stream-json.test.mjs +397 -0
- package/src/wf-ui-server/__tests__/codex-appserver.test.mjs +392 -0
- package/src/wf-ui-server/__tests__/component-node-api.test.mjs +881 -0
- package/src/wf-ui-server/__tests__/component-node-store.test.mjs +401 -0
- package/src/wf-ui-server/__tests__/control-plane-acceptance.test.mjs +2027 -0
- package/src/wf-ui-server/__tests__/control-plane-cli-smoke.test.mjs +1014 -0
- package/src/wf-ui-server/__tests__/dispatch-lifecycle.test.mjs +330 -0
- package/src/wf-ui-server/__tests__/effort-compatibility-red-092.test.mjs +151 -0
- package/src/wf-ui-server/__tests__/graph-layout-agent-tree.test.mjs +254 -0
- package/src/wf-ui-server/__tests__/graph-layout-tidy.test.mjs +260 -0
- package/src/wf-ui-server/__tests__/graph-layout.test.mjs +84 -0
- package/src/wf-ui-server/__tests__/node-config-api.test.mjs +384 -0
- package/src/wf-ui-server/__tests__/opencode-server.test.mjs +526 -0
- package/src/wf-ui-server/__tests__/peer-capsule.test.mjs +2 -2
- package/src/wf-ui-server/__tests__/pty-adapter.test.mjs +71 -1
- package/src/wf-ui-server/__tests__/runtime-config.test.mjs +3 -3
- package/src/wf-ui-server/__tests__/runtime-detector.test.mjs +21 -0
- package/src/wf-ui-server/__tests__/runtime-review.test.mjs +828 -0
- package/src/wf-ui-server/__tests__/server.integration.test.mjs +1463 -11
- package/src/wf-ui-server/__tests__/session-cleanup.test.mjs +159 -0
- package/src/wf-ui-server/__tests__/session-registry.test.mjs +52 -3
- package/src/wf-ui-server/__tests__/settings.test.mjs +12 -2
- package/src/wf-ui-server/__tests__/spawn-gate.test.mjs +78 -0
- package/src/wf-ui-server/__tests__/task-group-parser.test.mjs +120 -0
- package/src/wf-ui-server/__tests__/task-group-tag.test.mjs +264 -0
- package/src/wf-ui-server/__tests__/task-parser.test.mjs +49 -3
- package/src/wf-ui-server/__tests__/terminal-context-hardening.test.mjs +122 -0
- package/src/wf-ui-server/__tests__/terminal-context.test.mjs +164 -0
- package/src/wf-ui-server/__tests__/terminal-store.test.mjs +4 -4
- package/src/wf-ui-server/__tests__/wf-browser-api.test.mjs +599 -0
- package/src/wf-ui-server/__tests__/wf-browser-store.test.mjs +184 -0
- package/src/wf-ui-server/__tests__/workflow-action-registry.test.mjs +282 -0
- package/src/wf-ui-server/__tests__/workflow-agent-communication.test.mjs +411 -0
- package/src/wf-ui-server/__tests__/workflow-agent-context.test.mjs +323 -0
- package/src/wf-ui-server/__tests__/workflow-agent-cooperation-permissions.test.mjs +318 -0
- package/src/wf-ui-server/__tests__/workflow-agent-messages-structured.test.mjs +458 -0
- package/src/wf-ui-server/__tests__/workflow-agent-routing.test.mjs +434 -0
- package/src/wf-ui-server/__tests__/workflow-agent-runtime.test.mjs +324 -0
- package/src/wf-ui-server/__tests__/workflow-api-integration.test.mjs +263 -0
- package/src/wf-ui-server/__tests__/workflow-api-phase3.test.mjs +1213 -0
- package/src/wf-ui-server/__tests__/workflow-claude-materialize.test.mjs +209 -0
- package/src/wf-ui-server/__tests__/workflow-cli-registry-manuals.test.mjs +173 -0
- package/src/wf-ui-server/__tests__/workflow-cli-surface.test.mjs +176 -0
- package/src/wf-ui-server/__tests__/workflow-codex-resume-id.test.mjs +556 -0
- package/src/wf-ui-server/__tests__/workflow-cooperation-enforcement.test.mjs +553 -0
- package/src/wf-ui-server/__tests__/workflow-depth-resume-dock.test.mjs +846 -0
- package/src/wf-ui-server/__tests__/workflow-display-node.test.mjs +150 -0
- package/src/wf-ui-server/__tests__/workflow-edge-update.test.mjs +296 -0
- package/src/wf-ui-server/__tests__/workflow-file-cache-lock-watch.test.mjs +380 -0
- package/src/wf-ui-server/__tests__/workflow-file-formats.test.mjs +994 -0
- package/src/wf-ui-server/__tests__/workflow-file-node-actions.test.mjs +294 -0
- package/src/wf-ui-server/__tests__/workflow-goal-actions.test.mjs +357 -0
- package/src/wf-ui-server/__tests__/workflow-goal-task-autoclose.test.mjs +256 -0
- package/src/wf-ui-server/__tests__/workflow-graceful-stop.test.mjs +108 -0
- package/src/wf-ui-server/__tests__/workflow-graph-undo.test.mjs +524 -0
- package/src/wf-ui-server/__tests__/workflow-layout.test.mjs +732 -0
- package/src/wf-ui-server/__tests__/workflow-magnetic-topology.test.mjs +222 -0
- package/src/wf-ui-server/__tests__/workflow-markdown-lock.test.mjs +359 -0
- package/src/wf-ui-server/__tests__/workflow-mcp-hub.test.mjs +174 -0
- package/src/wf-ui-server/__tests__/workflow-node-manual-schema.test.mjs +241 -0
- package/src/wf-ui-server/__tests__/workflow-node-runtime.test.mjs +1991 -0
- package/src/wf-ui-server/__tests__/workflow-node-store-utils.test.mjs +125 -0
- package/src/wf-ui-server/__tests__/workflow-registry-drift.test.mjs +296 -0
- package/src/wf-ui-server/__tests__/workflow-resource-handle-four-side.test.mjs +217 -0
- package/src/wf-ui-server/__tests__/workflow-role-profile.test.mjs +234 -0
- package/src/wf-ui-server/__tests__/workflow-set-model.test.mjs +261 -0
- package/src/wf-ui-server/__tests__/workflow-skill-group-context-enabled.test.mjs +131 -0
- package/src/wf-ui-server/__tests__/workflow-skill-group-enable-disable.test.mjs +186 -0
- package/src/wf-ui-server/__tests__/workflow-skills-hub.test.mjs +125 -0
- package/src/wf-ui-server/__tests__/workflow-state-reconcile.test.mjs +139 -0
- package/src/wf-ui-server/__tests__/workflow-subagent-strategy-matrix.test.mjs +529 -0
- package/src/wf-ui-server/__tests__/workflow-team-flow.test.mjs +278 -0
- package/src/wf-ui-server/__tests__/workflow-terminal-control-live.test.mjs +294 -0
- package/src/wf-ui-server/__tests__/workflow-terminal-control.test.mjs +631 -0
- package/src/wf-ui-server/__tests__/workflow-timer-wakeup.test.mjs +318 -0
- package/src/wf-ui-server/__tests__/workflow-unified-resume.test.mjs +537 -0
- package/src/wf-ui-server/__tests__/workspace-api-hardening.test.mjs +187 -0
- package/src/wf-ui-server/__tests__/workspace-api.test.mjs +382 -0
- package/src/wf-ui-server/__tests__/workspace-reveal.test.mjs +138 -0
- package/src/wf-ui-server/__tests__/workspace-store-hardening.test.mjs +255 -0
- package/src/wf-ui-server/__tests__/workspace-store.test.mjs +208 -0
- package/src/wf-ui-server/__tests__/ws-events.integration.test.mjs +52 -25
- package/src/wf-ui-server/__tests__/ws-terminal.integration.test.mjs +12 -6
- package/src/wf-ui-server/__tests__/ws-wf-browser.integration.test.mjs +488 -0
- package/src/wf-ui-server/a2a-store.mjs +3007 -89
- package/src/wf-ui-server/action-registry.mjs +277 -0
- package/src/wf-ui-server/bridge-store.mjs +276 -0
- package/src/wf-ui-server/chat-driver.mjs +220 -0
- package/src/wf-ui-server/chat-store.mjs +109 -0
- package/src/wf-ui-server/claude-transcript-materializer.mjs +235 -0
- package/src/wf-ui-server/codex-update-prompt.mjs +53 -0
- package/src/wf-ui-server/component-node-store.mjs +689 -0
- package/src/wf-ui-server/composition-api.mjs +436 -0
- package/src/wf-ui-server/control-plane-token.mjs +17 -0
- package/src/wf-ui-server/dispatch-contract.mjs +150 -0
- package/src/wf-ui-server/drivers/claude-stream-json.mjs +371 -0
- package/src/wf-ui-server/drivers/codex-appserver.mjs +513 -0
- package/src/wf-ui-server/drivers/opencode-server.mjs +486 -0
- package/src/wf-ui-server/excalidraw-svg.mjs +141 -0
- package/src/wf-ui-server/file-format-adapters.mjs +511 -0
- package/src/wf-ui-server/file-watcher.mjs +215 -0
- package/src/wf-ui-server/graph-layout.mjs +778 -0
- package/src/wf-ui-server/harness-env.mjs +46 -0
- package/src/wf-ui-server/json-store-utils.mjs +48 -0
- package/src/wf-ui-server/model-capability.mjs +773 -0
- package/src/wf-ui-server/node-config-store.mjs +233 -0
- package/src/wf-ui-server/node-store-utils.mjs +88 -0
- package/src/wf-ui-server/peer-capsule.mjs +56 -1
- package/src/wf-ui-server/pty-adapter.mjs +513 -11
- package/src/wf-ui-server/reveal-foreground.mjs +69 -0
- package/src/wf-ui-server/runtime-detector.mjs +52 -6
- package/src/wf-ui-server/server.mjs +5613 -403
- package/src/wf-ui-server/session-cleanup.mjs +363 -0
- package/src/wf-ui-server/session-registry.mjs +179 -3
- package/src/wf-ui-server/settings.mjs +25 -0
- package/src/wf-ui-server/spawn-gate.mjs +46 -0
- package/src/wf-ui-server/task-parser.mjs +88 -3
- package/src/wf-ui-server/terminal-store.mjs +225 -11
- package/src/wf-ui-server/timer-wakeup-scheduler.mjs +226 -0
- package/src/wf-ui-server/wf-browser-store.mjs +733 -0
- package/src/wf-ui-server/workflow-agent-context.mjs +1731 -0
- package/src/wf-ui-server/workflow-capability-node-store.mjs +676 -0
- package/src/wf-ui-server/workflow-event-node-store.mjs +623 -0
- package/src/wf-ui-server/workflow-goal-node-store.mjs +328 -0
- package/src/wf-ui-server/workflow-graph-store.mjs +623 -0
- package/src/wf-ui-server/workflow-mcp-hub.mjs +286 -0
- package/src/wf-ui-server/workflow-node-runtime.mjs +1767 -0
- package/src/wf-ui-server/workflow-node-settings-store.mjs +339 -0
- package/src/wf-ui-server/workflow-node-types/agent-node.mjs +920 -0
- package/src/wf-ui-server/workflow-node-types/display-node.mjs +151 -0
- package/src/wf-ui-server/workflow-node-types/excalidraw-node.mjs +145 -0
- package/src/wf-ui-server/workflow-node-types/file-node.mjs +484 -0
- package/src/wf-ui-server/workflow-node-types/github-trigger-node.mjs +207 -0
- package/src/wf-ui-server/workflow-node-types/goal-node.mjs +491 -0
- package/src/wf-ui-server/workflow-node-types/markdown-node.mjs +225 -0
- package/src/wf-ui-server/workflow-node-types/mcp-connector-node.mjs +71 -0
- package/src/wf-ui-server/workflow-node-types/role-profile-store.mjs +191 -0
- package/src/wf-ui-server/workflow-node-types/skill-group-node.mjs +98 -0
- package/src/wf-ui-server/workflow-node-types/timer-node.mjs +607 -0
- package/src/wf-ui-server/workflow-ontology.mjs +681 -0
- package/src/wf-ui-server/workflow-operation-store.mjs +115 -0
- package/src/wf-ui-server/workflow-skills-hub.mjs +366 -0
- package/src/wf-ui-server/workflow-skills-market.mjs +723 -0
- package/src/wf-ui-server/workspace-store.mjs +951 -0
- package/src/wf-ui-server/ws-chat.mjs +299 -0
- package/src/wf-ui-server/ws-events.mjs +45 -20
- package/src/wf-ui-server/ws-terminal.mjs +165 -22
- package/src/wf-ui-server/ws-wf-browser.mjs +419 -0
- package/templates/common/.claude/agents/review-manager.md +33 -29
- package/templates/common/.claude/commands/wf-browser.md +1 -1
- package/templates/common/.claude/commands/wf-help.md +5 -3
- package/templates/common/.claude/commands/wf-init.md +44 -0
- package/templates/common/.claude/commands/wf-learn.md +34 -8
- package/templates/common/.claude/commands/wf-max.md +19 -9
- package/templates/common/.claude/commands/wf-review.md +3 -3
- package/templates/common/.claude/commands/wf-search.md +55 -0
- package/templates/common/.claude/commands/wf-task-archive.md +5 -4
- package/templates/common/.claude/commands/wf-task-list.md +6 -3
- package/templates/common/.claude/commands/wf-task-record.md +10 -2
- package/templates/common/.claude/commands/wf-ui.md +12 -5
- package/templates/common/.claude/commands/wf-update.md +4 -0
- package/templates/common/.claude/commands/wf.md +12 -1
- package/templates/common/.claude/rules/ecc/common.md +10 -1
- package/templates/common/.claude/skills/wf/SKILL.md +36 -0
- package/templates/common/.claude/skills/wf-browser/SKILL.md +427 -122
- package/templates/common/.claude/skills/wf-browser/references/BROWSER_CONTROL_PATTERNS.md +43 -0
- package/templates/common/.claude/skills/wf-init/SKILL.md +33 -0
- package/templates/common/.claude/skills/wf-learn/SKILL.md +106 -26
- package/templates/common/.claude/skills/wf-max/SKILL.md +45 -11
- package/templates/common/.claude/skills/wf-review/SKILL.md +26 -54
- package/templates/common/.claude/skills/wf-search/SKILL.md +122 -0
- package/templates/common/.claude/skills/wf-search/references/evidence-contract.md +77 -0
- package/templates/common/.claude/skills/wf-search/references/policies/compare.md +38 -0
- package/templates/common/.claude/skills/wf-search/references/policies/fact.md +39 -0
- package/templates/common/.claude/skills/wf-search/references/policies/troubleshoot.md +39 -0
- package/templates/common/.claude/skills/wf-search/references/policies/verify.md +44 -0
- package/templates/common/.claude/skills/wf-search/references/source-routing.md +40 -0
- package/templates/common/.claude/skills/wf-search/references/tool-adapters.md +38 -0
- package/templates/common/.claude/skills/wf-ui/SKILL.md +146 -12
- package/templates/common/.claude/skills/wf-update/SKILL.md +5 -1
- package/templates/common/.harness-version +188 -85
- package/templates/common/.opencode/agents/review-manager.md +31 -27
- package/templates/common/.opencode/commands/wf-browser.md +1 -1
- package/templates/common/.opencode/commands/wf-help.md +5 -3
- package/templates/common/.opencode/commands/wf-init.md +44 -0
- package/templates/common/.opencode/commands/wf-learn.md +34 -8
- package/templates/common/.opencode/commands/wf-max.md +19 -9
- package/templates/common/.opencode/commands/wf-review.md +3 -3
- package/templates/common/.opencode/commands/wf-search.md +55 -0
- package/templates/common/.opencode/commands/wf-task-archive.md +5 -7
- package/templates/common/.opencode/commands/wf-task-list.md +6 -6
- package/templates/common/.opencode/commands/wf-task-record.md +10 -5
- package/templates/common/.opencode/commands/wf-ui.md +12 -5
- package/templates/common/.opencode/commands/wf-update.md +4 -0
- package/templates/common/.opencode/commands/wf.md +12 -1
- package/templates/common/CLAUDE.md +61 -3
- package/templates/common/Harness/MEMORY.md +8 -5
- package/templates/common/Harness/README.md +14 -10
- package/templates/common/Harness/a2a/action-registry.json +4397 -0
- package/templates/common/Harness/a2a/role-graph.json +16 -3
- package/templates/common/Harness/a2a/skills/terminal-control.json +45 -1
- package/templates/common/Harness/a2a/skills/wf-ui-map.json +50 -0
- package/templates/common/Harness/a2a/skills/workflow-agent-node.json +143 -0
- package/templates/common/Harness/a2a/skills/workflow-context.json +95 -0
- package/templates/common/Harness/a2a/skills/workflow-diagram-node.json +60 -0
- package/templates/common/Harness/a2a/skills/workflow-display-node.json +69 -0
- package/templates/common/Harness/a2a/skills/workflow-file-node.json +92 -0
- package/templates/common/Harness/a2a/skills/workflow-goal-node.json +76 -0
- package/templates/common/Harness/a2a/skills/workflow-markdown-node.json +79 -0
- package/templates/common/Harness/a2a/skills/workflow-mcp-connector-node.json +59 -0
- package/templates/common/Harness/a2a/skills/workflow-node-actions.json +105 -0
- package/templates/common/Harness/a2a/skills/workflow-node-map.json +71 -0
- package/templates/common/Harness/a2a/skills/workflow-ontology.json +54 -0
- package/templates/common/Harness/a2a/skills/workflow-resource-node.json +68 -0
- package/templates/common/Harness/a2a/skills/workflow-skill-group-node.json +56 -0
- package/templates/common/Harness/a2a/skills/workflow-timer-node.json +81 -0
- package/templates/common/Harness/a2a/workflows.json +33 -0
- package/templates/common/Harness/ownership.manifest.json +263 -2
- package/templates/common/Harness/project/architecture.md +499 -0
- package/templates/common/Harness/research/README.md +20 -0
- package/templates/common/Harness/scripts/README.md +70 -6
- package/templates/common/Harness/scripts/a2a-terminal.mjs +12 -4
- package/templates/common/Harness/scripts/context-budget.mjs +7 -3
- package/templates/common/Harness/scripts/lib/memory-context.mjs +400 -0
- package/templates/common/Harness/scripts/lib/path-scope.mjs +77 -0
- package/templates/common/Harness/scripts/lib/research-policy.mjs +99 -0
- package/templates/common/Harness/scripts/lib/wf-search.mjs +189 -0
- package/templates/common/Harness/scripts/memory-context.mjs +63 -0
- package/templates/common/Harness/scripts/research-policy.mjs +27 -0
- package/templates/common/Harness/scripts/task-context.mjs +547 -0
- package/templates/common/Harness/scripts/task-group-index.mjs +242 -0
- package/templates/common/Harness/scripts/task-state.mjs +659 -95
- package/templates/common/Harness/scripts/validate-harness.mjs +70 -28
- package/templates/common/Harness/scripts/wf-auto-update-prompt.mjs +24 -0
- package/templates/common/Harness/scripts/wf-remove.mjs +10 -0
- package/templates/common/Harness/scripts/wf-search.mjs +10 -0
- package/templates/common/Harness/scripts/wf-ui-control.mjs +3144 -0
- package/templates/common/Harness/scripts/wf-update-check.mjs +274 -51
- package/templates/common/Harness/scripts/wf-update-runner.mjs +53 -16
- package/templates/common/Harness/settings.json +10 -0
- package/templates/common/Harness/specs/guides/SETUP.md +4 -3
- package/templates/common/Harness/specs/protocols/HARNESS_BRIDGE.md +429 -48
- package/templates/common/Harness/specs/protocols/MEMORY_PROTOCOL.md +24 -0
- package/templates/common/Harness/specs/protocols/TASK_ARCHIVE.md +14 -11
- package/templates/common/Harness/specs/runtime/command-surface.json +28 -0
- package/templates/common/Harness/specs/runtime/context-loading.md +6 -0
- package/templates/common/Harness/specs/runtime/dispatch.md +9 -1
- package/templates/common/Harness/specs/runtime/subagents.md +20 -5
- package/templates/common/Harness/specs/workflows/WF-AUTO-SPARK.md +19 -0
- package/templates/common/Harness/specs/workflows/WF-AUTO.md +21 -0
- package/templates/common/Harness/specs/workflows/WF-KERNEL.md +4 -2
- package/templates/common/Harness/specs/workflows/WF-MAX.md +39 -12
- package/templates/common/Harness/specs/workflows/WF-STATE.md +62 -14
- package/templates/common/Harness/specs/workflows/WF.md +32 -0
- package/templates/common/Harness/tasks/INDEX.json +7 -0
- package/templates/common/Harness/tasks/INDEX.md +12 -0
- package/templates/common/Harness/tasks/_template/PLAN.md +6 -0
- package/templates/common/Harness/tasks/_template/PROGRESS.md +5 -0
- package/templates/common/Harness/tasks/_template/STATE.json +22 -0
- package/templates/common/Harness/templates/TEST_PLAN.template.md +5 -4
- package/templates/common/Harness/templates/UI_CONTRACT.template.md +7 -5
- package/templates/common/Harness/wf-browser/README.md +69 -0
- package/templates/common/README.md +17 -0
- package/src/ui/dist/assets/AgentsRoute-CuSKYmFu.js +0 -17
- package/src/ui/dist/assets/AgentsRoute-CuSKYmFu.js.map +0 -1
- package/src/ui/dist/assets/RolesRoute-DOzTYVRm.js +0 -7
- package/src/ui/dist/assets/RolesRoute-DOzTYVRm.js.map +0 -1
- package/src/ui/dist/assets/SettingsRoute-DPU7jSQm.js +0 -12
- package/src/ui/dist/assets/SettingsRoute-DPU7jSQm.js.map +0 -1
- package/src/ui/dist/assets/TaskList-BN4r8s1i.js +0 -50
- package/src/ui/dist/assets/TaskList-BN4r8s1i.js.map +0 -1
- package/src/ui/dist/assets/TerminalDrawer-Cej4PxsH.js +0 -74
- package/src/ui/dist/assets/TerminalDrawer-Cej4PxsH.js.map +0 -1
- package/src/ui/dist/assets/WorkflowRoute-BnuhLJ6X.css +0 -1
- package/src/ui/dist/assets/WorkflowRoute-C-clKe-j.js +0 -39
- package/src/ui/dist/assets/WorkflowRoute-C-clKe-j.js.map +0 -1
- package/src/ui/dist/assets/index-BOVYWntB.js +0 -117
- package/src/ui/dist/assets/index-BOVYWntB.js.map +0 -1
- package/src/ui/dist/assets/index-DaUObq0H.css +0 -1
- package/src/ui/dist/assets/maximize-2-LNrr_rKr.js +0 -7
- package/src/ui/dist/assets/maximize-2-LNrr_rKr.js.map +0 -1
- package/src/ui/dist/assets/plus-QuTJyoT3.js +0 -7
- package/src/ui/dist/assets/plus-QuTJyoT3.js.map +0 -1
- package/src/ui/dist/assets/proxy-D0vUbds5.js.map +0 -1
- package/src/ui/dist/assets/refresh-cw-JNmExijd.js.map +0 -1
- package/src/ui/dist/assets/terminal-BBQvnOAK.js.map +0 -1
- package/src/ui/dist/assets/useReducedMotion-BqmH0Tf7.js +0 -7
- package/src/ui/dist/assets/useReducedMotion-BqmH0Tf7.js.map +0 -1
- package/src/ui/dist/assets/x-DoIOGAJz.js.map +0 -1
- package/src/ui/pnpm-lock.yaml +0 -1582
- package/src/ui/src/App.tsx +0 -86
- package/src/ui/src/api.ts +0 -93
- package/src/ui/src/components/AgentsRoute.tsx +0 -503
- package/src/ui/src/components/Footer.tsx +0 -69
- package/src/ui/src/components/Header.tsx +0 -175
- package/src/ui/src/components/LoadingView.tsx +0 -22
- package/src/ui/src/components/RolesRoute.tsx +0 -169
- package/src/ui/src/components/SettingsRoute.tsx +0 -166
- package/src/ui/src/components/TaskList.tsx +0 -388
- package/src/ui/src/components/TerminalDrawer.tsx +0 -611
- package/src/ui/src/components/WorkflowRoute.tsx +0 -670
- package/src/ui/src/hooks/useReducedMotion.ts +0 -17
- package/src/ui/src/hooks/useServerConnection.ts +0 -114
- package/src/ui/src/index.css +0 -281
- package/src/ui/src/main.tsx +0 -11
- package/src/ui/src/types.ts +0 -108
- /package/src/ui/dist/assets/{TerminalDrawer-6GBZ9nXN.css → terminalControl-6GBZ9nXN.css} +0 -0
|
@@ -45,6 +45,24 @@ Use interfaces and module boundaries to protect real seams in the generator, not
|
|
|
45
45
|
- Avoid speculative abstraction: do not add plugin systems, generic runners, extra config layers, or service containers until a real second use or testability boundary exists.
|
|
46
46
|
- When a boundary is real, express it with a small data contract and test it through generated output behavior.
|
|
47
47
|
|
|
48
|
+
## 2.1 Intelligence Routing and Source Reuse
|
|
49
|
+
|
|
50
|
+
Context and research are routing boundaries, not implicit dependencies. WF and
|
|
51
|
+
WF-MAX create a role-scoped task-context pack and consult the local research
|
|
52
|
+
policy only for a capability gap, volatile API, explicit request, repeated
|
|
53
|
+
failure, or benchmark gap. A source is recorded with URL, checked date,
|
|
54
|
+
version/terms, and an adopt/adapt/reject reason before any contract is reused;
|
|
55
|
+
prose ideas do not imply copied code or a dependency.
|
|
56
|
+
|
|
57
|
+
| Source | Reuse decision | Boundary |
|
|
58
|
+
| --- | --- | --- |
|
|
59
|
+
| [Anthropic: Building effective agents](https://www.anthropic.com/research/building-effective-agents) | Adapt composable-role and evaluator ideas | Validate against local runtime evidence; no code copied |
|
|
60
|
+
| [Anthropic: Effective context engineering](https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents) | Adapt finite, task-specific context budgeting | Implement as bounded packs; do not claim provider cache gains without telemetry |
|
|
61
|
+
| [Anthropic: Effective harnesses for long-running agents](https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents) | Adapt resumable handoff/evaluation framing | Bind to local STATE/A2A contracts and holdout checks |
|
|
62
|
+
| [OpenAI: Harness engineering](https://openai.com/index/harness-engineering/) | Adapt repository feedback-loop concepts | Process reference only; no equivalence or SOTA claim |
|
|
63
|
+
| [Hugging Face: smolagents agents reference](https://huggingface.co/docs/smolagents/en/reference/agents) | Adapt bounded managed-agent/step-limit concepts | Reject Python dependency import; verify version before reuse |
|
|
64
|
+
| [Hugging Face: ScreenSuite](https://huggingface.co/blog/screensuite) | Adapt hierarchical/holdout evaluation framing | Do not borrow scores or claim SOTA |
|
|
65
|
+
|
|
48
66
|
## 3. State Design
|
|
49
67
|
|
|
50
68
|
State in this repo should be explicit, serializable, and owned by one layer.
|
|
@@ -55,6 +73,406 @@ State in this repo should be explicit, serializable, and owned by one layer.
|
|
|
55
73
|
- Release state lives in `package.json`, npm, git tags, and GitHub; document commands in `README.md`, not `CLAUDE.md`.
|
|
56
74
|
- Long-running agent work records resumable status in `Harness/tasks/<task-id>/PLAN.md#Heartbeat`.
|
|
57
75
|
|
|
76
|
+
### 3.1 WF-UI Component Node State Contract
|
|
77
|
+
|
|
78
|
+
WF-UI component nodes have three distinct state shapes. Code, tests, and fixtures
|
|
79
|
+
must keep them separate:
|
|
80
|
+
|
|
81
|
+
- **Persistent state** lives at `Harness/a2a/component-nodes/<nodeId>/state.json`.
|
|
82
|
+
It is backend-owned, revisioned, and is the source of truth for user-editable
|
|
83
|
+
Markdown, Excalidraw, and File component state.
|
|
84
|
+
- **Agent refs** live in `stateRef`, `contentRef`, and `componentStateRefs`.
|
|
85
|
+
Refs contain only enough metadata for agents to locate state: path, revision,
|
|
86
|
+
type, title, and small file metadata when needed. Refs are not renderable UI
|
|
87
|
+
state and must not inline `markdown`, `scene`, or editable file payloads.
|
|
88
|
+
- **UI hydration state** lives in `/api/a2a/snapshot#componentNodes`. The first
|
|
89
|
+
paint workflow UI must receive full component state here so previews,
|
|
90
|
+
fullscreen editors, save buttons, and thumbnails hydrate from the same
|
|
91
|
+
revision the backend will later guard on save.
|
|
92
|
+
|
|
93
|
+
Invariants:
|
|
94
|
+
|
|
95
|
+
- `index.json`, `state.json`, `/api/workflow/nodes/:nodeId`,
|
|
96
|
+
`graph.componentStateRefs`, and `snapshot.componentNodes` must agree on
|
|
97
|
+
`nodeId`, `type`, `statePath`, and `revision`.
|
|
98
|
+
- `statePath` must use `Harness/a2a/component-nodes/<nodeId>/state.json`; the
|
|
99
|
+
legacy `Harness/a2a/component-nodes/<nodeId>.json` shape is invalid for new
|
|
100
|
+
code, tests, and docs.
|
|
101
|
+
- Defaults may seed newly created component nodes only. Existing persisted nodes
|
|
102
|
+
must not silently hydrate to empty Markdown, empty Excalidraw scenes, or empty
|
|
103
|
+
file metadata when their state file is missing or malformed.
|
|
104
|
+
- Global workflow snapshots, graph maps, runtime node lists, and Agent contexts
|
|
105
|
+
enumerate live component nodes only. If `index.json` still references a
|
|
106
|
+
missing, malformed, or revision-mismatched `state.json`, the global snapshot
|
|
107
|
+
must skip that component and any dangling edges instead of crashing the
|
|
108
|
+
backend or synthesizing empty state.
|
|
109
|
+
- Direct component reads remain strict: `GET /api/a2a/component-nodes/:id` and
|
|
110
|
+
typed component state updates must return the state mismatch error until the
|
|
111
|
+
stale index entry is deleted or repaired. Delete paths must still be able to
|
|
112
|
+
remove stale index entries whose state file is already gone.
|
|
113
|
+
- UI tests and Playwright fixtures must either use real backend endpoints or
|
|
114
|
+
mirror this contract exactly; mocks must not invent alternate handles, paths,
|
|
115
|
+
revisions, or hydration shapes.
|
|
116
|
+
|
|
117
|
+
### 3.2 WF-UI Workflow Connection State Contract
|
|
118
|
+
|
|
119
|
+
WF-UI graph connections are bidirectional by default. Persisted edge endpoint
|
|
120
|
+
fields preserve geometry and handle ordering; they are not a semantic permission
|
|
121
|
+
direction.
|
|
122
|
+
|
|
123
|
+
Invariants:
|
|
124
|
+
|
|
125
|
+
- Persisted graph edges may store `from`/`to` and `source`/`target`, but these
|
|
126
|
+
fields identify stable endpoint order for rendering, handles, offsets, and
|
|
127
|
+
revisioned graph writes only.
|
|
128
|
+
- Runtime node snapshots, A2A resource refs, and agent-readable graph context
|
|
129
|
+
must expose `direction: "bidirectional"` plus endpoint-specific
|
|
130
|
+
`endpointRole: "source" | "target"`.
|
|
131
|
+
- Connection refs must include `edgeId`, `localHandle`, `peerHandle`,
|
|
132
|
+
`sourceHandle`, `targetHandle`, and `relation`. UI display labels must not be
|
|
133
|
+
reused as semantic `relation` values.
|
|
134
|
+
- Resource nodes with one shared editable surface must expose one semantic
|
|
135
|
+
bidirectional resource port and separate physical side handles. Markdown uses
|
|
136
|
+
semantic port `markdown`; Excalidraw uses semantic port `scene`. ReactFlow may
|
|
137
|
+
render them as `markdown:left`/`markdown:right` and
|
|
138
|
+
`scene:left`/`scene:right`, but those physical handles are geometry only.
|
|
139
|
+
- Markdown and Excalidraw must not be modeled as `input`/`output` split ports.
|
|
140
|
+
Both physical sides can start or receive a connection. Agent-readable context,
|
|
141
|
+
labels, and capability checks use the semantic port, not the physical side.
|
|
142
|
+
- A bidirectional physical side must render as exactly one user-visible and DOM
|
|
143
|
+
handle for that side. Do not stack hidden source/target handles with the same
|
|
144
|
+
id to simulate bidirectionality; that creates ambiguous ReactFlow hit targets
|
|
145
|
+
and can snap a user drag to the wrong node. If a canvas library cannot support
|
|
146
|
+
one DOM handle that can start and receive connections, add an adapter-level
|
|
147
|
+
abstraction or tests before shipping that node.
|
|
148
|
+
- Graph readers and writers must normalize missing or legacy aliases at every
|
|
149
|
+
boundary that touches persisted graph state: graph-map load/write, workflow
|
|
150
|
+
edge APIs, A2A snapshots, runtime node snapshots, and ReactFlow import/export.
|
|
151
|
+
- Bare physical aliases such as `left` and `right` preserve their side before
|
|
152
|
+
semantic fallback. Normalizers must not invert them by source/target role.
|
|
153
|
+
- Duplicate edge validation is undirected. `A -> B` and `B -> A` are the same
|
|
154
|
+
workflow connection unless a future explicit permission/direction mode adds a
|
|
155
|
+
separate contract.
|
|
156
|
+
- UI labels and markers must present default workflow links as bidirectional.
|
|
157
|
+
Tests and fixtures must include the same connection shape as production and
|
|
158
|
+
must reject reverse duplicate pairs.
|
|
159
|
+
|
|
160
|
+
### 3.3 WF-UI Node Catalog Contract
|
|
161
|
+
|
|
162
|
+
WF-UI node creation must be registry-driven. The top-right create button and the
|
|
163
|
+
canvas create-node path render the same searchable catalog; they must not keep
|
|
164
|
+
separate hardcoded button grids.
|
|
165
|
+
|
|
166
|
+
Invariants:
|
|
167
|
+
|
|
168
|
+
- `src/ui/src/components/workflow/nodeRegistry.tsx` owns create-node catalog
|
|
169
|
+
metadata: `kind`, `category`, `state`, `label`, `description`,
|
|
170
|
+
`agentSemantics`, `searchText`, and icon.
|
|
171
|
+
- Catalog `state` is either `ready` or `planned`. `ready` items may create
|
|
172
|
+
runtime nodes. `planned` items are visible for discoverability. Most planned
|
|
173
|
+
items are disabled, but planned capability items may open a read-only Hub
|
|
174
|
+
drawer when they declare explicit hub metadata; opening a Hub is not the same
|
|
175
|
+
as creating a runtime node.
|
|
176
|
+
- The ready direct-create set is currently Agent, File, Markdown, Diagram, and
|
|
177
|
+
Timer. Skill group and MCP connector catalog entries open Hubs that may create
|
|
178
|
+
backend-owned capability nodes. Single Skill remains attach-only through an
|
|
179
|
+
Agent-targeted Skills Hub. Planned items still cover Trigger, GitHub trigger,
|
|
180
|
+
and Group/subgraph. Goal nodes are synthetic views over active Harness tasks
|
|
181
|
+
and are not direct-create catalog items.
|
|
182
|
+
- Search, category grouping, disabled state, and semantic copy are derived from
|
|
183
|
+
catalog metadata. UI tests must assert the same selectors used by production:
|
|
184
|
+
`workflow-create-node-search`, `workflow-create-node-options`,
|
|
185
|
+
`workflow-create-node-group`, and `workflow-create-node-option` with
|
|
186
|
+
`data-node-kind`, `data-node-category`, `data-node-state`,
|
|
187
|
+
`data-node-action`, optional `data-node-hub`, and `data-agent-semantics`.
|
|
188
|
+
- A future node type may not become `ready` as a canvas-only widget. It must
|
|
189
|
+
declare its Node Runtime adapter, storage/state ownership, graph ports,
|
|
190
|
+
direction semantics, settings/action schema, and browser/API regression tests
|
|
191
|
+
first.
|
|
192
|
+
|
|
193
|
+
### 3.4 WF-UI Capability Hub Contract
|
|
194
|
+
|
|
195
|
+
Skills and MCP entries are capability providers for Agent nodes. They are not
|
|
196
|
+
standalone executors until a later runtime contract defines lifecycle,
|
|
197
|
+
sandboxing, permissions, and audit logs.
|
|
198
|
+
|
|
199
|
+
Invariants:
|
|
200
|
+
|
|
201
|
+
- `GET /api/workflow/skills-hub` is a read-only metadata index. It scans only
|
|
202
|
+
allowed skill roots, defaults to project scope, reads only bounded `SKILL.md`
|
|
203
|
+
files, and returns `schemaVersion`, `query`, `roots`, `summary`,
|
|
204
|
+
`nodeSemantics`, `skills`, and `groups`.
|
|
205
|
+
- Hub responses must not expose absolute local paths, skill bodies, secrets, or
|
|
206
|
+
executable command output. Source locations are project-relative or `~/...`
|
|
207
|
+
display paths only.
|
|
208
|
+
- The create-node catalog may open the Skills Hub for Skill and Skill group
|
|
209
|
+
entries and may open the MCP Hub for MCP connector entries. Runtime creation
|
|
210
|
+
is allowed only for node types with backend-owned state, runtime adapters,
|
|
211
|
+
graph ports, Agent context refs, and browser/API regression tests.
|
|
212
|
+
- The Hub drawer contract is stable: `workflow-capability-hub-drawer`,
|
|
213
|
+
`workflow-capability-hub-search`, `workflow-capability-hub-item`,
|
|
214
|
+
`workflow-capability-attach`, and `workflow-capability-create-node`, with
|
|
215
|
+
`data-hub-kind`, `data-origin`, and optional `data-target-agent-id`.
|
|
216
|
+
- Skill attachment is enabled only when the Hub has a target Agent node. The
|
|
217
|
+
attach action updates that Agent config through `skills` and
|
|
218
|
+
`skillPolicy: "manual"`; a Hub opened without an Agent target remains
|
|
219
|
+
read-only with disabled attach controls.
|
|
220
|
+
- Agent-readable context exposes attached skills through
|
|
221
|
+
`connectedCapabilityRefs`, `effectiveSkills`, and `skillPolicy`. These refs
|
|
222
|
+
use relation `capability`, `direction: "bidirectional"`, and
|
|
223
|
+
`executor: "agent"` because the Agent remains the executor and mediator.
|
|
224
|
+
- `skill-group` is the first runtime capability-provider node. Its state lives
|
|
225
|
+
under `Harness/a2a/capability-nodes/<nodeId>/state.json`, is revisioned, and
|
|
226
|
+
appears in snapshots through `capabilityNodes` and `capabilityStateRefs`.
|
|
227
|
+
- A Skill group node is created from a Skills Hub group, not as a standalone
|
|
228
|
+
executor. It exposes one semantic bidirectional `capability` port rendered as
|
|
229
|
+
physical handles `capability:left` and `capability:right`; both sides may start
|
|
230
|
+
or receive resource/capability links.
|
|
231
|
+
- When connected to an Agent, a Skill group contributes
|
|
232
|
+
`connectedCapabilityNodeRefs`, merged `connectedCapabilityRefs`, and
|
|
233
|
+
`effectiveSkills` to that Agent context. The link uses relation `capability`,
|
|
234
|
+
`direction: "bidirectional"`, and `executor: "agent"`.
|
|
235
|
+
- Skill group nodes may store only bounded metadata: group id/label/kind, skill
|
|
236
|
+
names, source summaries, and counts. They must not persist skill bodies,
|
|
237
|
+
absolute local paths, command output, secrets, or MCP credential probes.
|
|
238
|
+
- `GET /api/workflow/mcp-hub` is a no-spawn, no-secret, read-only metadata
|
|
239
|
+
endpoint. It indexes project MCP config files only, exposes redacted server
|
|
240
|
+
metadata and summary counts, and never launches servers, tests credentials, or
|
|
241
|
+
leaks environment values.
|
|
242
|
+
- `mcp-connector` is a runtime capability-provider node created from MCP Hub
|
|
243
|
+
server metadata. The frontend sends only `mcpServerId`; the backend re-reads
|
|
244
|
+
the Hub and persists only the sanitized record: server names, transport,
|
|
245
|
+
command basename, arg count, redacted URL, env key names, source summaries,
|
|
246
|
+
risk flags, and counts. It exposes the same bidirectional `capability` port
|
|
247
|
+
and `capability:left|right` physical handles as other capability providers.
|
|
248
|
+
- When connected to an Agent, an MCP connector contributes
|
|
249
|
+
`connectedCapabilityNodeRefs` and merged `connectedCapabilityRefs`, but does
|
|
250
|
+
not add server names to `effectiveSkills`. Direct MCP attach, credential
|
|
251
|
+
probing, tool listing, and tool invocation remain gated until a separate
|
|
252
|
+
permission/audit/runtime contract exists.
|
|
253
|
+
|
|
254
|
+
### 3.5 WF-UI Event Node Contract
|
|
255
|
+
|
|
256
|
+
Timer is the first runtime event node. Event nodes may use directed event
|
|
257
|
+
outputs, but that direction is explicit and local to event emission. It must not
|
|
258
|
+
change the default bidirectional semantics of Agent, Markdown, Excalidraw, File,
|
|
259
|
+
Skill, or MCP capability links.
|
|
260
|
+
|
|
261
|
+
Invariants:
|
|
262
|
+
|
|
263
|
+
- Timer state lives under `Harness/a2a/event-nodes/<nodeId>/state.json` and is
|
|
264
|
+
backend-owned, revisioned, and represented in snapshots through `eventNodes`,
|
|
265
|
+
`eventStateRefs`, and `connectedEventRefs`.
|
|
266
|
+
- Timer exposes a directed `event` output, a `config` input, and an optional
|
|
267
|
+
bidirectional `status` port. The persisted Timer-to-Agent event edge uses
|
|
268
|
+
`direction: "source-to-target"` and relation `event`; Agent-to-Timer mutable
|
|
269
|
+
control uses a separate relation `control` edge.
|
|
270
|
+
- Advanced Timer state may include once, interval, cron, loop, adaptive,
|
|
271
|
+
watchdog, while, and task cadence metadata plus base heartbeat, watchdog
|
|
272
|
+
heartbeat, task binding, and control policy. Loop/while/task/adaptive modes
|
|
273
|
+
are declarative metadata only; runtime tick logic must never evaluate
|
|
274
|
+
user-authored code from Timer settings.
|
|
275
|
+
- Timer double-click opens the expanded Timer workbench for schedule mode,
|
|
276
|
+
base heartbeat, and WDT configuration. The right-click settings panel stays a
|
|
277
|
+
lightweight management surface and must not be the only way to edit schedule
|
|
278
|
+
details.
|
|
279
|
+
- Agent Timer actions such as interval changes, WDT ack/reset, enable/disable,
|
|
280
|
+
and mode changes require an explicit control edge and must be exposed through
|
|
281
|
+
bounded runtime actions instead of direct state-file writes.
|
|
282
|
+
- A directed event edge is duplicate-checked by ordered endpoints, relation, and
|
|
283
|
+
handles. This is separate from the unordered duplicate rule for default
|
|
284
|
+
bidirectional workflow links.
|
|
285
|
+
- Event node catalog entries become `ready` only after storage, runtime adapter,
|
|
286
|
+
graph-map direction persistence, agent context refs, settings/actions, and
|
|
287
|
+
browser/API regression tests are green.
|
|
288
|
+
- Trigger and GitHub trigger remain planned until their webhook/auth/replay,
|
|
289
|
+
dedupe, security, and audit contracts are written and tested.
|
|
290
|
+
|
|
291
|
+
### 3.6 WF-UI Goal Node Contract
|
|
292
|
+
|
|
293
|
+
Goal nodes are synthetic task-state nodes generated from active Harness tasks.
|
|
294
|
+
They let the workflow canvas show completion intent, acceptance state, progress,
|
|
295
|
+
and watchdog state without giving arbitrary Agents direct authority over task
|
|
296
|
+
closeout.
|
|
297
|
+
|
|
298
|
+
Invariants:
|
|
299
|
+
|
|
300
|
+
- Goal node ids are derived from task ids and state is read from
|
|
301
|
+
`Harness/tasks/<taskId>/STATE.json` plus a backend-owned sidecar under
|
|
302
|
+
`Harness/a2a/goal-nodes/<goalId>/state.json`.
|
|
303
|
+
- Goal nodes expose bidirectional `goal:left|right` handles for Agent
|
|
304
|
+
collaboration links and appear in snapshots through `goalNodes` and
|
|
305
|
+
`connectedGoalRefs`.
|
|
306
|
+
- Goal double-click opens the expanded Goal workbench for user-owned edits to
|
|
307
|
+
title, objective, next action, acceptance rows, and WDT settings. These edits
|
|
308
|
+
write the Goal sidecar and do not directly mutate task `STATE.json`.
|
|
309
|
+
- `goal.update` must not accept closeout authority fields such as task status,
|
|
310
|
+
phase, or gate. Completion/status transitions use the dedicated two-phase
|
|
311
|
+
Goal actions.
|
|
312
|
+
- Agent-authored mutable Goal actions, including `goal.update`, require an
|
|
313
|
+
existing bidirectional `goal` edge when `actorNodeId` is present. UI/user
|
|
314
|
+
edits omit `actorNodeId`; unlinked Agent writes are rejected with
|
|
315
|
+
`GOAL_EDGE_REQUIRED`.
|
|
316
|
+
- Agent completion is two-phase: `goal.requestCompletion` writes a proposal to
|
|
317
|
+
the sidecar, while direct mutation of task `STATE.json` remains gated behind a
|
|
318
|
+
separate closeout authority contract.
|
|
319
|
+
- Goal WDT acknowledgement/feed state is separate from task completion state so
|
|
320
|
+
failed or stopped Agents can be recovered without marking the task complete.
|
|
321
|
+
|
|
322
|
+
### 3.7 WF-UI Node Operation Language
|
|
323
|
+
|
|
324
|
+
Workflow node gestures must map to a stable operation model across node kinds.
|
|
325
|
+
|
|
326
|
+
Invariants:
|
|
327
|
+
|
|
328
|
+
- Single-click selects a node and never opens a heavy editor.
|
|
329
|
+
- Right-click opens a lightweight context menu or settings panel for node
|
|
330
|
+
management actions such as settings, delete, duplicate, copy, cut, and
|
|
331
|
+
open-config affordances.
|
|
332
|
+
- Double-click opens the node's primary workbench: Agent opens terminal mode,
|
|
333
|
+
Markdown opens the enlarged editor, Excalidraw opens the enlarged scene
|
|
334
|
+
editor, Timer opens the expanded schedule workbench, and Goal opens the
|
|
335
|
+
expanded Goal workbench.
|
|
336
|
+
- Expanded workbenches own draft UI state and save through typed node runtime
|
|
337
|
+
actions. Backend-owned snapshots and revisioned sidecars remain the source of
|
|
338
|
+
truth after save.
|
|
339
|
+
|
|
340
|
+
### 3.8 Agent Graph Operation Control
|
|
341
|
+
|
|
342
|
+
Agent-authored graph changes are first-class operations, not inferred UI state.
|
|
343
|
+
|
|
344
|
+
Invariants:
|
|
345
|
+
|
|
346
|
+
- Main Agent graph authority is exposed through typed `agent.*` node runtime
|
|
347
|
+
actions: `agent.readGraph`, `agent.createNode`, `agent.connectNodes`,
|
|
348
|
+
`agent.disconnectNodes`, `agent.moveNode`, `agent.deleteNode`, and
|
|
349
|
+
`agent.deleteNodes`.
|
|
350
|
+
- Agent node-map skills and CLI commands are API wrappers over
|
|
351
|
+
`POST /api/workflow/nodes/:actor/actions/agent.*`. `Harness/a2a/workflow-map.json`
|
|
352
|
+
and node state sidecars are backend-owned storage and may be read for
|
|
353
|
+
diagnostics only; Agent nodes must never edit or delete those files to control
|
|
354
|
+
the canvas.
|
|
355
|
+
- Compatibility commands such as `wf-ui-control.mjs connect` and
|
|
356
|
+
`wf-ui-control.mjs delete-node` must delegate to the same typed `agent.*`
|
|
357
|
+
actions instead of writing a whole graph map or calling legacy graph-node
|
|
358
|
+
delete routes directly.
|
|
359
|
+
- Non-main Agents cannot mutate the whole graph unless a future permission model
|
|
360
|
+
grants that authority explicitly. Unauthorized graph mutations must fail with a
|
|
361
|
+
403-style error.
|
|
362
|
+
- Every successful Agent graph action appends a bounded operation record under
|
|
363
|
+
`workflow.operations.recent[]` with only audit/animation metadata:
|
|
364
|
+
`id`, `kind`, `actor`, `targetNodeIds`, `edgeIds`, `status`, `startedAt`,
|
|
365
|
+
`completedAt`, and `expiresAt`.
|
|
366
|
+
- Operation records must not store prompts, transcripts, payload bodies, secrets,
|
|
367
|
+
raw MCP config, or large user content.
|
|
368
|
+
- The frontend visualizes Agent control from operation records only. Canvas
|
|
369
|
+
aura, controlled-node glow, and Agent-to-node data-flow edge animation must
|
|
370
|
+
read `targetNodeIds` and `edgeIds`; they must not guess control from node type,
|
|
371
|
+
handle side, or edge direction.
|
|
372
|
+
- Browser bridge graph intents use the same operation vocabulary as human UI:
|
|
373
|
+
`graph.createNode`, `graph.connectNodes`, `graph.disconnectNodes`, and
|
|
374
|
+
`graph.moveNode`, `graph.deleteNode`, and `graph.deleteNodes`. A semantic
|
|
375
|
+
intent must issue one semantic mutation request and return operation metadata
|
|
376
|
+
on success.
|
|
377
|
+
- Delete operations must protect the active controller: self-delete is rejected,
|
|
378
|
+
bulk delete skips the actor and live Agents by default, and virtual Goal node
|
|
379
|
+
deletion hides the canvas node without mutating the underlying task capsule.
|
|
380
|
+
- Operation records are observability and handoff metadata. They are not a durable
|
|
381
|
+
scheduler, retry engine, authorization policy, or workflow-run state machine.
|
|
382
|
+
|
|
383
|
+
### 3.9 Agent Node Context, Workspace, Skills, and Final Debug Matrix
|
|
384
|
+
|
|
385
|
+
Agent nodes are graph actors with a bounded local workspace and a typed control
|
|
386
|
+
plane. They must not rely on terminal prompt text alone to understand the graph.
|
|
387
|
+
|
|
388
|
+
Current required contract:
|
|
389
|
+
|
|
390
|
+
- Identity comes from environment plus node home:
|
|
391
|
+
`HARNESS_WORKFLOW_NODE_ID`, `HARNESS_PEER_SESSION_ID`,
|
|
392
|
+
`HARNESS_AGENT_KIND`, `HARNESS_WF_UI_URL`, `HARNESS_NODE_HOME`, and
|
|
393
|
+
`HARNESS_NODE_INIT`.
|
|
394
|
+
- Each Agent node owns a durable node home under
|
|
395
|
+
`Harness/a2a/nodes/<sessionId>/` with `STATE.json`, `init.md`, and a startup
|
|
396
|
+
`graph-snapshot.json`. This folder is the Agent's local run workspace, not the
|
|
397
|
+
node-map control surface.
|
|
398
|
+
- Agent working directory (`cwd`) is explicit session config and remains bounded
|
|
399
|
+
by the project workspace APIs. Workspace file changes go through
|
|
400
|
+
`/api/workspace/*`; graph and node state changes go through `/api/workflow/*`.
|
|
401
|
+
- Canonical context has one shape. `GET /api/workflow/context/:node`,
|
|
402
|
+
`workflow-context`, and `agent.readContext` must expose the same core Agent
|
|
403
|
+
context fields: `identity`, `workspace`, `connectedResourceRefs`, `connectedAgentRefs`,
|
|
404
|
+
`connectedEventRefs`, `connectedCapabilityRefs`,
|
|
405
|
+
`connectedCapabilityNodeRefs`, `connectedGoalRefs`, `defaultSkills`,
|
|
406
|
+
`effectiveSkills`, `skillTriggers`, `ontology`, `affordances`, and
|
|
407
|
+
`outputRouting`.
|
|
408
|
+
- Default Agent skills are machine-readable capabilities, not only prompt text:
|
|
409
|
+
`workflow-ontology`, `workflow-context`, `workflow-node-actions`,
|
|
410
|
+
`workflow-node-map`, and `terminal-control`. Each workflow skill must include
|
|
411
|
+
short trigger phrases for semantic selection, for example graph control,
|
|
412
|
+
connected-context observation, flowchart/diagram output, Goal updates, Timer
|
|
413
|
+
control, direct Agent messaging, broadcast Agent messaging, shared Markdown
|
|
414
|
+
context, worker delegation, and output readback.
|
|
415
|
+
- Capability nodes and Skill groups attach metadata to Agent context. They do
|
|
416
|
+
not execute independently. MCP connector nodes are metadata-only until a
|
|
417
|
+
separate permission, tool-list, invocation, audit, and sandbox contract exists.
|
|
418
|
+
- Before acting, an Agent must run the loop `observe -> plan -> act -> verify ->
|
|
419
|
+
report`: read ontology, read its context, choose connected affordances, perform
|
|
420
|
+
typed actions, then verify by reading the mutated node or peer output.
|
|
421
|
+
- Durable output selection is modality-aware. Connected writable Excalidraw is
|
|
422
|
+
the preferred target for diagrams, flowcharts, sketches, and visual plans.
|
|
423
|
+
Connected writable Markdown is the preferred target for reports, notes, plans,
|
|
424
|
+
and long-form text. Terminal prose is a summary or fallback.
|
|
425
|
+
- Connected Agent nodes are collaborators only when they appear in
|
|
426
|
+
`connectedAgentRefs`. Any connected Agent may send a one-to-one message with
|
|
427
|
+
`send-agent-message`/`agent.sendMessage` and reply through the same action.
|
|
428
|
+
One-to-many communication uses `broadcast-agent-message`/
|
|
429
|
+
`agent.broadcastMessage`, which records one bridge envelope per recipient.
|
|
430
|
+
Main Agents may still use legacy `delegate-agent`/`agent.sendInput` for
|
|
431
|
+
worker prompt submission, then verify with `read-agent`,
|
|
432
|
+
`read-agent-messages`, or `bridge-messages`. Built-in subagents are a
|
|
433
|
+
fallback when the graph lacks a suitable connected worker.
|
|
434
|
+
- A connected Markdown node with relation `shared-context` is the local
|
|
435
|
+
blackboard for Agent collaboration. Agents read/write it through typed
|
|
436
|
+
Markdown actions only; File nodes can be shared read context through file
|
|
437
|
+
actions but are not the default writable blackboard.
|
|
438
|
+
- Parallelism is a graph scheduling decision, not a terminal waiting habit.
|
|
439
|
+
Independent work packets may fan out to connected Agent workers; dependent
|
|
440
|
+
packets must wait for verified outputs or explicit Goal/Timer state.
|
|
441
|
+
- Agent prompt delivery must use the canonical prompt-submit path: write prompt
|
|
442
|
+
body first, then send Enter after a short delay. Tests must cover delayed
|
|
443
|
+
Enter behavior and durable node-state readback.
|
|
444
|
+
|
|
445
|
+
Final debug matrix:
|
|
446
|
+
|
|
447
|
+
| Area | Probe | Pass condition |
|
|
448
|
+
| --- | --- | --- |
|
|
449
|
+
| Agent identity/workspace | Start or create Agent, read node home and `self` output | `STATE.json`, `init.md`, env ids, `cwd`, `nodeHomeRel`, and graph node id agree |
|
|
450
|
+
| Canonical context | Compare `workflow-context` and `agent.readContext` | Both expose ontology, effective skills, connected refs, affordances, and output routing |
|
|
451
|
+
| Connected resource output | Ask Agent for a flowchart or long-form note | Agent uses connected Excalidraw/Markdown node actions and verifies revision/content |
|
|
452
|
+
| Graph control | Ask Main Agent to create/connect/move/delete nodes | Only typed `agent.*` actions mutate graph; operation records appear in `workflow.operations.recent[]` |
|
|
453
|
+
| Agent direct communication | Connect A-B and ask each side to message/reply | Both sides use `agent.sendMessage`, bridge envelopes record node/session ids, and `agent.readMessages` reads the thread |
|
|
454
|
+
| Agent broadcast communication | Connect A to B/C and broadcast one task | A records one delivered bridge envelope per connected recipient and reports skipped/unconnected recipients |
|
|
455
|
+
| Shared context | Connect A/B to one Markdown `shared-context` node | Both Agents see the same Markdown ref and use typed Markdown actions as a local blackboard |
|
|
456
|
+
| Worker orchestration | Connect Agent workers and delegate independent tasks | Main Agent chooses connected workers first, submits prompts, reads outputs, and records bridge evidence |
|
|
457
|
+
| Authority edges | Try Timer/Goal writes with and without links | Timer control needs `control`; Goal writes need bidirectional `goal`; unlinked Agent writes fail |
|
|
458
|
+
| Readback consistency | After every mutation, read through API, context, and UI snapshot | Node ids, revisions, handles, relations, and affordances match across all paths |
|
|
459
|
+
| Browser evidence | Run wf-browser or Browser-plugin route checks | UI-visible graph operations and operation animations match backend operation records |
|
|
460
|
+
|
|
461
|
+
Implementation path:
|
|
462
|
+
|
|
463
|
+
1. Keep closing duplicate context surfaces first. Any Agent-readable context API
|
|
464
|
+
must delegate to the canonical builder or prove field parity in tests.
|
|
465
|
+
2. Expand default workflow skills by semantic trigger phrases and keep generated
|
|
466
|
+
templates, dogfood manifests, Agent init text, and tests synchronized.
|
|
467
|
+
3. Add an Agent-run orchestrator only after connected-Agent delegation, retry,
|
|
468
|
+
cancel, timeout, result collation, and Goal/Timer state transitions have a
|
|
469
|
+
durable state machine separate from `workflow.operations.recent[]`.
|
|
470
|
+
4. Add scheduler/event delivery only after Timer due events have a durable queue,
|
|
471
|
+
replay/idempotency keys, watchdog recovery, and Agent wake-up semantics.
|
|
472
|
+
5. Treat every new node type as incomplete until it has storage, runtime actions,
|
|
473
|
+
ontology entries, context refs, UI handles, settings/workbench UX, browser
|
|
474
|
+
evidence, and readback tests.
|
|
475
|
+
|
|
58
476
|
## 4. Core Components
|
|
59
477
|
|
|
60
478
|
### 4.1 CLI Entry
|
|
@@ -96,6 +514,77 @@ State in this repo should be explicit, serializable, and owned by one layer.
|
|
|
96
514
|
- **Responsibility**: Govern future AI-agent work in this repository.
|
|
97
515
|
- **Does NOT handle**: Changing package output unless edits are made to `templates/**` or source code.
|
|
98
516
|
|
|
517
|
+
### 4.7 WF-UI Agent-Operable Browser Control Plane
|
|
518
|
+
|
|
519
|
+
- **Location**: `src/wf-ui-server/wf-browser-store.mjs`, `src/wf-ui-server/ws-wf-browser.mjs`, `src/wf-ui-server/server.mjs`, `src/ui/src/wfBrowserClient.ts`, `src/ui/src/wfBrowserDebug.tsx`, `src/ui/src/wfBrowserRouteCapabilities.ts`, `Harness/scripts/wf-ui-control.mjs`
|
|
520
|
+
- **Template location**: `templates/common/Harness/scripts/wf-ui-control.mjs`, `templates/common/.claude/skills/wf-ui/SKILL.md`
|
|
521
|
+
- **Responsibility**: Provide the backend foundation, launch URL allocator, frontend debug bridge, visible action primitives, first-party route capability maps, and local browser launch/close lifecycle for `wf-browser` run/window/lease/artifact/command control without coupling it to task parsing, terminal PTY state, or the existing task invalidation WebSocket.
|
|
522
|
+
- **Does NOT handle yet**: Trusted screenshot capture from the browser process, browser-process network/AST capture, replay playback UI, automatic close on every closeout path, or deep route-owned capability maps for every nested wf-ui surface.
|
|
523
|
+
|
|
524
|
+
Data contract:
|
|
525
|
+
|
|
526
|
+
```text
|
|
527
|
+
Harness/wf-browser/
|
|
528
|
+
runs/
|
|
529
|
+
<runId>/
|
|
530
|
+
manifest.json
|
|
531
|
+
timeline.jsonl
|
|
532
|
+
sessions.json
|
|
533
|
+
windows/
|
|
534
|
+
<windowId>/
|
|
535
|
+
window.json
|
|
536
|
+
leases.json
|
|
537
|
+
browser-launches.json
|
|
538
|
+
artifacts.jsonl
|
|
539
|
+
screenshots/
|
|
540
|
+
ui-tree/
|
|
541
|
+
state/
|
|
542
|
+
logs/
|
|
543
|
+
network/
|
|
544
|
+
ast/
|
|
545
|
+
replay/
|
|
546
|
+
analysis/
|
|
547
|
+
```
|
|
548
|
+
|
|
549
|
+
Control rules:
|
|
550
|
+
|
|
551
|
+
- `POST /api/wf-browser/runs` creates an isolated browser evidence run.
|
|
552
|
+
- `GET /api/wf-browser/runs/:runId/windows` lists a run's current window pool for multi-subagent dispatch and handoff.
|
|
553
|
+
- `POST /api/wf-browser/runs/:runId/windows` creates a logical browser window slot for one agent, route, viewport, and fixture scope.
|
|
554
|
+
- `POST /api/wf-browser/runs/:runId/windows/:windowId/lease` grants `control` or read-only `observe` access.
|
|
555
|
+
- A `control` lease is exclusive per window; conflicting mutating agents receive `LEASE_CONFLICT`.
|
|
556
|
+
- `GET /api/wf-browser/runs/:runId/windows/:windowId/launch-url` returns the local wf-ui URL with no frontend token and debug-only params: `wfRun`, `wfWindow`, optional `wfLease`, and `wfDebug`.
|
|
557
|
+
- `GET /api/wf-browser/connections` lists currently registered frontend debug clients; `Harness/scripts/wf-ui-control.mjs browser-wait` polls it before command dispatch when a launch URL was just opened or refreshed.
|
|
558
|
+
- `POST /api/wf-browser/runs/:runId/windows/:windowId/commands` validates the lease, dispatches a bounded `observe.*` or `act.*` command over `/ws/wf-browser`, records action evidence, and stores observation artifacts when applicable.
|
|
559
|
+
- `POST /api/wf-browser/runs/:runId/windows/:windowId/artifacts` stores bulky evidence files under the run/window folder and records compact metadata.
|
|
560
|
+
- `Harness/scripts/wf-ui-control.mjs browser-open` launches a visible browser for a launch URL, uses an isolated per-run/window profile when `--context isolated` is set, stores launch metadata as an `analysis` artifact, and records local lifecycle state in `browser-launches.json`.
|
|
561
|
+
- `Harness/scripts/wf-ui-control.mjs browser-launches` lists per-window launch state with process liveness; `browser-close` closes selected or all launches and safely removes per-window profiles under `Harness/wf-browser/tmp/browser-profiles/`.
|
|
562
|
+
- `Harness/scripts/wf-ui-control.mjs browser-release --close true` releases the backend lease and runs local browser cleanup as one closeout command.
|
|
563
|
+
- `POST /api/wf-browser/cleanup` previews or removes non-active run folders by retention policy; `Harness/scripts/wf-ui-control.mjs browser-cleanup` exposes this to agents.
|
|
564
|
+
|
|
565
|
+
Readiness boundary:
|
|
566
|
+
|
|
567
|
+
- Current implementation is an L3-minimal bridge for wf-browser: the opt-in frontend runtime registers with `/ws/wf-browser`, returns compact route/capability/UI-tree/state/log/network/replay/diff observations, and executes visible hover/click/focus/type/clear/select/press/drag/scroll/wait operations.
|
|
568
|
+
- `Harness/scripts/wf-ui-control.mjs browser-snapshot` captures a connected
|
|
569
|
+
window handoff bundle by serially running the standard observation primitives
|
|
570
|
+
through the current lease and returning artifact paths.
|
|
571
|
+
- `Harness/scripts/wf-ui-control.mjs browser-wait` is the connection-readiness
|
|
572
|
+
guard: it waits for the requested run/window/agent frontend registration
|
|
573
|
+
before `observe.*`, `act.*`, or snapshot dispatch.
|
|
574
|
+
- `Harness/scripts/wf-ui-control.mjs browser-open` is the isolated visible
|
|
575
|
+
launch foundation: it can create a per-window browser profile under
|
|
576
|
+
`Harness/wf-browser/tmp/browser-profiles/`, launch Chrome/Edge/Chromium,
|
|
577
|
+
record the exact command/profile metadata as a run/window artifact, and write
|
|
578
|
+
`browser-launches.json` for later closeout.
|
|
579
|
+
- `Harness/scripts/wf-ui-control.mjs browser-launches`, `browser-close`, and
|
|
580
|
+
`browser-release --close true` provide the first local process/profile
|
|
581
|
+
lifecycle layer for visible isolated agent windows.
|
|
582
|
+
- `Harness/scripts/wf-ui-control.mjs browser-allocate` is the window allocator foundation: it creates or reuses a run, creates a window, grants a lease, and returns a launch URL for one visible agent window. `browser-allocate-many` repeats that allocation for a batch of subagents in one run, and `browser-windows` lists allocated windows before dispatch, handoff, or cleanup.
|
|
583
|
+
- The React app shell registers base wf-browser capabilities for `app.shell`, header, navigation routes, theme toggle, and route-specific task/workflow/agents/roles/settings/terminal surfaces. `observe.uiTree` annotates matched DOM nodes with `registeredCapabilityIds`.
|
|
584
|
+
- Claim full L3 only after trusted screenshot/AST coverage and deeper route-owned component maps are implemented.
|
|
585
|
+
- Claim full L4 only after automatic cleanup coverage on all closeout paths and
|
|
586
|
+
concurrent isolated-window subagent runtime proof are recorded.
|
|
587
|
+
|
|
99
588
|
## 5. Data Flow
|
|
100
589
|
|
|
101
590
|
```text
|
|
@@ -124,3 +613,13 @@ CLI args / prompts
|
|
|
124
613
|
- Interactive confirmation currently happens before full conflict-plan display in interactive mode.
|
|
125
614
|
- Some README tests assert exact prose and can be made more structural.
|
|
126
615
|
- `subagent-orchestrator` routing priority should continue to be tightened in templates.
|
|
616
|
+
|
|
617
|
+
## 8. Agent Terminal Trigger Model
|
|
618
|
+
|
|
619
|
+
Agent terminals are triggered through three layers, depending on task kind:
|
|
620
|
+
|
|
621
|
+
1. **Spawn-time task**: `initialPrompt` argv → the runtime TUI auto-submits the initial message (codex/claude positional prompt; opencode `--prompt`). Enter-free, preferred path.
|
|
622
|
+
2. **In-session task**: ready-gated injection — wait for the prompt marker (`❯`/`›`), write the text, then a single `\r`; retry once on swallow; never send `\r\n`.
|
|
623
|
+
3. **Headless task**: `codex exec --json` (one process per task, JSONL result capture, exit semantics). Interface reserved; full productization later.
|
|
624
|
+
|
|
625
|
+
The PTY input sink is single: `writePtyInput` → `ptyProcess.write`. Frontend xterm WS `pty:input` and backend `send-input` share it, so a fix at the sink fixes both paths.
|
|
@@ -111,6 +111,26 @@ Use these patterns when turning research into PRD or feature docs:
|
|
|
111
111
|
|
|
112
112
|
## Architecture Decision References
|
|
113
113
|
|
|
114
|
+
## Executable research policy (0.9.2)
|
|
115
|
+
|
|
116
|
+
Use `node Harness/scripts/research-policy.mjs decide --task-type chore --json`
|
|
117
|
+
before external research. The optional repeatable triggers are
|
|
118
|
+
`capability-gap`, `volatile-api`, `user-request`, `repeated-failure`, and
|
|
119
|
+
`benchmark-gap`; without a trigger a simple local chore does not require web
|
|
120
|
+
research. The decision output is `{search, reasons, addDependency:false}`.
|
|
121
|
+
|
|
122
|
+
Record a checked source in the task capsule with:
|
|
123
|
+
|
|
124
|
+
```text
|
|
125
|
+
node Harness/scripts/research-policy.mjs record --project ROOT --task TASK --input REFERENCE.json [--apply] --json
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
The JSON reference contains `url`, `title`, `sourceType`, `version`, `license`,
|
|
129
|
+
`decision` (`adopt|adapt|reject`), `reason`, `acIds`, and `checkedAt`. Recording
|
|
130
|
+
is dry-run unless `--apply` is supplied, writes only that task's
|
|
131
|
+
`REFERENCES.md`, rejects adopting a code dependency without a license, and does
|
|
132
|
+
not download or execute external code.
|
|
133
|
+
|
|
114
134
|
When filling `Harness/project/architecture.md` and `Harness/research/research-results.md`, use these high-trust sources as starting points. Search within them; do not read them whole.
|
|
115
135
|
|
|
116
136
|
### System Design & Architecture Patterns
|
|
@@ -9,16 +9,18 @@ Agents: use `task-state.mjs` for all task lifecycle operations. Other scripts ar
|
|
|
9
9
|
Single entry point for all task capsule operations. Use this for any task CRUD.
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
#
|
|
13
|
-
node Harness/scripts/task-state.mjs list [--json]
|
|
14
|
-
node Harness/scripts/task-state.mjs open [--json]
|
|
12
|
+
# Task routing and lifecycle
|
|
13
|
+
node Harness/scripts/task-state.mjs list [--project <project>] [--status <status>] [--json]
|
|
14
|
+
node Harness/scripts/task-state.mjs open [--project <project>] [--status <status>] [--json]
|
|
15
|
+
node Harness/scripts/task-state.mjs index
|
|
16
|
+
node Harness/scripts/task-state.mjs query <keyword> [--project <project>] [--status <status>] --json
|
|
15
17
|
node Harness/scripts/task-state.mjs validate [--strict] [--json]
|
|
16
18
|
node Harness/scripts/task-state.mjs reconcile [--dry-run|--apply] [--json]
|
|
17
|
-
node Harness/scripts/task-state.mjs set-active <task-id>
|
|
19
|
+
node Harness/scripts/task-state.mjs set-active <task-id> # focus an open WF task when one is managed
|
|
18
20
|
node Harness/scripts/task-state.mjs transition <task-id> --status <s> --phase <p>
|
|
19
21
|
|
|
20
22
|
# Task creation
|
|
21
|
-
node Harness/scripts/task-state.mjs record <task-id> --create --text "goal" [--status <s>] [--dry-run|--apply]
|
|
23
|
+
node Harness/scripts/task-state.mjs record <task-id> --create --text "goal" [--status <s>] [--phase <p>] [--project <project>] [--tag <tag[,tag...]>] [--dry-run|--apply]
|
|
22
24
|
node Harness/scripts/task-state.mjs record --title "title" --note "note" # auto-generates ID
|
|
23
25
|
|
|
24
26
|
# Archive (moves completed tasks to _archive/YYYY/MM/DD/)
|
|
@@ -33,13 +35,75 @@ node Harness/scripts/task-state.mjs history delete <task-id> [--dry-run|--apply]
|
|
|
33
35
|
|
|
34
36
|
**When to use:**
|
|
35
37
|
- `/wf-task-list` calls `task-state.mjs list`
|
|
38
|
+
- `index` rebuilds the generated task route after task metadata changes.
|
|
39
|
+
- `query` performs deterministic keyword lookup across task metadata and capsule notes.
|
|
36
40
|
- `/wf-task-archive` calls `task-state.mjs archive`
|
|
37
41
|
- `/wf-task-record` calls `task-state.mjs record`
|
|
38
42
|
- Resume: check `task-state.mjs open` for blocked/open tasks
|
|
39
|
-
- Closeout: run `task-state.mjs archive --apply`
|
|
43
|
+
- Closeout: transition a task to `closed`, then run `task-state.mjs archive --apply`
|
|
44
|
+
- Durable WF: only tasks explicitly created with `--mode wf` or `--mode wf-max` auto-resume across sessions; mode is immutable and closed is terminal.
|
|
45
|
+
- Direct coexistence: direct tasks may stay open, but cannot replace an open WF focus or be promoted into WF.
|
|
40
46
|
- Debug: run `task-state.mjs validate --strict` to check state integrity
|
|
41
47
|
- Research: run `task-state.mjs history search <keyword>` to find past solutions
|
|
42
48
|
|
|
49
|
+
### Bounded context and conditional research
|
|
50
|
+
|
|
51
|
+
Workflow controllers and workers can exchange a bounded, role-scoped task pack:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
node Harness/scripts/task-context.mjs pack <task-id> --project <absolutePath> --role <role> --budget-bytes <n> --json
|
|
55
|
+
node Harness/scripts/task-context.mjs show <task-id> --project <absolutePath> --json
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
`pack` is also the resume input; it omits entries outside the role/work item or
|
|
59
|
+
the byte budget. The output is a structural context boundary, not a semantic
|
|
60
|
+
safety guarantee. `update` is write-enabled only with `--apply`; without it the
|
|
61
|
+
command is a dry run and changes no task state.
|
|
62
|
+
|
|
63
|
+
Ask whether external research is warranted before using a network tool:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
node Harness/scripts/research-policy.mjs decide --trigger <trigger> --task-type <type> --json
|
|
67
|
+
node Harness/scripts/research-policy.mjs record --project <absolutePath> --task <task-id> --input <reference.json> --apply --json
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Use `capability-gap`, `volatile-api`, `user-request`, `repeated-failure`, or
|
|
71
|
+
`benchmark-gap` as triggers. A permitted search must read the actual primary
|
|
72
|
+
source and retain its URL, title, version, license/terms, date, and
|
|
73
|
+
adopt/adapt/reject rationale in task evidence.
|
|
74
|
+
|
|
75
|
+
### Runtime capability declarations
|
|
76
|
+
|
|
77
|
+
Native provider catalogs are preferred. A runtime without a native effort
|
|
78
|
+
catalog may use an exact operator declaration in `Harness/settings.json`:
|
|
79
|
+
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"runtimeCapabilities": {
|
|
83
|
+
"claude": {
|
|
84
|
+
"models": {
|
|
85
|
+
"gateway/claude-luna": {
|
|
86
|
+
"supportedEfforts": ["low", "high", "xhigh"]
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
The model key and effort names are exact. `operator-configured` is provenance
|
|
95
|
+
only: it is not provider measurement, account entitlement, or task success.
|
|
96
|
+
HTTP settings updates must preserve the declaration; payloads cannot add,
|
|
97
|
+
replace, delete, null, or invalidate `runtimeCapabilities`. Reject invalid
|
|
98
|
+
capability mutations before any settings write.
|
|
99
|
+
|
|
100
|
+
### Scoped memory learning
|
|
101
|
+
|
|
102
|
+
`memory-context.mjs query` narrows existing entries before `validate`, `apply`,
|
|
103
|
+
or task-local `feedback`; it is not a full-memory preload. A method candidate
|
|
104
|
+
needs evidence, a counterexample, and passed verification, but this structural
|
|
105
|
+
gate does not replace semantic review.
|
|
106
|
+
|
|
43
107
|
### `archive-tasks.mjs`
|
|
44
108
|
|
|
45
109
|
Compatibility alias for `task-state.mjs archive`. Delegates all flags.
|