@qwen-code/qwen-code 0.23.3 → 0.23.4-nightly.20260914.f024b37689
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/bundled/computer-use/SKILL.md +219 -154
- package/bundled/computer-use/references/macos.md +208 -0
- package/bundled/computer-use/references/windows-linux.md +247 -0
- package/bundled/goal-draft/SKILL.md +10 -10
- package/bundled/qc-helper/docs/configuration/settings.md +81 -71
- package/bundled/qc-helper/docs/extension/getting-started-extensions.md +2 -0
- package/bundled/qc-helper/docs/extension/introduction.md +9 -3
- package/bundled/qc-helper/docs/features/_meta.ts +1 -0
- package/bundled/qc-helper/docs/features/agent-board.md +89 -0
- package/bundled/qc-helper/docs/features/channels/dingtalk.md +3 -21
- package/bundled/qc-helper/docs/features/channels/dws.md +5 -1
- package/bundled/qc-helper/docs/features/channels/overview.md +5 -6
- package/bundled/qc-helper/docs/features/code-review.md +18 -4
- package/bundled/qc-helper/docs/features/commands.md +9 -0
- package/bundled/qc-helper/docs/features/computer-use.md +26 -8
- package/bundled/qc-helper/docs/features/cross-session-protocol.md +23 -5
- package/bundled/qc-helper/docs/features/followup-suggestions.md +17 -5
- package/bundled/qc-helper/docs/features/goals.md +22 -18
- package/bundled/qc-helper/docs/features/hooks.md +280 -106
- package/bundled/qc-helper/docs/features/skills.md +33 -3
- package/bundled/qc-helper/docs/features/status-line.md +2 -0
- package/bundled/qc-helper/docs/features/sub-agents.md +27 -0
- package/bundled/qc-helper/docs/qwen-serve.md +7 -3
- package/bundled/review/SKILL.md +20 -10
- package/bundled/review/references/persistence.md +2 -0
- package/bundled/workflow-authoring/SKILL.md +442 -0
- package/bundled/workflow-creator/SKILL.md +1 -1
- package/chunks/{MaxSizedBox-D4LW7RZZ.js → MaxSizedBox-RT5FZP45.js} +59 -55
- package/chunks/{StandaloneSessionPicker-ALTTRWUP.js → StandaloneSessionPicker-RFPH4XLD.js} +83 -79
- package/chunks/{acp-startup-profiler-KEU6VAYR.js → acp-startup-profiler-RUQNTNU5.js} +2 -2
- package/chunks/acp-subagent-executor-3OYJJTVX.js +141 -0
- package/chunks/{acpAgent-BBSW7XZG.js → acpAgent-DWJA7565.js} +1026 -355
- package/chunks/{agent-SQ6OY3QD.js → agent-JLSKPDD6.js} +43 -39
- package/chunks/{agent-headless-RI2THRQ7.js → agent-headless-5DRZSKW6.js} +43 -39
- package/chunks/{anthropicContentGenerator-JSKMKS6V.js → anthropicContentGenerator-H5YPXIDE.js} +37 -15
- package/chunks/{artifact-tool-PMYZCYNH.js → artifact-tool-MFGORTWZ.js} +59 -109
- package/chunks/{askUserQuestion-4M4YYIB4.js → askUserQuestion-WS4GUT7C.js} +3 -3
- package/chunks/{bridge-DAFMI72L.js → bridge-53QBYO6W.js} +63 -58
- package/chunks/{build-63BIOYWK.js → build-5KWQBWEQ.js} +1 -1
- package/chunks/{ca-KC2AISNS.js → ca-GZ4FDJU2.js} +3 -3
- package/chunks/{channel-management-service-OWDXVL7R.js → channel-management-service-AFVIT4VH.js} +8 -8
- package/chunks/{channel-settings-store-4I6JONT7.js → channel-settings-store-QJJZURJO.js} +68 -64
- package/chunks/{channel-worker-group-F2ZZMLNS.js → channel-worker-group-JR6JOELM.js} +8 -8
- package/chunks/{channel-worker-manager-2SZLJJSJ.js → channel-worker-manager-AVKJEZFL.js} +8 -8
- package/chunks/{channel-worker-supervisor-ZFNWMG6D.js → channel-worker-supervisor-OOYY7BAQ.js} +5 -5
- package/chunks/{chunk-AC6KDLH3.js → chunk-23NA3NCR.js} +1 -1
- package/chunks/{chunk-6JACAGYH.js → chunk-2S2WIGCM.js} +1 -1
- package/chunks/{chunk-IUVIBDKU.js → chunk-2YMRRI2C.js} +9 -10
- package/chunks/{chunk-NOAG7N22.js → chunk-3CEFQSKN.js} +2 -2
- package/chunks/{chunk-F53KKZUD.js → chunk-3LMDSCLU.js} +158 -10
- package/chunks/{chunk-WG7BL3FY.js → chunk-473RJLIH.js} +1 -1
- package/chunks/{chunk-W5ZQMAEM.js → chunk-4Y2I3CI3.js} +1 -1
- package/chunks/{chunk-HGEUHUEV.js → chunk-54B2LTKP.js} +1 -1
- package/chunks/{chunk-IRH27ZC2.js → chunk-5EZRLTLQ.js} +4 -4
- package/chunks/{chunk-DLH7YIX6.js → chunk-5FK4MSHB.js} +3 -3
- package/chunks/{chunk-CUEXOHQH.js → chunk-5ODRE7E5.js} +9 -15
- package/chunks/{chunk-ZU47FBOC.js → chunk-5VPMGZ2V.js} +144 -12
- package/chunks/{chunk-532WHF4F.js → chunk-5VQR2DD7.js} +2 -2
- package/chunks/{chunk-YBUMTY7B.js → chunk-66N6C4EH.js} +1 -1
- package/chunks/{chunk-NHCZJQE4.js → chunk-6CHDV2MQ.js} +6 -6
- package/chunks/{chunk-Y2MYW47X.js → chunk-6WXVEDT2.js} +9 -2
- package/chunks/{chunk-SBRX4BDI.js → chunk-74NZLSCZ.js} +2 -2
- package/chunks/{chunk-7APZIRH3.js → chunk-755ZTFXV.js} +5 -5
- package/chunks/{chunk-ZHKTKHMO.js → chunk-7MIBD3LG.js} +1 -1
- package/chunks/{chunk-NJQTG2G3.js → chunk-7Q3B23XG.js} +11 -11
- package/chunks/{chunk-76RGWKLS.js → chunk-ABNX6E6K.js} +1 -1
- package/chunks/chunk-ACHCT36C.js +28 -0
- package/chunks/{chunk-NE624IVP.js → chunk-ADQUK6WA.js} +1 -1
- package/chunks/{chunk-PLLIWEM3.js → chunk-AEWCOE64.js} +2 -2
- package/chunks/{chunk-KOKPXIAN.js → chunk-AKVL46TX.js} +3 -3
- package/chunks/{chunk-RWVD5RRY.js → chunk-AKX4Y4PS.js} +3 -3
- package/chunks/{chunk-3FPYT6QC.js → chunk-ARDHE6MM.js} +23 -0
- package/chunks/{chunk-EVTNACMT.js → chunk-ASOI6Z7M.js} +12 -12
- package/chunks/{chunk-LILGKQ4B.js → chunk-AXZMWAJV.js} +156 -26
- package/chunks/{chunk-XBZTAGB7.js → chunk-AYS36QDK.js} +1 -1
- package/chunks/{chunk-MLQNSPRZ.js → chunk-BBGX7NTA.js} +15 -5
- package/chunks/{chunk-Q5BD56BW.js → chunk-BPLCAEJZ.js} +7 -7
- package/chunks/{chunk-TPKQIA7G.js → chunk-BSIOCNDK.js} +1 -1
- package/chunks/{chunk-U7O65WKL.js → chunk-BW2SMO6L.js} +1 -1
- package/chunks/{chunk-MSNHNAQZ.js → chunk-BYOV6CG6.js} +3 -3
- package/chunks/{chunk-WBCPROWX.js → chunk-C4HBZQNH.js} +1 -1
- package/chunks/{chunk-NOO4QFXM.js → chunk-C75BXMPM.js} +1 -3
- package/chunks/chunk-CFMZLE3L.js +75 -0
- package/chunks/{chunk-SODMFNAR.js → chunk-CMM34UXX.js} +5 -5
- package/chunks/{chunk-AXTFYDXT.js → chunk-CXXAZ2LZ.js} +1 -1
- package/chunks/{chunk-OLTN767L.js → chunk-DGK4IQXU.js} +2 -2
- package/chunks/{chunk-J3TJH52D.js → chunk-DOTF2PF2.js} +1 -1
- package/chunks/{chunk-HBU7EKY4.js → chunk-DQLYJFK2.js} +45 -15
- package/chunks/{chunk-BWQLXU37.js → chunk-DTMRHTFW.js} +381 -86
- package/chunks/{chunk-2ALXPGB4.js → chunk-E6IR653O.js} +1 -1
- package/chunks/{chunk-ZKYR7QS4.js → chunk-EDB556X7.js} +2 -2
- package/chunks/{chunk-NUQVB25K.js → chunk-EKMJR7M3.js} +2 -2
- package/chunks/{chunk-7QYWGTHB.js → chunk-EPVEPTI3.js} +44 -151
- package/chunks/{acp-subagent-executor-LEUN3N7N.js → chunk-EQAAQVLD.js} +11 -110
- package/chunks/{chunk-53GWJOLP.js → chunk-F7WDCD2N.js} +3 -1
- package/chunks/{chunk-S6Q6Q4P2.js → chunk-FBDHP23D.js} +1 -1
- package/chunks/{chunk-3KQBQ6FM.js → chunk-FEMYSX4G.js} +190 -28
- package/chunks/{chunk-3I7W2POO.js → chunk-FGROOEKM.js} +5 -40
- package/chunks/{chunk-LDVNJZGH.js → chunk-FIRCQJG2.js} +17 -8
- package/chunks/{chunk-HNLMYDQE.js → chunk-FMLBBXHB.js} +13 -9
- package/chunks/{chunk-ALMR3E6Q.js → chunk-GDWE23OR.js} +3 -3
- package/chunks/{chunk-X7UJKOHZ.js → chunk-GG27UVAT.js} +4 -6
- package/chunks/{chunk-DT75RKNH.js → chunk-GKLJIDLK.js} +3 -3
- package/chunks/{chunk-IAEXTMED.js → chunk-GNV2SFO7.js} +173 -7
- package/chunks/{chunk-CXTPVBFA.js → chunk-GSS4SZNG.js} +100 -17
- package/chunks/{chunk-BWAMMKIS.js → chunk-GYKAXTMQ.js} +135 -6
- package/chunks/{chunk-IL5M5NYD.js → chunk-HCKYDMYV.js} +11 -9
- package/chunks/{chunk-6HUXPLB5.js → chunk-HEOH7JZY.js} +5 -5
- package/chunks/{chunk-DTNV6UZY.js → chunk-HFJSQ4GL.js} +10 -24
- package/chunks/{chunk-SSGAAWLY.js → chunk-HNTIWVRC.js} +95 -73
- package/chunks/{chunk-E7LB57MB.js → chunk-HUD3U4GY.js} +6 -6
- package/chunks/{chunk-MHAADZOZ.js → chunk-HVCRYFA4.js} +3 -3
- package/chunks/{chunk-VZUCTJ2P.js → chunk-I6YJZGHS.js} +10 -10
- package/chunks/{chunk-RZHU3K6M.js → chunk-IAS753HG.js} +2 -20
- package/chunks/{chunk-EDMXGXAK.js → chunk-IBRQG2MP.js} +10 -13
- package/chunks/chunk-INGBUYL6.js +230 -0
- package/chunks/{chunk-7ICHPMBQ.js → chunk-IVUKJRSD.js} +4 -4
- package/chunks/{chunk-NRXWJXJ4.js → chunk-IYSXQ5I4.js} +15 -15
- package/chunks/{chunk-XGYHNWL3.js → chunk-J7LBAKDH.js} +3 -3
- package/chunks/{chunk-3BTSSIJO.js → chunk-JDKY7O5J.js} +99 -14
- package/chunks/chunk-JPXPY5L4.js +1416 -0
- package/chunks/{chunk-LG5Y4OWO.js → chunk-JRHKM3YQ.js} +2 -2
- package/chunks/{chunk-RLLRJJDR.js → chunk-JYTUSZOK.js} +2 -2
- package/chunks/{chunk-W5FIP7FC.js → chunk-K2JLUF22.js} +5 -5
- package/chunks/{chunk-POC3YMHG.js → chunk-K7YI4MSY.js} +4 -4
- package/chunks/{chunk-UKZ45TJL.js → chunk-KDXTBWQB.js} +420 -219
- package/chunks/{chunk-N7VWZDWW.js → chunk-KJFGH23C.js} +4506 -3840
- package/chunks/{chunk-K2OJUPOE.js → chunk-KP2FHIFR.js} +12 -0
- package/chunks/{chunk-GCDXVPFK.js → chunk-KYBIIQOQ.js} +31 -7
- package/chunks/{chunk-IV7GDNKC.js → chunk-KZCK5JUN.js} +4 -4
- package/chunks/{chunk-MF6E7FSA.js → chunk-L63PZHD7.js} +8 -201
- package/chunks/{chunk-ZW2EUO2A.js → chunk-L6DIANLD.js} +1 -1
- package/chunks/chunk-LAKMZLJ5.js +191 -0
- package/chunks/{chunk-DYFOSJHU.js → chunk-LCYVZFMV.js} +2769 -1153
- package/chunks/{chunk-3UXUOFO6.js → chunk-LLJIZIRQ.js} +9 -10
- package/chunks/chunk-LMJSPC55.js +260 -0
- package/chunks/{chunk-YQHLFCPU.js → chunk-LOAW7JYR.js} +32 -24
- package/chunks/{chunk-X6K77VHC.js → chunk-LWWRJRCD.js} +1 -1
- package/chunks/{chunk-UXEO7E3V.js → chunk-LYD3T3H7.js} +1 -0
- package/chunks/{chunk-E4UEO3XM.js → chunk-ME4JBHSB.js} +324 -2
- package/chunks/{chunk-BV6Q5HMY.js → chunk-MJHLKWGJ.js} +8 -7
- package/chunks/{chunk-NFYEQRLG.js → chunk-MQRLLBMQ.js} +1 -1
- package/chunks/{chunk-3XLK2QMY.js → chunk-MVLLTUOB.js} +59 -16
- package/chunks/{chunk-O4KNCAX4.js → chunk-NCPFOLM2.js} +11 -0
- package/chunks/{chunk-2SZH22YO.js → chunk-NJ2OFVUX.js} +115 -97
- package/chunks/{chunk-GOXQL4YH.js → chunk-NLRWN5PN.js} +2 -2
- package/chunks/{chunk-6MBXY6WM.js → chunk-NRQI3PGS.js} +1 -1
- package/chunks/{chunk-JYKWOREU.js → chunk-NSY7YQMU.js} +13 -3
- package/chunks/{chunk-NMRCXKQ5.js → chunk-NUIF54XD.js} +3 -3
- package/chunks/{chunk-3CZ2BQV6.js → chunk-NXUZFW3G.js} +49 -19
- package/chunks/chunk-OAWFG54S.js +32 -0
- package/chunks/{chunk-DAWWT2ID.js → chunk-OBHKFWAE.js} +1374 -2164
- package/chunks/{chunk-HBQ2NXOU.js → chunk-OKSSFN7F.js} +2 -2
- package/chunks/{chunk-NHJKAR6E.js → chunk-ON7M7VUD.js} +972 -18
- package/chunks/{chunk-5GLDOLNQ.js → chunk-OWUAZXXN.js} +4 -3
- package/chunks/{chunk-2UWQX4FP.js → chunk-OZEV3R3S.js} +1 -1
- package/chunks/{chunk-FCQJLMA2.js → chunk-Q3TFRP5G.js} +178 -8
- package/chunks/{chunk-ZKZHSB5W.js → chunk-QR4Q425T.js} +9 -9
- package/chunks/{chunk-J6MB5ZHZ.js → chunk-QZW6WRB7.js} +2 -1
- package/chunks/{chunk-TP6FYVQT.js → chunk-RSWBT7AZ.js} +33 -1
- package/chunks/chunk-S7UQ3V2H.js +87 -0
- package/chunks/{chunk-N6VQ37ZZ.js → chunk-SFL6U7U7.js} +1 -1
- package/chunks/{chunk-MOS5OAOG.js → chunk-SROLVJFY.js} +6 -6
- package/chunks/{chunk-HUXPEUFL.js → chunk-SYROIHU7.js} +1 -1
- package/chunks/{chunk-PSPAM24S.js → chunk-TBSCTWKF.js} +6 -0
- package/chunks/chunk-TDS25ULF.js +154 -0
- package/chunks/chunk-U6H3XTFA.js +95 -0
- package/chunks/{chunk-Z3GF56ME.js → chunk-UDEWJKNB.js} +3 -3
- package/chunks/{chunk-7BXXIQG4.js → chunk-ULPXHGLV.js} +36 -72
- package/chunks/{chunk-5KI7ZDTB.js → chunk-UN6YL6VF.js} +24 -12
- package/chunks/{chunk-JXNIF2O5.js → chunk-V545KI73.js} +1 -1
- package/chunks/chunk-VGY2RGXL.js +100 -0
- package/chunks/{chunk-TBEXLLAO.js → chunk-VRQZESKP.js} +1 -1
- package/chunks/{chunk-FN3JNDRU.js → chunk-VVI7MK3V.js} +3 -3
- package/chunks/{chunk-NMCDMLHL.js → chunk-VYIE36BF.js} +50 -35
- package/chunks/{chunk-EUURTIV6.js → chunk-WBSJ6VPZ.js} +10 -2
- package/chunks/{chunk-NLNQNBZ2.js → chunk-WD6YQI5M.js} +1 -1
- package/chunks/chunk-WDH4TVD3.js +2812 -0
- package/chunks/chunk-WFNEY5G7.js +347 -0
- package/chunks/{chunk-XKBFYTCD.js → chunk-WK6DEH3Q.js} +46 -0
- package/chunks/{chunk-36HCNKDS.js → chunk-WKVZES7O.js} +65 -14
- package/chunks/{chunk-R4Q2PEFV.js → chunk-WVQHS26P.js} +1 -1
- package/chunks/{chunk-GSILBZLN.js → chunk-XCQJUYLQ.js} +2 -2
- package/chunks/{chunk-KFZYGSJN.js → chunk-XMWEUO26.js} +3 -3
- package/chunks/{chunk-2PJRI3EH.js → chunk-XPEZVAK2.js} +218 -43
- package/chunks/{chunk-OX7IZ2G5.js → chunk-XPULQNNS.js} +4 -4
- package/chunks/{chunk-VX63RJXE.js → chunk-XX5HQLCZ.js} +7 -0
- package/chunks/{chunk-2Z3T52OC.js → chunk-Y5TM7SBV.js} +7 -2
- package/chunks/{chunk-SYLECP23.js → chunk-Y7W2X4WN.js} +4 -4
- package/chunks/{chunk-2ZN3O5FT.js → chunk-YAC6S4ZF.js} +6 -6
- package/chunks/{chunk-V2P3DOQR.js → chunk-YDFOHRS5.js} +1 -1
- package/chunks/{chunk-HGAELO7B.js → chunk-YFX2M3ZI.js} +2 -2
- package/chunks/{chunk-QMUYLYT5.js → chunk-YGFJ6BRT.js} +1 -1
- package/chunks/{chunk-LK2WUCDQ.js → chunk-YM6KUQ2S.js} +1 -1
- package/chunks/{chunk-BZM5U74J.js → chunk-YQSC7BRZ.js} +724 -468
- package/chunks/chunk-Z72PLR74.js +36 -0
- package/chunks/{chunk-6W4HBUA2.js → chunk-ZGZN54IU.js} +1 -1
- package/chunks/{chunk-BHTYRHJF.js → chunk-ZJ7JQUGY.js} +4 -1
- package/chunks/{chunk-4ALNJDHL.js → chunk-ZKIAGIGH.js} +87 -4
- package/chunks/{chunk-F42YYSCK.js → chunk-ZLU6NBSL.js} +8 -8
- package/chunks/{chunk-VG3Q2NC4.js → chunk-ZNI3YJHS.js} +32 -12
- package/chunks/{chunk-Q2LVVIKF.js → chunk-ZZUXUBEB.js} +29 -12
- package/chunks/codex-subagent-executor-QEDKWUAR.js +586 -0
- package/chunks/{config-utils-L6KLDYIV.js → config-utils-HCV2DX7W.js} +60 -56
- package/chunks/{contextCommand-UYEH7NIU.js → contextCommand-U5WK3XNI.js} +58 -54
- package/chunks/{core-runtime-NVHT3Z3V.js → core-runtime-RODZHBF7.js} +58 -55
- package/chunks/{create-sub-session-YWASE5VH.js → create-sub-session-L6UGUL4T.js} +169 -89
- package/chunks/{create-sub-session-TIGCFGCS.js → create-sub-session-MSGNIM37.js} +5 -2
- package/chunks/{cron-create-AKWX67FO.js → cron-create-U2JJ5CCF.js} +3 -3
- package/chunks/{cron-delete-XPB6IYZJ.js → cron-delete-7DM4LJWD.js} +2 -2
- package/chunks/{cron-list-XBKO4WU5.js → cron-list-VCUSZK2Y.js} +2 -2
- package/chunks/{daemon-G5TYKZD6.js → daemon-NJB4PWZ7.js} +3 -1
- package/chunks/{daemon-git-worktree-guard-FOW4RQSK.js → daemon-git-worktree-guard-Y5T7KIBG.js} +58 -54
- package/chunks/{daemon-status-provider-O5KQZYMP.js → daemon-status-provider-AQBGUOGB.js} +68 -63
- package/chunks/{daemon-trust-policy-3ATXEON7.js → daemon-trust-policy-EB2NNNDT.js} +64 -60
- package/chunks/{daemon-trust-policy-monitor-7MCNDNEC.js → daemon-trust-policy-monitor-AFI3E2Z5.js} +64 -60
- package/chunks/{de-UU2YTO37.js → de-VGY3VNBU.js} +3 -3
- package/chunks/{deferred-core-runtime-JK5IXL5K.js → deferred-core-runtime-H7ZSF3PZ.js} +56 -52
- package/chunks/{discovery-XP4RMDUM.js → discovery-5KUEPR65.js} +2 -2
- package/chunks/{display-image-NAH3AZ63.js → display-image-QTHALY6N.js} +3 -3
- package/chunks/{dist-KLZ7XGEQ.js → dist-2QYIVNS6.js} +1 -4
- package/chunks/{dist-AHJYPSJL.js → dist-GUB7QRYA.js} +2 -5
- package/chunks/{dist-ZXTZTE54.js → dist-MPUZZOG5.js} +4 -17
- package/chunks/{dist-F2DVGTL3.js → dist-NIOJXMGY.js} +111 -101
- package/chunks/{dist-KJGRVIGJ.js → dist-PA7WPFVE.js} +5 -36
- package/chunks/{dist-AIKC5E5P.js → dist-SE4J6Z4O.js} +43 -669
- package/chunks/{dist-H6G3K26N.js → dist-T6DDPDLQ.js} +14 -34
- package/chunks/{dist-GWNQVPZT.js → dist-TFGETXFN.js} +10 -33
- package/chunks/{dist-ZA52JXAS.js → dist-VDLSBCLM.js} +1 -5
- package/chunks/{edit-SY35KYIE.js → edit-AFPKKMKD.js} +46 -42
- package/chunks/{en-CAJHTIQT.js → en-E5ZO5TZW.js} +5 -3
- package/chunks/{enter-worktree-54L5QJ3N.js → enter-worktree-CAARFWBI.js} +6 -5
- package/chunks/{enterPlanMode-HXX6KQJR.js → enterPlanMode-3Z3I6I4K.js} +43 -39
- package/chunks/{environment-DKXHG4HB.js → environment-G4NM4JE4.js} +59 -55
- package/chunks/{errors-ADY7LQJJ.js → errors-XVV3RAEG.js} +58 -54
- package/chunks/exec-RPKEY6HP.js +505 -0
- package/chunks/{exit-worktree-EORJDKDS.js → exit-worktree-JXGGUOBP.js} +6 -5
- package/chunks/{exitPlanMode-HSK2CQI6.js → exitPlanMode-JGUYOZCP.js} +43 -39
- package/chunks/{fast-path-U636VWN2.js → fast-path-SXPNVZAS.js} +10 -10
- package/chunks/{fast-path-settings-V7MI7EZJ.js → fast-path-settings-XDYX7X5Z.js} +2 -2
- package/chunks/{fr-HKNWVXRJ.js → fr-UAZJJH5N.js} +3 -3
- package/chunks/{glob-GUGGTH5L.js → glob-BPOP43P6.js} +43 -39
- package/chunks/{goal-tools-PXYRSQGX.js → goal-tools-FQXDPBCD.js} +49 -41
- package/chunks/{grep-3PKFKLCA.js → grep-H2I33VAO.js} +8 -3
- package/chunks/{handleAutoUpdate-5KHS4HIN.js → handleAutoUpdate-23TEWABL.js} +61 -57
- package/chunks/{i18n-KSGKMUPT.js → i18n-2LI3LH4L.js} +57 -53
- package/chunks/{image-gen-OCCR2WWU.js → image-gen-5G2TQ3DY.js} +6 -5
- package/chunks/{initializer-YYT5XEZF.js → initializer-IHSQVGZD.js} +64 -60
- package/chunks/{installationInfo-UNSBPYW2.js → installationInfo-KTZGFBDG.js} +57 -53
- package/chunks/{ja-GJS5RZGU.js → ja-2RITCMAJ.js} +3 -3
- package/chunks/list-K2XO7FLR.js +133 -0
- package/chunks/{list-agents-QLDXS5OD.js → list-agents-EWDCEPIW.js} +3 -3
- package/chunks/{llm-XGGLBGPH.js → llm-FFYRSEJZ.js} +161 -125
- package/chunks/{llm-content-generator-ZHQQT5W7.js → llm-content-generator-EXJEU5MJ.js} +14 -7
- package/chunks/{loadedSettingsAdapter-3DXLASK7.js → loadedSettingsAdapter-BSWBMUIT.js} +64 -60
- package/chunks/{loggingContentGenerator-V72OCCJO.js → loggingContentGenerator-RE3L7S24.js} +47 -43
- package/chunks/{loop-wakeup-HHMYIC7Z.js → loop-wakeup-VG6CGBQA.js} +4 -4
- package/chunks/{ls-N7ABR6HI.js → ls-6ZB3BEIR.js} +1 -1
- package/chunks/{lsp-LTOFWG5P.js → lsp-M54FQARP.js} +5 -1
- package/chunks/{managed-npm-update-HV5LPZH2.js → managed-npm-update-D56DKMKV.js} +57 -53
- package/chunks/mcp-BS46APKT.js +127 -0
- package/chunks/model-configuration-L5WZ7NBY.js +140 -0
- package/chunks/modelConfigUtils-WAM6HBUX.js +119 -0
- package/chunks/{monitor-TLBNM4MV.js → monitor-CYXNE7UB.js} +43 -39
- package/chunks/{nonInteractiveCli-LSJSQ2W4.js → nonInteractiveCli-ZPBORWHM.js} +112 -107
- package/chunks/{notebook-edit-OSPOLZP6.js → notebook-edit-CSYGREO5.js} +45 -41
- package/chunks/{openaiContentGenerator-BE4S5TRD.js → openaiContentGenerator-KDGLKJVS.js} +24 -19
- package/chunks/{openaiResponsesContentGenerator-RTCAJ5V5.js → openaiResponsesContentGenerator-AWRYZLJU.js} +110 -19
- package/chunks/{pidfile-H32FEPWA.js → pidfile-QGUW5UJ7.js} +56 -52
- package/chunks/{processUtils-SSLIPDEA.js → processUtils-Q6GS3E2T.js} +2 -2
- package/chunks/{prompt-terminal-ledger-I5SLL6UF.js → prompt-terminal-ledger-BLCAZPSQ.js} +57 -53
- package/chunks/{pt-FXMYXEUV.js → pt-5ZF7ZQUV.js} +3 -3
- package/chunks/{qwenContentGenerator-TMQC623Z.js → qwenContentGenerator-LSRUVWCL.js} +47 -43
- package/chunks/{qwenOAuth2-3ZRQHHTC.js → qwenOAuth2-WIEUEFEY.js} +5 -4
- package/chunks/{read-file-T2QAIZE2.js → read-file-56DVLPQR.js} +9 -8
- package/chunks/{read-mcp-resource-B37WANAQ.js → read-mcp-resource-LPSWXVOD.js} +1 -1
- package/chunks/{record-artifact-OAXWXZ5D.js → record-artifact-PXMNP7GZ.js} +3 -3
- package/chunks/{record-source-D7R7X3GT.js → record-source-2GSY5JD5.js} +6 -6
- package/chunks/{report-findings-AR3VC6EQ.js → report-findings-W6GR7SYZ.js} +4 -4
- package/chunks/{request-shutdown-IKNWTX5M.js → request-shutdown-53SNYGVR.js} +5 -5
- package/chunks/{resumeHistoryUtils-QLKDH5GY.js → resumeHistoryUtils-ZM5PHHNI.js} +63 -59
- package/chunks/{ripGrep-YGWL7KCV.js → ripGrep-INOTDWED.js} +13 -11
- package/chunks/{ru-RMHURE5U.js → ru-7BNZFQKG.js} +3 -3
- package/chunks/{run-qwen-serve-26KZDECC.js → run-qwen-serve-NZY4OHHH.js} +314 -127
- package/chunks/{runtime-BMEIVDDG.js → runtime-6CSFTXGK.js} +69 -65
- package/chunks/{scheduled-tasks-NCFPP6VQ.js → scheduled-tasks-T5DMXMRI.js} +66 -60
- package/chunks/{scheduler-47TVMUVN.js → scheduler-STH4FWGX.js} +58 -54
- package/chunks/{sdk-exporters-http-VWTF4W6K.js → sdk-exporters-http-3R2TRQHE.js} +2 -1
- package/chunks/{sdk-impl-G6FVTBQZ.js → sdk-impl-4WF3VZ2F.js} +3 -3
- package/chunks/{send-message-TWOGWCBG.js → send-message-UMJKN27Q.js} +7 -7
- package/chunks/{serve-KL3G6LQQ.js → serve-K4VRD7S3.js} +66 -62
- package/chunks/{server-LBPYXZ5G.js → server-SAF6RZWD.js} +783 -350
- package/chunks/{session-YG6742LO.js → session-2IZX2R3S.js} +117 -112
- package/chunks/{session-attachments-root-OUBQDYC4.js → session-attachments-root-WFCEIOC7.js} +56 -52
- package/chunks/{session-pr-refresh-EKGMYNAW.js → session-pr-refresh-H7LDUL7K.js} +66 -60
- package/chunks/{settings-DDNHJX2L.js → settings-55B6W4ML.js} +67 -63
- package/chunks/{shell-KUCXWITU.js → shell-C6HWMJCS.js} +43 -39
- package/chunks/{skill-JQLKPNWZ.js → skill-IYKRY5HC.js} +128 -23
- package/chunks/{skill-settings-XERQCUXZ.js → skill-settings-YWKLCBV2.js} +72 -60
- package/chunks/{spawnChannel-GQ45QFGB.js → spawnChannel-YXUNPB3M.js} +60 -55
- package/chunks/{standalone-update-PRF3ILGZ.js → standalone-update-H6YIWY5F.js} +58 -54
- package/chunks/{start-opentui-ui-JDSOZE3N.js → start-opentui-ui-U2NNOY65.js} +2700 -2166
- package/chunks/{startInteractiveUI-RRW3JVHN.js → startInteractiveUI-ZF5EJN6N.js} +1621 -1783
- package/chunks/{syntheticOutput-F6F27JMK.js → syntheticOutput-EX5L5GYI.js} +2 -2
- package/chunks/{task-create-Y623TBHB.js → task-create-75HVPEAH.js} +7 -7
- package/chunks/{task-list-FCPEEGWL.js → task-list-ZLJSMRFA.js} +2 -2
- package/chunks/{task-stop-QTKZXLPH.js → task-stop-MD7P6QGK.js} +1 -1
- package/chunks/{task-update-YLSXF25N.js → task-update-RI7QNVDP.js} +20 -13
- package/chunks/{team-create-5DRLOLOE.js → team-create-XWCSBY3R.js} +43 -39
- package/chunks/{team-delete-S7TLHZCF.js → team-delete-RIDINW6I.js} +1 -1
- package/chunks/{team-plan-approval-MWSGAL5T.js → team-plan-approval-B2SOZ46Z.js} +43 -39
- package/chunks/{terminal-image-renderer-H7PD4FQW.js → terminal-image-renderer-HKBBPT64.js} +58 -54
- package/chunks/{theme-manager-7AV73D6R.js → theme-manager-LHBAB3RV.js} +56 -52
- package/chunks/{todoWrite-5QI2H2FW.js → todoWrite-XSTG2VT5.js} +6 -3
- package/chunks/{tool-search-UGYTBLUV.js → tool-search-D7UTGG7X.js} +17 -12
- package/chunks/{total-session-admission-JIHSTJ5S.js → total-session-admission-VN63755O.js} +63 -58
- package/chunks/{trustedFolders-5VCBXFOP.js → trustedFolders-GD56NJEV.js} +57 -53
- package/chunks/{update-relaunch-4LF3APCV.js → update-relaunch-BMQKKDR6.js} +5 -5
- package/chunks/{updateCheck-4T3WUE5F.js → updateCheck-BZFE6Z5I.js} +60 -56
- package/chunks/{useAutoAcceptIndicator-UMGB64Z6.js → useAutoAcceptIndicator-RD4YNRGG.js} +68 -64
- package/chunks/{validateNonInterActiveAuth-GFJ72U2C.js → validateNonInterActiveAuth-RWWD7TVJ.js} +109 -104
- package/chunks/{version-EAAZN4T2.js → version-DGWI3JF2.js} +1 -1
- package/chunks/{web-fetch-VRU3A2NI.js → web-fetch-2KXAHKDU.js} +15 -13
- package/chunks/web-search-LUI2YS33.js +45 -0
- package/chunks/{web-shell-static-CCN4JZEE.js → web-shell-static-T7UGLVE4.js} +2 -7
- package/chunks/{workflow-UHPFALVZ.js → workflow-WG7WNWMP.js} +179 -79
- package/chunks/workspace-providers-status-VJYJMUDI.js +133 -0
- package/chunks/{workspace-registration-store-A7RGKW62.js → workspace-registration-store-B3XUNFOG.js} +2 -2
- package/chunks/{workspace-registry-C2NGE6SD.js → workspace-registry-56R5RBVU.js} +63 -58
- package/chunks/{workspace-runtime-coordinator-QKMZ24YF.js → workspace-runtime-coordinator-EKDPCK4L.js} +66 -59
- package/chunks/{workspace-service-RQTTAGGC.js → workspace-service-UYGLM6XX.js} +70 -65
- package/chunks/workspace-skills-status-5HMTP63B.js +130 -0
- package/chunks/{workspace-trust-reconciler-KFWATZUU.js → workspace-trust-reconciler-AST2535P.js} +73 -68
- package/chunks/{write-file-DPVB2SBQ.js → write-file-F4R5RBBH.js} +45 -41
- package/chunks/{zh-TW-2K2WRFPY.js → zh-TW-7PRVUGLW.js} +5 -3
- package/chunks/{zh-S5V3Z5CR.js → zh-V2EYTYJP.js} +5 -3
- package/chunks/{zoom-image-S7AWLAPC.js → zoom-image-6HKQ5MFU.js} +11 -10
- package/cli.js +18 -17
- package/codeModeHost.js +4425 -0
- package/export-transcript-document.css +1 -1
- package/export-transcript-document.js +151 -151
- package/locales/ca.js +5 -6
- package/locales/de.js +5 -6
- package/locales/en.js +7 -6
- package/locales/fr.js +6 -6
- package/locales/ja.js +5 -6
- package/locales/pt.js +5 -6
- package/locales/ru.js +6 -6
- package/locales/zh-TW.js +7 -6
- package/locales/zh.js +7 -6
- package/package.json +4 -3
- package/web-shell/assets/{abnfDiagram-VCTEODGH-nU24rpIE.js → abnfDiagram-VCTEODGH-BtpzKw3A.js} +1 -1
- package/web-shell/assets/{arc-D1hTu8QI.js → arc-CQiVKZJP.js} +1 -1
- package/web-shell/assets/architectureDiagram-5GKGNRK7-ekIPBb2d.js +36 -0
- package/web-shell/assets/blockDiagram-NRAW4CY4-BrRWkWri.js +129 -0
- package/web-shell/assets/{c4Diagram-UCG6FXSJ-kEFoC1ei.js → c4Diagram-UCG6FXSJ-qYS8CYZ3.js} +4 -4
- package/web-shell/assets/channel-DSQQnOZj.js +1 -0
- package/web-shell/assets/{chunk-2Q5K7J3B-DbT9wS7j.js → chunk-2Q5K7J3B-ZasyyEZm.js} +1 -1
- package/web-shell/assets/{chunk-5VM5RSS4-CNbULt6O.js → chunk-5VM5RSS4-C_IzCGeA.js} +1 -1
- package/web-shell/assets/{chunk-F27PBJKO-CbQRy4Tb.js → chunk-F27PBJKO-C25NZOyD.js} +1 -1
- package/web-shell/assets/chunk-G27WJ6UU-XPOHNSGX.js +231 -0
- package/web-shell/assets/chunk-JWPE2WC7-BQBh0Xni.js +1 -0
- package/web-shell/assets/chunk-LCL6LL3I-CoShjpX7.js +206 -0
- package/web-shell/assets/chunk-POPQ4Y6H-BwRmCDSz.js +1 -0
- package/web-shell/assets/{chunk-SVP7TREG-DyBb2Axj.js → chunk-SVP7TREG-DSzE5-Mw.js} +4 -4
- package/web-shell/assets/{chunk-XXDRQBXY-BIA0eb5B.js → chunk-XXDRQBXY-BQSQv30h.js} +1 -1
- package/web-shell/assets/classDiagram-DTDB5LWJ-V94ta08R.js +1 -0
- package/web-shell/assets/classDiagram-v2-JRS7N3AN-V94ta08R.js +1 -0
- package/web-shell/assets/cose-bilkent-JH36ORCC-XVUVTHVo.js +1 -0
- package/web-shell/assets/cynefin-OW5HDTMX-CrsKx4lQ.js +178 -0
- package/web-shell/assets/{cynefinDiagram-5FMLGOSQ-LENf_IUy.js → cynefinDiagram-5FMLGOSQ-BPeZEuHw.js} +1 -1
- package/web-shell/assets/{cytoscape.esm-CUqq0XTU.js → cytoscape.esm-DJK6lGiH.js} +3 -3
- package/web-shell/assets/dagre-3AP2YEHR-D31cQ2Qs.js +4 -0
- package/web-shell/assets/diagram-S7CK7UJ4-zyiG097Q.js +30 -0
- package/web-shell/assets/diagram-UQ7AKVKN-Br3vtfsy.js +41 -0
- package/web-shell/assets/diagram-VSXAHHWV-Bxkhjx4u.js +3 -0
- package/web-shell/assets/diagram-VX7I27RA-BQH8QiDk.js +24 -0
- package/web-shell/assets/diagram-Z3DM3KII-B_aQ1cw0.js +24 -0
- package/web-shell/assets/{ebnfDiagram-PWID7BFC-BGpiquRm.js → ebnfDiagram-PWID7BFC-B9N7BRQE.js} +1 -1
- package/web-shell/assets/{erDiagram-SSCWMZ5O-D0besu_U.js → erDiagram-SSCWMZ5O-Cx6Hb1Re.js} +13 -13
- package/web-shell/assets/flowDiagram-A5DVABFB-DTuLP7GU.js +168 -0
- package/web-shell/assets/{ganttDiagram-EL5Y4UJY-CNlsAeNr.js → ganttDiagram-EL5Y4UJY-DYS3d-sL.js} +1 -1
- package/web-shell/assets/gitGraphDiagram-WWUBYQGX-Cp0EGx04.js +106 -0
- package/web-shell/assets/index-45-LkPDB.js +3 -0
- package/web-shell/assets/{index-CGT341lL.js → index-DohPy72Z.js} +1 -1
- package/web-shell/assets/index-H8um-iEl.js +2207 -0
- package/web-shell/assets/index-n6N-2a3v.css +36 -0
- package/web-shell/assets/{infoDiagram-RXCK75RN-Bpai64Ll.js → infoDiagram-RXCK75RN-9--kukiT.js} +1 -1
- package/web-shell/assets/ishikawaDiagram-5VMMS53U-CGBdsDLD.js +70 -0
- package/web-shell/assets/{journeyDiagram-EYS64GPL-iz_DKgFX.js → journeyDiagram-EYS64GPL-DeXhcscd.js} +1 -1
- package/web-shell/assets/kanban-definition-3QL26DDD-CFdvsU3b.js +89 -0
- package/web-shell/assets/{layout-qEvKgnvU.js → layout-DAnwQ3KB.js} +1 -1
- package/web-shell/assets/{linear-C6lklGdq.js → linear-CTo7v7Nh.js} +1 -1
- package/web-shell/assets/mermaid.core-jggSxF1i.js +312 -0
- package/web-shell/assets/mindmap-definition-FBJOCRG2-DzIepvlJ.js +96 -0
- package/web-shell/assets/{pegDiagram-XKGWAZYB-BhD0q0i6.js → pegDiagram-XKGWAZYB-BFGS9GJv.js} +1 -1
- package/web-shell/assets/pieDiagram-E7YTZNPT-B2UUcNIT.js +39 -0
- package/web-shell/assets/quadrantDiagram-AXDQQJYC-BgM6htrX.js +7 -0
- package/web-shell/assets/qwen-code-notification-BRVagufF.png +0 -0
- package/web-shell/assets/{railroadDiagram-O6MQD6OU-E1g2KIFK.js → railroadDiagram-O6MQD6OU-Dk9cS7N-.js} +1 -1
- package/web-shell/assets/{requirementDiagram-EFPCY7ZU-CuerYJOe.js → requirementDiagram-EFPCY7ZU-C9oRg7xi.js} +13 -13
- package/web-shell/assets/{sankeyDiagram-P5KCCOFB-CqWyCZGA.js → sankeyDiagram-P5KCCOFB-B-_c7GzI.js} +7 -7
- package/web-shell/assets/{sequenceDiagram-WJ2MYXX4-B-YWb8x4.js → sequenceDiagram-WJ2MYXX4-R0M-347u.js} +16 -16
- package/web-shell/assets/sizeCapture-X5ZJPWSS-Df0f8UAW.js +1 -0
- package/web-shell/assets/{stateDiagram-HBIQ2CUA-C8LDpNHS.js → stateDiagram-HBIQ2CUA-CsUEfAA-.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-4QOOHH4V-CnSuTPJ2.js +1 -0
- package/web-shell/assets/swimlanes-XN3QIQJK-9OGHVSrx.js +1 -0
- package/web-shell/assets/swimlanesDiagram-VK2B7HYN-Bb7TcWQw.js +8 -0
- package/web-shell/assets/timeline-definition-24CTP7MA-DAfGqS2B.js +120 -0
- package/web-shell/assets/vennDiagram-4TSXK5OY-CKATpwHi.js +34 -0
- package/web-shell/assets/wardleyDiagram-VM6X3IG4-CQHdhTrm.js +78 -0
- package/web-shell/assets/{xychartDiagram-S5SC5T6Z-ruD2Wjhg.js → xychartDiagram-S5SC5T6Z-5k9NLqlY.js} +1 -1
- package/web-shell/index.html +2 -2
- package/chunks/chunk-7Q2AXRDJ.js +0 -114
- package/chunks/chunk-AEY27Z35.js +0 -1411
- package/chunks/chunk-CFKIH3D3.js +0 -50
- package/chunks/chunk-HWVUSYSN.js +0 -126
- package/chunks/chunk-QHMLYMMS.js +0 -32
- package/chunks/chunk-SAH4BD2J.js +0 -92
- package/chunks/chunk-TWUKBNWM.js +0 -86
- package/chunks/chunk-ZTTC7T4X.js +0 -126
- package/chunks/list-YL6LDQKQ.js +0 -129
- package/chunks/mcp-IYVSIW6O.js +0 -123
- package/chunks/web-search-NEGYQNDJ.js +0 -912
- package/chunks/workspace-providers-status-AEYISSU2.js +0 -127
- package/chunks/workspace-skills-status-5HWZU3HX.js +0 -126
- package/web-shell/assets/architectureDiagram-5GKGNRK7-B_fgkKe7.js +0 -36
- package/web-shell/assets/blockDiagram-NRAW4CY4-C3pddUNg.js +0 -129
- package/web-shell/assets/channel-Blod4z1X.js +0 -1
- package/web-shell/assets/chunk-G27WJ6UU-CVbXTxYk.js +0 -231
- package/web-shell/assets/chunk-JWPE2WC7-D89c_BXy.js +0 -1
- package/web-shell/assets/chunk-LCL6LL3I-B7-I_9KB.js +0 -206
- package/web-shell/assets/chunk-POPQ4Y6H-DcLQFzS4.js +0 -1
- package/web-shell/assets/classDiagram-DTDB5LWJ-D6hFDMqb.js +0 -1
- package/web-shell/assets/classDiagram-v2-JRS7N3AN-D6hFDMqb.js +0 -1
- package/web-shell/assets/cose-bilkent-JH36ORCC-Db2FYN85.js +0 -1
- package/web-shell/assets/cynefin-OW5HDTMX-i4GwmBVy.js +0 -178
- package/web-shell/assets/dagre-3AP2YEHR-CF9XVrD9.js +0 -4
- package/web-shell/assets/diagram-S7CK7UJ4-DD5PJfSm.js +0 -30
- package/web-shell/assets/diagram-UQ7AKVKN-CjD_sBMj.js +0 -41
- package/web-shell/assets/diagram-VSXAHHWV-U5WwMqyA.js +0 -3
- package/web-shell/assets/diagram-VX7I27RA-BujpHJJf.js +0 -24
- package/web-shell/assets/diagram-Z3DM3KII-3ZLtKEXo.js +0 -24
- package/web-shell/assets/flowDiagram-A5DVABFB-9DwDuIyr.js +0 -168
- package/web-shell/assets/gitGraphDiagram-WWUBYQGX-C_pPFiTR.js +0 -106
- package/web-shell/assets/index-BYWs4JWq.js +0 -3
- package/web-shell/assets/index-D3YS6KuJ.js +0 -2173
- package/web-shell/assets/index-eBxK3rs2.css +0 -36
- package/web-shell/assets/ishikawaDiagram-5VMMS53U-ktpJFq4r.js +0 -70
- package/web-shell/assets/kanban-definition-3QL26DDD-m_gG00Yt.js +0 -89
- package/web-shell/assets/mermaid.core-DSCYB_2P.js +0 -312
- package/web-shell/assets/mindmap-definition-FBJOCRG2-DRQbT8w-.js +0 -96
- package/web-shell/assets/pieDiagram-E7YTZNPT-BvIGQCSd.js +0 -39
- package/web-shell/assets/quadrantDiagram-AXDQQJYC-BDQtfpU-.js +0 -7
- package/web-shell/assets/sizeCapture-X5ZJPWSS-BB7YY4Tl.js +0 -1
- package/web-shell/assets/stateDiagram-v2-4QOOHH4V-C4CbdvGa.js +0 -1
- package/web-shell/assets/swimlanes-XN3QIQJK-D94vOoxZ.js +0 -1
- package/web-shell/assets/swimlanesDiagram-VK2B7HYN--QNSIOC8.js +0 -8
- package/web-shell/assets/timeline-definition-24CTP7MA-C9C8uEYm.js +0 -120
- package/web-shell/assets/vennDiagram-4TSXK5OY-CYzMHbVW.js +0 -34
- package/web-shell/assets/wardleyDiagram-VM6X3IG4-G9nhtLES.js +0 -78
- package/chunks/{open-with-auth-6MVIHMXB.js → open-with-auth-XFCCJOO6.js} +3 -3
|
@@ -9,213 +9,280 @@ description: Control local desktop applications through Computer Use for tasks t
|
|
|
9
9
|
- Do not use other technologies besides `node_repl` for computer interactions, unless specifically requested by the user (e.g. AppleScript, `osascript`, JXA, System Events, synthesized input).
|
|
10
10
|
- Prefer a dedicated plugin or skill when it can complete the task; use Computer Use for app interactions that are not exposed through a more specific interface.
|
|
11
11
|
- `node_repl` state is persistent across calls.
|
|
12
|
-
- For text output, use `nodeRepl.write(...)`. `
|
|
12
|
+
- For text output, use `nodeRepl.write(...)`. It takes a string; use `JSON.stringify(...)` only for textual metadata. For an observation, write its `.text` and emit its screenshots as images; do not stringify an observation or driver result containing image bytes.
|
|
13
|
+
- Omit `yield_time_ms` for ordinary UI calls to use the default 10-second wait. A shorter yield does not speed up the action and can add a `node_repl_wait` round. Use a shorter yield only when you need control back before completion; if a cell is still running, collect its result with `node_repl_wait` before issuing dependent actions.
|
|
14
|
+
|
|
15
|
+
## Forwarding results in Codex code mode
|
|
16
|
+
|
|
17
|
+
When calling `node_repl` through `tools.*` inside Codex's outer `functions.exec`,
|
|
18
|
+
forward each returned `content` block by its type. `nodeRepl.emitImage(...)`
|
|
19
|
+
produces an MCP image block; the outer script must pass that block to `image()`
|
|
20
|
+
for the model to receive an image. Use the tool name exposed by your MCP server:
|
|
21
|
+
|
|
22
|
+
```js
|
|
23
|
+
const result = await tools.mcp__node_repl__node_repl({ code });
|
|
24
|
+
for (const block of result.content ?? []) {
|
|
25
|
+
if (block.type === 'text') {
|
|
26
|
+
text(block.text);
|
|
27
|
+
} else if (block.type === 'image') {
|
|
28
|
+
image(block);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Here `code` is the JavaScript to run in the persistent Node REPL. Keep the
|
|
34
|
+
forwarding loop in the outer code-mode script, outside that `code` string.
|
|
35
|
+
Apply the same loop to `node_repl_wait` results: images may arrive only when a
|
|
36
|
+
running cell completes. Forward text blocks too, including running-cell IDs and
|
|
37
|
+
errors. Direct MCP tool calls do not need this outer forwarding loop.
|
|
38
|
+
|
|
39
|
+
Do not use `text(result)`, `text(block)`, or `JSON.stringify(result)` to forward
|
|
40
|
+
an MCP result containing images: this turns image base64 into text, consuming
|
|
41
|
+
context without showing the image. `image()` accepts one image block, not the
|
|
42
|
+
whole result, so do not use `image(result)` either.
|
|
13
43
|
|
|
14
44
|
## Bootstrap
|
|
15
45
|
|
|
16
46
|
If `node_repl` is unavailable, run:
|
|
17
47
|
|
|
18
48
|
```bash
|
|
19
|
-
qwen mcp add --scope user node-repl npx -y @qwen-code/node-repl-mcp@0.1.
|
|
20
|
-
npm install --no-save --package-lock=false @qwen-code/cua-sdk@0.20.
|
|
49
|
+
qwen mcp add --scope user node-repl npx -y @qwen-code/node-repl-mcp@0.1.5
|
|
50
|
+
npm install --no-save --package-lock=false @qwen-code/cua-sdk@0.20.8
|
|
21
51
|
```
|
|
22
52
|
|
|
23
53
|
Tell the user to restart Qwen Code, then stop. If only the SDK import is missing,
|
|
24
54
|
run the second command and retry.
|
|
25
55
|
|
|
26
|
-
|
|
56
|
+
Reuse an existing `computer` connected to the intended desktop. Otherwise import
|
|
57
|
+
the `ComputerUse` API once per fresh `node_repl` session. Combine initialization
|
|
58
|
+
and connected-platform discovery in one call. Linux uses the complete workflow below
|
|
59
|
+
in this file. macOS and Windows also read their selected resource in that call;
|
|
60
|
+
set `skillBase` to the absolute Skill base directory shown by the skill loader
|
|
61
|
+
or the file you just read:
|
|
27
62
|
|
|
28
63
|
```js
|
|
29
64
|
globalThis.computer = await (
|
|
30
65
|
await import('@qwen-code/cua-sdk/computer-use')
|
|
31
66
|
).ComputerUse.create();
|
|
67
|
+
var platform = await computer.getPlatform();
|
|
68
|
+
var reference = {
|
|
69
|
+
macos: 'macos.md',
|
|
70
|
+
windows: 'windows-linux.md',
|
|
71
|
+
}[platform];
|
|
72
|
+
if (!reference && platform !== 'linux') {
|
|
73
|
+
throw new Error('Unsupported connected platform');
|
|
74
|
+
}
|
|
75
|
+
nodeRepl.write(`Connected platform: ${platform}`);
|
|
76
|
+
if (reference) {
|
|
77
|
+
var skillBase = '/absolute/path/to/computer-use';
|
|
78
|
+
nodeRepl.write(
|
|
79
|
+
await (
|
|
80
|
+
await import('node:fs/promises')
|
|
81
|
+
).readFile(`${skillBase}/references/${reference}`, 'utf8'),
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
If the returned platform is `macos` and the task already identifies an
|
|
87
|
+
unambiguous app, append its initial observation to that same initialization
|
|
88
|
+
call, after printing the resource:
|
|
89
|
+
|
|
90
|
+
```js
|
|
91
|
+
if (platform === 'macos') {
|
|
92
|
+
var app = await computer.getApp('App named by the task');
|
|
93
|
+
nodeRepl.write((await app.getState()).text);
|
|
94
|
+
}
|
|
32
95
|
```
|
|
33
96
|
|
|
34
|
-
|
|
97
|
+
Replace the example app name with the task's app. This only binds the app and
|
|
98
|
+
reads its current state; `getState()` can open that app if stopped. Read both
|
|
99
|
+
the returned platform workflow and initial state before any editing or input.
|
|
100
|
+
If the app is unknown or ambiguous, omit this block and follow the selected
|
|
101
|
+
resource's discovery steps. Do not guess an app or use the host platform.
|
|
102
|
+
|
|
103
|
+
## Select the target platform workflow
|
|
104
|
+
|
|
105
|
+
Use this returned platform, not the CLI or Node host operating system. A connected
|
|
106
|
+
driver may control a different machine. If the platform cannot be determined,
|
|
107
|
+
resolve the reported driver/SDK error before continuing; do not guess a platform.
|
|
108
|
+
|
|
109
|
+
For Linux, use the workflow below directly; no additional skill file is needed.
|
|
110
|
+
For macOS or Windows, initialization reads exactly one resource. If filesystem
|
|
111
|
+
imports are unavailable, use the following fallback before any UI work.
|
|
112
|
+
Read exactly one resource with `read_file`, resolving its absolute path from the
|
|
113
|
+
Skill base directory shown above:
|
|
114
|
+
|
|
115
|
+
- `macos`: read `references/macos.md` for the App workflow and text operations.
|
|
116
|
+
- `windows`: read `references/windows-linux.md` for the exact-window workflow.
|
|
117
|
+
|
|
118
|
+
On macOS and Windows, read the selected resource before taking actions. Once it
|
|
119
|
+
has been printed in the initialization result, do not read it again. After
|
|
120
|
+
changing the connected desktop, query its platform again and follow that
|
|
121
|
+
platform’s workflow. Resource files remain on the machine hosting this Skill;
|
|
122
|
+
do not look for them on the controlled desktop.
|
|
123
|
+
|
|
124
|
+
## Linux Computer Use
|
|
125
|
+
|
|
126
|
+
Use this workflow when `computer.getPlatform()` returns `linux`. The bootstrap
|
|
127
|
+
above has already initialized `computer`. This workflow is complete in this
|
|
128
|
+
`computer-use/SKILL.md` file.
|
|
129
|
+
|
|
130
|
+
### Targeting and input
|
|
131
|
+
|
|
132
|
+
Keep the observed process ID, window ID and element tokens. Input delivery is
|
|
133
|
+
managed by the runtime: it chooses a semantic action where available and prepares
|
|
134
|
+
the exact window's focus when native keyboard or pointer input requires it.
|
|
35
135
|
|
|
36
136
|
```ts
|
|
37
137
|
type WindowTarget = { pid: number; windowId: number };
|
|
38
|
-
type ElementTarget = {
|
|
39
|
-
pid: number;
|
|
40
|
-
windowId?: number;
|
|
41
|
-
elementToken: string;
|
|
42
|
-
};
|
|
138
|
+
type ElementTarget = { pid: number; windowId?: number; elementToken: string };
|
|
43
139
|
type CoordinateTarget = WindowTarget & { x: number; y: number };
|
|
44
140
|
type PointOrElementTarget = CoordinateTarget | ElementTarget;
|
|
45
141
|
type ExactActionTarget = WindowTarget | ElementTarget;
|
|
46
|
-
type DeliveryOptions = { deliveryMode?: DeliveryMode };
|
|
47
142
|
|
|
48
143
|
type ComputerUse = {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
)
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
144
|
+
listApps(): Promise<
|
|
145
|
+
Array<{
|
|
146
|
+
name?: string;
|
|
147
|
+
bundle_id?: string;
|
|
148
|
+
pid?: number;
|
|
149
|
+
running?: boolean;
|
|
150
|
+
}>
|
|
151
|
+
>;
|
|
152
|
+
listWindows(args: { pid: number; onScreenOnly?: boolean }): Promise<
|
|
153
|
+
Array<{
|
|
154
|
+
window_id: number;
|
|
155
|
+
title?: string;
|
|
156
|
+
is_on_screen?: boolean;
|
|
157
|
+
}>
|
|
158
|
+
>;
|
|
159
|
+
observeWindow(
|
|
160
|
+
args: WindowTarget & {
|
|
161
|
+
disableDiff?: boolean;
|
|
162
|
+
includeScreenshot?: boolean;
|
|
163
|
+
maxTextChars?: number;
|
|
164
|
+
},
|
|
165
|
+
): Promise<WindowObservation>;
|
|
166
|
+
click(
|
|
167
|
+
args: PointOrElementTarget & {
|
|
168
|
+
button?: 'left' | 'right' | 'middle';
|
|
169
|
+
count?: number;
|
|
170
|
+
},
|
|
171
|
+
): Promise<object>;
|
|
172
|
+
doubleClick(args: PointOrElementTarget): Promise<object>;
|
|
173
|
+
rightClick(
|
|
174
|
+
args: PointOrElementTarget & { modifier?: string[] },
|
|
175
|
+
): Promise<object>;
|
|
176
|
+
drag(
|
|
177
|
+
args: WindowTarget & {
|
|
178
|
+
fromX: number;
|
|
179
|
+
fromY: number;
|
|
180
|
+
toX: number;
|
|
181
|
+
toY: number;
|
|
182
|
+
},
|
|
183
|
+
): Promise<object>;
|
|
184
|
+
scroll(
|
|
185
|
+
args: PointOrElementTarget & {
|
|
186
|
+
direction: 'up' | 'down' | 'left' | 'right';
|
|
187
|
+
amount?: number;
|
|
188
|
+
},
|
|
189
|
+
): Promise<object>;
|
|
190
|
+
pressKey(
|
|
191
|
+
args: ExactActionTarget & { key: string; modifiers?: string[] },
|
|
192
|
+
): Promise<object>;
|
|
193
|
+
hotkey(args: ExactActionTarget & { keys: string[] }): Promise<object>;
|
|
194
|
+
typeText(args: ExactActionTarget & { text: string }): Promise<object>;
|
|
195
|
+
setValue(args: ElementTarget & { value: string }): Promise<object>;
|
|
196
|
+
performSecondaryAction(
|
|
74
197
|
args: ElementTarget & { action: string },
|
|
75
|
-
)
|
|
76
|
-
|
|
77
|
-
args: ExactActionTarget &
|
|
78
|
-
DeliveryOptions & { key: string; modifiers?: string[] },
|
|
79
|
-
) => Promise<object>;
|
|
80
|
-
hotkey: (
|
|
81
|
-
args: ExactActionTarget & DeliveryOptions & { keys: string[] },
|
|
82
|
-
) => Promise<object>;
|
|
83
|
-
scroll: (
|
|
84
|
-
args: PointOrElementTarget &
|
|
85
|
-
DeliveryOptions & { direction: Direction; amount?: number },
|
|
86
|
-
) => Promise<object>;
|
|
87
|
-
setValue: (args: ElementTarget & { value: string }) => Promise<object>;
|
|
88
|
-
typeText: (
|
|
89
|
-
args: ExactActionTarget & DeliveryOptions & { text: string },
|
|
90
|
-
) => Promise<object>;
|
|
91
|
-
close: () => Promise<void>;
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
type App = {
|
|
95
|
-
name?: string;
|
|
96
|
-
bundle_id?: string;
|
|
97
|
-
pid?: number;
|
|
98
|
-
running?: boolean;
|
|
99
|
-
launch_path?: string;
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
type Window = {
|
|
103
|
-
window_id: number;
|
|
104
|
-
title?: string;
|
|
105
|
-
is_on_screen?: boolean;
|
|
106
|
-
on_current_space?: boolean;
|
|
198
|
+
): Promise<object>;
|
|
199
|
+
close(): Promise<void>;
|
|
107
200
|
};
|
|
108
201
|
|
|
109
202
|
type WindowObservation = {
|
|
110
203
|
pid: number;
|
|
111
204
|
windowId: number;
|
|
112
205
|
mode: 'full' | 'diff' | 'no_change';
|
|
113
|
-
resyncReason?: string;
|
|
114
206
|
text: string;
|
|
115
|
-
elements: Array<
|
|
116
|
-
|
|
207
|
+
elements: Array<{
|
|
208
|
+
element_token?: string;
|
|
209
|
+
role?: string;
|
|
210
|
+
label?: string;
|
|
211
|
+
value?: unknown;
|
|
212
|
+
actions?: string[];
|
|
213
|
+
}>;
|
|
214
|
+
screenshot?: { images: Array<{ mimeType: string; dataBase64: string }> };
|
|
117
215
|
};
|
|
118
|
-
|
|
119
|
-
type Element = {
|
|
120
|
-
element_token?: string;
|
|
121
|
-
role?: string;
|
|
122
|
-
label?: string;
|
|
123
|
-
automation_id?: string;
|
|
124
|
-
value?: unknown;
|
|
125
|
-
actions?: string[];
|
|
126
|
-
};
|
|
127
|
-
|
|
128
|
-
type Screenshot = {
|
|
129
|
-
images: Array<{ mimeType: string; dataBase64: string }>;
|
|
130
|
-
};
|
|
131
|
-
|
|
132
|
-
type Direction = 'up' | 'down' | 'left' | 'right';
|
|
133
|
-
type MouseButton = 'left' | 'right' | 'middle';
|
|
134
|
-
type DeliveryMode = 'background' | 'foreground';
|
|
135
216
|
```
|
|
136
217
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
### 1. Initialize
|
|
218
|
+
### Discover and observe
|
|
140
219
|
|
|
141
|
-
|
|
142
|
-
|
|
220
|
+
Filter the app named by the task, then select its intended window from the
|
|
221
|
+
observed titles. If either is ambiguous, print the candidates before choosing.
|
|
222
|
+
Do not assume the first window is the task window.
|
|
143
223
|
|
|
144
224
|
```js
|
|
145
225
|
var apps = await computer.listApps();
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
226
|
+
nodeRepl.write(JSON.stringify(apps.filter((app) => app.name === 'Target App')));
|
|
227
|
+
// Use the matching app's observed PID.
|
|
228
|
+
var windows = await computer.listWindows({
|
|
229
|
+
pid: targetPid,
|
|
230
|
+
onScreenOnly: true,
|
|
231
|
+
});
|
|
232
|
+
nodeRepl.write(JSON.stringify(windows));
|
|
233
|
+
// Use the selected window's observed ID.
|
|
234
|
+
var target = { pid: targetPid, windowId: selectedWindowId };
|
|
153
235
|
var state = await computer.observeWindow(target);
|
|
154
|
-
nodeRepl.write(state.text);
|
|
236
|
+
nodeRepl.write(state.text);
|
|
155
237
|
```
|
|
156
238
|
|
|
157
|
-
|
|
158
|
-
|
|
239
|
+
Combine discovery, selection and observation in one cell when the target is
|
|
240
|
+
unambiguous. If the app is unknown, print `await computer.listApps()` first.
|
|
241
|
+
Reuse `computer` and the selected target across calls.
|
|
159
242
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
243
|
+
Observations default to text diffs. `state.elements` is the full current
|
|
244
|
+
captured element list even when `.text` reports a diff or no change. Use tokens
|
|
245
|
+
from that list; unchanged tokens remain usable across observations. After a
|
|
246
|
+
capture read failure, use only tokens issued by the latest observation.
|
|
164
247
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
248
|
+
Text is limited to 12,000 characters by default. Filter the elements for controls
|
|
249
|
+
you need, or request `disableDiff: true` with a larger `maxTextChars` (minimum
|
|
250
|
+
512). An omitted row does not prove absence. If you discarded earlier text,
|
|
251
|
+
request a full tree the next time you read accessibility text.
|
|
169
252
|
|
|
170
|
-
|
|
171
|
-
as a diff from the most previous accessibility tree, listing only the elements
|
|
172
|
-
that were removed, added, or changed. Prefer this default diff output; pass
|
|
173
|
-
`disableDiff: true` only when you need a fresh full accessibility tree. If you
|
|
174
|
-
disregard the text from a previous call to `observeWindow`, such as when you only
|
|
175
|
-
emit the screenshot, get the full tree next time you inspect AX text.
|
|
176
|
-
`state.elements` remains the current full actionable element list when
|
|
177
|
-
`state.text` is a diff or reports no change.
|
|
253
|
+
### Act and verify
|
|
178
254
|
|
|
179
|
-
|
|
255
|
+
Prefer current element tokens. Use screenshot coordinates for controls whose
|
|
256
|
+
accessibility actions or text are unavailable. Coordinates are pixels in the
|
|
257
|
+
PNG for that exact window, measured from its top-left corner. Accessibility
|
|
258
|
+
`frame` values are screen-space logical points; do not use them as PNG pixels.
|
|
180
259
|
|
|
181
|
-
|
|
260
|
+
Batch only actions whose target remains the same, then observe:
|
|
182
261
|
|
|
183
262
|
```js
|
|
184
263
|
await computer.click({ pid: target.pid, elementToken });
|
|
185
|
-
await computer.setValue({ pid: target.pid, elementToken, value: 'openai.com' });
|
|
186
|
-
await computer.pressKey({ ...target, key: 'Enter' });
|
|
187
264
|
await computer.typeText({ ...target, text: 'hello' });
|
|
188
|
-
await computer.scroll({
|
|
189
|
-
pid: target.pid,
|
|
190
|
-
elementToken,
|
|
191
|
-
direction: 'down',
|
|
192
|
-
amount: 1,
|
|
193
|
-
});
|
|
194
|
-
await computer.performSecondaryAction({
|
|
195
|
-
pid: target.pid,
|
|
196
|
-
elementToken,
|
|
197
|
-
action: 'Show Menu',
|
|
198
|
-
});
|
|
199
265
|
nodeRepl.write((await computer.observeWindow(target)).text);
|
|
200
266
|
```
|
|
201
267
|
|
|
202
|
-
|
|
268
|
+
End the batch when opening a dialog or menu. For a dialog, list windows and
|
|
269
|
+
observe the matching window before typing. For a menu in the same window,
|
|
270
|
+
refresh its observation and use current menu tokens. Never guess a window ID.
|
|
203
271
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
- `performSecondaryAction` invokes an accessibility action that an element exposes besides a normal click, such as expanding a disclosure row, showing a menu, incrementing a control, or cancelling something. It requires an action actually exposed for that element in the accessibility text. Do not guess action names.
|
|
209
|
-
- `pressKey` presses one key and accepts optional modifiers; `hotkey` sends a key combination such as `{ keys: ['ctrl', 'c'] }`. Single-key examples include `"a"`, `"Enter"`, `"Tab"`, and `"Up"`.
|
|
210
|
-
- Take care when passing strings containing `\n` or `\r` to `typeText`, as it simulates pressing the return key. Many apps with message composers or forms will respond by sending the message or submitting the form rather than inserting a newline.
|
|
211
|
-
- The SDK targets an exact PID and window ID. If an action opens a dialog, menu, or new window, call `listWindows({ pid })` again and select the current window before continuing.
|
|
272
|
+
The runtime may retry focus preparation before sending input. An action error,
|
|
273
|
+
cancellation, `suspected_noop` or `unverifiable` result does not establish that
|
|
274
|
+
nothing happened. Observe the current windows and state before deciding to
|
|
275
|
+
repeat an action. Do not blindly replay the previous batch or token.
|
|
212
276
|
|
|
213
|
-
|
|
277
|
+
`pressKey` accepts one key and optional modifiers; `hotkey` accepts a combination
|
|
278
|
+
such as `{ ...target, keys: ['ctrl', 'c'] }`. `performSecondaryAction` requires an
|
|
279
|
+
action actually exposed by that element. Newlines in `typeText` can submit forms
|
|
280
|
+
or send messages instead of inserting a line break.
|
|
214
281
|
|
|
215
|
-
|
|
216
|
-
emit each returned image:
|
|
282
|
+
### Read screenshots
|
|
217
283
|
|
|
218
|
-
|
|
284
|
+
Request the screenshot explicitly, print only the observation's text, and emit
|
|
285
|
+
each image:
|
|
219
286
|
|
|
220
287
|
```js
|
|
221
288
|
var state = await computer.observeWindow({
|
|
@@ -228,11 +295,9 @@ for (const image of state.screenshot?.images ?? []) {
|
|
|
228
295
|
}
|
|
229
296
|
```
|
|
230
297
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
await computer.close();
|
|
235
|
-
globalThis.computer = undefined;
|
|
236
|
-
```
|
|
298
|
+
Do not stringify the whole observation or a raw driver result containing image
|
|
299
|
+
bytes. In outer code mode, also forward each returned image block with `image()`
|
|
300
|
+
as shown in the shared entrypoint, including images from `node_repl_wait`.
|
|
237
301
|
|
|
238
|
-
|
|
302
|
+
When all Computer Use work is complete, call `await computer.close()` and clear
|
|
303
|
+
`globalThis.computer`. Reset the REPL only when no other persistent state is needed.
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
# macOS Computer Use
|
|
2
|
+
|
|
3
|
+
Use this workflow only when `computer.getPlatform()` returned `macos`.
|
|
4
|
+
The shared entrypoint has already initialized `computer`.
|
|
5
|
+
|
|
6
|
+
## API surface
|
|
7
|
+
|
|
8
|
+
```ts
|
|
9
|
+
type Point = number | { x: number; y: number };
|
|
10
|
+
type ComputerUse = {
|
|
11
|
+
getApp: (nameOrIdentifierOrPath: string) => Promise<App>;
|
|
12
|
+
listApps: () => Promise<
|
|
13
|
+
Array<{ id: string; displayName: string; isRunning: boolean }>
|
|
14
|
+
>;
|
|
15
|
+
close: () => Promise<void>;
|
|
16
|
+
};
|
|
17
|
+
type App = {
|
|
18
|
+
getState: (options?: {
|
|
19
|
+
disableDiff?: boolean;
|
|
20
|
+
includeScreenshot?: boolean;
|
|
21
|
+
maxTextChars?: number;
|
|
22
|
+
}) => Promise<State>;
|
|
23
|
+
click: (
|
|
24
|
+
point: Point,
|
|
25
|
+
options?: { button?: 'left' | 'right' | 'middle'; count?: number },
|
|
26
|
+
) => Promise<object>;
|
|
27
|
+
doubleClick: (point: Point) => Promise<object>;
|
|
28
|
+
rightClick: (
|
|
29
|
+
point: Point,
|
|
30
|
+
options?: { modifier?: string[] },
|
|
31
|
+
) => Promise<object>;
|
|
32
|
+
setValue: (element: number, value: string) => Promise<object>;
|
|
33
|
+
performSecondaryAction: (element: number, action: string) => Promise<object>;
|
|
34
|
+
typeText: (text: string) => Promise<object>;
|
|
35
|
+
paste: (
|
|
36
|
+
text: string,
|
|
37
|
+
options?: { format?: 'text' | 'md' | 'html'; signal?: AbortSignal },
|
|
38
|
+
) => Promise<object>;
|
|
39
|
+
selectText: (
|
|
40
|
+
element: number,
|
|
41
|
+
text: string,
|
|
42
|
+
options?: {
|
|
43
|
+
prefix?: string;
|
|
44
|
+
suffix?: string;
|
|
45
|
+
selection?: 'text' | 'cursor_before' | 'cursor_after';
|
|
46
|
+
signal?: AbortSignal;
|
|
47
|
+
},
|
|
48
|
+
) => Promise<object>;
|
|
49
|
+
pressKey: (
|
|
50
|
+
key: string,
|
|
51
|
+
options?: { modifiers?: string[] },
|
|
52
|
+
) => Promise<object>;
|
|
53
|
+
hotkey: (keys: string[]) => Promise<object>;
|
|
54
|
+
scroll: (
|
|
55
|
+
point: Point,
|
|
56
|
+
options: { direction: 'up' | 'down' | 'left' | 'right'; amount?: number },
|
|
57
|
+
) => Promise<object>;
|
|
58
|
+
drag: (options: {
|
|
59
|
+
fromX: number;
|
|
60
|
+
fromY: number;
|
|
61
|
+
toX: number;
|
|
62
|
+
toY: number;
|
|
63
|
+
}) => Promise<object>;
|
|
64
|
+
};
|
|
65
|
+
type State = {
|
|
66
|
+
app: string;
|
|
67
|
+
window: string;
|
|
68
|
+
mode: 'full' | 'diff' | 'no_change';
|
|
69
|
+
text: string;
|
|
70
|
+
screenshot?: { images: Array<{ mimeType: string; dataBase64: string }> };
|
|
71
|
+
};
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Workflow
|
|
75
|
+
|
|
76
|
+
### 1. Initialize
|
|
77
|
+
|
|
78
|
+
If initialization already bound the task's app and returned its state, reuse
|
|
79
|
+
that `app` and observation. Otherwise, bind the app named by the task, then read its state.
|
|
80
|
+
`getApp()` binds identity; `getState()` can open a discovered stopped app. Combine these
|
|
81
|
+
steps in one Node REPL call:
|
|
82
|
+
|
|
83
|
+
```js
|
|
84
|
+
var app = await computer.getApp('Microsoft Excel');
|
|
85
|
+
nodeRepl.write((await app.getState()).text);
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
The app handle tracks its current window and dialog. Read the returned window
|
|
89
|
+
title to confirm the intended document. If the app is unknown or its name is
|
|
90
|
+
ambiguous, discover applications with `computer.listApps()` and use a matching
|
|
91
|
+
application `id`.
|
|
92
|
+
|
|
93
|
+
AX text uses short numeric IDs, such as `[37] TextField "Name"`. Use IDs from
|
|
94
|
+
the current observation for element actions. IDs can change when the app's
|
|
95
|
+
window or session changes. Disabled and static-text rows are observation-only.
|
|
96
|
+
|
|
97
|
+
For token efficiency, the accessibility tree will be returned
|
|
98
|
+
as a diff when appropriate. Prefer this default diff output. A full state
|
|
99
|
+
replaces the previous state; a diff updates it; no-change preserves it. If you
|
|
100
|
+
need a full replacement, use `disableDiff: true` only when the previous state
|
|
101
|
+
is unavailable or no longer useful. Do not disregard the text and then assume
|
|
102
|
+
that a subsequent diff will reproduce the information you skipped.
|
|
103
|
+
|
|
104
|
+
Returned text defaults to at most 12,000 characters. Set `maxTextChars` (minimum 512) to adjust the limit. A truncation notice means some captured rows were
|
|
105
|
+
omitted; request `app.getState({ disableDiff: true, maxTextChars: 24000 })` when
|
|
106
|
+
you need more full text. An omitted row does not prove an element is absent.
|
|
107
|
+
Traversal-limited captures cover only the captured nodes: identical captures
|
|
108
|
+
can return no-change, while changes return full captured state. Use current
|
|
109
|
+
captured IDs; after a read failure, use only IDs from the latest observation.
|
|
110
|
+
|
|
111
|
+
### 2. Actions using app
|
|
112
|
+
|
|
113
|
+
After performing one or more UI actions, call `app.getState()` before deciding
|
|
114
|
+
what to do next. Batch actions whose target remains the same, then print only
|
|
115
|
+
the state needed for the next decision:
|
|
116
|
+
|
|
117
|
+
```js
|
|
118
|
+
await app.click(37);
|
|
119
|
+
await app.hotkey(['super', 'a']);
|
|
120
|
+
await app.typeText('hello');
|
|
121
|
+
await app.pressKey('Return');
|
|
122
|
+
nodeRepl.write((await app.getState()).text);
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Use the actual ID from your observation; `37` is only an example.
|
|
126
|
+
|
|
127
|
+
An observation is a decision boundary. When the current state already identifies
|
|
128
|
+
the controls and the next actions are known, combine those actions and saving
|
|
129
|
+
in the same call. Read state after the batch. End the batch at a new dialog,
|
|
130
|
+
menu, changed target or uncertain result; use that state before choosing the
|
|
131
|
+
next action. Do not split a known sequence merely to put each action in its own
|
|
132
|
+
call.
|
|
133
|
+
|
|
134
|
+
- Prefer element IDs to coordinates. `setValue(id, value)` changes a writable control, and `performSecondaryAction(id, action)` invokes a secondary action listed for that element. Use an observed action name rather than guessing.
|
|
135
|
+
- When an action opens or closes a dialog, sheet or menu, end the batch and call `app.getState()` to read the new window and IDs before continuing.
|
|
136
|
+
- `No open application window.` means the app is still running without a document window. If closing it completed the task, finish instead of retrying actions; otherwise open the intended file or window first.
|
|
137
|
+
- An action error can occur after the UI already changed. Read state before deciding whether to retry. Partial, unconfirmed or cancelled actions must not be blindly repeated.
|
|
138
|
+
- Coordinate actions use pixels in this app's current screenshot, with `(0, 0)` at its top-left. Every App observation refreshes that frame internally. Request `includeScreenshot: true` when you need to inspect the image, especially after a window change. Do not infer coordinates from another window or desktop screenshot.
|
|
139
|
+
- `pressKey` sends one key, optionally with modifiers. `hotkey` sends a combination such as `['super', 's']`. Use the platform's appropriate shortcut.
|
|
140
|
+
- App input activates the exact target internally for one dispatch and restores the previously active app. There is no delivery-mode choice and no automatic replay after an uncertain result.
|
|
141
|
+
- Literal `\n` or `\r` in `typeText` sends Return. In a composer or form this may submit rather than insert a newline.
|
|
142
|
+
- If AX is incomplete or does not explain the interface, request a screenshot and inspect it. Only currently captured actionable IDs can be used for element actions.
|
|
143
|
+
|
|
144
|
+
## Paste and select text
|
|
145
|
+
|
|
146
|
+
These App methods are available on macOS only. Read current state first and use
|
|
147
|
+
an observed element ID for selection.
|
|
148
|
+
|
|
149
|
+
```js
|
|
150
|
+
await app.selectText(37, 'draft', { prefix: 'Status: ' });
|
|
151
|
+
nodeRepl.write((await app.getState()).text);
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Use a real ID and text from your observation; the example assumes that the
|
|
155
|
+
selected element contains exactly one matching `draft` immediately after
|
|
156
|
+
`Status: `.
|
|
157
|
+
|
|
158
|
+
After confirming the selection, replace it with plain text:
|
|
159
|
+
|
|
160
|
+
```js
|
|
161
|
+
await app.paste('ready');
|
|
162
|
+
nodeRepl.write((await app.getState()).text);
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
- `selectText(element, text)` selects one exact, case-sensitive match. Optional
|
|
166
|
+
`prefix` and `suffix` must be immediately adjacent to that match. Missing or
|
|
167
|
+
ambiguous matches fail; provide enough observed context to identify one.
|
|
168
|
+
- `selection` defaults to `'text'`. Use `'cursor_before'` or `'cursor_after'` to
|
|
169
|
+
place the insertion point at a match boundary instead of selecting the text.
|
|
170
|
+
The element must support a writable text selection; static labels may not.
|
|
171
|
+
- `paste(text)` defaults to plain text. Use `{ format: 'md' }` for Markdown or
|
|
172
|
+
`{ format: 'html' }` for HTML; the receiving app determines which supplied
|
|
173
|
+
format it accepts. Use plain text when markup should remain literal.
|
|
174
|
+
- Paste uses the clipboard temporarily. It restores the previous clipboard only
|
|
175
|
+
while it still owns that transaction; a newer external clipboard change is
|
|
176
|
+
preserved.
|
|
177
|
+
- Both methods accept an optional `signal`. A completed dispatch, error or
|
|
178
|
+
cancellation does not by itself prove what changed. Observe state before
|
|
179
|
+
deciding whether to retry; do not blindly repeat unconfirmed text operations.
|
|
180
|
+
|
|
181
|
+
## Reading screenshots
|
|
182
|
+
|
|
183
|
+
Every App observation captures the current screenshot internally, independent
|
|
184
|
+
of whether AX returns full state, a diff or no-change. The default return omits
|
|
185
|
+
the image. `includeScreenshot: true` exposes it when visual inspection is needed.
|
|
186
|
+
Prefer the text-only default when it identifies the controls and confirms the
|
|
187
|
+
requested change. Request an image to resolve missing or ambiguous information,
|
|
188
|
+
choose coordinates or verify an appearance that AX does not describe.
|
|
189
|
+
|
|
190
|
+
```js
|
|
191
|
+
var state = await app.getState({ includeScreenshot: true });
|
|
192
|
+
nodeRepl.write(state.text);
|
|
193
|
+
for (const image of state.screenshot?.images ?? []) {
|
|
194
|
+
await nodeRepl.emitImage(`data:${image.mimeType};base64,${image.dataBase64}`);
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Include connection cleanup at the end of the call that emits the final
|
|
199
|
+
verification. Inspect that result before reporting success; reconnect and
|
|
200
|
+
continue if it reveals unfinished work. A separate cleanup-only model turn is
|
|
201
|
+
unnecessary:
|
|
202
|
+
|
|
203
|
+
```js
|
|
204
|
+
await computer.close();
|
|
205
|
+
globalThis.computer = undefined;
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
Reset the Node REPL only when no other persistent state is needed.
|