claude-code-best 1.1.0 → 1.2.1
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/README.md +66 -75
- package/dist/chunk-03hxwxzh.js +344 -0
- package/dist/chunk-07069jq1.js +30 -0
- package/dist/{chunk-kq098bkj.js → chunk-08g51x43.js} +254 -320
- package/dist/{chunk-7tqhx6dr.js → chunk-093r60b7.js} +109 -213
- package/dist/{chunk-ahjgghpe.js → chunk-0aya4737.js} +1 -1
- package/dist/{chunk-b4mnbry0.js → chunk-0fsdxz74.js} +4 -4
- package/dist/chunk-0jzdwbdc.js +14 -0
- package/dist/chunk-0mbxeb5q.js +406 -0
- package/dist/chunk-0pryepme.js +66 -0
- package/dist/chunk-0qsm7jac.js +169 -0
- package/dist/{chunk-1cbn5kxf.js → chunk-0rpb2bdp.js} +3 -2
- package/dist/chunk-0se7sxd4.js +38 -0
- package/dist/{chunk-3m7ge6tj.js → chunk-0xnepnph.js} +14 -12
- package/dist/{chunk-q7tvkc86.js → chunk-0zsam7pn.js} +10 -115
- package/dist/{chunk-44fpr6jq.js → chunk-168xb8v1.js} +4 -2
- package/dist/{chunk-bj0rvnjw.js → chunk-19h3a9pw.js} +40 -30
- package/dist/chunk-19wjkpe7.js +115 -0
- package/dist/{chunk-wsqhnjj3.js → chunk-1atfzck5.js} +24 -24
- package/dist/{chunk-0e1xsncc.js → chunk-1cwdhk7a.js} +1 -1
- package/dist/{chunk-c8jv6rtj.js → chunk-1hq59w8z.js} +78 -69
- package/dist/chunk-1qzk963z.js +108 -0
- package/dist/{chunk-fk06pejm.js → chunk-1rrmvwjn.js} +9 -9
- package/dist/{chunk-d18z9pna.js → chunk-1thgdca1.js} +2 -2
- package/dist/chunk-1tjnmcw7.js +68 -0
- package/dist/chunk-1xj83yc8.js +219 -0
- package/dist/chunk-21j2jfen.js +435 -0
- package/dist/{chunk-wc6wwwyb.js → chunk-21z7acxh.js} +3 -3
- package/dist/chunk-22gbbc5x.js +313 -0
- package/dist/chunk-238g70xa.js +1 -1
- package/dist/{chunk-vpb723tx.js → chunk-23ad5t92.js} +5 -5
- package/dist/{chunk-vbbf707n.js → chunk-24r3gfks.js} +39 -29
- package/dist/chunk-24sahbec.js +71 -0
- package/dist/chunk-28az45r7.js +112 -0
- package/dist/{chunk-9g827w4j.js → chunk-2q39ej51.js} +6 -6
- package/dist/chunk-2qwgfjcj.js +5370 -0
- package/dist/{chunk-0cpnzx7t.js → chunk-2rgvd09y.js} +118 -151
- package/dist/chunk-2wq8q15s.js +475 -0
- package/dist/{chunk-bqq4zamw.js → chunk-2ys5wcxk.js} +3 -3
- package/dist/{chunk-t24ytdcw.js → chunk-31nce7eh.js} +12 -10
- package/dist/chunk-31q6p2ke.js +123 -0
- package/dist/chunk-3394wc12.js +1024 -0
- package/dist/{chunk-33khw5gy.js → chunk-365zvqv3.js} +7 -7
- package/dist/{chunk-9g2ncq68.js → chunk-36gkb95k.js} +124 -128
- package/dist/{chunk-khdjg2v9.js → chunk-37y42ayh.js} +39 -29
- package/dist/chunk-3816xd5p.js +195 -0
- package/dist/chunk-3a6bynts.js +656 -0
- package/dist/{chunk-qvd0k5dn.js → chunk-3avfhw6x.js} +190 -348
- package/dist/{chunk-660kcy7p.js → chunk-3b25ycrx.js} +14 -8
- package/dist/chunk-3b4xhwhp.js +113 -0
- package/dist/chunk-3fjzvf0e.js +128 -0
- package/dist/chunk-3fvc0a79.js +67 -0
- package/dist/chunk-3g50kcwk.js +513 -0
- package/dist/chunk-3jnmy0nd.js +114 -0
- package/dist/chunk-3jzsxj3v.js +310 -0
- package/dist/{chunk-frbv3xqa.js → chunk-3mpfxbab.js} +2 -2
- package/dist/{chunk-aqa7w38f.js → chunk-3v03e2kz.js} +5 -5
- package/dist/chunk-3x5hdd5g.js +1030 -0
- package/dist/{chunk-mecs0gpc.js → chunk-3xv7rjsy.js} +14 -11
- package/dist/{chunk-j3215c49.js → chunk-3ygnhge8.js} +232 -372
- package/dist/chunk-42x5tjk2.js +42 -0
- package/dist/chunk-430tvx8d.js +110 -0
- package/dist/{chunk-dh6c8y1j.js → chunk-43h8sw5x.js} +3 -3
- package/dist/chunk-44d150tz.js +1175 -0
- package/dist/chunk-45dj834r.js +115 -0
- package/dist/{chunk-yhd82045.js → chunk-46fcr28b.js} +30 -9
- package/dist/{chunk-wm2f2f1z.js → chunk-474y75ga.js} +2 -2
- package/dist/{chunk-6fkwz9yk.js → chunk-478rpnqm.js} +8 -8
- package/dist/{chunk-83z0wrnz.js → chunk-47j9e6m2.js} +2 -2
- package/dist/chunk-47wqjw88.js +112 -0
- package/dist/{chunk-v4t6dyyh.js → chunk-4cp6193g.js} +2 -2
- package/dist/chunk-4h102wt5.js +65 -0
- package/dist/{chunk-3mgywd32.js → chunk-4hv90qcz.js} +1 -1
- package/dist/chunk-4k2270je.js +295 -0
- package/dist/{chunk-2wcbcdky.js → chunk-4k842par.js} +5 -5
- package/dist/chunk-4nspekjp.js +69 -0
- package/dist/chunk-4pjqtps4.js +151 -0
- package/dist/chunk-4sehjy27.js +112 -0
- package/dist/{chunk-pgnnrm2v.js → chunk-4t86n23n.js} +21 -17
- package/dist/{chunk-2de1vaxf.js → chunk-4whfjn78.js} +68 -78
- package/dist/{chunk-41mpwc8h.js → chunk-53c9gb9c.js} +19 -15
- package/dist/chunk-53kt8caz.js +122 -0
- package/dist/chunk-5a6ahhvy.js +594 -0
- package/dist/{chunk-12pv5fez.js → chunk-5gbqknz6.js} +10 -8
- package/dist/{chunk-hfzj1m07.js → chunk-5kkvfgzs.js} +14 -5
- package/dist/{chunk-4ycz58wj.js → chunk-5pxygepg.js} +68 -8
- package/dist/{chunk-2w8633e3.js → chunk-5rgbq3kf.js} +61 -100
- package/dist/{chunk-ggqx30m9.js → chunk-5z28bqne.js} +23 -311
- package/dist/{chunk-7ejt5gqq.js → chunk-5z8w2q5k.js} +65 -48
- package/dist/chunk-60k6v40t.js +70 -0
- package/dist/{chunk-p7g7pf3f.js → chunk-61ahbn23.js} +8 -6
- package/dist/{chunk-rmbp2das.js → chunk-64pp4hsr.js} +21 -19
- package/dist/{chunk-0sb5scxx.js → chunk-652wnf1z.js} +5 -5
- package/dist/{chunk-q25bjaev.js → chunk-677as3nh.js} +2 -2
- package/dist/{chunk-xs0hwvpa.js → chunk-68pfxvxt.js} +14 -9
- package/dist/{chunk-epmheefa.js → chunk-69hys77v.js} +8 -8
- package/dist/{chunk-427m88ms.js → chunk-6p1cptq5.js} +9 -9
- package/dist/{chunk-0nqrscrr.js → chunk-6p3mtny2.js} +5 -5
- package/dist/{chunk-v1mgv1et.js → chunk-6p4cyhb3.js} +4 -3
- package/dist/{chunk-m17y8b22.js → chunk-6rxz872v.js} +39 -29
- package/dist/chunk-6sjxvthw.js +106 -0
- package/dist/{chunk-6mz58s8p.js → chunk-6xana182.js} +18 -14
- package/dist/{chunk-vaebptnz.js → chunk-6zn3fm1k.js} +39 -29
- package/dist/chunk-704jkbsp.js +183 -0
- package/dist/chunk-71sf47by.js +154 -0
- package/dist/chunk-73a5g713.js +78 -0
- package/dist/chunk-78p7h20f.js +259 -0
- package/dist/chunk-7a3b1d4s.js +75 -0
- package/dist/{chunk-fpf4cgbt.js → chunk-7bfach0x.js} +9 -9
- package/dist/{chunk-ckcagq32.js → chunk-7gqf9wej.js} +5 -5
- package/dist/{chunk-sa7nc0vv.js → chunk-7y25wk51.js} +1 -1
- package/dist/{chunk-vyd8jzde.js → chunk-81v55vtd.js} +96 -85
- package/dist/{chunk-dv1wfr85.js → chunk-8225arm6.js} +5 -4
- package/dist/chunk-86715d2d.js +186 -0
- package/dist/chunk-8ah9easf.js +365 -0
- package/dist/{chunk-rwexx5ns.js → chunk-8baq1s87.js} +1 -3
- package/dist/chunk-8fy8hx84.js +386 -0
- package/dist/{chunk-4pbx3g7s.js → chunk-8g747a8x.js} +1 -1
- package/dist/{chunk-xyqr1cww.js → chunk-8me0yq6v.js} +12 -12
- package/dist/{chunk-sdj9b9wh.js → chunk-8pn8tvgg.js} +9 -154
- package/dist/chunk-8qxyxgkb.js +161 -0
- package/dist/{chunk-ecsw41df.js → chunk-8xs4yp9x.js} +85 -77
- package/dist/{chunk-24x87knx.js → chunk-9000dg9h.js} +1327 -2882
- package/dist/{chunk-bmvb57qb.js → chunk-905d2hee.js} +5 -5
- package/dist/chunk-90qsc60s.js +378 -0
- package/dist/chunk-92x6xgex.js +265 -0
- package/dist/{chunk-jknt3rxg.js → chunk-9ctg4x6c.js} +7 -9
- package/dist/chunk-9e4z7dx7.js +389 -0
- package/dist/chunk-9hy6ejmp.js +151 -0
- package/dist/chunk-9jvggd30.js +173 -0
- package/dist/{chunk-z9tgzh90.js → chunk-9m729tsn.js} +46 -35
- package/dist/chunk-9r90d3jt.js +121 -0
- package/dist/chunk-9rx2m3cb.js +124 -0
- package/dist/chunk-9sr2etaw.js +110 -0
- package/dist/chunk-9z8hzgve.js +68 -0
- package/dist/{chunk-yxnwsp4f.js → chunk-9zy607vw.js} +8 -6
- package/dist/chunk-a0bz6g5e.js +63 -0
- package/dist/chunk-a136cvvz.js +27 -0
- package/dist/{chunk-n5t9m8h9.js → chunk-a1bjde7d.js} +7 -7
- package/dist/{chunk-mvss16tj.js → chunk-a2aj2mtb.js} +414 -636
- package/dist/{chunk-8hsyagr8.js → chunk-a3sfy6as.js} +1 -1
- package/dist/{chunk-8hq5kk3y.js → chunk-a4twdmhf.js} +3 -2
- package/dist/chunk-ae76ded0.js +30 -0
- package/dist/chunk-aegyxcne.js +111 -0
- package/dist/chunk-aj1dcvrh.js +131 -0
- package/dist/{chunk-1yabrspp.js → chunk-amxm6996.js} +2 -2
- package/dist/{chunk-t6h4wf3k.js → chunk-ar39mr9c.js} +11 -11
- package/dist/{chunk-r6b58y3x.js → chunk-ase86y73.js} +1 -3
- package/dist/chunk-asfxrz4f.js +94 -0
- package/dist/chunk-axj46c2c.js +196 -0
- package/dist/{chunk-m5eb5pt2.js → chunk-ayz6f38j.js} +6 -6
- package/dist/{chunk-5b7119h5.js → chunk-b00zd850.js} +8 -6
- package/dist/chunk-b2abjkf7.js +126 -0
- package/dist/{chunk-8bedvdm1.js → chunk-b81hd3m6.js} +1 -1
- package/dist/chunk-bcfd2zw7.js +20 -0
- package/dist/{chunk-n5516f5q.js → chunk-bd8zk9tn.js} +4 -4
- package/dist/chunk-bhdt6k7w.js +15 -0
- package/dist/{chunk-jy35mvy3.js → chunk-bmjmrk76.js} +7 -7
- package/dist/chunk-bqaqz1j1.js +126 -0
- package/dist/chunk-bsbmmfyt.js +17 -0
- package/dist/{chunk-snvypj85.js → chunk-bt64sq5y.js} +3 -2
- package/dist/{chunk-zq9xa1xe.js → chunk-bwevztsj.js} +109 -141
- package/dist/{chunk-vyc0rjyx.js → chunk-bwg7582d.js} +1 -1
- package/dist/{chunk-3be7ka25.js → chunk-bxcfz5gy.js} +1 -1
- package/dist/chunk-c2mn2fyg.js +1406 -0
- package/dist/chunk-c2tw0dep.js +1811 -0
- package/dist/{chunk-402jrnj6.js → chunk-c5bngssh.js} +8 -8
- package/dist/chunk-c6sjhj89.js +1284 -0
- package/dist/chunk-cb2hpe6k.js +443 -0
- package/dist/{chunk-91r0z5qq.js → chunk-ccr1s7qs.js} +1152 -1771
- package/dist/chunk-cewqh6rb.js +111 -0
- package/dist/{chunk-k9a8jemz.js → chunk-cg01f3ez.js} +7 -7
- package/dist/{chunk-f64npa3b.js → chunk-chsyvavm.js} +704 -4
- package/dist/{chunk-z8nbjar4.js → chunk-cmcbatgz.js} +7 -5
- package/dist/chunk-cnsj3vq2.js +35 -0
- package/dist/{chunk-rj86xm6z.js → chunk-cpwe0yw7.js} +1 -1
- package/dist/chunk-cqjmxeqv.js +269 -0
- package/dist/{chunk-qpm1tmzz.js → chunk-crefny3c.js} +125 -193
- package/dist/{chunk-ks0m9njy.js → chunk-d2jekryq.js} +8 -8
- package/dist/chunk-d4mdda98.js +94 -0
- package/dist/{chunk-26wtxbdc.js → chunk-d7886r6a.js} +6928 -6928
- package/dist/chunk-dfkgpfaj.js +135 -0
- package/dist/{chunk-9mfbqw9k.js → chunk-dm3n2qgd.js} +4 -4
- package/dist/chunk-dnj95atq.js +66 -0
- package/dist/{chunk-vjc1svpc.js → chunk-dqgzpb0q.js} +87 -77
- package/dist/chunk-drenq3c7.js +383 -0
- package/dist/chunk-drkm8yx2.js +34 -0
- package/dist/{chunk-ra8fbt9p.js → chunk-dvjzq9x9.js} +543 -874
- package/dist/{chunk-w7h2yphx.js → chunk-dwekpr47.js} +2 -2
- package/dist/{chunk-49k5ktrj.js → chunk-e18dg1md.js} +31 -16
- package/dist/chunk-e396ak46.js +111 -0
- package/dist/{chunk-r55r29js.js → chunk-e3c32vwa.js} +191 -276
- package/dist/chunk-e3m7kqkb.js +1185 -0
- package/dist/{chunk-9cc60ae5.js → chunk-ea9m4e0k.js} +79 -70
- package/dist/chunk-ecsa9nd5.js +63 -0
- package/dist/{chunk-cmdsbsb6.js → chunk-edzkkadh.js} +2 -2
- package/dist/chunk-ek1jasqg.js +142 -0
- package/dist/chunk-ep0hwv07.js +126 -0
- package/dist/{chunk-cs6y2pc9.js → chunk-ergam9ft.js} +5 -5
- package/dist/{chunk-ptwn7qw7.js → chunk-f2k8b4nd.js} +38 -10
- package/dist/{chunk-h0rbjg6x.js → chunk-f2mhrmww.js} +8 -1
- package/dist/{chunk-s84smrx4.js → chunk-f32cksgw.js} +155 -190
- package/dist/{chunk-vzqrbsd1.js → chunk-f69rgsm2.js} +5 -5
- package/dist/{chunk-f3bapa1x.js → chunk-f6rbj3gz.js} +12 -7
- package/dist/chunk-f7n3xete.js +113 -0
- package/dist/chunk-fbest4vx.js +109 -0
- package/dist/{chunk-v0wa5ref.js → chunk-fdtcb8qr.js} +13 -555
- package/dist/chunk-feh2j8m2.js +136 -0
- package/dist/chunk-feyzykye.js +10 -0
- package/dist/chunk-fkkysfev.js +158 -0
- package/dist/chunk-fn510gqw.js +216 -0
- package/dist/{chunk-ch53fgm5.js → chunk-ft9qsa01.js} +13 -11
- package/dist/chunk-fw0ckaxh.js +109 -0
- package/dist/{chunk-kd97kxjn.js → chunk-fz0ch109.js} +3 -2
- package/dist/{chunk-ks0dm6t3.js → chunk-fzn524wa.js} +17 -71
- package/dist/chunk-g1k68z1b.js +15 -0
- package/dist/{chunk-9t1x831d.js → chunk-g5nb4xhz.js} +86 -74
- package/dist/chunk-g82mdy27.js +429 -0
- package/dist/{chunk-68qevppc.js → chunk-g8sz060e.js} +82 -72
- package/dist/chunk-g9f19ttm.js +15 -0
- package/dist/{chunk-zz21rvr7.js → chunk-gdqxtdh4.js} +9 -6
- package/dist/chunk-get9fk3h.js +74 -0
- package/dist/{chunk-4x5ym4h2.js → chunk-gf6qjt7j.js} +130 -16
- package/dist/{chunk-bq6x1ehp.js → chunk-gpz0ddyz.js} +8 -8
- package/dist/{chunk-mwp7sj0q.js → chunk-gs5eeqmc.js} +110336 -114801
- package/dist/{chunk-qqfa0dqg.js → chunk-h4b85amj.js} +20 -32
- package/dist/{chunk-j4c8s7tn.js → chunk-h5zv78zq.js} +9 -6
- package/dist/{chunk-cgn27dqf.js → chunk-ha5d5zfj.js} +3 -3
- package/dist/{chunk-crr52hf4.js → chunk-han7cwc0.js} +14 -12
- package/dist/{chunk-dnyeb288.js → chunk-hbv0tk35.js} +74 -106
- package/dist/{chunk-nxsh6de2.js → chunk-hcgkak1j.js} +20 -125
- package/dist/{chunk-224x480q.js → chunk-hd1p4hrd.js} +8 -6
- package/dist/{chunk-tjaqa99q.js → chunk-hezj20qy.js} +3 -3
- package/dist/{chunk-z7pr85qw.js → chunk-hfdyez7b.js} +3 -3
- package/dist/chunk-hh7hqa2c.js +272 -0
- package/dist/chunk-hk4a2sks.js +83 -0
- package/dist/{chunk-5zh1fbrj.js → chunk-hq85v2s7.js} +3 -3
- package/dist/chunk-hr06142m.js +117 -0
- package/dist/chunk-j1b3r6v6.js +66 -0
- package/dist/{chunk-v8xem37v.js → chunk-j2fgn3kq.js} +8 -6
- package/dist/chunk-j2wgj22c.js +441 -0
- package/dist/{chunk-9gbamk79.js → chunk-j5bth84e.js} +5 -1
- package/dist/{chunk-vratq94g.js → chunk-j9gxwbe3.js} +1 -1
- package/dist/{chunk-cettj572.js → chunk-ja87jt56.js} +7 -131
- package/dist/{chunk-3r24h7t6.js → chunk-jaaxk89e.js} +1 -1
- package/dist/{chunk-f4jcw0ea.js → chunk-jaew3662.js} +18 -14
- package/dist/{chunk-e1ge9n4d.js → chunk-jb2nh0m0.js} +2 -2
- package/dist/{chunk-f9b4wb89.js → chunk-jb4fc073.js} +84 -75
- package/dist/chunk-jba8f3hz.js +108 -0
- package/dist/{chunk-er9vzjac.js → chunk-jbt0jgtc.js} +16 -14
- package/dist/{chunk-v399mzxk.js → chunk-jf0p00fz.js} +2 -2
- package/dist/{chunk-vygf94dw.js → chunk-jg4ge4de.js} +78 -69
- package/dist/chunk-jkvy2cmt.js +346 -0
- package/dist/{chunk-80qg1pzv.js → chunk-jmdy5vdy.js} +11 -9
- package/dist/{chunk-dqh7e4mt.js → chunk-jn08nxj8.js} +52 -42
- package/dist/{chunk-av73dywf.js → chunk-jna2tcvj.js} +8 -8
- package/dist/chunk-jwh384j5.js +126 -0
- package/dist/chunk-jwx2scxy.js +222 -0
- package/dist/{chunk-41xeh3t9.js → chunk-jy6c07wa.js} +4 -4
- package/dist/{chunk-ctmt7xh1.js → chunk-jy77nthd.js} +740 -907
- package/dist/{chunk-hzttn8j7.js → chunk-jyjpaqbt.js} +139 -135
- package/dist/chunk-jztjnw31.js +147 -0
- package/dist/chunk-k0jhzcwg.js +2540 -0
- package/dist/{chunk-myzwt5yw.js → chunk-k0kwfqr8.js} +9 -15
- package/dist/{chunk-bqfnp99q.js → chunk-k3s4yk22.js} +1 -1
- package/dist/{chunk-1dyeexvn.js → chunk-kd3mmsd2.js} +4 -4
- package/dist/{chunk-x51h62jq.js → chunk-ke78h68m.js} +78 -69
- package/dist/{chunk-1xkekb9y.js → chunk-kfd89dsd.js} +5 -3
- package/dist/chunk-ksvvwa9w.js +111 -0
- package/dist/{chunk-jy35z4n0.js → chunk-m1z5td19.js} +9 -9
- package/dist/{chunk-jafes477.js → chunk-m2bcpk8j.js} +4 -3
- package/dist/{chunk-n6fbyke9.js → chunk-m2mzpskw.js} +3 -3
- package/dist/{chunk-s2dmn3yg.js → chunk-m47q5mxt.js} +5 -5
- package/dist/{chunk-s7qj2hg5.js → chunk-m8vyp6rw.js} +2 -2
- package/dist/chunk-mm4m13ng.js +881 -0
- package/dist/{chunk-ghr4s9g6.js → chunk-mq1qrwhq.js} +79 -70
- package/dist/{chunk-45e9mkyr.js → chunk-mqqw60br.js} +43 -83
- package/dist/chunk-mtcdknc8.js +2842 -0
- package/dist/{chunk-cvge4pvp.js → chunk-mzd6frw6.js} +2 -2
- package/dist/{chunk-n2874aq5.js → chunk-n1neft0d.js} +13 -7
- package/dist/{chunk-bcrxtdcy.js → chunk-n2mysxn1.js} +40 -30
- package/dist/chunk-n4wkxbq0.js +365 -0
- package/dist/chunk-n57dw6h9.js +128 -0
- package/dist/chunk-n5wf3b82.js +118 -0
- package/dist/{chunk-zgrg0wk3.js → chunk-n7ce94nd.js} +27 -67
- package/dist/{chunk-me2ef6g4.js → chunk-n8mpqdje.js} +1 -1
- package/dist/{chunk-g5sg6y9q.js → chunk-na2e0dfj.js} +82 -72
- package/dist/chunk-netzwgv1.js +154 -0
- package/dist/{chunk-xszk7n10.js → chunk-nh3cd07f.js} +1 -1
- package/dist/{chunk-5tx8dsy0.js → chunk-npjsp3z3.js} +10493 -18453
- package/dist/{chunk-5hva0tsg.js → chunk-p2yv7m0g.js} +6 -6
- package/dist/chunk-p4rmbc1e.js +409 -0
- package/dist/chunk-p7jdncj4.js +122 -0
- package/dist/{chunk-zk2wsm7d.js → chunk-p7vkh4wx.js} +2 -2
- package/dist/{chunk-da4ve9t5.js → chunk-p8crqj70.js} +10 -10
- package/dist/{chunk-hy3g1nv8.js → chunk-prw4xz5q.js} +9 -7
- package/dist/{chunk-zsfxha74.js → chunk-pshjyzq4.js} +8 -7
- package/dist/{chunk-684kdqez.js → chunk-q08sb44h.js} +203 -304
- package/dist/{chunk-n7158r58.js → chunk-q78bgdtk.js} +79 -70
- package/dist/{chunk-e5pntxye.js → chunk-q7tpyeb3.js} +6 -4
- package/dist/{chunk-7ymfj7m3.js → chunk-q82r31er.js} +1 -1
- package/dist/chunk-qajrkk97.js +298 -0
- package/dist/chunk-qbrsmra3.js +23 -0
- package/dist/chunk-qhfn4vgv.js +66 -0
- package/dist/{chunk-d7mx1phm.js → chunk-qndzvkdx.js} +61 -103
- package/dist/{chunk-35y0r56v.js → chunk-qtfc6wdh.js} +1 -4
- package/dist/{chunk-v9y80148.js → chunk-qwcnwn5t.js} +100 -191
- package/dist/chunk-qwehvedn.js +440 -0
- package/dist/{chunk-2cgdr2n7.js → chunk-qwk9fq7r.js} +78 -69
- package/dist/chunk-qy75c2vm.js +70 -0
- package/dist/{chunk-rryx19hp.js → chunk-r2k2jy0y.js} +2 -2
- package/dist/chunk-r47p0ff0.js +61 -0
- package/dist/{chunk-t3bf8hcf.js → chunk-r5tk54yt.js} +2 -2
- package/dist/{chunk-bt9krt49.js → chunk-r8q993g6.js} +38 -32
- package/dist/{chunk-veb0gkcf.js → chunk-ra2rykps.js} +78 -69
- package/dist/{chunk-gbcqdr0x.js → chunk-rav5xp8h.js} +1 -1
- package/dist/chunk-rbe0tcn9.js +120 -0
- package/dist/chunk-rd5cfz3k.js +68 -0
- package/dist/{chunk-cenpqc2t.js → chunk-rdvaan98.js} +8 -6
- package/dist/{chunk-dr4qq42x.js → chunk-rgbbtszq.js} +9 -9
- package/dist/chunk-rjsb9s3q.js +206 -0
- package/dist/{chunk-fdwa7gem.js → chunk-rkak3kjw.js} +7 -7
- package/dist/{chunk-a6s8wnhe.js → chunk-rnam0xc5.js} +4 -4
- package/dist/chunk-rqkqbppr.js +112 -0
- package/dist/{chunk-ye18m1zb.js → chunk-rqvqqrpg.js} +38 -8
- package/dist/{chunk-rw466wqn.js → chunk-rvkvehat.js} +5284 -3093
- package/dist/chunk-s1baskk7.js +14 -0
- package/dist/{chunk-jt0pha6y.js → chunk-s5gnvx67.js} +227 -198
- package/dist/chunk-s7dtt7tw.js +109 -0
- package/dist/chunk-s9ftt1fh.js +135 -0
- package/dist/chunk-sc6sy490.js +240 -0
- package/dist/chunk-sh9er84d.js +1073 -0
- package/dist/{chunk-faycqscv.js → chunk-sk9xag9g.js} +2 -2
- package/dist/{chunk-zpc0kwkb.js → chunk-t0g8wbcq.js} +7 -7
- package/dist/chunk-tbgm1v8n.js +146 -0
- package/dist/{chunk-35b0ek0j.js → chunk-tcdv4gp8.js} +13 -9
- package/dist/{chunk-mt25echc.js → chunk-tezak8rx.js} +1 -1
- package/dist/chunk-thk6yn51.js +154 -0
- package/dist/{chunk-s2gm9vfk.js → chunk-tkf24yhv.js} +7 -7
- package/dist/{chunk-6td4c2eq.js → chunk-tkrjcekq.js} +54 -72
- package/dist/{chunk-9rcbyag3.js → chunk-tmdbrszg.js} +2 -2
- package/dist/chunk-tw2g1yhq.js +118 -0
- package/dist/chunk-twzjxwhf.js +182 -0
- package/dist/{chunk-m94pnhfa.js → chunk-v4e4f711.js} +39 -29
- package/dist/{chunk-b51jjfh5.js → chunk-v5k7zmqm.js} +43 -32
- package/dist/chunk-var1et7e.js +66 -0
- package/dist/chunk-vd11xbz3.js +304 -0
- package/dist/{chunk-hqmz36b3.js → chunk-vf612n57.js} +21 -101
- package/dist/chunk-vfhqj46w.js +144 -0
- package/dist/chunk-vkxx8ymr.js +2377 -0
- package/dist/{chunk-n9x557ea.js → chunk-vs094cby.js} +2332 -4220
- package/dist/{chunk-dxc7begm.js → chunk-vtb8z6as.js} +14 -10
- package/dist/{chunk-x51mdzqq.js → chunk-vzd3cjy9.js} +3 -3
- package/dist/chunk-w2es9743.js +439 -0
- package/dist/{chunk-8z039kef.js → chunk-w92b262y.js} +53 -54
- package/dist/chunk-wa1dpga1.js +236 -0
- package/dist/{chunk-qf2v384j.js → chunk-wbmacbfb.js} +9 -7
- package/dist/{chunk-ryj80g9p.js → chunk-wbn46nb4.js} +136 -178
- package/dist/{chunk-t9z6njcr.js → chunk-wtycm8km.js} +9 -9
- package/dist/{chunk-q6rax9kh.js → chunk-wymtgh88.js} +5 -5
- package/dist/{chunk-pa7saazk.js → chunk-x0aj8rh8.js} +28 -56
- package/dist/{chunk-1szr63w0.js → chunk-x69w7xr7.js} +86 -74
- package/dist/{chunk-k5gdea6r.js → chunk-x6qmm22r.js} +84 -75
- package/dist/{chunk-zrse3zpz.js → chunk-xbprynsc.js} +18 -46
- package/dist/chunk-xc0v11v6.js +914 -0
- package/dist/chunk-xed18bb5.js +233 -0
- package/dist/{chunk-gjyc3293.js → chunk-xj76qk4z.js} +288 -499
- package/dist/chunk-xmd9eezd.js +83 -0
- package/dist/chunk-xrzrbw0f.js +142 -0
- package/dist/{chunk-fzxg8v1y.js → chunk-xycy3c8q.js} +15 -12
- package/dist/chunk-y0m0rd5v.js +140 -0
- package/dist/chunk-y2vtmzre.js +137 -0
- package/dist/{chunk-vybkxr18.js → chunk-y5z1cjbk.js} +42 -32
- package/dist/chunk-y60q54ph.js +111 -0
- package/dist/{chunk-d7vv2ydf.js → chunk-y78t50v0.js} +2 -2
- package/dist/{chunk-xkr7as9h.js → chunk-y9bgt2k1.js} +13 -9
- package/dist/chunk-ycwdzwz5.js +233 -0
- package/dist/chunk-yfyc2y1v.js +136 -0
- package/dist/chunk-yg6gtf9j.js +152 -0
- package/dist/{chunk-kyer92r4.js → chunk-yk8vcecd.js} +33 -5
- package/dist/{chunk-hkn7tzgv.js → chunk-ym5r3jnk.js} +1 -1
- package/dist/chunk-yr6gqw17.js +132 -0
- package/dist/chunk-yw62vhjz.js +445 -0
- package/dist/{chunk-athjeyrt.js → chunk-yw79dz62.js} +4 -4
- package/dist/{chunk-5mrhhmas.js → chunk-yx64nmbh.js} +8 -5
- package/dist/chunk-yy232vtj.js +84 -0
- package/dist/chunk-z1bs6d7k.js +24 -0
- package/dist/chunk-z4mgvsdj.js +456 -0
- package/dist/chunk-z6e5jp2w.js +119 -0
- package/dist/{chunk-t7cbhqd2.js → chunk-z6zt2ns7.js} +111 -123
- package/dist/chunk-z735r3p2.js +114 -0
- package/dist/{chunk-rjz6btwk.js → chunk-z7ssqvt6.js} +4972 -4638
- package/dist/{chunk-bpts9jbq.js → chunk-z8nv1ah0.js} +39 -31
- package/dist/chunk-z9mbssbe.js +128 -0
- package/dist/chunk-zdctabq6.js +264 -0
- package/dist/{chunk-ve60fbtd.js → chunk-ze6zvkg6.js} +2 -2
- package/dist/{chunk-t0rgmccj.js → chunk-zejm280k.js} +1 -1
- package/dist/{chunk-krstc7m7.js → chunk-zfapazzd.js} +15 -11
- package/dist/{chunk-2j0j79p0.js → chunk-zg4ae27v.js} +8 -8
- package/dist/chunk-zqxe8qnw.js +3590 -0
- package/dist/{chunk-q6dpqj3z.js → chunk-zs2ddzfv.js} +10 -7
- package/dist/chunk-zy80g72r.js +512 -0
- package/dist/{chunk-g3t0act8.js → chunk-zzm33q8x.js} +1 -1
- package/dist/{chunk-s8fzxy94.js → chunk-zzzc1ead.js} +17 -13
- package/dist/cli.js +63 -11
- package/dist/vendor/audio-capture/arm64-darwin/audio-capture.node +0 -0
- package/dist/vendor/audio-capture/arm64-linux/audio-capture.node +0 -0
- package/dist/vendor/audio-capture/arm64-win32/audio-capture.node +0 -0
- package/dist/vendor/audio-capture/x64-darwin/audio-capture.node +0 -0
- package/dist/vendor/audio-capture/x64-linux/audio-capture.node +0 -0
- package/dist/vendor/audio-capture/x64-win32/audio-capture.node +0 -0
- package/package.json +8 -5
- package/scripts/postinstall.cjs +319 -0
- package/dist/chunk-0291smg3.js +0 -42
- package/dist/chunk-04g2ty3v.js +0 -104
- package/dist/chunk-069x95ne.js +0 -764
- package/dist/chunk-06x02eab.js +0 -655
- package/dist/chunk-09pjmga5.js +0 -713
- package/dist/chunk-0g90je6r.js +0 -145
- package/dist/chunk-0paqc2yw.js +0 -15
- package/dist/chunk-0rddv9vb.js +0 -328
- package/dist/chunk-162w6yv3.js +0 -756
- package/dist/chunk-1gjbaa3n.js +0 -128
- package/dist/chunk-23wg4mnt.js +0 -404
- package/dist/chunk-2gbjtg7c.js +0 -102
- package/dist/chunk-2v1q0ezq.js +0 -102
- package/dist/chunk-37n7jkxe.js +0 -436
- package/dist/chunk-38svjnh4.js +0 -158
- package/dist/chunk-3bg1089y.js +0 -616
- package/dist/chunk-3d8ck5ne.js +0 -112
- package/dist/chunk-3g6rf9sz.js +0 -106
- package/dist/chunk-3x3rr2n5.js +0 -57
- package/dist/chunk-4f6q3d38.js +0 -117
- package/dist/chunk-4h57km3m.js +0 -74
- package/dist/chunk-4kyh2618.js +0 -99
- package/dist/chunk-4w9vc9vc.js +0 -119
- package/dist/chunk-53hqpp5z.js +0 -208
- package/dist/chunk-5deqy8r0.js +0 -143
- package/dist/chunk-5m2rmc2k.js +0 -128
- package/dist/chunk-5wp9pkpt.js +0 -539
- package/dist/chunk-5ym9f6w3.js +0 -263
- package/dist/chunk-6f938733.js +0 -1027
- package/dist/chunk-6nenxecd.js +0 -115
- package/dist/chunk-6rja0h86.js +0 -1593
- package/dist/chunk-70q6dp4d.js +0 -96
- package/dist/chunk-7bn0wzs3.js +0 -1493
- package/dist/chunk-7e2e0bfm.js +0 -65
- package/dist/chunk-7ywadnax.js +0 -490
- package/dist/chunk-7z33j54s.js +0 -142
- package/dist/chunk-8yvfkzyh.js +0 -58
- package/dist/chunk-9abpx1kv.js +0 -2833
- package/dist/chunk-9ks2nswb.js +0 -114
- package/dist/chunk-9wrds5tr.js +0 -109
- package/dist/chunk-ab2twken.js +0 -102
- package/dist/chunk-abncjeag.js +0 -97
- package/dist/chunk-am6w4x6y.js +0 -103
- package/dist/chunk-b1xt9jqg.js +0 -28
- package/dist/chunk-b73bd7db.js +0 -496
- package/dist/chunk-bc7nvynh.js +0 -195
- package/dist/chunk-br17dhef.js +0 -103
- package/dist/chunk-c3k0sdey.js +0 -281
- package/dist/chunk-c909bmyv.js +0 -103
- package/dist/chunk-cftsv9w4.js +0 -129
- package/dist/chunk-cj1a7npk.js +0 -99
- package/dist/chunk-cpma9zs5.js +0 -335
- package/dist/chunk-cyscs4k5.js +0 -1330
- package/dist/chunk-czr7y063.js +0 -348
- package/dist/chunk-d93sndem.js +0 -372
- package/dist/chunk-ddz8xbpd.js +0 -481
- package/dist/chunk-dkhqx4hk.js +0 -84
- package/dist/chunk-dsrharmv.js +0 -359
- package/dist/chunk-eqmy5d05.js +0 -56
- package/dist/chunk-f2crxw2c.js +0 -5400
- package/dist/chunk-f8zga40p.js +0 -234
- package/dist/chunk-fbgm2ym6.js +0 -990
- package/dist/chunk-fcbbsswe.js +0 -119
- package/dist/chunk-fda654nt.js +0 -6121
- package/dist/chunk-ffmv9ezj.js +0 -104
- package/dist/chunk-fmjte7md.js +0 -38
- package/dist/chunk-fqtwqxxc.js +0 -293
- package/dist/chunk-g8k85nkd.js +0 -802
- package/dist/chunk-ge4ak7dj.js +0 -127
- package/dist/chunk-gpqemecy.js +0 -126
- package/dist/chunk-h19p6s3b.js +0 -131
- package/dist/chunk-j0sk1rct.js +0 -998
- package/dist/chunk-j1wfpa1a.js +0 -70
- package/dist/chunk-j829fx31.js +0 -3458
- package/dist/chunk-jqctzrvd.js +0 -722
- package/dist/chunk-jx817w05.js +0 -11
- package/dist/chunk-ka6sab33.js +0 -174
- package/dist/chunk-krjsvmwp.js +0 -101
- package/dist/chunk-kvpe50pm.js +0 -311
- package/dist/chunk-mez504fj.js +0 -113
- package/dist/chunk-mj6wbrae.js +0 -105
- package/dist/chunk-n0k8xrey.js +0 -319
- package/dist/chunk-n0pg2kpe.js +0 -122
- package/dist/chunk-n4qtqkp0.js +0 -295
- package/dist/chunk-n9meha2m.js +0 -73
- package/dist/chunk-ndk7q5n3.js +0 -169
- package/dist/chunk-ng6n9t4h.js +0 -56
- package/dist/chunk-p3pz13x2.js +0 -1933
- package/dist/chunk-p9ez6zgq.js +0 -2656
- package/dist/chunk-ph750kx1.js +0 -550
- package/dist/chunk-pxb99zqs.js +0 -117
- package/dist/chunk-q1yqc5n3.js +0 -100
- package/dist/chunk-q5b91nhh.js +0 -40
- package/dist/chunk-qtfqk0jr.js +0 -131
- package/dist/chunk-qzfmdh1t.js +0 -388
- package/dist/chunk-r3cv0j9n.js +0 -456
- package/dist/chunk-rx0pbgym.js +0 -97
- package/dist/chunk-s624rd5j.js +0 -531
- package/dist/chunk-satndwqj.js +0 -285
- package/dist/chunk-ssrxnkd1.js +0 -109
- package/dist/chunk-t2pgctqx.js +0 -106
- package/dist/chunk-t7sgwf31.js +0 -644
- package/dist/chunk-tth904tj.js +0 -53
- package/dist/chunk-typpbjhy.js +0 -128
- package/dist/chunk-vp6nrhdq.js +0 -102
- package/dist/chunk-vtjm53nt.js +0 -432
- package/dist/chunk-w412n7tq.js +0 -469
- package/dist/chunk-w4153rky.js +0 -1885
- package/dist/chunk-wdgv15as.js +0 -212
- package/dist/chunk-wgn9kydv.js +0 -58
- package/dist/chunk-whknbrk0.js +0 -184
- package/dist/chunk-x1k8e1xc.js +0 -56
- package/dist/chunk-x45xx6sc.js +0 -105
- package/dist/chunk-x4xvqbe5.js +0 -1166
- package/dist/chunk-x8b7vft8.js +0 -132
- package/dist/chunk-xaycc8qe.js +0 -44
- package/dist/chunk-xd4785ks.js +0 -73
- package/dist/chunk-xjxgmxhq.js +0 -463
- package/dist/chunk-xx2x3tz9.js +0 -166
- package/dist/chunk-y2j23eem.js +0 -101
- package/dist/chunk-y83j09wv.js +0 -123
- package/dist/chunk-yh8460pb.js +0 -119
- package/dist/chunk-z6nhchdb.js +0 -60
- package/dist/chunk-zbt73sj7.js +0 -192
- package/dist/chunk-zmwaatmq.js +0 -118
- package/dist/chunk-zvdg9tex.js +0 -135
- package/dist/chunk-zwa780cx.js +0 -584
- package/dist/{chunk-whvdag1y.js → chunk-3bfs3x0h.js} +9 -9
- package/dist/{chunk-27xc1csx.js → chunk-dggvswz1.js} +3 -3
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
Server,
|
|
6
6
|
init_server,
|
|
7
7
|
init_types
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-4cp6193g.js";
|
|
9
9
|
import {
|
|
10
10
|
__esm
|
|
11
11
|
} from "./chunk-qp2qdcda.js";
|
|
@@ -293,6 +293,263 @@ function buildComputerUseTools(caps, coordinateMode, installedAppNames) {
|
|
|
293
293
|
required: ["app"]
|
|
294
294
|
}
|
|
295
295
|
},
|
|
296
|
+
...caps.platform === "win32" ? [
|
|
297
|
+
{
|
|
298
|
+
name: "window_management",
|
|
299
|
+
description: "Manage the bound application window via Win32 API calls (ShowWindow, SetWindowPos, SendMessage). " + "All operations target the bound HWND directly \u2014 NO global shortcuts (Win+Down, Alt+F4, etc.). " + "The window must have been opened via open_application first. " + "Actions: minimize (hide to taskbar), maximize (fill screen), restore (undo min/max), " + "close (graceful WM_CLOSE), focus (bring to front), move_offscreen (move to -32000,-32000 for background operation). " + "Use move_resize to reposition or resize the window to specific coordinates.",
|
|
300
|
+
inputSchema: {
|
|
301
|
+
type: "object",
|
|
302
|
+
properties: {
|
|
303
|
+
action: {
|
|
304
|
+
type: "string",
|
|
305
|
+
enum: ["minimize", "maximize", "restore", "close", "focus", "move_offscreen", "move_resize", "get_rect"],
|
|
306
|
+
description: "minimize: ShowWindow(SW_MINIMIZE). " + "maximize: ShowWindow(SW_MAXIMIZE). " + "restore: ShowWindow(SW_RESTORE) \u2014 undo minimize or maximize. " + "close: SendMessage(WM_CLOSE) \u2014 graceful close. " + "focus: SetForegroundWindow + BringWindowToTop. " + "move_offscreen: SetWindowPos(-32000,-32000) \u2014 keeps window usable by SendMessage/PrintWindow but invisible. " + "move_resize: SetWindowPos to specific x,y,width,height. " + "get_rect: GetWindowRect \u2014 returns current position and size."
|
|
307
|
+
},
|
|
308
|
+
x: { type: "integer", description: "X position for move_resize." },
|
|
309
|
+
y: { type: "integer", description: "Y position for move_resize." },
|
|
310
|
+
width: { type: "integer", description: "Width for move_resize." },
|
|
311
|
+
height: { type: "integer", description: "Height for move_resize." }
|
|
312
|
+
},
|
|
313
|
+
required: ["action"]
|
|
314
|
+
}
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
name: "click_element",
|
|
318
|
+
description: "Click a GUI element by its accessible name, role, or automationId \u2014 no pixel coordinates needed. " + "Uses Windows UI Automation to find the element and InvokePattern to click it. " + "Prefer this over left_click when the element name is visible in the accessibility snapshot. " + "Falls back to BoundingRect center-click if InvokePattern is not supported.",
|
|
319
|
+
inputSchema: {
|
|
320
|
+
type: "object",
|
|
321
|
+
properties: {
|
|
322
|
+
name: {
|
|
323
|
+
type: "string",
|
|
324
|
+
description: 'Accessible name of the element (e.g. "Save", "File", "Search..."). Case-insensitive partial match.'
|
|
325
|
+
},
|
|
326
|
+
role: {
|
|
327
|
+
type: "string",
|
|
328
|
+
description: 'Control type (e.g. "Button", "MenuItem", "Edit", "Link"). Optional \u2014 narrows the search.'
|
|
329
|
+
},
|
|
330
|
+
automationId: {
|
|
331
|
+
type: "string",
|
|
332
|
+
description: "Exact automationId from the accessibility snapshot. Most precise selector."
|
|
333
|
+
}
|
|
334
|
+
},
|
|
335
|
+
required: []
|
|
336
|
+
}
|
|
337
|
+
},
|
|
338
|
+
{
|
|
339
|
+
name: "type_into_element",
|
|
340
|
+
description: "Type text into a named GUI element using Windows UI Automation ValuePattern. " + "Finds the element by name/role/automationId, then sets its value directly \u2014 " + "no need to click first or use pixel coordinates. Works on Edit, ComboBox, and other value-holding controls.",
|
|
341
|
+
inputSchema: {
|
|
342
|
+
type: "object",
|
|
343
|
+
properties: {
|
|
344
|
+
name: { type: "string", description: "Accessible name of the target element." },
|
|
345
|
+
role: { type: "string", description: 'Control type (optional, e.g. "Edit").' },
|
|
346
|
+
automationId: { type: "string", description: "Exact automationId." },
|
|
347
|
+
text: { type: "string", description: "Text to type/set into the element." }
|
|
348
|
+
},
|
|
349
|
+
required: ["text"]
|
|
350
|
+
}
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
name: "open_terminal",
|
|
354
|
+
description: "Open a new terminal window and launch an AI agent CLI. " + "This is a workflow tool that automates: open terminal \u2192 type startup command \u2192 press Enter \u2192 wait \u2192 verify. " + "Supported agents: claude (runs 'claude'), codex (runs 'codex'), gemini (runs 'gemini'), " + "or any custom command. After launching, the tool binds to the new terminal window " + "and takes a screenshot to verify the agent started successfully. " + "Use this when the user says: 'open Claude Code', 'start a Codex terminal', 'launch Gemini', etc.",
|
|
355
|
+
inputSchema: {
|
|
356
|
+
type: "object",
|
|
357
|
+
properties: {
|
|
358
|
+
agent: {
|
|
359
|
+
type: "string",
|
|
360
|
+
enum: ["claude", "codex", "gemini", "custom"],
|
|
361
|
+
description: "Which agent to launch. " + "claude: runs 'claude' command. " + "codex: runs 'codex' command. " + "gemini: runs 'gemini' command. " + "custom: runs the command specified in 'command' parameter."
|
|
362
|
+
},
|
|
363
|
+
command: {
|
|
364
|
+
type: "string",
|
|
365
|
+
description: "Custom command to run in the terminal. Only used when agent='custom'. Example: 'python app.py'"
|
|
366
|
+
},
|
|
367
|
+
terminal: {
|
|
368
|
+
type: "string",
|
|
369
|
+
enum: ["wt", "powershell", "cmd"],
|
|
370
|
+
description: "Which terminal to open. Default: 'wt' (Windows Terminal). 'powershell' for PowerShell window, 'cmd' for Command Prompt."
|
|
371
|
+
},
|
|
372
|
+
working_directory: {
|
|
373
|
+
type: "string",
|
|
374
|
+
description: "Working directory for the terminal. If omitted, uses current directory."
|
|
375
|
+
}
|
|
376
|
+
},
|
|
377
|
+
required: ["agent"]
|
|
378
|
+
}
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
name: "bind_window",
|
|
382
|
+
description: "Bind to a specific window for all subsequent operations (screenshot, click, type, etc.). " + "Once bound, screenshots capture only that window via PrintWindow, and all input goes through SendMessageW \u2014 " + "no cursor movement, no focus steal, no interference with the user's desktop. " + "Actions: bind (by title, hwnd, or pid), unbind (release binding), status (show current binding), list (show all visible windows). " + "Use 'list' first to see available windows, then 'bind' with a title or hwnd. " + "open_application auto-binds the launched window, but use this tool to bind to already-running windows or switch between windows.",
|
|
383
|
+
inputSchema: {
|
|
384
|
+
type: "object",
|
|
385
|
+
properties: {
|
|
386
|
+
action: {
|
|
387
|
+
type: "string",
|
|
388
|
+
enum: ["bind", "unbind", "status", "list"],
|
|
389
|
+
description: "bind: Bind to a window (specify title, hwnd, or pid). " + "unbind: Release the current binding, return to full-screen mode. " + "status: Show the currently bound window (hwnd, title, rect). " + "list: List all visible windows with hwnd, pid, and title."
|
|
390
|
+
},
|
|
391
|
+
title: {
|
|
392
|
+
type: "string",
|
|
393
|
+
description: "Window title to search for (partial match, case-insensitive). For 'bind' action."
|
|
394
|
+
},
|
|
395
|
+
hwnd: {
|
|
396
|
+
type: "string",
|
|
397
|
+
description: "Exact window handle from 'list' output. For 'bind' action."
|
|
398
|
+
},
|
|
399
|
+
pid: {
|
|
400
|
+
type: "integer",
|
|
401
|
+
description: "Process ID to find window for. For 'bind' action."
|
|
402
|
+
}
|
|
403
|
+
},
|
|
404
|
+
required: ["action"]
|
|
405
|
+
}
|
|
406
|
+
},
|
|
407
|
+
{
|
|
408
|
+
name: "activate_window",
|
|
409
|
+
description: "Activate the bound window: bring it to foreground, click to ensure keyboard focus, " + "and optionally send an initial key sequence. Use this before any input operations to guarantee " + "the window is ready to receive keyboard/mouse events. " + "Combines SetForegroundWindow + BringWindowToTop + SendMessage(WM_LBUTTONDOWN) in one call.",
|
|
410
|
+
inputSchema: {
|
|
411
|
+
type: "object",
|
|
412
|
+
properties: {
|
|
413
|
+
click_x: { type: "integer", description: "X coordinate to click after activation (client-area). If omitted, clicks center of window." },
|
|
414
|
+
click_y: { type: "integer", description: "Y coordinate to click after activation (client-area). If omitted, clicks center of window." }
|
|
415
|
+
},
|
|
416
|
+
required: []
|
|
417
|
+
}
|
|
418
|
+
},
|
|
419
|
+
{
|
|
420
|
+
name: "prompt_respond",
|
|
421
|
+
description: "Handle interactive CLI/terminal prompts (Yes/No, selection menus, confirmations). " + "Sends a sequence of key events to the bound window to navigate and confirm a prompt. " + "This is a convenience wrapper around bound-window keyboard input for common prompt flows. " + "Typical flows: " + "1) Yes/No prompt \u2192 send 'y' or 'n' + Enter. " + "2) Arrow-key selection menu \u2192 send arrow_down/arrow_up N times + Enter. " + "3) Text input prompt \u2192 type the response + Enter. " + "After responding, take a screenshot to verify the result.",
|
|
422
|
+
inputSchema: {
|
|
423
|
+
type: "object",
|
|
424
|
+
properties: {
|
|
425
|
+
response_type: {
|
|
426
|
+
type: "string",
|
|
427
|
+
enum: ["yes", "no", "enter", "escape", "select", "type"],
|
|
428
|
+
description: "yes: send 'y' + Enter. " + "no: send 'n' + Enter. " + "enter: send Enter only. " + "escape: send Escape (cancel). " + "select: use arrow keys to navigate to an option, then Enter. Requires 'arrow_count'. " + "type: type custom text then Enter. Requires 'text'."
|
|
429
|
+
},
|
|
430
|
+
arrow_direction: {
|
|
431
|
+
type: "string",
|
|
432
|
+
enum: ["up", "down"],
|
|
433
|
+
description: "Arrow key direction for 'select' type. Default: 'down'."
|
|
434
|
+
},
|
|
435
|
+
arrow_count: {
|
|
436
|
+
type: "integer",
|
|
437
|
+
description: "Number of arrow key presses for 'select' type. Default: 1.",
|
|
438
|
+
minimum: 0,
|
|
439
|
+
maximum: 50
|
|
440
|
+
},
|
|
441
|
+
text: {
|
|
442
|
+
type: "string",
|
|
443
|
+
description: "Text to type for 'type' response_type."
|
|
444
|
+
}
|
|
445
|
+
},
|
|
446
|
+
required: ["response_type"]
|
|
447
|
+
}
|
|
448
|
+
},
|
|
449
|
+
{
|
|
450
|
+
name: "status_indicator",
|
|
451
|
+
description: "Control the visual status indicator overlay on the bound window. " + "The indicator is a small floating label at the bottom of the window that shows what Computer Use is doing. " + "It auto-shows during click/type/key/scroll operations, but you can also send custom messages. " + "Actions: show (display a custom message), hide (dismiss), status (check if active).",
|
|
452
|
+
inputSchema: {
|
|
453
|
+
type: "object",
|
|
454
|
+
properties: {
|
|
455
|
+
action: {
|
|
456
|
+
type: "string",
|
|
457
|
+
enum: ["show", "hide", "status"],
|
|
458
|
+
description: "show: display a custom message on the indicator. hide: dismiss the indicator. status: check if indicator is active."
|
|
459
|
+
},
|
|
460
|
+
message: {
|
|
461
|
+
type: "string",
|
|
462
|
+
description: "Custom message to display (for 'show' action). Supports emoji. Auto-fades after 2 seconds."
|
|
463
|
+
}
|
|
464
|
+
},
|
|
465
|
+
required: ["action"]
|
|
466
|
+
}
|
|
467
|
+
},
|
|
468
|
+
{
|
|
469
|
+
name: "virtual_keyboard",
|
|
470
|
+
description: "Send keyboard input directly to the bound window via SendMessageW \u2014 independent of the physical keyboard. " + "The user can keep typing on their own keyboard without interference. " + "Supports: single keys, key combinations (Ctrl+S, Alt+F4), text input, and hold-key operations. " + "All input targets the bound HWND only \u2014 no global keyboard events.",
|
|
471
|
+
inputSchema: {
|
|
472
|
+
type: "object",
|
|
473
|
+
properties: {
|
|
474
|
+
action: {
|
|
475
|
+
type: "string",
|
|
476
|
+
enum: ["type", "combo", "press", "release", "hold"],
|
|
477
|
+
description: "type: Send text string via WM_CHAR (Unicode, supports Chinese/emoji). " + "combo: Send a key combination like ctrl+s, alt+f4, ctrl+shift+a (press all, release in reverse). " + "press: Press a key down and hold it (pair with 'release'). " + "release: Release a previously pressed key. " + "hold: Press key(s) for a duration then release."
|
|
478
|
+
},
|
|
479
|
+
text: {
|
|
480
|
+
type: "string",
|
|
481
|
+
description: "For 'type': the text to input. For 'combo': key combination string (e.g. 'ctrl+s', 'alt+tab', 'ctrl+shift+a'). For 'press'/'release': single key name (e.g. 'shift', 'ctrl', 'a')."
|
|
482
|
+
},
|
|
483
|
+
duration: {
|
|
484
|
+
type: "number",
|
|
485
|
+
description: "For 'hold': seconds to hold the key(s) before releasing. Default: 1."
|
|
486
|
+
},
|
|
487
|
+
repeat: {
|
|
488
|
+
type: "integer",
|
|
489
|
+
description: "Number of times to repeat the action. Default: 1.",
|
|
490
|
+
minimum: 1,
|
|
491
|
+
maximum: 100
|
|
492
|
+
}
|
|
493
|
+
},
|
|
494
|
+
required: ["action", "text"]
|
|
495
|
+
}
|
|
496
|
+
},
|
|
497
|
+
{
|
|
498
|
+
name: "virtual_mouse",
|
|
499
|
+
description: "Control a virtual mouse on the bound window via SendMessageW \u2014 independent of the physical mouse. " + "The user's real cursor stays free. All operations target the bound HWND only.",
|
|
500
|
+
inputSchema: {
|
|
501
|
+
type: "object",
|
|
502
|
+
properties: {
|
|
503
|
+
action: {
|
|
504
|
+
type: "string",
|
|
505
|
+
enum: ["click", "double_click", "right_click", "move", "drag", "down", "up"],
|
|
506
|
+
description: "click: left-click at coordinate. " + "double_click: double left-click. " + "right_click: right-click. " + "move: move virtual cursor (visual only, no click). " + "drag: press at start, move to end, release. Requires coordinate (end) and start_coordinate. " + "down: press left button at coordinate (hold). " + "up: release left button at coordinate."
|
|
507
|
+
},
|
|
508
|
+
coordinate: {
|
|
509
|
+
type: "array",
|
|
510
|
+
items: { type: "number" },
|
|
511
|
+
minItems: 2,
|
|
512
|
+
maxItems: 2,
|
|
513
|
+
description: "(x, y) client-area coordinate on the bound window."
|
|
514
|
+
},
|
|
515
|
+
start_coordinate: {
|
|
516
|
+
type: "array",
|
|
517
|
+
items: { type: "number" },
|
|
518
|
+
minItems: 2,
|
|
519
|
+
maxItems: 2,
|
|
520
|
+
description: "(x, y) start point for drag. If omitted, drags from current virtual cursor position."
|
|
521
|
+
}
|
|
522
|
+
},
|
|
523
|
+
required: ["action", "coordinate"]
|
|
524
|
+
}
|
|
525
|
+
},
|
|
526
|
+
{
|
|
527
|
+
name: "mouse_wheel",
|
|
528
|
+
description: "Scroll inside the bound window using mouse wheel (WM_MOUSEWHEEL / WM_MOUSEHWHEEL). " + "Unlike the generic 'scroll' tool which uses WM_VSCROLL (only works on scrollbar controls), " + "mouse_wheel simulates the physical mouse wheel and works on Excel spreadsheets, web pages, " + "code editors, PDF viewers, and any modern UI. " + "Specify the click point within the window where the scroll should occur \u2014 " + "this determines which panel/pane/element receives the scroll.",
|
|
529
|
+
inputSchema: {
|
|
530
|
+
type: "object",
|
|
531
|
+
properties: {
|
|
532
|
+
coordinate: {
|
|
533
|
+
type: "array",
|
|
534
|
+
items: { type: "number" },
|
|
535
|
+
minItems: 2,
|
|
536
|
+
maxItems: 2,
|
|
537
|
+
description: "(x, y) client-area coordinate where the scroll should occur. Determines which element receives the scroll."
|
|
538
|
+
},
|
|
539
|
+
delta: {
|
|
540
|
+
type: "integer",
|
|
541
|
+
description: "Scroll amount in 'clicks'. Positive = scroll up, negative = scroll down. Each click = 3 lines typically. Use -3 to -5 for page-like scrolling."
|
|
542
|
+
},
|
|
543
|
+
direction: {
|
|
544
|
+
type: "string",
|
|
545
|
+
enum: ["vertical", "horizontal"],
|
|
546
|
+
description: "Scroll direction. Default: 'vertical'. Use 'horizontal' for side-scrolling (e.g. wide Excel sheets, timeline views)."
|
|
547
|
+
}
|
|
548
|
+
},
|
|
549
|
+
required: ["coordinate", "delta"]
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
] : [],
|
|
296
553
|
{
|
|
297
554
|
name: "switch_display",
|
|
298
555
|
description: "Switch which monitor subsequent screenshots capture. Use this when the " + "application you need is on a different monitor than the one shown. " + "The screenshot tool tells you which monitor it captured and lists " + "other attached monitors by name \u2014 pass one of those names here. " + "After switching, call screenshot to see the new monitor. " + 'Pass "auto" to return to automatic monitor selection.',
|
|
@@ -1166,6 +1423,9 @@ async function runInputActionGates(adapter, overrides, subGates, actionKind) {
|
|
|
1166
1423
|
overrides.onAppsHidden?.(hidden);
|
|
1167
1424
|
}
|
|
1168
1425
|
}
|
|
1426
|
+
if (adapter.executor.capabilities.screenshotFiltering === "none") {
|
|
1427
|
+
return null;
|
|
1428
|
+
}
|
|
1169
1429
|
const frontmost = await adapter.executor.getFrontmostApp();
|
|
1170
1430
|
const tierByBundleId = new Map(overrides.allowedApps.map((a) => [a.bundleId, a.tier]));
|
|
1171
1431
|
const frontmostTier = frontmost ? tierByBundleId.get(frontmost.bundleId) : undefined;
|
|
@@ -1199,6 +1459,9 @@ async function runInputActionGates(adapter, overrides, subGates, actionKind) {
|
|
|
1199
1459
|
return errorResult(`"${frontmost.displayName}" is not in the allowed applications and is ` + `currently in front. Take a new screenshot \u2014 it may have appeared ` + `since your last one.`, "app_not_granted");
|
|
1200
1460
|
}
|
|
1201
1461
|
async function runHitTestGate(adapter, overrides, subGates, x, y, actionKind) {
|
|
1462
|
+
if (adapter.executor.capabilities.screenshotFiltering === "none") {
|
|
1463
|
+
return null;
|
|
1464
|
+
}
|
|
1202
1465
|
const target = await adapter.executor.appUnderPoint(x, y);
|
|
1203
1466
|
if (!target)
|
|
1204
1467
|
return null;
|
|
@@ -1281,9 +1544,9 @@ function resolveRequestedApps(requestedNames, installed, alreadyGrantedBundleIds
|
|
|
1281
1544
|
resolved = byLowerDisplayName.get(requested.toLowerCase());
|
|
1282
1545
|
}
|
|
1283
1546
|
if (!resolved) {
|
|
1284
|
-
const
|
|
1285
|
-
for (const app of
|
|
1286
|
-
if (
|
|
1547
|
+
const clean = requested.toLowerCase().replace(/\.exe$/, "").trim();
|
|
1548
|
+
for (const [name, app] of byLowerDisplayName) {
|
|
1549
|
+
if (name.includes(clean) || clean.includes(name)) {
|
|
1287
1550
|
resolved = app;
|
|
1288
1551
|
break;
|
|
1289
1552
|
}
|
|
@@ -1922,6 +2185,8 @@ async function handleScreenshot(adapter, overrides, subGates) {
|
|
|
1922
2185
|
content: [
|
|
1923
2186
|
...monitorNote2 ? [{ type: "text", text: monitorNote2 }] : [],
|
|
1924
2187
|
...hiddenNote2 ? [{ type: "text", text: hiddenNote2 }] : [],
|
|
2188
|
+
...shot2.accessibilityText ? [{ type: "text", text: `GUI elements in this window:
|
|
2189
|
+
${shot2.accessibilityText}` }] : [],
|
|
1925
2190
|
{
|
|
1926
2191
|
type: "image",
|
|
1927
2192
|
data: shot2.base64,
|
|
@@ -1949,6 +2214,8 @@ async function handleScreenshot(adapter, overrides, subGates) {
|
|
|
1949
2214
|
content: [
|
|
1950
2215
|
...monitorNote ? [{ type: "text", text: monitorNote }] : [],
|
|
1951
2216
|
...hiddenNote ? [{ type: "text", text: hiddenNote }] : [],
|
|
2217
|
+
...shot.accessibilityText ? [{ type: "text", text: `GUI elements in this window:
|
|
2218
|
+
${shot.accessibilityText}` }] : [],
|
|
1952
2219
|
{
|
|
1953
2220
|
type: "image",
|
|
1954
2221
|
data: shot.base64,
|
|
@@ -2207,6 +2474,355 @@ async function handleOpenApplication(adapter, args, overrides) {
|
|
|
2207
2474
|
}
|
|
2208
2475
|
return okText(`Opened "${app}".`);
|
|
2209
2476
|
}
|
|
2477
|
+
async function handleVirtualMouse(adapter, args) {
|
|
2478
|
+
if (!adapter.executor.virtualMouse) {
|
|
2479
|
+
return errorResult("virtual_mouse is only available on Windows with a bound window.", "feature_unavailable");
|
|
2480
|
+
}
|
|
2481
|
+
const action = requireString(args, "action");
|
|
2482
|
+
if (action instanceof Error)
|
|
2483
|
+
return errorResult(action.message, "bad_args");
|
|
2484
|
+
const coord = args.coordinate;
|
|
2485
|
+
if (!Array.isArray(coord) || coord.length < 2) {
|
|
2486
|
+
return errorResult("coordinate [x, y] is required.", "bad_args");
|
|
2487
|
+
}
|
|
2488
|
+
const validActions = new Set(["click", "double_click", "right_click", "move", "drag", "down", "up"]);
|
|
2489
|
+
if (!validActions.has(action)) {
|
|
2490
|
+
return errorResult(`Invalid action "${action}". Valid: ${[...validActions].join(", ")}`, "bad_args");
|
|
2491
|
+
}
|
|
2492
|
+
const startCoord = Array.isArray(args.start_coordinate) ? args.start_coordinate : undefined;
|
|
2493
|
+
const ok = await adapter.executor.virtualMouse({
|
|
2494
|
+
action,
|
|
2495
|
+
x: coord[0],
|
|
2496
|
+
y: coord[1],
|
|
2497
|
+
startX: startCoord?.[0],
|
|
2498
|
+
startY: startCoord?.[1]
|
|
2499
|
+
});
|
|
2500
|
+
if (!ok) {
|
|
2501
|
+
return errorResult("No window is currently bound.", "bad_args");
|
|
2502
|
+
}
|
|
2503
|
+
const desc = {
|
|
2504
|
+
click: `Click at (${coord[0]},${coord[1]})`,
|
|
2505
|
+
double_click: `Double-click at (${coord[0]},${coord[1]})`,
|
|
2506
|
+
right_click: `Right-click at (${coord[0]},${coord[1]})`,
|
|
2507
|
+
move: `Moved to (${coord[0]},${coord[1]})`,
|
|
2508
|
+
drag: `Dragged ${startCoord ? `(${startCoord[0]},${startCoord[1]})` : "current"} \u2192 (${coord[0]},${coord[1]})`,
|
|
2509
|
+
down: `Button down at (${coord[0]},${coord[1]})`,
|
|
2510
|
+
up: `Button up at (${coord[0]},${coord[1]})`
|
|
2511
|
+
};
|
|
2512
|
+
return okText(desc[action] ?? action);
|
|
2513
|
+
}
|
|
2514
|
+
async function handleVirtualKeyboard(adapter, args) {
|
|
2515
|
+
if (!adapter.executor.virtualKeyboard) {
|
|
2516
|
+
return errorResult("virtual_keyboard is only available on Windows with a bound window.", "feature_unavailable");
|
|
2517
|
+
}
|
|
2518
|
+
const action = requireString(args, "action");
|
|
2519
|
+
if (action instanceof Error)
|
|
2520
|
+
return errorResult(action.message, "bad_args");
|
|
2521
|
+
const text = requireString(args, "text");
|
|
2522
|
+
if (text instanceof Error)
|
|
2523
|
+
return errorResult(text.message, "bad_args");
|
|
2524
|
+
const validActions = new Set(["type", "combo", "press", "release", "hold"]);
|
|
2525
|
+
if (!validActions.has(action)) {
|
|
2526
|
+
return errorResult(`Invalid action "${action}". Valid: ${[...validActions].join(", ")}`, "bad_args");
|
|
2527
|
+
}
|
|
2528
|
+
const duration = typeof args.duration === "number" ? args.duration : undefined;
|
|
2529
|
+
const repeat = typeof args.repeat === "number" ? args.repeat : undefined;
|
|
2530
|
+
const ok = await adapter.executor.virtualKeyboard({
|
|
2531
|
+
action,
|
|
2532
|
+
text,
|
|
2533
|
+
duration,
|
|
2534
|
+
repeat
|
|
2535
|
+
});
|
|
2536
|
+
if (!ok) {
|
|
2537
|
+
return errorResult("No window is currently bound. Use open_application or bind_window first.", "bad_args");
|
|
2538
|
+
}
|
|
2539
|
+
const desc = {
|
|
2540
|
+
type: `Typed "${text.length > 40 ? text.slice(0, 40) + "..." : text}"`,
|
|
2541
|
+
combo: `Sent ${text}`,
|
|
2542
|
+
press: `Pressed ${text} (holding)`,
|
|
2543
|
+
release: `Released ${text}`,
|
|
2544
|
+
hold: `Held ${text} for ${duration ?? 1}s`
|
|
2545
|
+
};
|
|
2546
|
+
return okText(`${desc[action]}${repeat && repeat > 1 ? ` \xD7${repeat}` : ""}`);
|
|
2547
|
+
}
|
|
2548
|
+
async function handleStatusIndicator(adapter, args) {
|
|
2549
|
+
if (!adapter.executor.statusIndicator) {
|
|
2550
|
+
return errorResult("status_indicator is only available on Windows.", "feature_unavailable");
|
|
2551
|
+
}
|
|
2552
|
+
const action = requireString(args, "action");
|
|
2553
|
+
if (action instanceof Error)
|
|
2554
|
+
return errorResult(action.message, "bad_args");
|
|
2555
|
+
if (!["show", "hide", "status"].includes(action)) {
|
|
2556
|
+
return errorResult(`Invalid action "${action}". Valid: show, hide, status.`, "bad_args");
|
|
2557
|
+
}
|
|
2558
|
+
const message = typeof args.message === "string" ? args.message : undefined;
|
|
2559
|
+
if (action === "show" && !message) {
|
|
2560
|
+
return errorResult("'show' requires a message parameter.", "bad_args");
|
|
2561
|
+
}
|
|
2562
|
+
const result = await adapter.executor.statusIndicator(action, message);
|
|
2563
|
+
if (action === "status") {
|
|
2564
|
+
return okText(result.active ? "Indicator is active on the bound window." : "Indicator is not active (no window bound).");
|
|
2565
|
+
}
|
|
2566
|
+
if (action === "show") {
|
|
2567
|
+
return okText(`Indicator showing: "${message}"`);
|
|
2568
|
+
}
|
|
2569
|
+
return okText("Indicator hidden.");
|
|
2570
|
+
}
|
|
2571
|
+
async function handleMouseWheel(adapter, args) {
|
|
2572
|
+
if (!adapter.executor.mouseWheel) {
|
|
2573
|
+
return errorResult("mouse_wheel is only available on Windows with a bound window.", "feature_unavailable");
|
|
2574
|
+
}
|
|
2575
|
+
const coord = args.coordinate;
|
|
2576
|
+
if (!Array.isArray(coord) || coord.length < 2) {
|
|
2577
|
+
return errorResult("coordinate must be [x, y] array.", "bad_args");
|
|
2578
|
+
}
|
|
2579
|
+
const delta = typeof args.delta === "number" ? args.delta : undefined;
|
|
2580
|
+
if (delta === undefined) {
|
|
2581
|
+
return errorResult("delta is required (positive=up, negative=down).", "bad_args");
|
|
2582
|
+
}
|
|
2583
|
+
const horizontal = args.direction === "horizontal";
|
|
2584
|
+
const ok = await adapter.executor.mouseWheel(coord[0], coord[1], delta, horizontal);
|
|
2585
|
+
if (!ok) {
|
|
2586
|
+
return errorResult("No window is currently bound. Use open_application or bind_window first.", "bad_args");
|
|
2587
|
+
}
|
|
2588
|
+
return okText(`Mouse wheel: ${horizontal ? "horizontal" : "vertical"} scroll ${delta > 0 ? "up" : "down"} ${Math.abs(delta)} click(s) at (${coord[0]},${coord[1]}).`);
|
|
2589
|
+
}
|
|
2590
|
+
async function handleActivateWindow(adapter, args) {
|
|
2591
|
+
if (!adapter.executor.activateWindow) {
|
|
2592
|
+
return errorResult("activate_window is only available on Windows with a bound window.", "feature_unavailable");
|
|
2593
|
+
}
|
|
2594
|
+
const clickX = typeof args.click_x === "number" ? args.click_x : undefined;
|
|
2595
|
+
const clickY = typeof args.click_y === "number" ? args.click_y : undefined;
|
|
2596
|
+
const ok = await adapter.executor.activateWindow(clickX, clickY);
|
|
2597
|
+
if (!ok) {
|
|
2598
|
+
return errorResult("No window is currently bound. Use open_application or bind_window first.", "bad_args");
|
|
2599
|
+
}
|
|
2600
|
+
return okText("Window activated and focused. Ready for input.");
|
|
2601
|
+
}
|
|
2602
|
+
async function handlePromptRespond(adapter, args) {
|
|
2603
|
+
if (!adapter.executor.respondToPrompt) {
|
|
2604
|
+
return errorResult("prompt_respond is only available on Windows with a bound window.", "feature_unavailable");
|
|
2605
|
+
}
|
|
2606
|
+
const responseType = requireString(args, "response_type");
|
|
2607
|
+
if (responseType instanceof Error)
|
|
2608
|
+
return errorResult(responseType.message, "bad_args");
|
|
2609
|
+
const validTypes = new Set(["yes", "no", "enter", "escape", "select", "type"]);
|
|
2610
|
+
if (!validTypes.has(responseType)) {
|
|
2611
|
+
return errorResult(`Invalid response_type "${responseType}". Valid: ${[...validTypes].join(", ")}`, "bad_args");
|
|
2612
|
+
}
|
|
2613
|
+
if (responseType === "select" && typeof args.arrow_count !== "number") {
|
|
2614
|
+
return errorResult("'select' requires arrow_count parameter.", "bad_args");
|
|
2615
|
+
}
|
|
2616
|
+
if (responseType === "type" && typeof args.text !== "string") {
|
|
2617
|
+
return errorResult("'type' requires text parameter.", "bad_args");
|
|
2618
|
+
}
|
|
2619
|
+
const ok = await adapter.executor.respondToPrompt({
|
|
2620
|
+
responseType,
|
|
2621
|
+
arrowDirection: typeof args.arrow_direction === "string" ? args.arrow_direction : undefined,
|
|
2622
|
+
arrowCount: typeof args.arrow_count === "number" ? args.arrow_count : undefined,
|
|
2623
|
+
text: typeof args.text === "string" ? args.text : undefined
|
|
2624
|
+
});
|
|
2625
|
+
if (!ok) {
|
|
2626
|
+
return errorResult("No window is currently bound. Use open_application or bind_window first.", "bad_args");
|
|
2627
|
+
}
|
|
2628
|
+
const descriptions = {
|
|
2629
|
+
yes: "Sent 'y' + Enter.",
|
|
2630
|
+
no: "Sent 'n' + Enter.",
|
|
2631
|
+
enter: "Sent Enter.",
|
|
2632
|
+
escape: "Sent Escape.",
|
|
2633
|
+
select: `Navigated ${args.arrow_direction ?? "down"} ${args.arrow_count ?? 1} time(s) + Enter.`,
|
|
2634
|
+
type: `Typed "${args.text}" + Enter.`
|
|
2635
|
+
};
|
|
2636
|
+
return okText(`Prompt responded: ${descriptions[responseType] ?? responseType}. Take a screenshot to verify.`);
|
|
2637
|
+
}
|
|
2638
|
+
async function handleOpenTerminal(adapter, args) {
|
|
2639
|
+
if (!adapter.executor.openTerminal) {
|
|
2640
|
+
return errorResult("open_terminal is only available on Windows.", "feature_unavailable");
|
|
2641
|
+
}
|
|
2642
|
+
const agent = requireString(args, "agent");
|
|
2643
|
+
if (agent instanceof Error)
|
|
2644
|
+
return errorResult(agent.message, "bad_args");
|
|
2645
|
+
const validAgents = new Set(["claude", "codex", "gemini", "custom"]);
|
|
2646
|
+
if (!validAgents.has(agent)) {
|
|
2647
|
+
return errorResult(`Invalid agent "${agent}". Valid: claude, codex, gemini, custom.`, "bad_args");
|
|
2648
|
+
}
|
|
2649
|
+
if (agent === "custom" && typeof args.command !== "string") {
|
|
2650
|
+
return errorResult("agent='custom' requires 'command' parameter.", "bad_args");
|
|
2651
|
+
}
|
|
2652
|
+
const result = await adapter.executor.openTerminal({
|
|
2653
|
+
agent,
|
|
2654
|
+
command: typeof args.command === "string" ? args.command : undefined,
|
|
2655
|
+
terminal: typeof args.terminal === "string" ? args.terminal : undefined,
|
|
2656
|
+
workingDirectory: typeof args.working_directory === "string" ? args.working_directory : undefined
|
|
2657
|
+
});
|
|
2658
|
+
if (!result) {
|
|
2659
|
+
return errorResult("Failed to open terminal. Windows Terminal (wt.exe) may not be installed.", "launch_failed");
|
|
2660
|
+
}
|
|
2661
|
+
if (!result.launched) {
|
|
2662
|
+
return okText(`Terminal opened (hwnd=${result.hwnd}, "${result.title}") but no command was sent. Window is now bound.`);
|
|
2663
|
+
}
|
|
2664
|
+
const agentNames = {
|
|
2665
|
+
claude: "Claude Code",
|
|
2666
|
+
codex: "Codex",
|
|
2667
|
+
gemini: "Gemini",
|
|
2668
|
+
custom: args.command
|
|
2669
|
+
};
|
|
2670
|
+
return okText(`Terminal opened and ${agentNames[agent] ?? agent} launched.
|
|
2671
|
+
` + `Window: hwnd=${result.hwnd} "${result.title}"
|
|
2672
|
+
` + `Command: '${agent === "custom" ? args.command : agent}' + Enter
|
|
2673
|
+
` + `Status: bound to this terminal. Take a screenshot to verify the agent started.`);
|
|
2674
|
+
}
|
|
2675
|
+
async function handleBindWindow(adapter, args) {
|
|
2676
|
+
const action = requireString(args, "action");
|
|
2677
|
+
if (action instanceof Error)
|
|
2678
|
+
return errorResult(action.message, "bad_args");
|
|
2679
|
+
switch (action) {
|
|
2680
|
+
case "list": {
|
|
2681
|
+
if (!adapter.executor.listVisibleWindows) {
|
|
2682
|
+
return errorResult("bind_window is only available on Windows.", "feature_unavailable");
|
|
2683
|
+
}
|
|
2684
|
+
const windows = await adapter.executor.listVisibleWindows();
|
|
2685
|
+
if (windows.length === 0)
|
|
2686
|
+
return okText("No visible windows found.");
|
|
2687
|
+
const lines = windows.map((w) => `hwnd=${w.hwnd} pid=${w.pid} "${w.title}"`);
|
|
2688
|
+
return okText(`Visible windows (${windows.length}):
|
|
2689
|
+
${lines.join(`
|
|
2690
|
+
`)}`);
|
|
2691
|
+
}
|
|
2692
|
+
case "status": {
|
|
2693
|
+
if (!adapter.executor.getBindingStatus) {
|
|
2694
|
+
return errorResult("bind_window is only available on Windows.", "feature_unavailable");
|
|
2695
|
+
}
|
|
2696
|
+
const status = await adapter.executor.getBindingStatus();
|
|
2697
|
+
if (!status || !status.bound) {
|
|
2698
|
+
return okText("No window is currently bound. Use bind_window(action='list') to see available windows, then bind_window(action='bind', title='...') to bind.");
|
|
2699
|
+
}
|
|
2700
|
+
let text = `Bound to: hwnd=${status.hwnd}`;
|
|
2701
|
+
if (status.title)
|
|
2702
|
+
text += ` "${status.title}"`;
|
|
2703
|
+
if (status.pid)
|
|
2704
|
+
text += ` pid=${status.pid}`;
|
|
2705
|
+
if (status.rect)
|
|
2706
|
+
text += ` rect=(${status.rect.x},${status.rect.y} ${status.rect.width}x${status.rect.height})`;
|
|
2707
|
+
return okText(text);
|
|
2708
|
+
}
|
|
2709
|
+
case "bind": {
|
|
2710
|
+
if (!adapter.executor.bindToWindow) {
|
|
2711
|
+
return errorResult("bind_window is only available on Windows.", "feature_unavailable");
|
|
2712
|
+
}
|
|
2713
|
+
const title = typeof args.title === "string" ? args.title : undefined;
|
|
2714
|
+
const hwnd = typeof args.hwnd === "string" ? args.hwnd : undefined;
|
|
2715
|
+
const pid = typeof args.pid === "number" ? args.pid : undefined;
|
|
2716
|
+
if (!title && !hwnd && !pid) {
|
|
2717
|
+
return errorResult("Specify at least one of: title, hwnd, or pid.", "bad_args");
|
|
2718
|
+
}
|
|
2719
|
+
const result = await adapter.executor.bindToWindow({ hwnd, title, pid });
|
|
2720
|
+
if (!result) {
|
|
2721
|
+
return errorResult(`No window found matching: ${[title && `title="${title}"`, hwnd && `hwnd=${hwnd}`, pid && `pid=${pid}`].filter(Boolean).join(", ")}. Use bind_window(action='list') to see available windows.`, "element_not_found");
|
|
2722
|
+
}
|
|
2723
|
+
return okText(`Bound to window: hwnd=${result.hwnd} pid=${result.pid} "${result.title}". All subsequent screenshot/click/type operations target this window.`);
|
|
2724
|
+
}
|
|
2725
|
+
case "unbind": {
|
|
2726
|
+
if (!adapter.executor.unbindFromWindow) {
|
|
2727
|
+
return errorResult("bind_window is only available on Windows.", "feature_unavailable");
|
|
2728
|
+
}
|
|
2729
|
+
await adapter.executor.unbindFromWindow();
|
|
2730
|
+
return okText("Window binding released. Operations now target the full screen.");
|
|
2731
|
+
}
|
|
2732
|
+
default:
|
|
2733
|
+
return errorResult(`Unknown bind_window action "${action}". Valid: list, bind, unbind, status.`, "bad_args");
|
|
2734
|
+
}
|
|
2735
|
+
}
|
|
2736
|
+
async function handleClickElement(adapter, args) {
|
|
2737
|
+
if (!adapter.executor.clickElement) {
|
|
2738
|
+
return errorResult("click_element is only available on Windows with a bound window.", "feature_unavailable");
|
|
2739
|
+
}
|
|
2740
|
+
const name = typeof args.name === "string" ? args.name : undefined;
|
|
2741
|
+
const role = typeof args.role === "string" ? args.role : undefined;
|
|
2742
|
+
const automationId = typeof args.automationId === "string" ? args.automationId : undefined;
|
|
2743
|
+
if (!name && !role && !automationId) {
|
|
2744
|
+
return errorResult("At least one of name, role, or automationId is required.", "bad_args");
|
|
2745
|
+
}
|
|
2746
|
+
const ok = await adapter.executor.clickElement({ name, role, automationId });
|
|
2747
|
+
if (!ok) {
|
|
2748
|
+
return errorResult(`Element not found: ${[name && `name="${name}"`, role && `role=${role}`, automationId && `id=${automationId}`].filter(Boolean).join(", ")}. Take a screenshot to see current GUI elements.`, "element_not_found");
|
|
2749
|
+
}
|
|
2750
|
+
return okText(`Clicked element: ${[name && `"${name}"`, role, automationId].filter(Boolean).join(" ")}`);
|
|
2751
|
+
}
|
|
2752
|
+
async function handleTypeIntoElement(adapter, args) {
|
|
2753
|
+
if (!adapter.executor.typeIntoElement) {
|
|
2754
|
+
return errorResult("type_into_element is only available on Windows with a bound window.", "feature_unavailable");
|
|
2755
|
+
}
|
|
2756
|
+
const text = requireString(args, "text");
|
|
2757
|
+
if (text instanceof Error)
|
|
2758
|
+
return errorResult(text.message, "bad_args");
|
|
2759
|
+
const name = typeof args.name === "string" ? args.name : undefined;
|
|
2760
|
+
const role = typeof args.role === "string" ? args.role : undefined;
|
|
2761
|
+
const automationId = typeof args.automationId === "string" ? args.automationId : undefined;
|
|
2762
|
+
const ok = await adapter.executor.typeIntoElement({ name, role, automationId }, text);
|
|
2763
|
+
if (!ok) {
|
|
2764
|
+
return errorResult(`Could not type into element: ${[name && `name="${name}"`, role && `role=${role}`, automationId && `id=${automationId}`].filter(Boolean).join(", ")}. The element was not found or doesn't support text input.`, "element_not_found");
|
|
2765
|
+
}
|
|
2766
|
+
return okText(`Typed ${text.length} chars into: ${[name && `"${name}"`, role, automationId].filter(Boolean).join(" ")}`);
|
|
2767
|
+
}
|
|
2768
|
+
async function handleWindowManagement(adapter, args) {
|
|
2769
|
+
const action = requireString(args, "action");
|
|
2770
|
+
if (action instanceof Error)
|
|
2771
|
+
return errorResult(action.message, "bad_args");
|
|
2772
|
+
const VALID_ACTIONS = new Set([
|
|
2773
|
+
"minimize",
|
|
2774
|
+
"maximize",
|
|
2775
|
+
"restore",
|
|
2776
|
+
"close",
|
|
2777
|
+
"focus",
|
|
2778
|
+
"move_offscreen",
|
|
2779
|
+
"move_resize",
|
|
2780
|
+
"get_rect"
|
|
2781
|
+
]);
|
|
2782
|
+
if (!VALID_ACTIONS.has(action)) {
|
|
2783
|
+
return errorResult(`Unknown window_management action "${action}". Valid: ${[...VALID_ACTIONS].join(", ")}`, "bad_args");
|
|
2784
|
+
}
|
|
2785
|
+
if (!adapter.executor.manageWindow) {
|
|
2786
|
+
return errorResult("window_management is only available on Windows with a bound window.", "feature_unavailable");
|
|
2787
|
+
}
|
|
2788
|
+
if (action === "get_rect") {
|
|
2789
|
+
if (!adapter.executor.getWindowRect) {
|
|
2790
|
+
return errorResult("getWindowRect not available.", "feature_unavailable");
|
|
2791
|
+
}
|
|
2792
|
+
const rect = await adapter.executor.getWindowRect();
|
|
2793
|
+
if (!rect) {
|
|
2794
|
+
return errorResult("No window is currently bound. Call open_application first.", "bad_args");
|
|
2795
|
+
}
|
|
2796
|
+
return okText(`Window rect: x=${rect.x}, y=${rect.y}, width=${rect.width}, height=${rect.height}`);
|
|
2797
|
+
}
|
|
2798
|
+
if (action === "move_resize") {
|
|
2799
|
+
const x = typeof args.x === "number" ? args.x : undefined;
|
|
2800
|
+
const y = typeof args.y === "number" ? args.y : undefined;
|
|
2801
|
+
if (x === undefined || y === undefined) {
|
|
2802
|
+
return errorResult("move_resize requires x and y parameters.", "bad_args");
|
|
2803
|
+
}
|
|
2804
|
+
const width = typeof args.width === "number" ? args.width : undefined;
|
|
2805
|
+
const height = typeof args.height === "number" ? args.height : undefined;
|
|
2806
|
+
const ok2 = await adapter.executor.manageWindow(action, { x, y, width, height });
|
|
2807
|
+
if (!ok2) {
|
|
2808
|
+
return errorResult("No window is currently bound. Call open_application first.", "bad_args");
|
|
2809
|
+
}
|
|
2810
|
+
return okText(width && height ? `Moved window to (${x}, ${y}) and resized to ${width}\xD7${height}.` : `Moved window to (${x}, ${y}).`);
|
|
2811
|
+
}
|
|
2812
|
+
const ok = await adapter.executor.manageWindow(action);
|
|
2813
|
+
if (!ok) {
|
|
2814
|
+
return errorResult("No window is currently bound. Call open_application first.", "bad_args");
|
|
2815
|
+
}
|
|
2816
|
+
const descriptions = {
|
|
2817
|
+
minimize: "Window minimized (ShowWindow SW_MINIMIZE).",
|
|
2818
|
+
maximize: "Window maximized (ShowWindow SW_MAXIMIZE).",
|
|
2819
|
+
restore: "Window restored (ShowWindow SW_RESTORE).",
|
|
2820
|
+
close: "Window closed (SendMessage WM_CLOSE). The window binding has been released.",
|
|
2821
|
+
focus: "Window brought to front (SetForegroundWindow).",
|
|
2822
|
+
move_offscreen: "Window moved offscreen (-32000,-32000). Still usable via SendMessage/PrintWindow."
|
|
2823
|
+
};
|
|
2824
|
+
return okText(descriptions[action] ?? `Action "${action}" completed.`);
|
|
2825
|
+
}
|
|
2210
2826
|
async function handleSwitchDisplay(adapter, args, overrides) {
|
|
2211
2827
|
const display = requireString(args, "display");
|
|
2212
2828
|
if (display instanceof Error)
|
|
@@ -2432,6 +3048,68 @@ function firstTextContent(r) {
|
|
|
2432
3048
|
return first && first.type === "text" ? first.text : "";
|
|
2433
3049
|
}
|
|
2434
3050
|
async function dispatchAction(name, a, adapter, overrides, subGates) {
|
|
3051
|
+
const hasBoundWindow = await adapter.executor.hasBoundWindow?.() === true && adapter.executor.virtualMouse && adapter.executor.virtualKeyboard;
|
|
3052
|
+
if (hasBoundWindow) {
|
|
3053
|
+
const coord = Array.isArray(a.coordinate) ? a.coordinate : undefined;
|
|
3054
|
+
switch (name) {
|
|
3055
|
+
case "left_click":
|
|
3056
|
+
if (coord)
|
|
3057
|
+
return handleVirtualMouse(adapter, { action: "click", coordinate: coord });
|
|
3058
|
+
break;
|
|
3059
|
+
case "double_click":
|
|
3060
|
+
if (coord)
|
|
3061
|
+
return handleVirtualMouse(adapter, { action: "double_click", coordinate: coord });
|
|
3062
|
+
break;
|
|
3063
|
+
case "right_click":
|
|
3064
|
+
if (coord)
|
|
3065
|
+
return handleVirtualMouse(adapter, { action: "right_click", coordinate: coord });
|
|
3066
|
+
break;
|
|
3067
|
+
case "mouse_move":
|
|
3068
|
+
if (coord)
|
|
3069
|
+
return handleVirtualMouse(adapter, { action: "move", coordinate: coord });
|
|
3070
|
+
break;
|
|
3071
|
+
case "left_click_drag":
|
|
3072
|
+
if (coord)
|
|
3073
|
+
return handleVirtualMouse(adapter, {
|
|
3074
|
+
action: "drag",
|
|
3075
|
+
coordinate: coord,
|
|
3076
|
+
start_coordinate: Array.isArray(a.start_coordinate) ? a.start_coordinate : undefined
|
|
3077
|
+
});
|
|
3078
|
+
break;
|
|
3079
|
+
case "left_mouse_down":
|
|
3080
|
+
if (coord)
|
|
3081
|
+
return handleVirtualMouse(adapter, { action: "down", coordinate: coord });
|
|
3082
|
+
break;
|
|
3083
|
+
case "left_mouse_up":
|
|
3084
|
+
if (coord)
|
|
3085
|
+
return handleVirtualMouse(adapter, { action: "up", coordinate: coord });
|
|
3086
|
+
break;
|
|
3087
|
+
case "type":
|
|
3088
|
+
if (typeof a.text === "string")
|
|
3089
|
+
return handleVirtualKeyboard(adapter, { action: "type", text: a.text });
|
|
3090
|
+
break;
|
|
3091
|
+
case "key":
|
|
3092
|
+
if (typeof a.text === "string")
|
|
3093
|
+
return handleVirtualKeyboard(adapter, { action: "combo", text: a.text, repeat: a.repeat });
|
|
3094
|
+
break;
|
|
3095
|
+
case "hold_key":
|
|
3096
|
+
if (typeof a.text === "string")
|
|
3097
|
+
return handleVirtualKeyboard(adapter, {
|
|
3098
|
+
action: "hold",
|
|
3099
|
+
text: a.text,
|
|
3100
|
+
duration: typeof a.duration === "number" ? a.duration : 1
|
|
3101
|
+
});
|
|
3102
|
+
break;
|
|
3103
|
+
case "scroll":
|
|
3104
|
+
if (coord)
|
|
3105
|
+
return handleMouseWheel(adapter, {
|
|
3106
|
+
coordinate: coord,
|
|
3107
|
+
delta: a.scroll_direction === "up" ? a.scroll_amount ?? 3 : -(a.scroll_amount ?? 3),
|
|
3108
|
+
direction: a.scroll_direction === "left" || a.scroll_direction === "right" ? "horizontal" : "vertical"
|
|
3109
|
+
});
|
|
3110
|
+
break;
|
|
3111
|
+
}
|
|
3112
|
+
}
|
|
2435
3113
|
switch (name) {
|
|
2436
3114
|
case "screenshot":
|
|
2437
3115
|
return handleScreenshot(adapter, overrides, subGates);
|
|
@@ -2469,6 +3147,28 @@ async function dispatchAction(name, a, adapter, overrides, subGates) {
|
|
|
2469
3147
|
return handleLeftMouseUp(adapter, overrides, subGates);
|
|
2470
3148
|
case "open_application":
|
|
2471
3149
|
return handleOpenApplication(adapter, a, overrides);
|
|
3150
|
+
case "window_management":
|
|
3151
|
+
return handleWindowManagement(adapter, a);
|
|
3152
|
+
case "click_element":
|
|
3153
|
+
return handleClickElement(adapter, a);
|
|
3154
|
+
case "type_into_element":
|
|
3155
|
+
return handleTypeIntoElement(adapter, a);
|
|
3156
|
+
case "open_terminal":
|
|
3157
|
+
return handleOpenTerminal(adapter, a);
|
|
3158
|
+
case "bind_window":
|
|
3159
|
+
return handleBindWindow(adapter, a);
|
|
3160
|
+
case "virtual_mouse":
|
|
3161
|
+
return handleVirtualMouse(adapter, a);
|
|
3162
|
+
case "virtual_keyboard":
|
|
3163
|
+
return handleVirtualKeyboard(adapter, a);
|
|
3164
|
+
case "status_indicator":
|
|
3165
|
+
return handleStatusIndicator(adapter, a);
|
|
3166
|
+
case "mouse_wheel":
|
|
3167
|
+
return handleMouseWheel(adapter, a);
|
|
3168
|
+
case "activate_window":
|
|
3169
|
+
return handleActivateWindow(adapter, a);
|
|
3170
|
+
case "prompt_respond":
|
|
3171
|
+
return handlePromptRespond(adapter, a);
|
|
2472
3172
|
case "switch_display":
|
|
2473
3173
|
return handleSwitchDisplay(adapter, a, overrides);
|
|
2474
3174
|
case "list_granted_applications":
|