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
|
@@ -1,11 +1,24 @@
|
|
|
1
1
|
import { ALLOWED_RUNTIMES, generateSessionId } from './session-registry.mjs';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import os from 'node:os';
|
|
2
4
|
import path from 'node:path';
|
|
5
|
+
import { createRequire } from 'node:module';
|
|
6
|
+
|
|
7
|
+
// node:sqlite (DatabaseSync) is loaded lazily through createRequire so older
|
|
8
|
+
// Node versions that lack the builtin never crash pty-adapter at import time.
|
|
9
|
+
const require = createRequire(import.meta.url);
|
|
3
10
|
import {
|
|
4
11
|
getRuntimeDefinition,
|
|
5
12
|
isRuntimeLaunchable,
|
|
6
13
|
resolveRuntimeCommand,
|
|
7
14
|
resolveRuntimeLaunchArgs,
|
|
8
15
|
} from './runtime-detector.mjs';
|
|
16
|
+
import {
|
|
17
|
+
codexUpdatePromptControlEnabled,
|
|
18
|
+
createCodexUpdatePromptDetector,
|
|
19
|
+
stripTerminalControls,
|
|
20
|
+
} from './codex-update-prompt.mjs';
|
|
21
|
+
import { buildHarnessEnvSession } from './harness-env.mjs';
|
|
9
22
|
|
|
10
23
|
async function loadPtyModule() {
|
|
11
24
|
const attempts = [
|
|
@@ -53,6 +66,391 @@ export function resolvePtyCommand(executable, args) {
|
|
|
53
66
|
};
|
|
54
67
|
}
|
|
55
68
|
|
|
69
|
+
export function windowsPtyOptions() {
|
|
70
|
+
if (process.platform !== 'win32') return {};
|
|
71
|
+
return {
|
|
72
|
+
useConpty: true,
|
|
73
|
+
useConptyDll: process.env.HARNESS_WF_UI_USE_SYSTEM_CONPTY !== '1',
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Codex rollout-id detector (secondary, confirmation-gated).
|
|
79
|
+
*
|
|
80
|
+
* Codex keys its saved sessions by an internal rollout UUID. Newer codex
|
|
81
|
+
* TUI versions never print this UUID to PTY output (verified against real
|
|
82
|
+
* sessions), so the primary source is the filesystem capture below. This
|
|
83
|
+
* output-scanner is kept for runtimes/builds that do print a session-context
|
|
84
|
+
* UUID at boot (e.g. `Session 019ffa1b-...`), but it never fires on its own:
|
|
85
|
+
* when `sessionsDir` is provided, a captured PTY-line UUID must ALSO exist as
|
|
86
|
+
* a real rollout-*.jsonl file in the sessions dir before it is reported.
|
|
87
|
+
* Resume error lines (`No saved session found with ID <harness-uuid>`) carry
|
|
88
|
+
* the harness session id, which never matches a rollout file, so they are
|
|
89
|
+
* ignored instead of poisoning the persisted rollout id.
|
|
90
|
+
*
|
|
91
|
+
* Same shape as createCodexUpdatePromptDetector: observe(chunk) returns a
|
|
92
|
+
* control request once (type 'codex:rollout-id', payload { rolloutId }).
|
|
93
|
+
*/
|
|
94
|
+
export const CODEX_ROLLOUT_ID_CAPTURE_WINDOW_MS = 30000;
|
|
95
|
+
const ROLLOUT_BUFFER_CHARS = 6000;
|
|
96
|
+
const CODEX_ROLLOUT_UUID_PATTERN = /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/i;
|
|
97
|
+
const CODEX_ROLLOUT_CONTEXT_PATTERN = /session|rollout/i;
|
|
98
|
+
|
|
99
|
+
export function createCodexRolloutIdDetector({ enabled = true, windowMs = CODEX_ROLLOUT_ID_CAPTURE_WINDOW_MS, sessionsDir = null } = {}) {
|
|
100
|
+
let buffer = '';
|
|
101
|
+
let captured = null;
|
|
102
|
+
let expired = false;
|
|
103
|
+
// Any finite offset is honored (negative = already past the window); a
|
|
104
|
+
// non-finite value falls back to the default window.
|
|
105
|
+
const captureWindowMs = Number.isFinite(windowMs) ? windowMs : CODEX_ROLLOUT_ID_CAPTURE_WINDOW_MS;
|
|
106
|
+
const startedAt = Date.now();
|
|
107
|
+
|
|
108
|
+
function scan(text) {
|
|
109
|
+
for (const line of String(text).split(/\r?\n/)) {
|
|
110
|
+
if (!CODEX_ROLLOUT_CONTEXT_PATTERN.test(line)) continue;
|
|
111
|
+
const match = line.match(CODEX_ROLLOUT_UUID_PATTERN);
|
|
112
|
+
if (!match) continue;
|
|
113
|
+
const candidate = match[0].toLowerCase();
|
|
114
|
+
// Anti-false-positive guard: a PTY line mentioning a uuid is only a
|
|
115
|
+
// rollout when a real rollout-*.jsonl file with that uuid exists in the
|
|
116
|
+
// sessions dir. Without an fs match the line is a resume error message,
|
|
117
|
+
// not a rollout, so it must not fire or persist.
|
|
118
|
+
if (sessionsDir && !rolloutIdExistsInSessionsDir(sessionsDir, candidate)) continue;
|
|
119
|
+
return candidate;
|
|
120
|
+
}
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return {
|
|
125
|
+
observe(chunk) {
|
|
126
|
+
if (!enabled || captured || expired) return null;
|
|
127
|
+
if (Date.now() - startedAt > captureWindowMs) {
|
|
128
|
+
expired = true;
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
buffer = stripTerminalControls(`${buffer}${chunk || ''}`).slice(-ROLLOUT_BUFFER_CHARS);
|
|
132
|
+
const rolloutId = scan(buffer);
|
|
133
|
+
if (!rolloutId) return null;
|
|
134
|
+
captured = rolloutId;
|
|
135
|
+
return {
|
|
136
|
+
reason: 'codex-rollout-id-detected',
|
|
137
|
+
type: 'codex:rollout-id',
|
|
138
|
+
payload: { rolloutId },
|
|
139
|
+
};
|
|
140
|
+
},
|
|
141
|
+
get rolloutId() {
|
|
142
|
+
return captured;
|
|
143
|
+
},
|
|
144
|
+
get active() {
|
|
145
|
+
return enabled && !captured && !expired;
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Codex rollout-id filesystem capture (primary).
|
|
152
|
+
*
|
|
153
|
+
* codex 0.147.x TUI never prints its rollout UUID to the PTY; the UUID lives
|
|
154
|
+
* in codex's sessions dir (`~/.codex/sessions`, or `$CODEX_HOME/sessions`)
|
|
155
|
+
* under a per-day nested layout
|
|
156
|
+
* `sessions/<YYYY>/<MM>/<DD>/rollout-<timestamp>-<uuid>.jsonl` (e.g.
|
|
157
|
+
* `sessions/2026/08/13/rollout-2026-08-13T16-21-24-019ffa36-34a1-7923-ab6b-c66732a1e06e.jsonl`),
|
|
158
|
+
* so every scan below walks the tree recursively (depth-bounded). This
|
|
159
|
+
* capture snapshots the rollout files before spawn (baseline) and polls for
|
|
160
|
+
* a NEW rollout file, extracting the UUID from the filename and emitting the
|
|
161
|
+
* same control request the PTY detector emits:
|
|
162
|
+
* `{ type: 'codex:rollout-id', payload: { rolloutId } }`.
|
|
163
|
+
*
|
|
164
|
+
* The window and poll interval default to 240s/2s and can be shortened via
|
|
165
|
+
* CODEX_ROLLOUT_FS_CAPTURE_WINDOW_MS / CODEX_ROLLOUT_FS_POLL_MS (used in
|
|
166
|
+
* tests). Returns a handle with start()/stop(), rolloutId, and active.
|
|
167
|
+
*/
|
|
168
|
+
export const CODEX_ROLLOUT_FS_CAPTURE_WINDOW_MS = 240000;
|
|
169
|
+
export const CODEX_ROLLOUT_FS_POLL_MS = 2000;
|
|
170
|
+
const ROLLOUT_FS_MTIME_SLACK_MS = 2000;
|
|
171
|
+
// Timestamp is dash-separated (2026-08-13T16-21-24); the trailing dash-delimited
|
|
172
|
+
// segment must be a canonical 8-4-4-4-12 UUID before `.jsonl`.
|
|
173
|
+
const CODEX_ROLLOUT_FILENAME_PATTERN = /^rollout-.*-([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.jsonl$/i;
|
|
174
|
+
// Real layout is sessions/<YYYY>/<MM>/<DD>/rollout-*.jsonl (3 dir levels);
|
|
175
|
+
// one extra level of headroom keeps the walk bounded on any odd variant.
|
|
176
|
+
export const CODEX_ROLLOUT_SCAN_MAX_DEPTH = 4;
|
|
177
|
+
|
|
178
|
+
export function codexSessionsDir() {
|
|
179
|
+
const codexHome = process.env.CODEX_HOME || path.join(os.homedir(), '.codex');
|
|
180
|
+
return path.join(codexHome, 'sessions');
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export function extractRolloutIdFromFilename(filename) {
|
|
184
|
+
const match = CODEX_ROLLOUT_FILENAME_PATTERN.exec(String(filename || ''));
|
|
185
|
+
return match ? match[1].toLowerCase() : null;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Recursive, depth-bounded walk of the codex sessions dir. Returns a Map of
|
|
190
|
+
* posix-style relative paths (from sessionsDir) to mtimeMs (null when the file
|
|
191
|
+
* is unreadable) for every rollout-*.jsonl file found. A flat readdir never
|
|
192
|
+
* sees the real `YYYY/MM/DD` layout, so this is the single source of truth
|
|
193
|
+
* for both the baseline snapshot and the capture poller.
|
|
194
|
+
*/
|
|
195
|
+
function collectRolloutFiles(sessionsDir, maxDepth = CODEX_ROLLOUT_SCAN_MAX_DEPTH) {
|
|
196
|
+
const found = new Map();
|
|
197
|
+
function walk(dir, depth) {
|
|
198
|
+
if (depth > maxDepth) return;
|
|
199
|
+
let entries;
|
|
200
|
+
try {
|
|
201
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
202
|
+
} catch {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
for (const entry of entries) {
|
|
206
|
+
const fullPath = path.join(dir, entry.name);
|
|
207
|
+
if (entry.isDirectory()) {
|
|
208
|
+
walk(fullPath, depth + 1);
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
if (!entry.isFile() || extractRolloutIdFromFilename(entry.name) === null) continue;
|
|
212
|
+
const relPath = path.relative(sessionsDir, fullPath).split(path.sep).join('/');
|
|
213
|
+
let mtimeMs = null;
|
|
214
|
+
try {
|
|
215
|
+
mtimeMs = fs.statSync(fullPath).mtimeMs;
|
|
216
|
+
} catch {
|
|
217
|
+
// Unreadable file: keep it with null mtime so existence checks still see it.
|
|
218
|
+
}
|
|
219
|
+
found.set(relPath, mtimeMs);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
walk(sessionsDir, 0);
|
|
223
|
+
return found;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* True when a rollout-*.jsonl file whose uuid equals `rolloutId` exists
|
|
228
|
+
* anywhere under the sessions dir (recursive). Used by the PTY detector to
|
|
229
|
+
* confirm a PTY-line uuid against the filesystem before it may fire.
|
|
230
|
+
*/
|
|
231
|
+
export function rolloutIdExistsInSessionsDir(sessionsDir, rolloutId) {
|
|
232
|
+
const target = String(rolloutId || '').toLowerCase();
|
|
233
|
+
if (!target) return false;
|
|
234
|
+
for (const relPath of collectRolloutFiles(sessionsDir).keys()) {
|
|
235
|
+
if (extractRolloutIdFromFilename(path.basename(relPath)) === target) return true;
|
|
236
|
+
}
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
export function snapshotRolloutFilenames(sessionsDir) {
|
|
241
|
+
return new Set(collectRolloutFiles(sessionsDir).keys());
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
function readEnvCaptureMs(name, fallback) {
|
|
245
|
+
const parsed = Number(process.env[name]);
|
|
246
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
export function createCodexRolloutFsCapture({
|
|
250
|
+
sessionsDir,
|
|
251
|
+
baselineFiles = new Set(),
|
|
252
|
+
spawnTime = Date.now(),
|
|
253
|
+
windowMs = readEnvCaptureMs('CODEX_ROLLOUT_FS_CAPTURE_WINDOW_MS', CODEX_ROLLOUT_FS_CAPTURE_WINDOW_MS),
|
|
254
|
+
pollMs = readEnvCaptureMs('CODEX_ROLLOUT_FS_POLL_MS', CODEX_ROLLOUT_FS_POLL_MS),
|
|
255
|
+
onControlRequest,
|
|
256
|
+
} = {}) {
|
|
257
|
+
let timer = null;
|
|
258
|
+
let capturedRolloutId = null;
|
|
259
|
+
let expired = false;
|
|
260
|
+
const startedAt = Date.now();
|
|
261
|
+
|
|
262
|
+
function scan() {
|
|
263
|
+
for (const [relPath, mtimeMs] of collectRolloutFiles(sessionsDir)) {
|
|
264
|
+
if (baselineFiles.has(relPath)) continue;
|
|
265
|
+
const rolloutId = extractRolloutIdFromFilename(path.basename(relPath));
|
|
266
|
+
if (!rolloutId) continue;
|
|
267
|
+
if (mtimeMs === null || mtimeMs >= spawnTime - ROLLOUT_FS_MTIME_SLACK_MS) {
|
|
268
|
+
return rolloutId;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return null;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
function stop() {
|
|
275
|
+
if (timer) {
|
|
276
|
+
clearInterval(timer);
|
|
277
|
+
timer = null;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
function tick() {
|
|
282
|
+
if (capturedRolloutId) {
|
|
283
|
+
stop();
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
if (Date.now() - startedAt >= windowMs) {
|
|
287
|
+
expired = true;
|
|
288
|
+
stop();
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
const rolloutId = scan();
|
|
292
|
+
if (!rolloutId) return;
|
|
293
|
+
capturedRolloutId = rolloutId;
|
|
294
|
+
stop();
|
|
295
|
+
if (typeof onControlRequest === 'function') {
|
|
296
|
+
onControlRequest({
|
|
297
|
+
reason: 'codex-rollout-id-detected',
|
|
298
|
+
type: 'codex:rollout-id',
|
|
299
|
+
payload: { rolloutId },
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
return {
|
|
305
|
+
start() {
|
|
306
|
+
if (timer || capturedRolloutId || expired) return;
|
|
307
|
+
timer = setInterval(tick, pollMs);
|
|
308
|
+
if (typeof timer.unref === 'function') timer.unref();
|
|
309
|
+
},
|
|
310
|
+
stop,
|
|
311
|
+
get rolloutId() {
|
|
312
|
+
return capturedRolloutId;
|
|
313
|
+
},
|
|
314
|
+
get active() {
|
|
315
|
+
return !capturedRolloutId && !expired;
|
|
316
|
+
},
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* OpenCode session-id capture.
|
|
322
|
+
*
|
|
323
|
+
* opencode 1.18.x never prints its session id to the PTY; sessions are stored
|
|
324
|
+
* in the opencode SQLite db (`~/.local/share/opencode/opencode.db`, or
|
|
325
|
+
* `$OPENCODE_DB`) in the `session` table keyed by `directory` (forward-slash
|
|
326
|
+
* normalized cwd). This capture snapshots the newest session row for the
|
|
327
|
+
* spawn directory BEFORE spawn (baseline) and polls the db for a NEW row
|
|
328
|
+
* (id prefix `ses_`), emitting the same control-request shape as the codex
|
|
329
|
+
* rollout capture: `{ type: 'opencode:session-id', payload: { sessionId } }`.
|
|
330
|
+
*
|
|
331
|
+
* The window and poll interval default to 240s/2s and can be shortened via
|
|
332
|
+
* OPENCODE_SESSION_CAPTURE_WINDOW_MS / OPENCODE_SESSION_POLL_MS (used in
|
|
333
|
+
* tests). Returns a handle with start()/stop(), sessionId, and active.
|
|
334
|
+
* The capture is skipped when the db file is missing; schema/query failures
|
|
335
|
+
* never throw — they simply yield no event until the window expires.
|
|
336
|
+
*/
|
|
337
|
+
export const OPENCODE_SESSION_CAPTURE_WINDOW_MS = 240000;
|
|
338
|
+
export const OPENCODE_SESSION_POLL_MS = 2000;
|
|
339
|
+
|
|
340
|
+
export function opencodeDbPath() {
|
|
341
|
+
return process.env.OPENCODE_DB || path.join(os.homedir(), '.local', 'share', 'opencode', 'opencode.db');
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
// opencode stores the session `directory` with forward slashes on every
|
|
345
|
+
// platform, so a Windows cwd must be normalized before matching.
|
|
346
|
+
export function opencodeSessionDirectory(cwd) {
|
|
347
|
+
return String(cwd || '').replace(/\\/g, '/');
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
export function queryOpencodeLatestSessionId(dbPath, directory) {
|
|
351
|
+
try {
|
|
352
|
+
const { DatabaseSync } = require('node:sqlite');
|
|
353
|
+
const db = new DatabaseSync(String(dbPath), { readOnly: true });
|
|
354
|
+
try {
|
|
355
|
+
const row = db
|
|
356
|
+
.prepare('SELECT id FROM session WHERE directory = ? ORDER BY time_created DESC LIMIT 1')
|
|
357
|
+
.get(String(directory || ''));
|
|
358
|
+
return row ? String(row.id || '') : null;
|
|
359
|
+
} finally {
|
|
360
|
+
db.close();
|
|
361
|
+
}
|
|
362
|
+
} catch {
|
|
363
|
+
return null;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
export function createOpencodeSessionIdCapture({
|
|
368
|
+
dbPath,
|
|
369
|
+
directory,
|
|
370
|
+
baselineId = null,
|
|
371
|
+
windowMs = readEnvCaptureMs('OPENCODE_SESSION_CAPTURE_WINDOW_MS', OPENCODE_SESSION_CAPTURE_WINDOW_MS),
|
|
372
|
+
pollMs = readEnvCaptureMs('OPENCODE_SESSION_POLL_MS', OPENCODE_SESSION_POLL_MS),
|
|
373
|
+
onControlRequest,
|
|
374
|
+
} = {}) {
|
|
375
|
+
let timer = null;
|
|
376
|
+
let capturedSessionId = null;
|
|
377
|
+
let expired = false;
|
|
378
|
+
const startedAt = Date.now();
|
|
379
|
+
|
|
380
|
+
function stop() {
|
|
381
|
+
if (timer) {
|
|
382
|
+
clearInterval(timer);
|
|
383
|
+
timer = null;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
function tick() {
|
|
388
|
+
if (capturedSessionId) {
|
|
389
|
+
stop();
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
392
|
+
if (Date.now() - startedAt >= windowMs) {
|
|
393
|
+
expired = true;
|
|
394
|
+
stop();
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
397
|
+
const latestId = queryOpencodeLatestSessionId(dbPath, directory);
|
|
398
|
+
if (!latestId || latestId === baselineId || !String(latestId).startsWith('ses_')) return;
|
|
399
|
+
capturedSessionId = latestId;
|
|
400
|
+
stop();
|
|
401
|
+
if (typeof onControlRequest === 'function') {
|
|
402
|
+
onControlRequest({
|
|
403
|
+
reason: 'opencode-session-id-detected',
|
|
404
|
+
type: 'opencode:session-id',
|
|
405
|
+
payload: { sessionId: latestId },
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
return {
|
|
411
|
+
start() {
|
|
412
|
+
if (timer || capturedSessionId || expired) return;
|
|
413
|
+
timer = setInterval(tick, pollMs);
|
|
414
|
+
if (typeof timer.unref === 'function') timer.unref();
|
|
415
|
+
},
|
|
416
|
+
stop,
|
|
417
|
+
get sessionId() {
|
|
418
|
+
return capturedSessionId;
|
|
419
|
+
},
|
|
420
|
+
get active() {
|
|
421
|
+
return !capturedSessionId && !expired;
|
|
422
|
+
},
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
/**
|
|
427
|
+
* Resolve the launch argument list for a runtime PTY spawn.
|
|
428
|
+
*
|
|
429
|
+
* Pure helper (no PTY side effects) so the claude pre-assign flag can be
|
|
430
|
+
* asserted in unit tests. Claude Code pre-assigns its conversation session id
|
|
431
|
+
* at spawn via `--session-id <uuid>` (deterministic, zero polling); resume
|
|
432
|
+
* spawns never carry agentSessionId, so the flag is never combined with
|
|
433
|
+
* resume args.
|
|
434
|
+
*/
|
|
435
|
+
export function resolveSpawnArgs(runtime, {
|
|
436
|
+
model,
|
|
437
|
+
effort,
|
|
438
|
+
effortVariant,
|
|
439
|
+
launchPolicy,
|
|
440
|
+
initialPrompt,
|
|
441
|
+
agentSessionId,
|
|
442
|
+
commandArgs = [],
|
|
443
|
+
} = {}) {
|
|
444
|
+
const args = [
|
|
445
|
+
...resolveRuntimeLaunchArgs(runtime, { model, effort, effortVariant, launchPolicy, initialPrompt }),
|
|
446
|
+
...commandArgs,
|
|
447
|
+
];
|
|
448
|
+
if ((runtime === 'claude' || runtime === 'cc') && agentSessionId) {
|
|
449
|
+
args.push('--session-id', String(agentSessionId));
|
|
450
|
+
}
|
|
451
|
+
return args;
|
|
452
|
+
}
|
|
453
|
+
|
|
56
454
|
/**
|
|
57
455
|
* Spawn a PTY for a given runtime agent.
|
|
58
456
|
*
|
|
@@ -64,12 +462,23 @@ export function resolvePtyCommand(executable, args) {
|
|
|
64
462
|
* @param {string|null} opts.taskId - Optional task ID for the session
|
|
65
463
|
* @param {string} opts.peerId - Peer identifier
|
|
66
464
|
* @param {string} opts.projectRoot - Project root directory
|
|
465
|
+
* @param {string} [opts.cwd] - Working directory for the PTY
|
|
67
466
|
* @param {string} [opts.command] - Resolved executable command from detector
|
|
68
467
|
* @param {string[]} [opts.commandArgs] - Extra args appended after runtime launch args
|
|
468
|
+
* @param {string} [opts.agentSessionId] - Pre-assigned runtime session id for claude/cc (appended as --session-id)
|
|
69
469
|
* @param {string} [opts.model] - Optional model override for runtimes that support it
|
|
470
|
+
* @param {string} [opts.effort] - Explicit reasoning effort forwarded to the runtime-native CLI
|
|
471
|
+
* @param {string} [opts.effortVariant] - Trusted OpenCode model variant selected by capability preflight
|
|
472
|
+
* @param {string} [opts.initialPrompt] - Optional initial prompt passed through the runtime CLI
|
|
473
|
+
* @param {string} [opts.dispatchId] - Canonical dispatch identity for the worker
|
|
474
|
+
* @param {number} [opts.dispatchAttempt=0] - Canonical dispatch attempt
|
|
475
|
+
* @param {string} [opts.workerCapability] - Ephemeral service-issued worker capability
|
|
476
|
+
* @param {string} [opts.requestId] - Canonical dispatch request correlation id
|
|
477
|
+
* @param {string} [opts.replyTo] - Canonical dispatch reply correlation id
|
|
70
478
|
* @param {number} [opts.cols=120] - Terminal columns
|
|
71
479
|
* @param {number} [opts.rows=32] - Terminal rows
|
|
72
480
|
* @param {function} opts.onData - Callback for PTY output data (chunk) => void
|
|
481
|
+
* @param {function} [opts.onControlRequest] - Callback when PTY output needs frontend-controlled input
|
|
73
482
|
* @param {function} opts.onExit - Callback for PTY exit ({ exitCode, signal }) => void
|
|
74
483
|
* @returns {Promise<{sessionId: string, pid: number, ptyProcess: object}|{blocked: boolean, reason: string, hint: string}>}
|
|
75
484
|
* @throws {Error} If runtime is not in ALLOWED_RUNTIMES
|
|
@@ -79,13 +488,34 @@ export async function spawnPty({
|
|
|
79
488
|
taskId,
|
|
80
489
|
peerId,
|
|
81
490
|
projectRoot,
|
|
491
|
+
cwd,
|
|
82
492
|
sessionId,
|
|
83
493
|
command,
|
|
84
494
|
commandArgs = [],
|
|
495
|
+
agentSessionId,
|
|
85
496
|
model = '',
|
|
497
|
+
effort = '',
|
|
498
|
+
effortVariant = '',
|
|
499
|
+
initialPrompt = '',
|
|
500
|
+
launchPolicy = null,
|
|
501
|
+
controlPlaneUrl = '',
|
|
502
|
+
controlPlaneToken = '',
|
|
503
|
+
agentKind = '',
|
|
504
|
+
workflowMode = '',
|
|
505
|
+
subagentMode = '',
|
|
506
|
+
graphNodeId = '',
|
|
507
|
+
graphContextPath = '',
|
|
508
|
+
nodeHomePath = '',
|
|
509
|
+
nodeInitPath = '',
|
|
510
|
+
dispatchId = '',
|
|
511
|
+
dispatchAttempt = 0,
|
|
512
|
+
workerCapability = '',
|
|
513
|
+
requestId = '',
|
|
514
|
+
replyTo = '',
|
|
86
515
|
cols = 120,
|
|
87
516
|
rows = 32,
|
|
88
517
|
onData,
|
|
518
|
+
onControlRequest,
|
|
89
519
|
onExit,
|
|
90
520
|
}) {
|
|
91
521
|
// Validate runtime before anything else
|
|
@@ -109,25 +539,53 @@ export async function spawnPty({
|
|
|
109
539
|
const resolvedSessionId = sessionId || generateSessionId();
|
|
110
540
|
|
|
111
541
|
const requestedExecutable = command || resolveRuntimeCommand(runtime);
|
|
112
|
-
const requestedArgs =
|
|
542
|
+
const requestedArgs = resolveSpawnArgs(runtime, { model, effort, effortVariant, launchPolicy, initialPrompt, agentSessionId, commandArgs });
|
|
113
543
|
const { executable, args: launchArgs } = resolvePtyCommand(requestedExecutable, requestedArgs);
|
|
114
544
|
|
|
545
|
+
// Baseline snapshot of codex rollout files BEFORE spawn; the fs capture
|
|
546
|
+
// started after spawn only reports rollout-*.jsonl files that appear after
|
|
547
|
+
// this point, so pre-existing sessions can never be mistaken for new ones.
|
|
548
|
+
const codexRolloutSessionsDir = runtime === 'codex' ? codexSessionsDir() : null;
|
|
549
|
+
const codexRolloutBaseline = codexRolloutSessionsDir ? snapshotRolloutFilenames(codexRolloutSessionsDir) : new Set();
|
|
550
|
+
const codexSpawnTimestamp = Date.now();
|
|
551
|
+
|
|
552
|
+
// Baseline snapshot of the opencode session db BEFORE spawn; the sqlite
|
|
553
|
+
// capture started after spawn only reports session rows that appear after
|
|
554
|
+
// this point, so pre-existing sessions can never be mistaken for new ones.
|
|
555
|
+
const spawnCwd = cwd || projectRoot || process.cwd();
|
|
556
|
+
const opencodeDb = runtime === 'opencode' ? opencodeDbPath() : null;
|
|
557
|
+
const opencodeSessionDir = opencodeDb ? opencodeSessionDirectory(spawnCwd) : '';
|
|
558
|
+
const opencodeBaselineId = opencodeDb && fs.existsSync(opencodeDb)
|
|
559
|
+
? queryOpencodeLatestSessionId(opencodeDb, opencodeSessionDir)
|
|
560
|
+
: null;
|
|
561
|
+
|
|
115
562
|
let ptyProcess;
|
|
116
563
|
try {
|
|
117
564
|
ptyProcess = nodePty.spawn(executable, launchArgs, {
|
|
118
565
|
name: 'xterm-256color',
|
|
119
566
|
cols,
|
|
120
567
|
rows,
|
|
121
|
-
cwd: projectRoot || process.cwd(),
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
568
|
+
cwd: cwd || projectRoot || process.cwd(),
|
|
569
|
+
...windowsPtyOptions(),
|
|
570
|
+
env: buildHarnessEnvSession({
|
|
571
|
+
runtime,
|
|
572
|
+
agentKind,
|
|
573
|
+
workflowMode,
|
|
574
|
+
graphNodeId,
|
|
575
|
+
graphContextPath,
|
|
576
|
+
nodeHomePath,
|
|
577
|
+
nodeInitPath,
|
|
578
|
+
subagentMode,
|
|
579
|
+
controlPlaneUrl,
|
|
580
|
+
taskId,
|
|
581
|
+
peerId,
|
|
582
|
+
sessionId: resolvedSessionId,
|
|
583
|
+
dispatchId,
|
|
584
|
+
dispatchAttempt,
|
|
585
|
+
workerCapability,
|
|
586
|
+
requestId,
|
|
587
|
+
replyTo,
|
|
588
|
+
}),
|
|
131
589
|
});
|
|
132
590
|
} catch (err) {
|
|
133
591
|
return {
|
|
@@ -138,11 +596,55 @@ export async function spawnPty({
|
|
|
138
596
|
}
|
|
139
597
|
|
|
140
598
|
const pid = ptyProcess.pid;
|
|
599
|
+
const codexUpdateDetector = createCodexUpdatePromptDetector({
|
|
600
|
+
enabled: runtime === 'codex' && codexUpdatePromptControlEnabled(),
|
|
601
|
+
});
|
|
602
|
+
// Secondary, confirmation-gated source: a PTY-line uuid only fires when a
|
|
603
|
+
// real rollout-*.jsonl file with that uuid exists in the sessions dir, so
|
|
604
|
+
// resume error lines (`No saved session found with ID <harness-uuid>`) can
|
|
605
|
+
// never poison the captured rollout id.
|
|
606
|
+
const codexRolloutIdDetector = createCodexRolloutIdDetector({
|
|
607
|
+
enabled: runtime === 'codex',
|
|
608
|
+
sessionsDir: codexRolloutSessionsDir,
|
|
609
|
+
});
|
|
610
|
+
// Primary rollout-id source: watch the codex sessions dir (recursively, the
|
|
611
|
+
// real layout is sessions/YYYY/MM/DD/) for the new rollout-*.jsonl file
|
|
612
|
+
// codex writes at session start (the TUI never prints the UUID). Bounded by
|
|
613
|
+
// CODEX_ROLLOUT_FS_CAPTURE_WINDOW_MS.
|
|
614
|
+
if (codexRolloutSessionsDir && typeof onControlRequest === 'function') {
|
|
615
|
+
const rolloutFsCapture = createCodexRolloutFsCapture({
|
|
616
|
+
sessionsDir: codexRolloutSessionsDir,
|
|
617
|
+
baselineFiles: codexRolloutBaseline,
|
|
618
|
+
spawnTime: codexSpawnTimestamp,
|
|
619
|
+
onControlRequest,
|
|
620
|
+
});
|
|
621
|
+
rolloutFsCapture.start();
|
|
622
|
+
}
|
|
623
|
+
// Primary opencode session-id source: watch the opencode session table for
|
|
624
|
+
// the new ses_ row opencode writes at session start (the TUI never prints
|
|
625
|
+
// the id). Bounded by OPENCODE_SESSION_CAPTURE_WINDOW_MS.
|
|
626
|
+
if (opencodeDb && fs.existsSync(opencodeDb) && typeof onControlRequest === 'function') {
|
|
627
|
+
const opencodeCapture = createOpencodeSessionIdCapture({
|
|
628
|
+
dbPath: opencodeDb,
|
|
629
|
+
directory: opencodeSessionDir,
|
|
630
|
+
baselineId: opencodeBaselineId,
|
|
631
|
+
onControlRequest,
|
|
632
|
+
});
|
|
633
|
+
opencodeCapture.start();
|
|
634
|
+
}
|
|
141
635
|
|
|
142
636
|
ptyProcess.onData((data) => {
|
|
143
637
|
if (typeof onData === 'function') {
|
|
144
638
|
onData(data);
|
|
145
639
|
}
|
|
640
|
+
const controlRequest = codexUpdateDetector.observe(data);
|
|
641
|
+
if (controlRequest && typeof onControlRequest === 'function') {
|
|
642
|
+
onControlRequest(controlRequest);
|
|
643
|
+
}
|
|
644
|
+
const rolloutRequest = codexRolloutIdDetector.observe(data);
|
|
645
|
+
if (rolloutRequest && typeof onControlRequest === 'function') {
|
|
646
|
+
onControlRequest(rolloutRequest);
|
|
647
|
+
}
|
|
146
648
|
});
|
|
147
649
|
|
|
148
650
|
ptyProcess.onExit(({ exitCode, signal }) => {
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// Force a freshly revealed Explorer window to the foreground (Windows only).
|
|
2
|
+
//
|
|
3
|
+
// explorer.exe spawned from a background process (this server) is subject to
|
|
4
|
+
// the Win32 foreground lock: the new window opens behind the browser, and when
|
|
5
|
+
// the folder already has an Explorer window, explorer reuses it without
|
|
6
|
+
// raising it. This best-effort helper launches a short-lived hidden PowerShell
|
|
7
|
+
// that polls Shell.Application for the window showing the target folder and
|
|
8
|
+
// activates it via user32 (SwitchToThisWindow works from background
|
|
9
|
+
// processes, unlike SetForegroundWindow alone). Any failure is silent: the
|
|
10
|
+
// reveal itself already succeeded, this only improves focus.
|
|
11
|
+
//
|
|
12
|
+
// The target folder path travels via the WF_REVEAL_TARGET environment
|
|
13
|
+
// variable so no user-controlled text is embedded in the command line.
|
|
14
|
+
// For file reveals (/select) the Explorer window shows the parent directory,
|
|
15
|
+
// so the helper matches on the parent path.
|
|
16
|
+
|
|
17
|
+
import { spawn } from 'node:child_process';
|
|
18
|
+
import path from 'node:path';
|
|
19
|
+
|
|
20
|
+
const HELPER_TIMEOUT_MS = 4000;
|
|
21
|
+
const POLL_INTERVAL_MS = 250;
|
|
22
|
+
|
|
23
|
+
const PS_SCRIPT = `
|
|
24
|
+
$ErrorActionPreference = 'SilentlyContinue'
|
|
25
|
+
Add-Type -TypeDefinition 'using System; using System.Runtime.InteropServices; public class W { [DllImport("user32.dll")] public static extern void SwitchToThisWindow(IntPtr h, bool fAltTab); [DllImport("user32.dll")] public static extern bool SetForegroundWindow(IntPtr h); [DllImport("user32.dll")] public static extern bool ShowWindow(IntPtr h, int c); }'
|
|
26
|
+
$target = ($env:WF_REVEAL_TARGET ?? '').TrimEnd('\\').ToLower()
|
|
27
|
+
if ($target) {
|
|
28
|
+
$shell = New-Object -ComObject Shell.Application
|
|
29
|
+
$deadline = (Get-Date).AddMilliseconds(${HELPER_TIMEOUT_MS})
|
|
30
|
+
while ((Get-Date) -lt $deadline) {
|
|
31
|
+
foreach ($w in @($shell.Windows())) {
|
|
32
|
+
$p = $null
|
|
33
|
+
try { $p = [string]$w.Document.Folder.Self.Path } catch {}
|
|
34
|
+
if ($p -and $p.TrimEnd('\\').ToLower() -eq $target) {
|
|
35
|
+
[W]::ShowWindow($w.hwnd, 9) | Out-Null
|
|
36
|
+
[W]::SwitchToThisWindow($w.hwnd, $true)
|
|
37
|
+
[W]::SetForegroundWindow($w.hwnd) | Out-Null
|
|
38
|
+
exit 0
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
Start-Sleep -Milliseconds ${POLL_INTERVAL_MS}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
`;
|
|
45
|
+
|
|
46
|
+
// Fire-and-forget: returns true when a helper was spawned (win32 only).
|
|
47
|
+
export function bringRevealWindowToFront({ absolutePath, isDirectory }) {
|
|
48
|
+
if (process.platform !== 'win32' || !absolutePath) return false;
|
|
49
|
+
// The window shows the file's parent folder for /select reveals.
|
|
50
|
+
const targetFolder = isDirectory ? absolutePath : path.dirname(absolutePath);
|
|
51
|
+
let child;
|
|
52
|
+
try {
|
|
53
|
+
child = spawn(
|
|
54
|
+
'powershell.exe',
|
|
55
|
+
['-NoProfile', '-NonInteractive', '-ExecutionPolicy', 'Bypass', '-WindowStyle', 'Hidden', '-Command', PS_SCRIPT],
|
|
56
|
+
{
|
|
57
|
+
detached: true,
|
|
58
|
+
stdio: 'ignore',
|
|
59
|
+
windowsHide: true,
|
|
60
|
+
env: { ...process.env, WF_REVEAL_TARGET: targetFolder },
|
|
61
|
+
},
|
|
62
|
+
);
|
|
63
|
+
} catch {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
child.on('error', () => {});
|
|
67
|
+
child.unref();
|
|
68
|
+
return true;
|
|
69
|
+
}
|