@qwen-code/qwen-code 0.23.3 → 0.23.4
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 +46 -198
- 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 +48 -37
- 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-Q44AWRWI.js} +59 -55
- package/chunks/{StandaloneSessionPicker-ALTTRWUP.js → StandaloneSessionPicker-UKII7M7U.js} +83 -79
- package/chunks/{acp-startup-profiler-KEU6VAYR.js → acp-startup-profiler-RUQNTNU5.js} +2 -2
- package/chunks/acp-subagent-executor-7RUAOXE7.js +141 -0
- package/chunks/{acpAgent-BBSW7XZG.js → acpAgent-5N3LHCO3.js} +1026 -355
- package/chunks/{agent-SQ6OY3QD.js → agent-LU5UJALC.js} +43 -39
- package/chunks/{agent-headless-RI2THRQ7.js → agent-headless-LTLADUGR.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-P34XQP3D.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-VE4ARRSR.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-DAWWT2ID.js → chunk-2NRKLYID.js} +1374 -2164
- package/chunks/{chunk-53GWJOLP.js → chunk-2P2IXKDR.js} +3 -1
- package/chunks/{chunk-6JACAGYH.js → chunk-2S2WIGCM.js} +1 -1
- package/chunks/{chunk-IUVIBDKU.js → chunk-2YMRRI2C.js} +9 -10
- package/chunks/{chunk-MLQNSPRZ.js → chunk-3AYIKQTJ.js} +15 -5
- package/chunks/{chunk-F53KKZUD.js → chunk-3LMDSCLU.js} +158 -10
- package/chunks/{chunk-WG7BL3FY.js → chunk-473RJLIH.js} +1 -1
- package/chunks/{chunk-BWAMMKIS.js → chunk-4XP7WXC4.js} +135 -6
- 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-5JG3DAKS.js +1416 -0
- package/chunks/{chunk-CUEXOHQH.js → chunk-5ODRE7E5.js} +9 -15
- package/chunks/{chunk-532WHF4F.js → chunk-5VQR2DD7.js} +2 -2
- package/chunks/chunk-62MWBTS7.js +191 -0
- package/chunks/{chunk-YQHLFCPU.js → chunk-65ANUQSV.js} +32 -24
- package/chunks/{chunk-YBUMTY7B.js → chunk-66N6C4EH.js} +1 -1
- package/chunks/{chunk-AC6KDLH3.js → chunk-6TFZIA2L.js} +1 -1
- package/chunks/{chunk-Y2MYW47X.js → chunk-6WXVEDT2.js} +9 -2
- package/chunks/{chunk-NRXWJXJ4.js → chunk-7GKPKIUB.js} +15 -15
- package/chunks/chunk-7JGH6IMU.js +2780 -0
- package/chunks/{chunk-ZHKTKHMO.js → chunk-7MIBD3LG.js} +1 -1
- package/chunks/{chunk-HGAELO7B.js → chunk-7ML2ZLQF.js} +2 -2
- package/chunks/{chunk-3UXUOFO6.js → chunk-7W2Y3PZD.js} +9 -10
- 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-3FPYT6QC.js → chunk-ARDHE6MM.js} +23 -0
- package/chunks/{chunk-LILGKQ4B.js → chunk-AXZMWAJV.js} +156 -26
- package/chunks/{chunk-SYLECP23.js → chunk-BBMOAZ2E.js} +4 -4
- package/chunks/{chunk-RWVD5RRY.js → chunk-BDDE4YNP.js} +3 -3
- package/chunks/{chunk-TPKQIA7G.js → chunk-BSIOCNDK.js} +1 -1
- package/chunks/{chunk-U7O65WKL.js → chunk-BW2SMO6L.js} +1 -1
- 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-AXTFYDXT.js → chunk-CXXAZ2LZ.js} +1 -1
- package/chunks/{chunk-N7VWZDWW.js → chunk-DCRVSIK6.js} +4460 -3838
- package/chunks/{chunk-NJQTG2G3.js → chunk-DGTH4BSO.js} +11 -11
- package/chunks/{chunk-J3TJH52D.js → chunk-DOTF2PF2.js} +1 -1
- package/chunks/{chunk-BWQLXU37.js → chunk-E4XZSQXB.js} +381 -86
- package/chunks/{chunk-2ALXPGB4.js → chunk-E6IR653O.js} +1 -1
- package/chunks/{chunk-R4Q2PEFV.js → chunk-E7HXORS7.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-Q5BD56BW.js → chunk-ELHAQ5H4.js} +7 -7
- package/chunks/{chunk-GSILBZLN.js → chunk-EOQXU3ZE.js} +2 -2
- package/chunks/{chunk-7QYWGTHB.js → chunk-EPVEPTI3.js} +44 -151
- package/chunks/{chunk-POC3YMHG.js → chunk-F2IRY2TD.js} +4 -4
- package/chunks/{chunk-S6Q6Q4P2.js → chunk-FBDHP23D.js} +1 -1
- package/chunks/{chunk-3I7W2POO.js → chunk-FGROOEKM.js} +5 -40
- package/chunks/{chunk-HNLMYDQE.js → chunk-FMLBBXHB.js} +13 -9
- package/chunks/{chunk-Z3GF56ME.js → chunk-FRISMWG3.js} +3 -3
- package/chunks/{chunk-ALMR3E6Q.js → chunk-GDWE23OR.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-3XLK2QMY.js → chunk-H7L725Z6.js} +59 -16
- package/chunks/{chunk-6HUXPLB5.js → chunk-HEOH7JZY.js} +5 -5
- package/chunks/{chunk-DTNV6UZY.js → chunk-HFJSQ4GL.js} +10 -24
- package/chunks/{chunk-BZM5U74J.js → chunk-I6JRN375.js} +724 -468
- 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-NOAG7N22.js → chunk-IGLX6UXJ.js} +2 -2
- package/chunks/chunk-INGBUYL6.js +230 -0
- package/chunks/{chunk-IL5M5NYD.js → chunk-IR5CVY5G.js} +11 -9
- package/chunks/{chunk-OX7IZ2G5.js → chunk-ITOB3LRT.js} +4 -4
- package/chunks/{chunk-LDVNJZGH.js → chunk-IUXWAKVS.js} +17 -8
- package/chunks/{chunk-2PJRI3EH.js → chunk-J4DRBDHX.js} +218 -43
- package/chunks/{chunk-XGYHNWL3.js → chunk-J7LBAKDH.js} +3 -3
- package/chunks/{chunk-W5FIP7FC.js → chunk-JLZ5YCMV.js} +5 -5
- package/chunks/{chunk-LG5Y4OWO.js → chunk-JRHKM3YQ.js} +2 -2
- package/chunks/{chunk-2ZN3O5FT.js → chunk-JZ3FFPES.js} +6 -6
- package/chunks/{chunk-NMCDMLHL.js → chunk-K2DCZ6SZ.js} +50 -35
- package/chunks/{chunk-F42YYSCK.js → chunk-KLGCF6G7.js} +8 -8
- package/chunks/{chunk-K2OJUPOE.js → chunk-KP2FHIFR.js} +12 -0
- package/chunks/{chunk-IV7GDNKC.js → chunk-KZCK5JUN.js} +4 -4
- package/chunks/{acp-subagent-executor-LEUN3N7N.js → chunk-L56E7YUM.js} +11 -110
- package/chunks/{chunk-NMRCXKQ5.js → chunk-L5BVU4JW.js} +3 -3
- package/chunks/{chunk-ZW2EUO2A.js → chunk-L6DIANLD.js} +1 -1
- package/chunks/{chunk-GOXQL4YH.js → chunk-LFNK4DGQ.js} +2 -2
- package/chunks/{chunk-UKZ45TJL.js → chunk-LMDMYMSS.js} +420 -219
- package/chunks/chunk-LMJSPC55.js +260 -0
- package/chunks/{chunk-X6K77VHC.js → chunk-LWWRJRCD.js} +1 -1
- package/chunks/{chunk-UXEO7E3V.js → chunk-LYD3T3H7.js} +1 -0
- package/chunks/{chunk-HBQ2NXOU.js → chunk-M6MID3FA.js} +2 -2
- package/chunks/{chunk-E4UEO3XM.js → chunk-ME4JBHSB.js} +324 -2
- package/chunks/{chunk-MF6E7FSA.js → chunk-MFPAVOYJ.js} +8 -201
- package/chunks/{chunk-BV6Q5HMY.js → chunk-MJHLKWGJ.js} +8 -7
- package/chunks/{chunk-NFYEQRLG.js → chunk-MQRLLBMQ.js} +1 -1
- package/chunks/{chunk-O4KNCAX4.js → chunk-NCPFOLM2.js} +11 -0
- package/chunks/{chunk-2SZH22YO.js → chunk-NJ2OFVUX.js} +115 -97
- package/chunks/{chunk-6MBXY6WM.js → chunk-NRQI3PGS.js} +1 -1
- package/chunks/{chunk-3CZ2BQV6.js → chunk-NXUZFW3G.js} +49 -19
- package/chunks/{chunk-X7UJKOHZ.js → chunk-O75ZXPOX.js} +4 -6
- package/chunks/{chunk-5GLDOLNQ.js → chunk-OWUAZXXN.js} +4 -3
- package/chunks/{chunk-XBZTAGB7.js → chunk-OXDQETZA.js} +1 -1
- package/chunks/{chunk-2UWQX4FP.js → chunk-OZEV3R3S.js} +1 -1
- package/chunks/{chunk-SBRX4BDI.js → chunk-P225AM5U.js} +2 -2
- package/chunks/{chunk-ZU47FBOC.js → chunk-P6XVYPWA.js} +126 -12
- package/chunks/{chunk-MHAADZOZ.js → chunk-PCIYPEYV.js} +3 -3
- package/chunks/{chunk-SSGAAWLY.js → chunk-PNACDSCO.js} +95 -73
- package/chunks/chunk-PRWRNC64.js +32 -0
- package/chunks/{chunk-7BXXIQG4.js → chunk-PVKEYO5D.js} +36 -72
- package/chunks/{chunk-FCQJLMA2.js → chunk-Q3TFRP5G.js} +178 -8
- package/chunks/{chunk-DYFOSJHU.js → chunk-QM2MRAG4.js} +2756 -1153
- package/chunks/{chunk-ZKZHSB5W.js → chunk-QR4Q425T.js} +9 -9
- package/chunks/{chunk-J6MB5ZHZ.js → chunk-QZW6WRB7.js} +2 -1
- package/chunks/{chunk-3BTSSIJO.js → chunk-RHTNPDGD.js} +99 -14
- package/chunks/{chunk-OLTN767L.js → chunk-RJFUPP3F.js} +2 -2
- package/chunks/chunk-RKXAOP6F.js +154 -0
- package/chunks/{chunk-TP6FYVQT.js → chunk-RSWBT7AZ.js} +33 -1
- package/chunks/{chunk-E7LB57MB.js → chunk-RWKR4VNK.js} +6 -6
- package/chunks/chunk-S7UQ3V2H.js +87 -0
- package/chunks/{chunk-N6VQ37ZZ.js → chunk-SFL6U7U7.js} +1 -1
- package/chunks/{chunk-SODMFNAR.js → chunk-SQCZDHBQ.js} +5 -5
- package/chunks/{chunk-MOS5OAOG.js → chunk-SROLVJFY.js} +6 -6
- package/chunks/{chunk-3KQBQ6FM.js → chunk-SYDMM6IX.js} +190 -28
- package/chunks/{chunk-HUXPEUFL.js → chunk-SYROIHU7.js} +1 -1
- package/chunks/{chunk-PSPAM24S.js → chunk-TBSCTWKF.js} +6 -0
- package/chunks/{chunk-RLLRJJDR.js → chunk-TJDUJSVH.js} +2 -2
- package/chunks/{chunk-HBU7EKY4.js → chunk-TRKIKBUW.js} +45 -15
- package/chunks/{chunk-GCDXVPFK.js → chunk-TW2RLZPC.js} +31 -7
- package/chunks/chunk-U6H3XTFA.js +95 -0
- package/chunks/{chunk-NHJKAR6E.js → chunk-UGEDTVL6.js} +972 -18
- package/chunks/{chunk-KOKPXIAN.js → chunk-UL4DXZMP.js} +3 -3
- package/chunks/{chunk-MSNHNAQZ.js → chunk-UUT7EFX3.js} +3 -3
- package/chunks/{chunk-JXNIF2O5.js → chunk-V545KI73.js} +1 -1
- package/chunks/{chunk-7ICHPMBQ.js → chunk-VELFTVEO.js} +4 -4
- package/chunks/chunk-VGY2RGXL.js +100 -0
- package/chunks/{chunk-5KI7ZDTB.js → chunk-VQ3SUPLA.js} +24 -12
- package/chunks/{chunk-TBEXLLAO.js → chunk-VRQZESKP.js} +1 -1
- package/chunks/{chunk-FN3JNDRU.js → chunk-VVI7MK3V.js} +3 -3
- package/chunks/{chunk-EUURTIV6.js → chunk-WBSJ6VPZ.js} +10 -2
- package/chunks/{chunk-NLNQNBZ2.js → chunk-WD6YQI5M.js} +1 -1
- package/chunks/{chunk-KFZYGSJN.js → chunk-WDB57HEI.js} +3 -3
- package/chunks/chunk-WFNEY5G7.js +347 -0
- package/chunks/{chunk-XKBFYTCD.js → chunk-WK6DEH3Q.js} +46 -0
- package/chunks/{chunk-EVTNACMT.js → chunk-WKQX4FND.js} +12 -12
- package/chunks/{chunk-36HCNKDS.js → chunk-WKVZES7O.js} +65 -14
- package/chunks/{chunk-NHCZJQE4.js → chunk-WLFILD4T.js} +6 -6
- package/chunks/{chunk-JYKWOREU.js → chunk-WMEX6CFP.js} +13 -3
- package/chunks/{chunk-6W4HBUA2.js → chunk-WNQRJXKP.js} +1 -1
- package/chunks/{chunk-7APZIRH3.js → chunk-X7GOO6VM.js} +5 -5
- package/chunks/{chunk-VX63RJXE.js → chunk-XX5HQLCZ.js} +7 -0
- package/chunks/{chunk-2Z3T52OC.js → chunk-Y5TM7SBV.js} +7 -2
- package/chunks/{chunk-V2P3DOQR.js → chunk-YDFOHRS5.js} +1 -1
- package/chunks/{chunk-QMUYLYT5.js → chunk-YGFJ6BRT.js} +1 -1
- package/chunks/{chunk-LK2WUCDQ.js → chunk-YM6KUQ2S.js} +1 -1
- package/chunks/chunk-Z72PLR74.js +36 -0
- package/chunks/{chunk-BHTYRHJF.js → chunk-ZJ7JQUGY.js} +4 -1
- package/chunks/{chunk-4ALNJDHL.js → chunk-ZKIAGIGH.js} +87 -4
- package/chunks/{chunk-VG3Q2NC4.js → chunk-ZNI3YJHS.js} +32 -12
- package/chunks/{chunk-DT75RKNH.js → chunk-ZXUKZHMV.js} +3 -3
- package/chunks/{chunk-Q2LVVIKF.js → chunk-ZZUXUBEB.js} +29 -12
- package/chunks/codex-subagent-executor-WCRCJMQK.js +586 -0
- package/chunks/{config-utils-L6KLDYIV.js → config-utils-73C3RGYN.js} +60 -56
- package/chunks/{contextCommand-UYEH7NIU.js → contextCommand-4ZDPQJHD.js} +58 -54
- package/chunks/{core-runtime-NVHT3Z3V.js → core-runtime-ZDUA5DYE.js} +58 -55
- package/chunks/{create-sub-session-YWASE5VH.js → create-sub-session-JK3SSJKO.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-QU2CCJIE.js} +58 -54
- package/chunks/{daemon-status-provider-O5KQZYMP.js → daemon-status-provider-2PO7NLDQ.js} +68 -63
- package/chunks/{daemon-trust-policy-3ATXEON7.js → daemon-trust-policy-IMDTIUWB.js} +64 -60
- package/chunks/{daemon-trust-policy-monitor-7MCNDNEC.js → daemon-trust-policy-monitor-6IVBNUAD.js} +64 -60
- package/chunks/{de-UU2YTO37.js → de-VGY3VNBU.js} +3 -3
- package/chunks/{deferred-core-runtime-JK5IXL5K.js → deferred-core-runtime-3AZUE7F3.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-HXMBABZU.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-KAMW2I2C.js} +43 -39
- package/chunks/{environment-DKXHG4HB.js → environment-HYMXOTVB.js} +59 -55
- package/chunks/{errors-ADY7LQJJ.js → errors-NQRH7NAM.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-SMEBS5EF.js} +43 -39
- package/chunks/{fast-path-U636VWN2.js → fast-path-CUWUTJUR.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-VOM5DVZ3.js} +43 -39
- package/chunks/{goal-tools-PXYRSQGX.js → goal-tools-YBYJ5KPM.js} +49 -41
- package/chunks/{grep-3PKFKLCA.js → grep-H2I33VAO.js} +8 -3
- package/chunks/{handleAutoUpdate-5KHS4HIN.js → handleAutoUpdate-4CEHNJ2F.js} +61 -57
- package/chunks/{i18n-KSGKMUPT.js → i18n-G7ODGUGN.js} +57 -53
- package/chunks/{image-gen-OCCR2WWU.js → image-gen-5G2TQ3DY.js} +6 -5
- package/chunks/{initializer-YYT5XEZF.js → initializer-GZ73HSOA.js} +64 -60
- package/chunks/{installationInfo-UNSBPYW2.js → installationInfo-PV472I52.js} +57 -53
- package/chunks/{ja-GJS5RZGU.js → ja-2RITCMAJ.js} +3 -3
- package/chunks/list-D4A7LFOF.js +133 -0
- package/chunks/{list-agents-QLDXS5OD.js → list-agents-EWDCEPIW.js} +3 -3
- package/chunks/{llm-XGGLBGPH.js → llm-PJU4VT3K.js} +161 -125
- package/chunks/{llm-content-generator-ZHQQT5W7.js → llm-content-generator-ITOMDK65.js} +14 -7
- package/chunks/{loadedSettingsAdapter-3DXLASK7.js → loadedSettingsAdapter-NNU4BY5Q.js} +64 -60
- package/chunks/{loggingContentGenerator-V72OCCJO.js → loggingContentGenerator-SMI2AJYY.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-AN5RDI5D.js} +57 -53
- package/chunks/mcp-RIIEZ7NJ.js +127 -0
- package/chunks/model-configuration-E5M35A3M.js +140 -0
- package/chunks/modelConfigUtils-43SY2EDS.js +119 -0
- package/chunks/{monitor-TLBNM4MV.js → monitor-5WYDOXLI.js} +43 -39
- package/chunks/{nonInteractiveCli-LSJSQ2W4.js → nonInteractiveCli-D3YFYXNB.js} +112 -107
- package/chunks/{notebook-edit-OSPOLZP6.js → notebook-edit-GQNFJTIR.js} +45 -41
- package/chunks/{openaiContentGenerator-BE4S5TRD.js → openaiContentGenerator-VJAKFZ32.js} +24 -19
- package/chunks/{openaiResponsesContentGenerator-RTCAJ5V5.js → openaiResponsesContentGenerator-AWRYZLJU.js} +110 -19
- package/chunks/{pidfile-H32FEPWA.js → pidfile-I5SWEJDX.js} +56 -52
- package/chunks/{processUtils-SSLIPDEA.js → processUtils-NSYM3SKR.js} +2 -2
- package/chunks/{prompt-terminal-ledger-I5SLL6UF.js → prompt-terminal-ledger-KWBANHUE.js} +57 -53
- package/chunks/{pt-FXMYXEUV.js → pt-5ZF7ZQUV.js} +3 -3
- package/chunks/{qwenContentGenerator-TMQC623Z.js → qwenContentGenerator-LR6HNFBU.js} +47 -43
- package/chunks/{qwenOAuth2-3ZRQHHTC.js → qwenOAuth2-WIEUEFEY.js} +5 -4
- package/chunks/{read-file-T2QAIZE2.js → read-file-LOSUPKDX.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-6IFK3MQO.js} +63 -59
- package/chunks/{ripGrep-YGWL7KCV.js → ripGrep-MBSYRHNP.js} +13 -11
- package/chunks/{ru-RMHURE5U.js → ru-7BNZFQKG.js} +3 -3
- package/chunks/{run-qwen-serve-26KZDECC.js → run-qwen-serve-WYEEYIHV.js} +314 -127
- package/chunks/{runtime-BMEIVDDG.js → runtime-FVTTOB4E.js} +69 -65
- package/chunks/{scheduled-tasks-NCFPP6VQ.js → scheduled-tasks-RN6DUY7E.js} +66 -60
- package/chunks/{scheduler-47TVMUVN.js → scheduler-T7DDWINW.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-LVMPJBTV.js} +66 -62
- package/chunks/{server-LBPYXZ5G.js → server-U7K7EJEP.js} +783 -350
- package/chunks/{session-YG6742LO.js → session-BQNC5QUN.js} +117 -112
- package/chunks/{session-attachments-root-OUBQDYC4.js → session-attachments-root-LQDHWZST.js} +56 -52
- package/chunks/{session-pr-refresh-EKGMYNAW.js → session-pr-refresh-J7DQYX2I.js} +66 -60
- package/chunks/{settings-DDNHJX2L.js → settings-WAWJIZHR.js} +67 -63
- package/chunks/{shell-KUCXWITU.js → shell-WFJEYGQI.js} +43 -39
- package/chunks/{skill-JQLKPNWZ.js → skill-RHQWSDOK.js} +128 -23
- package/chunks/{skill-settings-XERQCUXZ.js → skill-settings-ALFUQQD6.js} +72 -60
- package/chunks/{spawnChannel-GQ45QFGB.js → spawnChannel-D35CB5JB.js} +60 -55
- package/chunks/{standalone-update-PRF3ILGZ.js → standalone-update-NMMY6CAO.js} +58 -54
- package/chunks/{start-opentui-ui-JDSOZE3N.js → start-opentui-ui-F6BN46GE.js} +2693 -2160
- package/chunks/{startInteractiveUI-RRW3JVHN.js → startInteractiveUI-E6U7L5AD.js} +1610 -1773
- 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-DKAJ3OUY.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-ZUG32DAK.js} +43 -39
- package/chunks/{terminal-image-renderer-H7PD4FQW.js → terminal-image-renderer-U3Z5PMGO.js} +58 -54
- package/chunks/{theme-manager-7AV73D6R.js → theme-manager-GA65ZFKB.js} +56 -52
- package/chunks/{todoWrite-5QI2H2FW.js → todoWrite-XSTG2VT5.js} +6 -3
- package/chunks/{tool-search-UGYTBLUV.js → tool-search-XCEN7VXX.js} +17 -12
- package/chunks/{total-session-admission-JIHSTJ5S.js → total-session-admission-FZSHBR32.js} +63 -58
- package/chunks/{trustedFolders-5VCBXFOP.js → trustedFolders-SXPNZESV.js} +57 -53
- package/chunks/{update-relaunch-4LF3APCV.js → update-relaunch-QOUTZZ7Q.js} +5 -5
- package/chunks/{updateCheck-4T3WUE5F.js → updateCheck-DYRX7M34.js} +60 -56
- package/chunks/{useAutoAcceptIndicator-UMGB64Z6.js → useAutoAcceptIndicator-QOG7LUT3.js} +68 -64
- package/chunks/{validateNonInterActiveAuth-GFJ72U2C.js → validateNonInterActiveAuth-FJPAEMDD.js} +109 -104
- package/chunks/{version-EAAZN4T2.js → version-5IC46F2Z.js} +1 -1
- package/chunks/{web-fetch-VRU3A2NI.js → web-fetch-WSW4QZBA.js} +15 -13
- package/chunks/web-search-5QFKXWUV.js +39 -0
- package/chunks/{web-shell-static-CCN4JZEE.js → web-shell-static-T7UGLVE4.js} +2 -7
- package/chunks/{workflow-UHPFALVZ.js → workflow-ZF4DLK4V.js} +179 -79
- package/chunks/workspace-providers-status-4E4XWBFS.js +133 -0
- package/chunks/{workspace-registration-store-A7RGKW62.js → workspace-registration-store-M3QEP27F.js} +2 -2
- package/chunks/{workspace-registry-C2NGE6SD.js → workspace-registry-H2ENI5G2.js} +63 -58
- package/chunks/{workspace-runtime-coordinator-QKMZ24YF.js → workspace-runtime-coordinator-CRRNB7PC.js} +66 -59
- package/chunks/{workspace-service-RQTTAGGC.js → workspace-service-GJ2GOHKU.js} +70 -65
- package/chunks/workspace-skills-status-CRWHV35X.js +130 -0
- package/chunks/{workspace-trust-reconciler-KFWATZUU.js → workspace-trust-reconciler-GG2JA7KI.js} +73 -68
- package/chunks/{write-file-DPVB2SBQ.js → write-file-LZ4EMF36.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-J5IMS3WD.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-S_JCiANq.js} +1 -1
- package/web-shell/assets/{arc-D1hTu8QI.js → arc-DP-839Xn.js} +1 -1
- package/web-shell/assets/architectureDiagram-5GKGNRK7-C8rCd2KK.js +36 -0
- package/web-shell/assets/blockDiagram-NRAW4CY4-DQR82jwr.js +129 -0
- package/web-shell/assets/{c4Diagram-UCG6FXSJ-kEFoC1ei.js → c4Diagram-UCG6FXSJ-D21PNMRP.js} +4 -4
- package/web-shell/assets/channel-BgGrpX_z.js +1 -0
- package/web-shell/assets/{chunk-2Q5K7J3B-DbT9wS7j.js → chunk-2Q5K7J3B-KdDInGLi.js} +1 -1
- package/web-shell/assets/{chunk-5VM5RSS4-CNbULt6O.js → chunk-5VM5RSS4-ltb7zRmH.js} +1 -1
- package/web-shell/assets/{chunk-F27PBJKO-CbQRy4Tb.js → chunk-F27PBJKO-DcpQA0Ng.js} +1 -1
- package/web-shell/assets/chunk-G27WJ6UU-C8NDZxcy.js +231 -0
- package/web-shell/assets/chunk-JWPE2WC7-hXhhHTs1.js +1 -0
- package/web-shell/assets/chunk-LCL6LL3I-CLaOR-Hl.js +206 -0
- package/web-shell/assets/chunk-POPQ4Y6H-Y5_qlB1N.js +1 -0
- package/web-shell/assets/{chunk-SVP7TREG-DyBb2Axj.js → chunk-SVP7TREG-BWX2Voh7.js} +4 -4
- package/web-shell/assets/{chunk-XXDRQBXY-BIA0eb5B.js → chunk-XXDRQBXY-1wmj_kXI.js} +1 -1
- package/web-shell/assets/classDiagram-DTDB5LWJ-jUH7ADYs.js +1 -0
- package/web-shell/assets/classDiagram-v2-JRS7N3AN-jUH7ADYs.js +1 -0
- package/web-shell/assets/cose-bilkent-JH36ORCC-DpLc-cdd.js +1 -0
- package/web-shell/assets/cynefin-OW5HDTMX-DhxGiPZW.js +178 -0
- package/web-shell/assets/{cynefinDiagram-5FMLGOSQ-LENf_IUy.js → cynefinDiagram-5FMLGOSQ-Dl3jfBry.js} +1 -1
- package/web-shell/assets/{cytoscape.esm-CUqq0XTU.js → cytoscape.esm-DJK6lGiH.js} +3 -3
- package/web-shell/assets/dagre-3AP2YEHR-C8FA8vJk.js +4 -0
- package/web-shell/assets/diagram-S7CK7UJ4-D-quIUtW.js +30 -0
- package/web-shell/assets/diagram-UQ7AKVKN-Bjo09Uts.js +41 -0
- package/web-shell/assets/diagram-VSXAHHWV-IoI3ttq4.js +3 -0
- package/web-shell/assets/diagram-VX7I27RA-BKyOZ5SO.js +24 -0
- package/web-shell/assets/diagram-Z3DM3KII-Cu_OHEhw.js +24 -0
- package/web-shell/assets/{ebnfDiagram-PWID7BFC-BGpiquRm.js → ebnfDiagram-PWID7BFC-UVB-bbPg.js} +1 -1
- package/web-shell/assets/{erDiagram-SSCWMZ5O-D0besu_U.js → erDiagram-SSCWMZ5O-l8drddto.js} +13 -13
- package/web-shell/assets/flowDiagram-A5DVABFB-DU1I_VAI.js +168 -0
- package/web-shell/assets/{ganttDiagram-EL5Y4UJY-CNlsAeNr.js → ganttDiagram-EL5Y4UJY-BLRH05uB.js} +1 -1
- package/web-shell/assets/gitGraphDiagram-WWUBYQGX-Czg_BkRE.js +106 -0
- package/web-shell/assets/index-CmMV8Jla.js +3 -0
- package/web-shell/assets/{index-CGT341lL.js → index-DohPy72Z.js} +1 -1
- package/web-shell/assets/index-DyMtNYuu.js +2207 -0
- package/web-shell/assets/index-n6N-2a3v.css +36 -0
- package/web-shell/assets/{infoDiagram-RXCK75RN-Bpai64Ll.js → infoDiagram-RXCK75RN-BpBvjkro.js} +1 -1
- package/web-shell/assets/ishikawaDiagram-5VMMS53U-phy1l3jm.js +70 -0
- package/web-shell/assets/{journeyDiagram-EYS64GPL-iz_DKgFX.js → journeyDiagram-EYS64GPL-oY-9LgVS.js} +1 -1
- package/web-shell/assets/kanban-definition-3QL26DDD-slZoy-sc.js +89 -0
- package/web-shell/assets/{layout-qEvKgnvU.js → layout-0hnn_P9l.js} +1 -1
- package/web-shell/assets/{linear-C6lklGdq.js → linear-7Wqe8DRy.js} +1 -1
- package/web-shell/assets/mermaid.core-BaK8n0bq.js +312 -0
- package/web-shell/assets/mindmap-definition-FBJOCRG2-BedUdy_E.js +96 -0
- package/web-shell/assets/{pegDiagram-XKGWAZYB-BhD0q0i6.js → pegDiagram-XKGWAZYB-DQLRdmxq.js} +1 -1
- package/web-shell/assets/pieDiagram-E7YTZNPT-UC20w9-5.js +39 -0
- package/web-shell/assets/quadrantDiagram-AXDQQJYC-CQx2Hmk3.js +7 -0
- package/web-shell/assets/qwen-code-notification-BRVagufF.png +0 -0
- package/web-shell/assets/{railroadDiagram-O6MQD6OU-E1g2KIFK.js → railroadDiagram-O6MQD6OU-2UEJe_y-.js} +1 -1
- package/web-shell/assets/{requirementDiagram-EFPCY7ZU-CuerYJOe.js → requirementDiagram-EFPCY7ZU-DOAJggB4.js} +13 -13
- package/web-shell/assets/{sankeyDiagram-P5KCCOFB-CqWyCZGA.js → sankeyDiagram-P5KCCOFB-DnQ_qJo7.js} +7 -7
- package/web-shell/assets/{sequenceDiagram-WJ2MYXX4-B-YWb8x4.js → sequenceDiagram-WJ2MYXX4-DZrZUoCo.js} +16 -16
- package/web-shell/assets/sizeCapture-X5ZJPWSS-B5G4GDQB.js +1 -0
- package/web-shell/assets/{stateDiagram-HBIQ2CUA-C8LDpNHS.js → stateDiagram-HBIQ2CUA-Bn1cT0qF.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-4QOOHH4V-BF3xtNvJ.js +1 -0
- package/web-shell/assets/swimlanes-XN3QIQJK-Bzhcdn87.js +1 -0
- package/web-shell/assets/swimlanesDiagram-VK2B7HYN-B753mA3E.js +8 -0
- package/web-shell/assets/timeline-definition-24CTP7MA-BqZ_3D10.js +120 -0
- package/web-shell/assets/vennDiagram-4TSXK5OY-z9kw1kmm.js +34 -0
- package/web-shell/assets/wardleyDiagram-VM6X3IG4-Cydp1zJW.js +78 -0
- package/web-shell/assets/{xychartDiagram-S5SC5T6Z-ruD2Wjhg.js → xychartDiagram-S5SC5T6Z-j4X1lQKo.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
|
@@ -16,223 +16,71 @@ description: Control local desktop applications through Computer Use for tasks t
|
|
|
16
16
|
If `node_repl` is unavailable, run:
|
|
17
17
|
|
|
18
18
|
```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.
|
|
19
|
+
qwen mcp add --scope user node-repl npx -y @qwen-code/node-repl-mcp@0.1.4
|
|
20
|
+
npm install --no-save --package-lock=false @qwen-code/cua-sdk@0.20.7
|
|
21
21
|
```
|
|
22
22
|
|
|
23
23
|
Tell the user to restart Qwen Code, then stop. If only the SDK import is missing,
|
|
24
24
|
run the second command and retry.
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
Reuse an existing `computer` connected to the intended desktop. Otherwise import
|
|
27
|
+
the `ComputerUse` API once per fresh `node_repl` session. Combine initialization,
|
|
28
|
+
connected-platform discovery and the selected resource read in one call. Set
|
|
29
|
+
`skillBase` to the absolute Skill base directory of this `SKILL.md`, as shown by
|
|
30
|
+
the skill loader or the file you just read:
|
|
27
31
|
|
|
28
32
|
```js
|
|
29
33
|
globalThis.computer = await (
|
|
30
34
|
await import('@qwen-code/cua-sdk/computer-use')
|
|
31
35
|
).ComputerUse.create();
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
type ExactActionTarget = WindowTarget | ElementTarget;
|
|
46
|
-
type DeliveryOptions = { deliveryMode?: DeliveryMode };
|
|
47
|
-
|
|
48
|
-
type ComputerUse = {
|
|
49
|
-
click: (
|
|
50
|
-
args: PointOrElementTarget &
|
|
51
|
-
DeliveryOptions & { button?: MouseButton; count?: number },
|
|
52
|
-
) => Promise<object>;
|
|
53
|
-
doubleClick: (
|
|
54
|
-
args: PointOrElementTarget & DeliveryOptions,
|
|
55
|
-
) => Promise<object>;
|
|
56
|
-
rightClick: (
|
|
57
|
-
args: PointOrElementTarget & DeliveryOptions & { modifier?: string[] },
|
|
58
|
-
) => Promise<object>;
|
|
59
|
-
drag: (
|
|
60
|
-
args: WindowTarget &
|
|
61
|
-
DeliveryOptions & {
|
|
62
|
-
fromX: number;
|
|
63
|
-
fromY: number;
|
|
64
|
-
toX: number;
|
|
65
|
-
toY: number;
|
|
66
|
-
},
|
|
67
|
-
) => Promise<object>;
|
|
68
|
-
observeWindow: (
|
|
69
|
-
args: WindowTarget & { disableDiff?: boolean; includeScreenshot?: boolean },
|
|
70
|
-
) => Promise<WindowObservation>;
|
|
71
|
-
listApps: () => Promise<Array<App>>;
|
|
72
|
-
listWindows: (args: { pid: number }) => Promise<Array<Window>>;
|
|
73
|
-
performSecondaryAction: (
|
|
74
|
-
args: ElementTarget & { action: string },
|
|
75
|
-
) => Promise<object>;
|
|
76
|
-
pressKey: (
|
|
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;
|
|
107
|
-
};
|
|
108
|
-
|
|
109
|
-
type WindowObservation = {
|
|
110
|
-
pid: number;
|
|
111
|
-
windowId: number;
|
|
112
|
-
mode: 'full' | 'diff' | 'no_change';
|
|
113
|
-
resyncReason?: string;
|
|
114
|
-
text: string;
|
|
115
|
-
elements: Array<Element>;
|
|
116
|
-
screenshot?: Screenshot;
|
|
117
|
-
};
|
|
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
|
-
```
|
|
136
|
-
|
|
137
|
-
## Workflow
|
|
138
|
-
|
|
139
|
-
### 1. Initialize
|
|
140
|
-
|
|
141
|
-
Start by getting the state for the app and window you want to use. When the task
|
|
142
|
-
names an app, filter for that name directly:
|
|
143
|
-
|
|
144
|
-
```js
|
|
145
|
-
var apps = await computer.listApps();
|
|
146
|
-
var matches = apps.filter(
|
|
147
|
-
(app) => app.name === 'Target App' || app.bundle_id === 'com.example.target',
|
|
36
|
+
var platform = await computer.getPlatform();
|
|
37
|
+
var reference = {
|
|
38
|
+
macos: 'macos.md',
|
|
39
|
+
windows: 'windows-linux.md',
|
|
40
|
+
linux: 'windows-linux.md',
|
|
41
|
+
}[platform];
|
|
42
|
+
if (!reference) throw new Error('Unsupported connected platform');
|
|
43
|
+
var skillBase = '/absolute/path/to/computer-use';
|
|
44
|
+
nodeRepl.write(`Connected platform: ${platform}`);
|
|
45
|
+
nodeRepl.write(
|
|
46
|
+
await (
|
|
47
|
+
await import('node:fs/promises')
|
|
48
|
+
).readFile(`${skillBase}/references/${reference}`, 'utf8'),
|
|
148
49
|
);
|
|
149
|
-
nodeRepl.write(JSON.stringify(matches));
|
|
150
|
-
|
|
151
|
-
var windows = await computer.listWindows({ pid: matches[0].pid });
|
|
152
|
-
var target = { pid: matches[0].pid, windowId: windows[0].window_id };
|
|
153
|
-
var state = await computer.observeWindow(target);
|
|
154
|
-
nodeRepl.write(state.text); // This will return the accessibility tree
|
|
155
50
|
```
|
|
156
51
|
|
|
157
|
-
If
|
|
158
|
-
|
|
52
|
+
If the returned platform is `macos` and the task already identifies an
|
|
53
|
+
unambiguous app, append its initial observation to that same initialization
|
|
54
|
+
call, after printing the resource:
|
|
159
55
|
|
|
160
56
|
```js
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
After performing one or more UI actions, call `observeWindow(...)` before
|
|
166
|
-
deciding what to do next. This keeps you in the current UI state. Read the
|
|
167
|
-
current actionable `element_token` values from `state.elements`; tokens for
|
|
168
|
-
unchanged elements remain valid across `diff` and `no_change` observations.
|
|
169
|
-
|
|
170
|
-
For token efficiency, when appropriate, the accessibility tree will be returned
|
|
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.
|
|
178
|
-
|
|
179
|
-
### 2. Actions using app
|
|
180
|
-
|
|
181
|
-
Perform one or more actions, and then fetch the latest state:
|
|
182
|
-
|
|
183
|
-
```js
|
|
184
|
-
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
|
-
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
|
-
nodeRepl.write((await computer.observeWindow(target)).text);
|
|
57
|
+
if (platform === 'macos') {
|
|
58
|
+
var app = await computer.getApp('App named by the task');
|
|
59
|
+
nodeRepl.write((await app.getState()).text);
|
|
60
|
+
}
|
|
200
61
|
```
|
|
201
62
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
- Prefer using accessibility text over screenshots for efficiency, but if the interface is not fully working or not providing enough context, make sure to fetch a screenshot to get more context. The accessibility interface may be incomplete in some applications, so a screenshot helps fully understand what is going on.
|
|
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.
|
|
212
|
-
|
|
213
|
-
## Reading screenshots
|
|
63
|
+
Replace the example app name with the task's app. This only binds the app and
|
|
64
|
+
reads its current state; `getState()` can open that app if stopped. Read both
|
|
65
|
+
the returned platform workflow and initial state before any editing or input.
|
|
66
|
+
If the app is unknown or ambiguous, omit this block and follow the selected
|
|
67
|
+
resource's discovery steps. Do not guess an app or use the host platform.
|
|
214
68
|
|
|
215
|
-
|
|
216
|
-
emit each returned image:
|
|
69
|
+
## Select the target platform workflow
|
|
217
70
|
|
|
218
|
-
|
|
71
|
+
Use this returned platform, not the CLI or Node host operating system. A connected
|
|
72
|
+
driver may control a different machine. If the platform cannot be determined,
|
|
73
|
+
resolve the reported driver/SDK error before continuing; do not guess a platform.
|
|
219
74
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
});
|
|
225
|
-
nodeRepl.write(state.text);
|
|
226
|
-
for (const image of state.screenshot?.images ?? []) {
|
|
227
|
-
await nodeRepl.emitImage(`data:${image.mimeType};base64,${image.dataBase64}`);
|
|
228
|
-
}
|
|
229
|
-
```
|
|
75
|
+
The initialization call above reads exactly one resource. If filesystem imports
|
|
76
|
+
are unavailable, use the following fallback before any UI work.
|
|
77
|
+
Read exactly one resource with `read_file`, resolving its absolute path from the
|
|
78
|
+
Skill base directory shown above:
|
|
230
79
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
```js
|
|
234
|
-
await computer.close();
|
|
235
|
-
globalThis.computer = undefined;
|
|
236
|
-
```
|
|
80
|
+
- `macos`: read `references/macos.md` for the App workflow and text operations.
|
|
81
|
+
- `windows` or `linux`: read `references/windows-linux.md` for the exact-window workflow.
|
|
237
82
|
|
|
238
|
-
|
|
83
|
+
Read the selected resource before taking actions. Once it has been printed in the
|
|
84
|
+
initialization result, do not read it again. After changing the connected desktop,
|
|
85
|
+
query its platform again and read the matching resource. Resource files remain on
|
|
86
|
+
the machine hosting this Skill; do not look for them on the controlled desktop.
|
|
@@ -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.
|