@vm0/cli 9.249.0 → 9.249.2

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.
Files changed (141) hide show
  1. package/{agent-J7UZFWFE.js → agent-TOFXTWYP.js} +11 -10
  2. package/{agent-J7UZFWFE.js.map → agent-TOFXTWYP.js.map} +1 -1
  3. package/{banking-TLHPJBS5.js → banking-U7I6EJUO.js} +8 -7
  4. package/{banking-TLHPJBS5.js.map → banking-U7I6EJUO.js.map} +1 -1
  5. package/{chat-PWHG42AL.js → chat-77EDGFMS.js} +9 -8
  6. package/{chat-PWHG42AL.js.map → chat-77EDGFMS.js.map} +1 -1
  7. package/{chunk-DIRAZ3YX.js → chunk-3VVCUQPB.js} +3 -3
  8. package/{chunk-DIRAZ3YX.js.map → chunk-3VVCUQPB.js.map} +1 -1
  9. package/{chunk-LDQPMTQY.js → chunk-4HN7U3JF.js} +103 -625
  10. package/chunk-4HN7U3JF.js.map +1 -0
  11. package/{chunk-ZJENFGWZ.js → chunk-5CZNUTFF.js} +3 -3
  12. package/chunk-A2NKQGRI.js +491 -0
  13. package/chunk-A2NKQGRI.js.map +1 -0
  14. package/{chunk-6IFIMWPY.js → chunk-AFNSFKAH.js} +5 -5
  15. package/{chunk-XE764T2N.js → chunk-BQOOTJNB.js} +27 -672
  16. package/chunk-BQOOTJNB.js.map +1 -0
  17. package/{chunk-KLIW3XK7.js → chunk-GPF7NSX7.js} +2 -2
  18. package/{chunk-HJOW32CJ.js → chunk-HSGQT7LT.js} +3 -3
  19. package/{chunk-PD3A7MGG.js → chunk-JCLLQRCI.js} +3 -3
  20. package/{chunk-B3W2RUBP.js → chunk-LD4ZVU4O.js} +2 -2
  21. package/chunk-N6TDQYGF.js +678 -0
  22. package/chunk-N6TDQYGF.js.map +1 -0
  23. package/{chunk-3QXK5RR7.js → chunk-ROB3OE37.js} +17 -113
  24. package/chunk-ROB3OE37.js.map +1 -0
  25. package/{chunk-LTDQISD7.js → chunk-SB7EZ2ZO.js} +2 -2
  26. package/{chunk-RTYT3CSZ.js → chunk-UG5XA6KU.js} +2 -2
  27. package/{chunk-ZKWCFMDV.js → chunk-UNQJRTJQ.js} +3 -3
  28. package/chunk-W75R7EZF.js +17 -0
  29. package/chunk-W75R7EZF.js.map +1 -0
  30. package/chunk-WDDZJGWL.js +32 -0
  31. package/chunk-WDDZJGWL.js.map +1 -0
  32. package/{chunk-JFY6GK7Y.js → chunk-X2545RBX.js} +2 -2
  33. package/{chunk-ZE2VIESK.js → chunk-X4DBCBU4.js} +2 -2
  34. package/{computer-use-EE6NPCXS.js → computer-use-BCGPVGWS.js} +7 -6
  35. package/{computer-use-EE6NPCXS.js.map → computer-use-BCGPVGWS.js.map} +1 -1
  36. package/{connector-SCLSWTMT.js → connector-CHZSI2LW.js} +14 -13
  37. package/{connector-SCLSWTMT.js.map → connector-CHZSI2LW.js.map} +1 -1
  38. package/credit-RWFBPKOS.js +166 -0
  39. package/credit-RWFBPKOS.js.map +1 -0
  40. package/{developer-support-V3N3BOYC.js → developer-support-IVR3HIP7.js} +8 -7
  41. package/{developer-support-V3N3BOYC.js.map → developer-support-IVR3HIP7.js.map} +1 -1
  42. package/{doctor-AQLFJCC6.js → doctor-KGWTXW2Q.js} +39 -13
  43. package/doctor-KGWTXW2Q.js.map +1 -0
  44. package/{esm-PZKPCIYJ.js → esm-GOCEMHJO.js} +3 -3
  45. package/{feishu-XHOLF32I.js → feishu-PLF4P5OG.js} +8 -7
  46. package/{feishu-XHOLF32I.js.map → feishu-PLF4P5OG.js.map} +1 -1
  47. package/{finance-TF5RU7FD.js → finance-LVFG3WWP.js} +8 -7
  48. package/{finance-TF5RU7FD.js.map → finance-LVFG3WWP.js.map} +1 -1
  49. package/{generate-GFFAZX7Y.js → generate-4FIBMMJO.js} +77 -22
  50. package/generate-4FIBMMJO.js.map +1 -0
  51. package/{getMachineId-bsd-L73QENVB.js → getMachineId-bsd-SB7C44VX.js} +4 -4
  52. package/{getMachineId-darwin-TCCWKQ2S.js → getMachineId-darwin-R4BWY3CQ.js} +4 -4
  53. package/{getMachineId-linux-TJYYUZVM.js → getMachineId-linux-BR4HVNPW.js} +3 -3
  54. package/{getMachineId-unsupported-DPRVLH4Y.js → getMachineId-unsupported-FPGM635L.js} +3 -3
  55. package/{getMachineId-win-7EE436CJ.js → getMachineId-win-RB4JMF33.js} +4 -4
  56. package/{github-V4ZW6TI4.js → github-WHNAVVG3.js} +8 -7
  57. package/{github-V4ZW6TI4.js.map → github-WHNAVVG3.js.map} +1 -1
  58. package/{goal-TED5FUYM.js → goal-G4J2BQ5Z.js} +8 -7
  59. package/{goal-TED5FUYM.js.map → goal-G4J2BQ5Z.js.map} +1 -1
  60. package/{host-HKDD3CHD.js → host-3W6U2ZUP.js} +8 -7
  61. package/{host-HKDD3CHD.js.map → host-3W6U2ZUP.js.map} +1 -1
  62. package/{intro-MIVVJG7M.js → intro-PMHOBGDL.js} +3 -3
  63. package/{logs-SBMQQM46.js → logs-P7JLTGXY.js} +10 -9
  64. package/{logs-SBMQQM46.js.map → logs-P7JLTGXY.js.map} +1 -1
  65. package/{mail-SF5JKA2F.js → mail-LIAOXDD4.js} +12 -11
  66. package/{mail-SF5JKA2F.js.map → mail-LIAOXDD4.js.map} +1 -1
  67. package/{maps-D5NKFEAD.js → maps-C4NOXSE7.js} +8 -7
  68. package/{maps-D5NKFEAD.js.map → maps-C4NOXSE7.js.map} +1 -1
  69. package/{model-S7CMGRIH.js → model-I2MNQ5KC.js} +9 -8
  70. package/{model-S7CMGRIH.js.map → model-I2MNQ5KC.js.map} +1 -1
  71. package/{model-provider-ATXIDNKM.js → model-provider-AOCCHEMP.js} +9 -8
  72. package/{model-provider-ATXIDNKM.js.map → model-provider-AOCCHEMP.js.map} +1 -1
  73. package/{org-6JBRK5NL.js → org-MVBG3WXZ.js} +9 -8
  74. package/{org-6JBRK5NL.js.map → org-MVBG3WXZ.js.map} +1 -1
  75. package/package.json +1 -1
  76. package/{phone-B3UWRGWF.js → phone-4OZQFYHU.js} +8 -7
  77. package/{phone-B3UWRGWF.js.map → phone-4OZQFYHU.js.map} +1 -1
  78. package/{preference-HRRRUEP3.js → preference-H2A3WBGQ.js} +9 -8
  79. package/{preference-HRRRUEP3.js.map → preference-H2A3WBGQ.js.map} +1 -1
  80. package/{resource-65P5D2LT.js → resource-CPCQ6V6M.js} +9 -8
  81. package/{resource-65P5D2LT.js.map → resource-CPCQ6V6M.js.map} +1 -1
  82. package/{scrape-N3AWNV2R.js → scrape-6RMFDYAT.js} +8 -7
  83. package/{scrape-N3AWNV2R.js.map → scrape-6RMFDYAT.js.map} +1 -1
  84. package/{search-T76RE67L.js → search-HSQVSQZY.js} +10 -9
  85. package/{search-T76RE67L.js.map → search-HSQVSQZY.js.map} +1 -1
  86. package/{secret-WALMH6S2.js → secret-S4D6CNOX.js} +9 -8
  87. package/{secret-WALMH6S2.js.map → secret-S4D6CNOX.js.map} +1 -1
  88. package/{slack-WXDCNAI2.js → slack-E3E2NIDZ.js} +50 -175
  89. package/slack-E3E2NIDZ.js.map +1 -0
  90. package/{teams-LAQBLRUR.js → teams-CLEWT2LQ.js} +8 -7
  91. package/{teams-LAQBLRUR.js.map → teams-CLEWT2LQ.js.map} +1 -1
  92. package/{telegram-5BASFBEA.js → telegram-35FKKA4K.js} +8 -7
  93. package/{telegram-5BASFBEA.js.map → telegram-35FKKA4K.js.map} +1 -1
  94. package/{undici-ZMFN7TNU.js → undici-YXSVPIYI.js} +2 -2
  95. package/upgrade-DNGUR42E.js +50 -0
  96. package/upgrade-DNGUR42E.js.map +1 -0
  97. package/{variable-GBVHKR6I.js → variable-C7RWUPV6.js} +9 -8
  98. package/{variable-GBVHKR6I.js.map → variable-C7RWUPV6.js.map} +1 -1
  99. package/{video-3FXQGBYB.js → video-JS5VOA2S.js} +9 -7
  100. package/{video-3FXQGBYB.js.map → video-JS5VOA2S.js.map} +1 -1
  101. package/{weather-JNMUODGJ.js → weather-5R2N5OX4.js} +8 -7
  102. package/{weather-JNMUODGJ.js.map → weather-5R2N5OX4.js.map} +1 -1
  103. package/{web-DZT26X4I.js → web-FXIIYCZ7.js} +10 -8
  104. package/{web-DZT26X4I.js.map → web-FXIIYCZ7.js.map} +1 -1
  105. package/{web-search-36UUSSUX.js → web-search-SZP7J4UM.js} +8 -7
  106. package/{web-search-36UUSSUX.js.map → web-search-SZP7J4UM.js.map} +1 -1
  107. package/{whoami-NXYCNII4.js → whoami-J4FRN67A.js} +10 -9
  108. package/{whoami-NXYCNII4.js.map → whoami-J4FRN67A.js.map} +1 -1
  109. package/{workflow-WHTBJCEF.js → workflow-HQHZKXB2.js} +9 -8
  110. package/{workflow-WHTBJCEF.js.map → workflow-HQHZKXB2.js.map} +1 -1
  111. package/zero.js +88 -61
  112. package/zero.js.map +1 -1
  113. package/chunk-3QXK5RR7.js.map +0 -1
  114. package/chunk-LDQPMTQY.js.map +0 -1
  115. package/chunk-LRHXR7JT.js +0 -33
  116. package/chunk-LRHXR7JT.js.map +0 -1
  117. package/chunk-XE764T2N.js.map +0 -1
  118. package/credit-2VN2PYRE.js +0 -128
  119. package/credit-2VN2PYRE.js.map +0 -1
  120. package/doctor-AQLFJCC6.js.map +0 -1
  121. package/generate-GFFAZX7Y.js.map +0 -1
  122. package/slack-WXDCNAI2.js.map +0 -1
  123. /package/{chunk-ZJENFGWZ.js.map → chunk-5CZNUTFF.js.map} +0 -0
  124. /package/{chunk-6IFIMWPY.js.map → chunk-AFNSFKAH.js.map} +0 -0
  125. /package/{chunk-KLIW3XK7.js.map → chunk-GPF7NSX7.js.map} +0 -0
  126. /package/{chunk-HJOW32CJ.js.map → chunk-HSGQT7LT.js.map} +0 -0
  127. /package/{chunk-PD3A7MGG.js.map → chunk-JCLLQRCI.js.map} +0 -0
  128. /package/{chunk-B3W2RUBP.js.map → chunk-LD4ZVU4O.js.map} +0 -0
  129. /package/{chunk-LTDQISD7.js.map → chunk-SB7EZ2ZO.js.map} +0 -0
  130. /package/{chunk-RTYT3CSZ.js.map → chunk-UG5XA6KU.js.map} +0 -0
  131. /package/{chunk-ZKWCFMDV.js.map → chunk-UNQJRTJQ.js.map} +0 -0
  132. /package/{chunk-JFY6GK7Y.js.map → chunk-X2545RBX.js.map} +0 -0
  133. /package/{chunk-ZE2VIESK.js.map → chunk-X4DBCBU4.js.map} +0 -0
  134. /package/{esm-PZKPCIYJ.js.map → esm-GOCEMHJO.js.map} +0 -0
  135. /package/{getMachineId-bsd-L73QENVB.js.map → getMachineId-bsd-SB7C44VX.js.map} +0 -0
  136. /package/{getMachineId-darwin-TCCWKQ2S.js.map → getMachineId-darwin-R4BWY3CQ.js.map} +0 -0
  137. /package/{getMachineId-linux-TJYYUZVM.js.map → getMachineId-linux-BR4HVNPW.js.map} +0 -0
  138. /package/{getMachineId-unsupported-DPRVLH4Y.js.map → getMachineId-unsupported-FPGM635L.js.map} +0 -0
  139. /package/{getMachineId-win-7EE436CJ.js.map → getMachineId-win-RB4JMF33.js.map} +0 -0
  140. /package/{intro-MIVVJG7M.js.map → intro-PMHOBGDL.js.map} +0 -0
  141. /package/{undici-ZMFN7TNU.js.map → undici-YXSVPIYI.js.map} +0 -0
@@ -3,8 +3,8 @@ import { createRequire as __createRequire } from "node:module";
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  init_esm_shims
6
- } from "./chunk-DIRAZ3YX.js";
6
+ } from "./chunk-3VVCUQPB.js";
7
7
 
8
8
  // src/lib/command/index.ts
9
9
  init_esm_shims();
10
- //# sourceMappingURL=chunk-LTDQISD7.js.map
10
+ //# sourceMappingURL=chunk-SB7EZ2ZO.js.map
@@ -3,7 +3,7 @@ import { createRequire as __createRequire } from "node:module";
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  init_esm_shims
6
- } from "./chunk-DIRAZ3YX.js";
6
+ } from "./chunk-3VVCUQPB.js";
7
7
 
8
8
  // ../../packages/core/src/resource-registry.ts
9
9
  init_esm_shims();
@@ -3405,4 +3405,4 @@ export {
3405
3405
  toGenerationTarget,
3406
3406
  selectResourceCandidates
3407
3407
  };
3408
- //# sourceMappingURL=chunk-RTYT3CSZ.js.map
3408
+ //# sourceMappingURL=chunk-UG5XA6KU.js.map
@@ -4,10 +4,10 @@ const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  getZeroAgent,
6
6
  getZeroAgentUserConnectors
7
- } from "./chunk-3QXK5RR7.js";
7
+ } from "./chunk-ROB3OE37.js";
8
8
  import {
9
9
  init_esm_shims
10
- } from "./chunk-DIRAZ3YX.js";
10
+ } from "./chunk-3VVCUQPB.js";
11
11
 
12
12
  // src/commands/zero/connector/public-catalog.ts
13
13
  init_esm_shims();
@@ -265,4 +265,4 @@ export {
265
265
  resolveManualGrantAuthMethod,
266
266
  resolveAgentContext
267
267
  };
268
- //# sourceMappingURL=chunk-ZKWCFMDV.js.map
268
+ //# sourceMappingURL=chunk-UNQJRTJQ.js.map
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from "node:module";
3
+ const require = __createRequire(import.meta.url);
4
+ import {
5
+ init_esm_shims
6
+ } from "./chunk-3VVCUQPB.js";
7
+
8
+ // src/commands/zero/shared/billing-links.ts
9
+ init_esm_shims();
10
+ function planUpgradeUrl(platformOrigin) {
11
+ return `${platformOrigin}/?settings=billing&billingView=plans`;
12
+ }
13
+
14
+ export {
15
+ planUpgradeUrl
16
+ };
17
+ //# sourceMappingURL=chunk-W75R7EZF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/zero/shared/billing-links.ts"],"sourcesContent":["export function planUpgradeUrl(platformOrigin: string): string {\n return `${platformOrigin}/?settings=billing&billingView=plans`;\n}\n"],"mappings":";;;;;;;;AAAA;AAAO,SAAS,eAAe,gBAAgC;AAC7D,SAAO,GAAG,cAAc;AAC1B;","names":[]}
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from "node:module";
3
+ const require = __createRequire(import.meta.url);
4
+ import {
5
+ decodeZeroTokenPayload
6
+ } from "./chunk-A2NKQGRI.js";
7
+ import {
8
+ init_esm_shims
9
+ } from "./chunk-3VVCUQPB.js";
10
+
11
+ // src/commands/zero/shared/billing-capabilities.ts
12
+ init_esm_shims();
13
+ function legacyPaidCapability(tier) {
14
+ return tier !== "limited-free-1" && tier !== "pro-suspend";
15
+ }
16
+ function currentPlanCanBuyCredits(billing) {
17
+ return billing.canBuyCredits ?? legacyPaidCapability(billing.tier);
18
+ }
19
+ function currentPlanAllowsVideo(billing) {
20
+ return billing.videoGenerationAllowed ?? legacyPaidCapability(billing.tier);
21
+ }
22
+ function currentTokenCanReadBilling() {
23
+ const payload = decodeZeroTokenPayload();
24
+ return payload === void 0 || payload.capabilities.includes("billing:read");
25
+ }
26
+
27
+ export {
28
+ currentPlanCanBuyCredits,
29
+ currentPlanAllowsVideo,
30
+ currentTokenCanReadBilling
31
+ };
32
+ //# sourceMappingURL=chunk-WDDZJGWL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/zero/shared/billing-capabilities.ts"],"sourcesContent":["import type { BillingStatusResponse } from \"@vm0/api-contracts/contracts/zero-billing\";\nimport { decodeZeroTokenPayload } from \"../../../lib/api/zero-token\";\n\nfunction legacyPaidCapability(tier: string): boolean {\n return tier !== \"limited-free-1\" && tier !== \"pro-suspend\";\n}\n\nexport function currentPlanCanBuyCredits(\n billing: BillingStatusResponse,\n): boolean {\n return billing.canBuyCredits ?? legacyPaidCapability(billing.tier);\n}\n\nexport function currentPlanAllowsVideo(\n billing: BillingStatusResponse,\n): boolean {\n return billing.videoGenerationAllowed ?? legacyPaidCapability(billing.tier);\n}\n\nexport function currentTokenCanReadBilling(): boolean {\n const payload = decodeZeroTokenPayload();\n return payload === undefined || payload.capabilities.includes(\"billing:read\");\n}\n"],"mappings":";;;;;;;;;;;AAAA;AAGA,SAAS,qBAAqB,MAAuB;AACnD,SAAO,SAAS,oBAAoB,SAAS;AAC/C;AAEO,SAAS,yBACd,SACS;AACT,SAAO,QAAQ,iBAAiB,qBAAqB,QAAQ,IAAI;AACnE;AAEO,SAAS,uBACd,SACS;AACT,SAAO,QAAQ,0BAA0B,qBAAqB,QAAQ,IAAI;AAC5E;AAEO,SAAS,6BAAsC;AACpD,QAAM,UAAU,uBAAuB;AACvC,SAAO,YAAY,UAAa,QAAQ,aAAa,SAAS,cAAc;AAC9E;","names":[]}
@@ -6,7 +6,7 @@ import {
6
6
  __require,
7
7
  __toESM,
8
8
  init_esm_shims
9
- } from "./chunk-DIRAZ3YX.js";
9
+ } from "./chunk-3VVCUQPB.js";
10
10
 
11
11
  // ../../node_modules/.pnpm/kleur@3.0.3/node_modules/kleur/index.js
12
12
  var require_kleur = __commonJS({
@@ -5001,4 +5001,4 @@ export {
5001
5001
  promptConfirm,
5002
5002
  promptPassword
5003
5003
  };
5004
- //# sourceMappingURL=chunk-JFY6GK7Y.js.map
5004
+ //# sourceMappingURL=chunk-X2545RBX.js.map
@@ -5,7 +5,7 @@ import {
5
5
  __esm,
6
6
  __export,
7
7
  init_esm_shims
8
- } from "./chunk-DIRAZ3YX.js";
8
+ } from "./chunk-3VVCUQPB.js";
9
9
 
10
10
  // ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/version.js
11
11
  var VERSION;
@@ -1656,4 +1656,4 @@ export {
1656
1656
  esm_exports,
1657
1657
  init_esm
1658
1658
  };
1659
- //# sourceMappingURL=chunk-ZE2VIESK.js.map
1659
+ //# sourceMappingURL=chunk-X4DBCBU4.js.map
@@ -12,18 +12,19 @@ import {
12
12
  fetchComputerUseScreenshot,
13
13
  getComputerUseCommand,
14
14
  listComputerUseHosts
15
- } from "./chunk-3QXK5RR7.js";
15
+ } from "./chunk-ROB3OE37.js";
16
+ import "./chunk-N6TDQYGF.js";
16
17
  import {
17
18
  ApiRequestError,
18
19
  withErrorHandler
19
- } from "./chunk-XE764T2N.js";
20
- import "./chunk-LRHXR7JT.js";
20
+ } from "./chunk-BQOOTJNB.js";
21
+ import "./chunk-A2NKQGRI.js";
21
22
  import {
22
23
  Command
23
- } from "./chunk-B3W2RUBP.js";
24
+ } from "./chunk-LD4ZVU4O.js";
24
25
  import {
25
26
  init_esm_shims
26
- } from "./chunk-DIRAZ3YX.js";
27
+ } from "./chunk-3VVCUQPB.js";
27
28
 
28
29
  // src/commands/zero/computer-use/index.ts
29
30
  init_esm_shims();
@@ -969,4 +970,4 @@ export {
969
970
  formatComputerUseResultForConsole,
970
971
  zeroComputerUseCommand
971
972
  };
972
- //# sourceMappingURL=computer-use-EE6NPCXS.js.map
973
+ //# sourceMappingURL=computer-use-BCGPVGWS.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/zero/computer-use/index.ts","../src/commands/zero/computer-use/output-artifacts.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { Command } from \"commander\";\nimport type {\n ComputerUseCommandResponse,\n ComputerUseReadCommandKind,\n ComputerUseWriteCommandKind,\n} from \"@vm0/api-contracts/contracts/zero-computer-use\";\nimport {\n COMPUTER_USE_FILESYSTEM_PLUGIN,\n COMPUTER_USE_MCP_LIST_TOOLS,\n COMPUTER_USE_MCP_PLUGIN,\n type ComputerUseMcpPluginCallBody,\n type ComputerUseFilesystemTool,\n type ComputerUsePluginCallBody,\n} from \"@vm0/api-contracts/contracts/zero-computer-use-plugins\";\nimport {\n ApiRequestError,\n createComputerUsePluginCommand,\n listComputerUseHosts,\n createComputerUseReadCommand,\n createComputerUseWriteCommand,\n fetchComputerUsePluginContent,\n fetchComputerUseScreenshot,\n getComputerUseCommand,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\nimport {\n computerUseOutputDir,\n writeComputerUseArtifact,\n} from \"./output-artifacts\";\n\ninterface ComputerUseCommandOptions {\n readonly timeout?: string;\n}\n\ninterface ComputerUseAppOptions extends ComputerUseCommandOptions {\n readonly app: string;\n}\n\ninterface ComputerUseClickOptions extends ComputerUseAppOptions {\n readonly snapshotId?: string;\n readonly element?: string;\n readonly elementIndex?: string;\n readonly x?: string;\n readonly y?: string;\n readonly button?: \"left\" | \"right\" | \"middle\";\n readonly clickCount?: string;\n}\n\ninterface ComputerUseScrollOptions extends ComputerUseAppOptions {\n readonly snapshotId?: string;\n readonly element?: string;\n readonly elementIndex?: string;\n readonly direction: \"up\" | \"down\" | \"left\" | \"right\";\n readonly pages?: string;\n}\n\ninterface ComputerUseSetValueOptions extends ComputerUseAppOptions {\n readonly snapshotId?: string;\n readonly element?: string;\n readonly elementIndex?: string;\n readonly value: string;\n}\n\ninterface ComputerUsePerformActionOptions extends ComputerUseAppOptions {\n readonly snapshotId?: string;\n readonly element?: string;\n readonly elementIndex?: string;\n readonly action: string;\n}\n\ninterface ComputerUseTypeTextOptions extends ComputerUseAppOptions {\n readonly snapshotId?: string;\n readonly text: string;\n}\n\ninterface ComputerUsePressKeyOptions extends ComputerUseAppOptions {\n readonly snapshotId?: string;\n readonly key: string;\n}\n\ninterface ComputerUsePluginOptions extends ComputerUseCommandOptions {\n readonly argumentsJson?: string;\n}\n\ninterface FilesystemPathOptions extends ComputerUsePluginOptions {\n readonly path: string;\n}\n\ninterface FilesystemReadTextOptions extends FilesystemPathOptions {\n readonly head?: string;\n readonly tail?: string;\n}\n\ninterface FilesystemReadMultipleFilesOptions extends ComputerUsePluginOptions {\n readonly path: readonly string[];\n}\n\ninterface FilesystemWriteFileOptions extends FilesystemPathOptions {\n readonly content: string;\n}\n\ninterface FilesystemEditFileOptions extends FilesystemPathOptions {\n readonly oldText?: string;\n readonly newText?: string;\n readonly dryRun?: boolean;\n}\n\ninterface FilesystemListDirectoryWithSizesOptions extends FilesystemPathOptions {\n readonly sortBy?: \"name\" | \"size\";\n}\n\ninterface FilesystemDirectoryTreeOptions extends FilesystemPathOptions {\n readonly excludePattern?: readonly string[];\n}\n\ninterface FilesystemMoveFileOptions extends ComputerUsePluginOptions {\n readonly source: string;\n readonly destination: string;\n}\n\ninterface FilesystemSearchFilesOptions extends FilesystemPathOptions {\n readonly pattern: string;\n readonly excludePattern?: readonly string[];\n}\n\nconst DATA_URL_PATTERN = /^data:([^;,]+);base64,(.*)$/s;\nconst COMPUTER_USE_REQUIRED_CAPABILITY_MESSAGE =\n \"Missing required capability: computer-use:write\";\nconst COMPUTER_USE_AUTHORIZATION_REQUIRED_ERROR =\n \"COMPUTER_USE_AUTHORIZATION_REQUIRED\";\nconst COMPUTER_USE_HELP_TEXT = `\nWorkflow:\n 1. Start the Zero Desktop app and make sure Computer Use is online.\n 2. Run \"zero computer-use list-apps\" to find the target app's bundleId.\n --app accepts a bundle id only (e.g. com.google.Chrome); the name is for\n display. Apps listed without a bundleId cannot be targeted.\n 3. Run \"zero computer-use get-app-state --app <bundleId>\" to get a screenshot,\n snapshotId, visible element indexes, and accessibility state.\n 4. Prefer element actions with --snapshot-id and --element-index. Use --x/--y\n only when the target is visible in the returned screenshot but has no useful\n accessibility element.\n 5. Read the JSON result. Screenshot and App State data are saved under\n /tmp/vm0/computer-use and replaced with local file paths in CLI output.\n Files are named from app and snapshotId; rerunning the same snapshot\n overwrites the same files.\n\nNotes:\n Write commands are sent to the connected Desktop host. Coordinate fallbacks use\n screenshot coordinates from get-app-state; pass the matching --snapshot-id when\n acting on a prior snapshot.\n type-text sends literal keyboard input to the target app's current focus. It\n first verifies the focused element is editable and fails with\n element_not_editable when it is not (for example a focused table or list), so\n click into a text field before typing. Use set-value when you need\n deterministic accessibility value assignment.\n press-key accepts xdotool-style names such as shift+semicolon, Control_L+J,\n ctrl+alt+n, and BackSpace, plus existing macOS-style forms such as Command+L.\n type-text and press-key accept the same --snapshot-id as the element actions:\n pass it to deliver keyboard input to that snapshot's window. Without it, the\n most relevant window for the app is picked, which is ambiguous for multi-window\n apps.\n\nExamples:\n List available apps:\n zero computer-use list-apps\n\n Inspect Safari state:\n zero computer-use get-app-state --app com.apple.Safari\n\n Click element index 7 from snapshot desktop_abc:\n zero computer-use click --app com.apple.Safari --snapshot-id desktop_abc --element-index 7\n\n Click screenshot coordinate (320, 240) from snapshot desktop_abc:\n zero computer-use click --app com.apple.Safari --snapshot-id desktop_abc --x 320 --y 240\n\n Type text into the snapshot desktop_abc window in Safari:\n zero computer-use type-text --app com.apple.Safari --snapshot-id desktop_abc --text \"Hello\"\n\n Press a keyboard shortcut in the snapshot desktop_abc window:\n zero computer-use press-key --app com.apple.Safari --snapshot-id desktop_abc --key shift+semicolon\n\n Open an app without activating the current foreground app:\n zero computer-use open-app --app com.culturedcode.ThingsMac`;\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction throwComputerUseAuthorizationGuidanceError(error: unknown): never {\n if (\n error instanceof ApiRequestError &&\n error.status === 403 &&\n error.code === \"FORBIDDEN\" &&\n error.message === COMPUTER_USE_REQUIRED_CAPABILITY_MESSAGE\n ) {\n throw new ApiRequestError(\n \"Computer Use authorization required\",\n COMPUTER_USE_AUTHORIZATION_REQUIRED_ERROR,\n 403,\n );\n }\n\n throw error;\n}\n\nfunction parseTimeoutSeconds(value: string | undefined): number {\n if (!value) return 30;\n const seconds = Number.parseInt(value, 10);\n if (!Number.isFinite(seconds) || seconds <= 0) {\n throw new Error(\"Timeout must be a positive number of seconds\");\n }\n return seconds;\n}\n\nfunction parseOptionalNonNegativeInteger(\n value: string | undefined,\n label: string,\n): number | undefined {\n if (value === undefined) return undefined;\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed) || parsed < 0) {\n throw new Error(`${label} must be a non-negative integer`);\n }\n return parsed;\n}\n\nfunction parsePositiveInteger(\n value: string | undefined,\n label: string,\n): number {\n if (value === undefined) {\n throw new Error(`${label} is required`);\n }\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new Error(`${label} must be a positive integer`);\n }\n return parsed;\n}\n\nfunction parsePositiveNumber(\n value: string | undefined,\n label: string,\n): number | undefined {\n if (value === undefined) return undefined;\n const parsed = Number.parseFloat(value);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new Error(`${label} must be a positive number`);\n }\n return parsed;\n}\n\nfunction parseMouseButton(\n value: string | undefined,\n): \"left\" | \"right\" | \"middle\" {\n if (value === \"left\" || value === \"right\" || value === \"middle\") {\n return value;\n }\n throw new Error(\"button must be left, right, or middle\");\n}\n\nfunction elementTargetPayload(options: {\n readonly element?: string;\n readonly elementIndex?: string;\n}): { readonly elementId?: string; readonly elementIndex?: number } {\n const elementIndex = parseOptionalNonNegativeInteger(\n options.elementIndex,\n \"element-index\",\n );\n if (!options.element && elementIndex === undefined) {\n throw new Error(\"element or element-index is required\");\n }\n return {\n ...(options.element ? { elementId: options.element } : {}),\n ...(elementIndex !== undefined ? { elementIndex } : {}),\n };\n}\n\nfunction sanitizeFilenamePart(value: unknown, fallback: string): string {\n if (typeof value !== \"string\") {\n return fallback;\n }\n const sanitized = value\n .trim()\n .replace(/[^A-Za-z0-9._-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 80);\n return sanitized.length > 0 ? sanitized : fallback;\n}\n\nfunction extensionForMimeType(mimeType: string): string {\n if (mimeType === \"image/png\") {\n return \"png\";\n }\n if (mimeType === \"image/jpeg\") {\n return \"jpg\";\n }\n if (mimeType === \"image/webp\") {\n return \"webp\";\n }\n const suffix = mimeType.startsWith(\"image/\") ? mimeType.slice(6) : \"bin\";\n return sanitizeFilenamePart(suffix, \"bin\").toLowerCase();\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction stringField(\n value: Record<string, unknown>,\n key: string,\n): string | undefined {\n const field = value[key];\n return typeof field === \"string\" ? field : undefined;\n}\n\nasync function writeScreenshotDataUrl(\n result: Record<string, unknown>,\n dataUrl: string,\n): Promise<string | null> {\n const match = DATA_URL_PATTERN.exec(dataUrl);\n if (!match) {\n return null;\n }\n\n const mimeType = match[1] ?? \"\";\n if (!mimeType.startsWith(\"image/\")) {\n throw new Error(`Unsupported screenshot MIME type: ${mimeType}`);\n }\n\n const base64Data = match[2] ?? \"\";\n const appName = sanitizeFilenamePart(result.app, \"app\");\n const snapshotId = sanitizeFilenamePart(result.snapshotId, \"snapshot\");\n const outputPath = join(\n computerUseOutputDir(),\n `${appName}-${snapshotId}.${extensionForMimeType(mimeType)}`,\n );\n\n await writeComputerUseArtifact(outputPath, Buffer.from(base64Data, \"base64\"));\n return outputPath;\n}\n\nfunction screenshotPointerType(value: unknown): \"s3\" | \"expired\" | null {\n if (typeof value !== \"object\" || value === null) {\n return null;\n }\n const type = (value as { readonly type?: unknown }).type;\n return type === \"s3\" || type === \"expired\" ? type : null;\n}\n\nasync function writeScreenshotBytes(\n result: Record<string, unknown>,\n buffer: Buffer,\n mimeType: string,\n): Promise<string> {\n const appName = sanitizeFilenamePart(result.app, \"app\");\n const snapshotId = sanitizeFilenamePart(result.snapshotId, \"snapshot\");\n const outputPath = join(\n computerUseOutputDir(),\n `${appName}-${snapshotId}.${extensionForMimeType(mimeType)}`,\n );\n\n await writeComputerUseArtifact(outputPath, buffer);\n return outputPath;\n}\n\nasync function writeAppStateText(\n result: Record<string, unknown>,\n appState: string,\n): Promise<string> {\n const appName = sanitizeFilenamePart(result.app, \"app\");\n const snapshotId = sanitizeFilenamePart(result.snapshotId, \"snapshot\");\n const outputPath = join(\n computerUseOutputDir(),\n `${appName}-${snapshotId}.appState.txt`,\n );\n\n await writeComputerUseArtifact(outputPath, appState);\n return outputPath;\n}\n\nfunction compactActionResult(\n action: Record<string, unknown>,\n): Record<string, unknown> {\n const compact: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(action)) {\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n compact[key] = value;\n }\n }\n return compact;\n}\n\nexport async function formatComputerUseResultForConsole(\n result: Record<string, unknown>,\n commandId: string,\n): Promise<string> {\n const printable: Record<string, unknown> = { status: \"succeeded\" };\n const apps = result.apps;\n if (Array.isArray(apps)) {\n printable.apps = apps;\n }\n const snapshotId = stringField(result, \"snapshotId\");\n if (snapshotId) {\n printable.snapshotId = snapshotId;\n }\n const appState = stringField(result, \"appState\");\n if (appState) {\n printable.appState = await writeAppStateText(result, appState);\n }\n const screenshot = result.screenshot;\n if (typeof screenshot === \"string\") {\n const screenshotPath = await writeScreenshotDataUrl(result, screenshot);\n printable.screenshot = screenshotPath ?? screenshot;\n } else {\n const pointerType = screenshotPointerType(screenshot);\n if (pointerType === \"s3\") {\n const { buffer, mimeType } = await fetchComputerUseScreenshot(commandId);\n printable.screenshot = await writeScreenshotBytes(\n result,\n buffer,\n mimeType,\n );\n } else if (pointerType === \"expired\") {\n printable.screenshot = \"[screenshot expired]\";\n }\n }\n const action = result.action;\n if (isRecord(action)) {\n printable.action = compactActionResult(action);\n }\n return JSON.stringify(printable, null, 2);\n}\n\nasync function commandOutputText(\n command: ComputerUseCommandResponse,\n): Promise<string> {\n if (!command.result) {\n return \"\";\n }\n return await formatComputerUseResultForConsole(command.result, command.id);\n}\n\nfunction pluginContentPointerType(value: unknown): \"s3\" | \"expired\" | null {\n if (!isRecord(value)) {\n return null;\n }\n const type = value.type;\n return type === \"s3\" || type === \"expired\" ? type : null;\n}\n\nfunction pluginContentFileName(value: unknown): string {\n if (!isRecord(value) || typeof value.fileName !== \"string\") {\n return \"plugin-content.bin\";\n }\n return sanitizeFilenamePart(value.fileName, \"plugin-content.bin\");\n}\n\nasync function writePluginContent(\n commandId: string,\n result: Record<string, unknown>,\n): Promise<string> {\n const downloaded = await fetchComputerUsePluginContent(commandId);\n const pointerFileName = pluginContentFileName(result.pluginContent);\n const directoryName = sanitizeFilenamePart(commandId, \"command\");\n const outputPath = join(\n computerUseOutputDir(),\n \"plugins\",\n directoryName,\n sanitizeFilenamePart(\n downloaded.fileName || pointerFileName,\n pointerFileName,\n ),\n );\n await writeComputerUseArtifact(outputPath, downloaded.buffer);\n return outputPath;\n}\n\nfunction formatHumanValue(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (Array.isArray(value)) {\n return value.map(formatHumanValue).join(\"\\n\");\n }\n if (value === null || value === undefined) {\n return \"\";\n }\n return JSON.stringify(value, null, 2);\n}\n\nasync function pluginCommandOutputText(\n command: ComputerUseCommandResponse,\n): Promise<string> {\n const result = command.result;\n if (!result) {\n return \"\";\n }\n const content = stringField(result, \"content\");\n if (content) {\n return content;\n }\n\n const pluginContentType = pluginContentPointerType(result.pluginContent);\n if (pluginContentType === \"s3\") {\n const outputPath = await writePluginContent(command.id, result);\n const sizeBytes =\n typeof result.sizeBytes === \"number\"\n ? ` (${result.sizeBytes} bytes)`\n : \"\";\n return `Saved plugin content${sizeBytes}: ${outputPath}`;\n }\n if (pluginContentType === \"expired\") {\n return \"Plugin content expired.\";\n }\n\n const lines: string[] = [];\n for (const [key, value] of Object.entries(result)) {\n if (key === \"pluginContent\") {\n continue;\n }\n const formatted = formatHumanValue(value);\n if (formatted) {\n lines.push(`${key}: ${formatted}`);\n }\n }\n return lines.join(\"\\n\");\n}\n\nasync function waitForCommand(\n commandId: string,\n timeoutSeconds: number,\n formatter: (\n command: ComputerUseCommandResponse,\n ) => Promise<string> = commandOutputText,\n): Promise<void> {\n const deadline = Date.now() + timeoutSeconds * 1000;\n while (Date.now() <= deadline) {\n const command = await getComputerUseCommand(commandId);\n if (command.status === \"queued\" || command.status === \"running\") {\n if (process.stdout.isTTY) {\n process.stdout.write(\".\");\n }\n await sleep(500);\n continue;\n }\n\n if (process.stdout.isTTY) {\n process.stdout.write(\"\\n\");\n }\n\n if (command.status === \"failed\") {\n throw new Error(\n command.error\n ? `${command.error.code}: ${command.error.message}`\n : \"Computer-use command failed\",\n );\n }\n\n const text = await formatter(command);\n if (text) {\n console.log(text);\n }\n return;\n }\n\n throw new Error(`Computer-use command timed out: ${commandId}`);\n}\n\nasync function runReadCommand(\n kind: ComputerUseReadCommandKind,\n options: ComputerUseCommandOptions,\n payload: { readonly app?: string } = {},\n): Promise<void> {\n const timeoutSeconds = parseTimeoutSeconds(options.timeout);\n try {\n const created = await createComputerUseReadCommand({\n kind,\n timeoutMs: timeoutSeconds * 1000,\n ...payload,\n });\n await waitForCommand(created.commandId, timeoutSeconds);\n } catch (error) {\n throwComputerUseAuthorizationGuidanceError(error);\n }\n}\n\nasync function runWriteCommand(\n kind: ComputerUseWriteCommandKind,\n options: ComputerUseCommandOptions,\n payload: {\n readonly app: string;\n readonly snapshotId?: string;\n readonly elementId?: string;\n readonly elementIndex?: number;\n readonly x?: number;\n readonly y?: number;\n readonly button?: \"left\" | \"right\" | \"middle\";\n readonly clickCount?: number;\n readonly direction?: \"up\" | \"down\" | \"left\" | \"right\";\n readonly pages?: number;\n readonly value?: string;\n readonly text?: string;\n readonly key?: string;\n readonly action?: string;\n },\n): Promise<void> {\n const timeoutSeconds = parseTimeoutSeconds(options.timeout);\n try {\n const created = await createComputerUseWriteCommand({\n kind,\n timeoutMs: timeoutSeconds * 1000,\n ...payload,\n });\n await waitForCommand(created.commandId, timeoutSeconds);\n } catch (error) {\n throwComputerUseAuthorizationGuidanceError(error);\n }\n}\n\nfunction parseArgumentsJson(\n value: string | undefined,\n): Record<string, unknown> {\n if (!value) {\n return {};\n }\n const parsed: unknown = JSON.parse(value);\n if (!isRecord(parsed)) {\n throw new Error(\"arguments-json must be a JSON object\");\n }\n return parsed;\n}\n\nfunction withArgumentsJson(\n options: ComputerUsePluginOptions,\n fallback: Record<string, unknown>,\n): Record<string, unknown> {\n return options.argumentsJson\n ? parseArgumentsJson(options.argumentsJson)\n : fallback;\n}\n\nfunction parseOptionalPositiveInteger(\n value: string | undefined,\n label: string,\n): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n return parsePositiveInteger(value, label);\n}\n\nasync function runFilesystemPluginCommand(\n tool: ComputerUseFilesystemTool,\n options: ComputerUsePluginOptions,\n args: Record<string, unknown>,\n): Promise<void> {\n const timeoutSeconds = parseTimeoutSeconds(options.timeout);\n const body: ComputerUsePluginCallBody = {\n plugin: COMPUTER_USE_FILESYSTEM_PLUGIN,\n tool,\n arguments: args,\n timeoutMs: timeoutSeconds * 1000,\n };\n try {\n const created = await createComputerUsePluginCommand(body);\n await waitForCommand(\n created.commandId,\n timeoutSeconds,\n pluginCommandOutputText,\n );\n } catch (error) {\n throwComputerUseAuthorizationGuidanceError(error);\n }\n}\n\nfunction addTargetOptions(command: Command): Command {\n return command.option(\"--timeout <seconds>\", \"Maximum time to wait\", \"30\");\n}\n\nfunction addPluginOptions(command: Command): Command {\n return addTargetOptions(command).option(\n \"--arguments-json <json>\",\n \"Raw tool arguments object for advanced cases\",\n );\n}\n\nfunction appOption(command: Command): Command {\n return command.requiredOption(\n \"--app <bundleId>\",\n \"Target app bundle id (e.g. com.google.Chrome); run list-apps to find it\",\n );\n}\n\nconst listAppsCommand = addTargetOptions(\n new Command()\n .name(\"list-apps\")\n .description(\"List apps available to the Desktop Computer Use host\")\n .action(\n withErrorHandler(async (options: ComputerUseCommandOptions) => {\n await runReadCommand(\"apps.list\", options);\n }),\n ),\n);\n\nconst getAppStateCommand = appOption(\n addTargetOptions(\n new Command()\n .name(\"get-app-state\")\n .description(\n \"Get screenshot and accessibility state without activating an app\",\n )\n .action(\n withErrorHandler(async (options: ComputerUseAppOptions) => {\n await runReadCommand(\"app.state\", options, { app: options.app });\n }),\n ),\n ),\n);\n\nconst clickCommand = appOption(\n addTargetOptions(\n new Command()\n .name(\"click\")\n .description(\n \"Click an accessibility element or background screenshot coordinate\",\n )\n .option(\"--snapshot-id <id>\", \"Snapshot id returned by get-app-state\")\n .option(\"--element <id>\", \"Element id from get-app-state\")\n .option(\"--element-index <index>\", \"Element index from get-app-state\")\n .option(\"--x <points>\", \"Screenshot x coordinate fallback\")\n .option(\"--y <points>\", \"Screenshot y coordinate fallback\")\n .option(\"--button <button>\", \"Mouse button\", \"left\")\n .option(\"--click-count <count>\", \"Number of clicks\", \"1\")\n .action(\n withErrorHandler(async (options: ComputerUseClickOptions) => {\n const x = parseOptionalNonNegativeInteger(options.x, \"x\");\n const y = parseOptionalNonNegativeInteger(options.y, \"y\");\n const elementIndex = parseOptionalNonNegativeInteger(\n options.elementIndex,\n \"element-index\",\n );\n await runWriteCommand(\"element.click\", options, {\n app: options.app,\n ...(options.snapshotId ? { snapshotId: options.snapshotId } : {}),\n ...(options.element ? { elementId: options.element } : {}),\n ...(elementIndex !== undefined ? { elementIndex } : {}),\n ...(x !== undefined ? { x } : {}),\n ...(y !== undefined ? { y } : {}),\n button: parseMouseButton(options.button),\n clickCount: parsePositiveInteger(options.clickCount, \"click-count\"),\n });\n }),\n ),\n ),\n);\n\nconst scrollCommand = appOption(\n addTargetOptions(\n new Command()\n .name(\"scroll\")\n .description(\"Scroll an accessibility element\")\n .option(\"--snapshot-id <id>\", \"Snapshot id returned by get-app-state\")\n .option(\"--element <id>\", \"Element id from get-app-state\")\n .option(\"--element-index <index>\", \"Element index from get-app-state\")\n .requiredOption(\n \"--direction <direction>\",\n \"Scroll direction: up, down, left, or right\",\n )\n .option(\"--pages <count>\", \"Number of pages to scroll\", \"1\")\n .action(\n withErrorHandler(async (options: ComputerUseScrollOptions) => {\n await runWriteCommand(\"element.scroll\", options, {\n app: options.app,\n ...(options.snapshotId ? { snapshotId: options.snapshotId } : {}),\n ...elementTargetPayload(options),\n direction: options.direction,\n pages: parsePositiveNumber(options.pages, \"pages\"),\n });\n }),\n ),\n ),\n);\n\nconst setValueCommand = appOption(\n addTargetOptions(\n new Command()\n .name(\"set-value\")\n .description(\"Set the value of a settable accessibility element\")\n .option(\"--snapshot-id <id>\", \"Snapshot id returned by get-app-state\")\n .option(\"--element <id>\", \"Element id from get-app-state\")\n .option(\"--element-index <index>\", \"Element index from get-app-state\")\n .requiredOption(\"--value <text>\", \"Value to assign\")\n .action(\n withErrorHandler(async (options: ComputerUseSetValueOptions) => {\n await runWriteCommand(\"element.set_value\", options, {\n app: options.app,\n ...(options.snapshotId ? { snapshotId: options.snapshotId } : {}),\n ...elementTargetPayload(options),\n value: options.value,\n });\n }),\n ),\n ),\n);\n\nconst typeTextCommand = appOption(\n addTargetOptions(\n new Command()\n .name(\"type-text\")\n .description(\"Type literal keyboard input into the target app\")\n .option(\"--snapshot-id <id>\", \"Snapshot id returned by get-app-state\")\n .requiredOption(\"--text <text>\", \"Text to type\")\n .action(\n withErrorHandler(async (options: ComputerUseTypeTextOptions) => {\n await runWriteCommand(\"keyboard.type_text\", options, {\n app: options.app,\n ...(options.snapshotId ? { snapshotId: options.snapshotId } : {}),\n text: options.text,\n });\n }),\n ),\n ),\n);\n\nconst pressKeyCommand = appOption(\n addTargetOptions(\n new Command()\n .name(\"press-key\")\n .description(\"Send a background key or key combination to the target app\")\n .option(\"--snapshot-id <id>\", \"Snapshot id returned by get-app-state\")\n .requiredOption(\n \"--key <key>\",\n \"Key or xdotool-style combination, for example Command+K, shift+semicolon, or Control_L+J\",\n )\n .action(\n withErrorHandler(async (options: ComputerUsePressKeyOptions) => {\n await runWriteCommand(\"keyboard.press_key\", options, {\n app: options.app,\n ...(options.snapshotId ? { snapshotId: options.snapshotId } : {}),\n key: options.key,\n });\n }),\n ),\n ),\n);\n\nconst performActionCommand = appOption(\n addTargetOptions(\n new Command()\n .name(\"perform-action\")\n .description(\"Invoke a secondary accessibility action\")\n .option(\"--snapshot-id <id>\", \"Snapshot id returned by get-app-state\")\n .option(\"--element <id>\", \"Element id from get-app-state\")\n .option(\"--element-index <index>\", \"Element index from get-app-state\")\n .requiredOption(\"--action <name>\", \"Accessibility action name\")\n .action(\n withErrorHandler(async (options: ComputerUsePerformActionOptions) => {\n await runWriteCommand(\"element.perform_action\", options, {\n app: options.app,\n ...(options.snapshotId ? { snapshotId: options.snapshotId } : {}),\n ...elementTargetPayload(options),\n action: options.action,\n });\n }),\n ),\n ),\n);\n\nconst openAppCommand = appOption(\n addTargetOptions(\n new Command()\n .name(\"open-app\")\n .description(\"Open an app on the Desktop host without activating it\")\n .action(\n withErrorHandler(async (options: ComputerUseAppOptions) => {\n await runWriteCommand(\"app.open\", options, { app: options.app });\n }),\n ),\n ),\n);\n\nconst filesystemListAllowedDirectoriesCommand = addPluginOptions(\n new Command()\n .name(\"list_allowed_directories\")\n .description(\"List directories enabled in Zero Desktop\")\n .action(\n withErrorHandler(async (options: ComputerUsePluginOptions) => {\n await runFilesystemPluginCommand(\n \"list_allowed_directories\",\n options,\n withArgumentsJson(options, {}),\n );\n }),\n ),\n);\n\nconst filesystemReadTextFileCommand = addPluginOptions(\n new Command()\n .name(\"read_text_file\")\n .description(\"Read a text file\")\n .requiredOption(\"--path <path>\", \"File path\")\n .option(\"--head <lines>\", \"Read the first N lines\")\n .option(\"--tail <lines>\", \"Read the last N lines\")\n .action(\n withErrorHandler(async (options: FilesystemReadTextOptions) => {\n await runFilesystemPluginCommand(\n \"read_text_file\",\n options,\n withArgumentsJson(options, {\n path: options.path,\n ...(options.head\n ? { head: parseOptionalPositiveInteger(options.head, \"head\") }\n : {}),\n ...(options.tail\n ? { tail: parseOptionalPositiveInteger(options.tail, \"tail\") }\n : {}),\n }),\n );\n }),\n ),\n);\n\nconst filesystemReadMediaFileCommand = addPluginOptions(\n new Command()\n .name(\"read_media_file\")\n .description(\"Read an image or audio file\")\n .requiredOption(\"--path <path>\", \"File path\")\n .action(\n withErrorHandler(async (options: FilesystemPathOptions) => {\n await runFilesystemPluginCommand(\n \"read_media_file\",\n options,\n withArgumentsJson(options, { path: options.path }),\n );\n }),\n ),\n);\n\nconst filesystemReadMultipleFilesCommand = addPluginOptions(\n new Command()\n .name(\"read_multiple_files\")\n .description(\"Read multiple text files\")\n .requiredOption(\"--path <path...>\", \"File paths\")\n .action(\n withErrorHandler(async (options: FilesystemReadMultipleFilesOptions) => {\n await runFilesystemPluginCommand(\n \"read_multiple_files\",\n options,\n withArgumentsJson(options, { paths: options.path }),\n );\n }),\n ),\n);\n\nconst filesystemWriteFileCommand = addPluginOptions(\n new Command()\n .name(\"write_file\")\n .description(\"Write a file\")\n .requiredOption(\"--path <path>\", \"File path\")\n .requiredOption(\"--content <text>\", \"File content\")\n .action(\n withErrorHandler(async (options: FilesystemWriteFileOptions) => {\n await runFilesystemPluginCommand(\n \"write_file\",\n options,\n withArgumentsJson(options, {\n path: options.path,\n content: options.content,\n }),\n );\n }),\n ),\n);\n\nconst filesystemEditFileCommand = addPluginOptions(\n new Command()\n .name(\"edit_file\")\n .description(\"Edit a file\")\n .requiredOption(\"--path <path>\", \"File path\")\n .option(\"--old-text <text>\", \"Text to replace\")\n .option(\"--new-text <text>\", \"Replacement text\")\n .option(\"--dry-run\", \"Preview changes without writing\")\n .action(\n withErrorHandler(async (options: FilesystemEditFileOptions) => {\n if (\n !options.argumentsJson &&\n (!options.oldText || options.newText === undefined)\n ) {\n throw new Error(\n \"edit_file requires --old-text and --new-text, or --arguments-json\",\n );\n }\n await runFilesystemPluginCommand(\n \"edit_file\",\n options,\n withArgumentsJson(options, {\n path: options.path,\n edits: [\n {\n oldText: options.oldText,\n newText: options.newText,\n },\n ],\n dryRun: options.dryRun === true,\n }),\n );\n }),\n ),\n);\n\nconst filesystemCreateDirectoryCommand = addPluginOptions(\n new Command()\n .name(\"create_directory\")\n .description(\"Create a directory\")\n .requiredOption(\"--path <path>\", \"Directory path\")\n .action(\n withErrorHandler(async (options: FilesystemPathOptions) => {\n await runFilesystemPluginCommand(\n \"create_directory\",\n options,\n withArgumentsJson(options, { path: options.path }),\n );\n }),\n ),\n);\n\nconst filesystemListDirectoryCommand = addPluginOptions(\n new Command()\n .name(\"list_directory\")\n .description(\"List directory entries\")\n .requiredOption(\"--path <path>\", \"Directory path\")\n .action(\n withErrorHandler(async (options: FilesystemPathOptions) => {\n await runFilesystemPluginCommand(\n \"list_directory\",\n options,\n withArgumentsJson(options, { path: options.path }),\n );\n }),\n ),\n);\n\nconst filesystemListDirectoryWithSizesCommand = addPluginOptions(\n new Command()\n .name(\"list_directory_with_sizes\")\n .description(\"List directory entries with sizes\")\n .requiredOption(\"--path <path>\", \"Directory path\")\n .option(\"--sort-by <field>\", \"Sort by name or size\", \"name\")\n .action(\n withErrorHandler(\n async (options: FilesystemListDirectoryWithSizesOptions) => {\n await runFilesystemPluginCommand(\n \"list_directory_with_sizes\",\n options,\n withArgumentsJson(options, {\n path: options.path,\n sortBy: options.sortBy ?? \"name\",\n }),\n );\n },\n ),\n ),\n);\n\nconst filesystemDirectoryTreeCommand = addPluginOptions(\n new Command()\n .name(\"directory_tree\")\n .description(\"Return a directory tree\")\n .requiredOption(\"--path <path>\", \"Directory path\")\n .option(\"--exclude-pattern <pattern...>\", \"Patterns to exclude\")\n .action(\n withErrorHandler(async (options: FilesystemDirectoryTreeOptions) => {\n await runFilesystemPluginCommand(\n \"directory_tree\",\n options,\n withArgumentsJson(options, {\n path: options.path,\n ...(options.excludePattern\n ? { excludePatterns: options.excludePattern }\n : {}),\n }),\n );\n }),\n ),\n);\n\nconst filesystemMoveFileCommand = addPluginOptions(\n new Command()\n .name(\"move_file\")\n .description(\"Move or rename a file\")\n .requiredOption(\"--source <path>\", \"Source path\")\n .requiredOption(\"--destination <path>\", \"Destination path\")\n .action(\n withErrorHandler(async (options: FilesystemMoveFileOptions) => {\n await runFilesystemPluginCommand(\n \"move_file\",\n options,\n withArgumentsJson(options, {\n source: options.source,\n destination: options.destination,\n }),\n );\n }),\n ),\n);\n\nconst filesystemSearchFilesCommand = addPluginOptions(\n new Command()\n .name(\"search_files\")\n .description(\"Search files by name\")\n .requiredOption(\"--path <path>\", \"Directory path\")\n .requiredOption(\"--pattern <pattern>\", \"Search pattern\")\n .option(\"--exclude-pattern <pattern...>\", \"Patterns to exclude\")\n .action(\n withErrorHandler(async (options: FilesystemSearchFilesOptions) => {\n await runFilesystemPluginCommand(\n \"search_files\",\n options,\n withArgumentsJson(options, {\n path: options.path,\n pattern: options.pattern,\n ...(options.excludePattern\n ? { excludePatterns: options.excludePattern }\n : {}),\n }),\n );\n }),\n ),\n);\n\nconst filesystemGetFileInfoCommand = addPluginOptions(\n new Command()\n .name(\"get_file_info\")\n .description(\"Get file metadata\")\n .requiredOption(\"--path <path>\", \"File or directory path\")\n .action(\n withErrorHandler(async (options: FilesystemPathOptions) => {\n await runFilesystemPluginCommand(\n \"get_file_info\",\n options,\n withArgumentsJson(options, { path: options.path }),\n );\n }),\n ),\n);\n\nconst filesystemPluginCommand = new Command()\n .name(\"filesystem\")\n .description(\"Use the Zero Desktop filesystem plugin\")\n .addCommand(filesystemListAllowedDirectoriesCommand)\n .addCommand(filesystemReadTextFileCommand)\n .addCommand(filesystemReadMediaFileCommand)\n .addCommand(filesystemReadMultipleFilesCommand)\n .addCommand(filesystemWriteFileCommand)\n .addCommand(filesystemEditFileCommand)\n .addCommand(filesystemCreateDirectoryCommand)\n .addCommand(filesystemListDirectoryCommand)\n .addCommand(filesystemListDirectoryWithSizesCommand)\n .addCommand(filesystemDirectoryTreeCommand)\n .addCommand(filesystemMoveFileCommand)\n .addCommand(filesystemSearchFilesCommand)\n .addCommand(filesystemGetFileInfoCommand);\n\nconst MCP_SERVER_CAPABILITY_PREFIX = `plugin.${COMPUTER_USE_MCP_PLUGIN}.`;\n\ninterface ComputerUseMcpCallOptions extends ComputerUseCommandOptions {\n readonly args?: string;\n readonly argsFile?: string;\n}\n\nfunction parseMcpToolArguments(\n options: ComputerUseMcpCallOptions,\n): Record<string, unknown> {\n if (options.args && options.argsFile) {\n throw new Error(\"Pass either --args or --args-file, not both\");\n }\n if (options.argsFile) {\n return parseArgumentsJson(readFileSync(options.argsFile, \"utf8\"));\n }\n return parseArgumentsJson(options.args);\n}\n\nasync function runMcpPluginCommand(\n server: string,\n tool: string,\n options: ComputerUseCommandOptions,\n args: Record<string, unknown>,\n): Promise<void> {\n const timeoutSeconds = parseTimeoutSeconds(options.timeout);\n const body: ComputerUseMcpPluginCallBody = {\n plugin: COMPUTER_USE_MCP_PLUGIN,\n server,\n tool,\n arguments: args,\n timeoutMs: timeoutSeconds * 1000,\n };\n try {\n const created = await createComputerUsePluginCommand(body);\n await waitForCommand(\n created.commandId,\n timeoutSeconds,\n pluginCommandOutputText,\n );\n } catch (error) {\n throwComputerUseAuthorizationGuidanceError(error);\n }\n}\n\nasync function printMcpServers(): Promise<void> {\n const hosts = await listComputerUseHosts().catch((error: unknown) => {\n throwComputerUseAuthorizationGuidanceError(error);\n });\n const lines: string[] = [];\n for (const host of hosts) {\n const servers = host.supportedCapabilities\n .filter((capability) => {\n return capability.startsWith(MCP_SERVER_CAPABILITY_PREFIX);\n })\n .map((capability) => {\n return capability.slice(MCP_SERVER_CAPABILITY_PREFIX.length);\n });\n if (servers.length === 0) {\n continue;\n }\n lines.push(`${host.displayName} (${host.status}): ${servers.join(\", \")}`);\n }\n if (lines.length === 0) {\n console.log(\n \"No MCP servers are running on any linked host. Configure and enable them in the Zero Desktop app's Developer Tools section.\",\n );\n return;\n }\n console.log(lines.join(\"\\n\"));\n}\n\nconst mcpListCommand = new Command()\n .name(\"list\")\n .description(\n \"List MCP servers on linked hosts, or a server's tools and schemas\",\n )\n .argument(\"[server]\", \"MCP server name; omit to list available servers\")\n .action(\n withErrorHandler(\n async (\n server: string | undefined,\n _options: Record<string, never>,\n command: Command,\n ) => {\n if (!server) {\n await printMcpServers();\n return;\n }\n await runMcpPluginCommand(\n server,\n COMPUTER_USE_MCP_LIST_TOOLS,\n command.optsWithGlobals<ComputerUseCommandOptions>(),\n {},\n );\n },\n ),\n );\n\nconst mcpCallCommand = new Command()\n .name(\"call\")\n .description(\"Call a tool on a configured MCP server\")\n .argument(\"<server>\", \"MCP server name (see: plugin mcp list)\")\n .argument(\"<tool>\", \"Tool name (see: plugin mcp list <server>)\")\n .option(\"--args <json>\", \"Tool arguments as a JSON object\")\n .option(\"--args-file <path>\", \"Read tool arguments JSON from a file\")\n .action(\n withErrorHandler(\n async (\n server: string,\n tool: string,\n options: ComputerUseMcpCallOptions,\n command: Command,\n ) => {\n await runMcpPluginCommand(\n server,\n tool,\n command.optsWithGlobals<ComputerUseCommandOptions>(),\n parseMcpToolArguments(options),\n );\n },\n ),\n );\n\nconst mcpPluginCommand = new Command()\n .name(\"mcp\")\n .description(\"Use custom MCP servers configured in the Zero Desktop app\")\n .addCommand(mcpListCommand)\n .addCommand(mcpCallCommand);\n\nconst pluginCommand = addTargetOptions(\n new Command()\n .name(\"plugin\")\n .description(\"Use Desktop Computer Use plugins\")\n .addCommand(filesystemPluginCommand)\n .addCommand(mcpPluginCommand),\n);\n\nexport const zeroComputerUseCommand = new Command()\n .name(\"computer-use\")\n .description(\"Desktop app computer use through Zero CLI\")\n .addHelpText(\"after\", COMPUTER_USE_HELP_TEXT)\n .addCommand(listAppsCommand)\n .addCommand(getAppStateCommand)\n .addCommand(clickCommand)\n .addCommand(scrollCommand)\n .addCommand(setValueCommand)\n .addCommand(typeTextCommand)\n .addCommand(pressKeyCommand)\n .addCommand(performActionCommand)\n .addCommand(openAppCommand)\n .addCommand(pluginCommand);\n","import { randomUUID } from \"node:crypto\";\nimport type { Dirent } from \"node:fs\";\nimport {\n chmod,\n lstat,\n mkdir,\n readdir,\n rename,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\n\nconst COMPUTER_USE_OUTPUT_DIR_MODE = 0o700;\nconst COMPUTER_USE_OUTPUT_FILE_MODE = 0o600;\nconst COMPUTER_USE_OUTPUT_TTL_MS = 24 * 60 * 60 * 1000;\nconst DEFAULT_COMPUTER_USE_OUTPUT_DIR = path.join(\n tmpdir(),\n \"vm0\",\n \"computer-use\",\n);\n\nexport function computerUseOutputDir(): string {\n const configured = process.env.VM0_COMPUTER_OUTPUT_DIR?.trim();\n return configured && configured.length > 0\n ? configured\n : DEFAULT_COMPUTER_USE_OUTPUT_DIR;\n}\n\nasync function ensurePrivateDirectory(directory: string): Promise<void> {\n await mkdir(directory, {\n recursive: true,\n mode: COMPUTER_USE_OUTPUT_DIR_MODE,\n });\n const stats = await lstat(directory);\n if (!stats.isDirectory() || stats.isSymbolicLink()) {\n throw new Error(\n `Computer-use output path is not a directory: ${directory}`,\n );\n }\n await chmod(directory, COMPUTER_USE_OUTPUT_DIR_MODE);\n}\n\nasync function removeStaleEntries(\n directory: string,\n cutoffMs: number,\n): Promise<void> {\n let entries: Dirent[];\n try {\n entries = await readdir(directory, { withFileTypes: true });\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return;\n }\n throw error;\n }\n\n for (const entry of entries) {\n const entryPath = path.join(directory, entry.name);\n const stats = await lstat(entryPath).catch(() => {\n return null;\n });\n if (!stats) {\n continue;\n }\n if (entry.isDirectory() && !stats.isSymbolicLink()) {\n await removeStaleEntries(entryPath, cutoffMs);\n continue;\n }\n if (stats.mtimeMs < cutoffMs) {\n await rm(entryPath, { force: true, recursive: entry.isDirectory() });\n }\n }\n}\n\nasync function prepareComputerUseOutputDir(): Promise<string> {\n const outputDir = computerUseOutputDir();\n await ensurePrivateDirectory(outputDir);\n await removeStaleEntries(outputDir, Date.now() - COMPUTER_USE_OUTPUT_TTL_MS);\n return outputDir;\n}\n\nasync function ensureOutputPathDirectory(outputPath: string): Promise<void> {\n const outputDir = await prepareComputerUseOutputDir();\n const directory = path.dirname(outputPath);\n const relative = path.relative(outputDir, directory);\n if (relative.startsWith(\"..\") || path.isAbsolute(relative)) {\n throw new Error(`Computer-use artifact path escapes output directory`);\n }\n\n let current = outputDir;\n for (const part of relative.split(path.sep).filter(Boolean)) {\n current = path.join(current, part);\n await ensurePrivateDirectory(current);\n }\n}\n\nexport async function writeComputerUseArtifact(\n outputPath: string,\n data: string | Buffer,\n): Promise<void> {\n await ensureOutputPathDirectory(outputPath);\n const tempPath = path.join(\n path.dirname(outputPath),\n `.${path.basename(outputPath)}.${process.pid.toString()}.${randomUUID()}.tmp`,\n );\n let moved = false;\n try {\n await writeFile(tempPath, data, {\n flag: \"wx\",\n mode: COMPUTER_USE_OUTPUT_FILE_MODE,\n });\n await chmod(tempPath, COMPUTER_USE_OUTPUT_FILE_MODE);\n await rename(tempPath, outputPath);\n moved = true;\n await chmod(outputPath, COMPUTER_USE_OUTPUT_FILE_MODE);\n } finally {\n if (!moved) {\n await rm(tempPath, { force: true });\n }\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/commands/zero/computer-use/index.ts","../src/commands/zero/computer-use/output-artifacts.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { Command } from \"commander\";\nimport type {\n ComputerUseCommandResponse,\n ComputerUseReadCommandKind,\n ComputerUseWriteCommandKind,\n} from \"@vm0/api-contracts/contracts/zero-computer-use\";\nimport {\n COMPUTER_USE_FILESYSTEM_PLUGIN,\n COMPUTER_USE_MCP_LIST_TOOLS,\n COMPUTER_USE_MCP_PLUGIN,\n type ComputerUseMcpPluginCallBody,\n type ComputerUseFilesystemTool,\n type ComputerUsePluginCallBody,\n} from \"@vm0/api-contracts/contracts/zero-computer-use-plugins\";\nimport {\n ApiRequestError,\n createComputerUsePluginCommand,\n listComputerUseHosts,\n createComputerUseReadCommand,\n createComputerUseWriteCommand,\n fetchComputerUsePluginContent,\n fetchComputerUseScreenshot,\n getComputerUseCommand,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\nimport {\n computerUseOutputDir,\n writeComputerUseArtifact,\n} from \"./output-artifacts\";\n\ninterface ComputerUseCommandOptions {\n readonly timeout?: string;\n}\n\ninterface ComputerUseAppOptions extends ComputerUseCommandOptions {\n readonly app: string;\n}\n\ninterface ComputerUseClickOptions extends ComputerUseAppOptions {\n readonly snapshotId?: string;\n readonly element?: string;\n readonly elementIndex?: string;\n readonly x?: string;\n readonly y?: string;\n readonly button?: \"left\" | \"right\" | \"middle\";\n readonly clickCount?: string;\n}\n\ninterface ComputerUseScrollOptions extends ComputerUseAppOptions {\n readonly snapshotId?: string;\n readonly element?: string;\n readonly elementIndex?: string;\n readonly direction: \"up\" | \"down\" | \"left\" | \"right\";\n readonly pages?: string;\n}\n\ninterface ComputerUseSetValueOptions extends ComputerUseAppOptions {\n readonly snapshotId?: string;\n readonly element?: string;\n readonly elementIndex?: string;\n readonly value: string;\n}\n\ninterface ComputerUsePerformActionOptions extends ComputerUseAppOptions {\n readonly snapshotId?: string;\n readonly element?: string;\n readonly elementIndex?: string;\n readonly action: string;\n}\n\ninterface ComputerUseTypeTextOptions extends ComputerUseAppOptions {\n readonly snapshotId?: string;\n readonly text: string;\n}\n\ninterface ComputerUsePressKeyOptions extends ComputerUseAppOptions {\n readonly snapshotId?: string;\n readonly key: string;\n}\n\ninterface ComputerUsePluginOptions extends ComputerUseCommandOptions {\n readonly argumentsJson?: string;\n}\n\ninterface FilesystemPathOptions extends ComputerUsePluginOptions {\n readonly path: string;\n}\n\ninterface FilesystemReadTextOptions extends FilesystemPathOptions {\n readonly head?: string;\n readonly tail?: string;\n}\n\ninterface FilesystemReadMultipleFilesOptions extends ComputerUsePluginOptions {\n readonly path: readonly string[];\n}\n\ninterface FilesystemWriteFileOptions extends FilesystemPathOptions {\n readonly content: string;\n}\n\ninterface FilesystemEditFileOptions extends FilesystemPathOptions {\n readonly oldText?: string;\n readonly newText?: string;\n readonly dryRun?: boolean;\n}\n\ninterface FilesystemListDirectoryWithSizesOptions extends FilesystemPathOptions {\n readonly sortBy?: \"name\" | \"size\";\n}\n\ninterface FilesystemDirectoryTreeOptions extends FilesystemPathOptions {\n readonly excludePattern?: readonly string[];\n}\n\ninterface FilesystemMoveFileOptions extends ComputerUsePluginOptions {\n readonly source: string;\n readonly destination: string;\n}\n\ninterface FilesystemSearchFilesOptions extends FilesystemPathOptions {\n readonly pattern: string;\n readonly excludePattern?: readonly string[];\n}\n\nconst DATA_URL_PATTERN = /^data:([^;,]+);base64,(.*)$/s;\nconst COMPUTER_USE_REQUIRED_CAPABILITY_MESSAGE =\n \"Missing required capability: computer-use:write\";\nconst COMPUTER_USE_AUTHORIZATION_REQUIRED_ERROR =\n \"COMPUTER_USE_AUTHORIZATION_REQUIRED\";\nconst COMPUTER_USE_HELP_TEXT = `\nWorkflow:\n 1. Start the Zero Desktop app and make sure Computer Use is online.\n 2. Run \"zero computer-use list-apps\" to find the target app's bundleId.\n --app accepts a bundle id only (e.g. com.google.Chrome); the name is for\n display. Apps listed without a bundleId cannot be targeted.\n 3. Run \"zero computer-use get-app-state --app <bundleId>\" to get a screenshot,\n snapshotId, visible element indexes, and accessibility state.\n 4. Prefer element actions with --snapshot-id and --element-index. Use --x/--y\n only when the target is visible in the returned screenshot but has no useful\n accessibility element.\n 5. Read the JSON result. Screenshot and App State data are saved under\n /tmp/vm0/computer-use and replaced with local file paths in CLI output.\n Files are named from app and snapshotId; rerunning the same snapshot\n overwrites the same files.\n\nNotes:\n Write commands are sent to the connected Desktop host. Coordinate fallbacks use\n screenshot coordinates from get-app-state; pass the matching --snapshot-id when\n acting on a prior snapshot.\n type-text sends literal keyboard input to the target app's current focus. It\n first verifies the focused element is editable and fails with\n element_not_editable when it is not (for example a focused table or list), so\n click into a text field before typing. Use set-value when you need\n deterministic accessibility value assignment.\n press-key accepts xdotool-style names such as shift+semicolon, Control_L+J,\n ctrl+alt+n, and BackSpace, plus existing macOS-style forms such as Command+L.\n type-text and press-key accept the same --snapshot-id as the element actions:\n pass it to deliver keyboard input to that snapshot's window. Without it, the\n most relevant window for the app is picked, which is ambiguous for multi-window\n apps.\n\nExamples:\n List available apps:\n zero computer-use list-apps\n\n Inspect Safari state:\n zero computer-use get-app-state --app com.apple.Safari\n\n Click element index 7 from snapshot desktop_abc:\n zero computer-use click --app com.apple.Safari --snapshot-id desktop_abc --element-index 7\n\n Click screenshot coordinate (320, 240) from snapshot desktop_abc:\n zero computer-use click --app com.apple.Safari --snapshot-id desktop_abc --x 320 --y 240\n\n Type text into the snapshot desktop_abc window in Safari:\n zero computer-use type-text --app com.apple.Safari --snapshot-id desktop_abc --text \"Hello\"\n\n Press a keyboard shortcut in the snapshot desktop_abc window:\n zero computer-use press-key --app com.apple.Safari --snapshot-id desktop_abc --key shift+semicolon\n\n Open an app without activating the current foreground app:\n zero computer-use open-app --app com.culturedcode.ThingsMac`;\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction throwComputerUseAuthorizationGuidanceError(error: unknown): never {\n if (\n error instanceof ApiRequestError &&\n error.status === 403 &&\n error.code === \"FORBIDDEN\" &&\n error.message === COMPUTER_USE_REQUIRED_CAPABILITY_MESSAGE\n ) {\n throw new ApiRequestError(\n \"Computer Use authorization required\",\n COMPUTER_USE_AUTHORIZATION_REQUIRED_ERROR,\n 403,\n );\n }\n\n throw error;\n}\n\nfunction parseTimeoutSeconds(value: string | undefined): number {\n if (!value) return 30;\n const seconds = Number.parseInt(value, 10);\n if (!Number.isFinite(seconds) || seconds <= 0) {\n throw new Error(\"Timeout must be a positive number of seconds\");\n }\n return seconds;\n}\n\nfunction parseOptionalNonNegativeInteger(\n value: string | undefined,\n label: string,\n): number | undefined {\n if (value === undefined) return undefined;\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed) || parsed < 0) {\n throw new Error(`${label} must be a non-negative integer`);\n }\n return parsed;\n}\n\nfunction parsePositiveInteger(\n value: string | undefined,\n label: string,\n): number {\n if (value === undefined) {\n throw new Error(`${label} is required`);\n }\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new Error(`${label} must be a positive integer`);\n }\n return parsed;\n}\n\nfunction parsePositiveNumber(\n value: string | undefined,\n label: string,\n): number | undefined {\n if (value === undefined) return undefined;\n const parsed = Number.parseFloat(value);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new Error(`${label} must be a positive number`);\n }\n return parsed;\n}\n\nfunction parseMouseButton(\n value: string | undefined,\n): \"left\" | \"right\" | \"middle\" {\n if (value === \"left\" || value === \"right\" || value === \"middle\") {\n return value;\n }\n throw new Error(\"button must be left, right, or middle\");\n}\n\nfunction elementTargetPayload(options: {\n readonly element?: string;\n readonly elementIndex?: string;\n}): { readonly elementId?: string; readonly elementIndex?: number } {\n const elementIndex = parseOptionalNonNegativeInteger(\n options.elementIndex,\n \"element-index\",\n );\n if (!options.element && elementIndex === undefined) {\n throw new Error(\"element or element-index is required\");\n }\n return {\n ...(options.element ? { elementId: options.element } : {}),\n ...(elementIndex !== undefined ? { elementIndex } : {}),\n };\n}\n\nfunction sanitizeFilenamePart(value: unknown, fallback: string): string {\n if (typeof value !== \"string\") {\n return fallback;\n }\n const sanitized = value\n .trim()\n .replace(/[^A-Za-z0-9._-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 80);\n return sanitized.length > 0 ? sanitized : fallback;\n}\n\nfunction extensionForMimeType(mimeType: string): string {\n if (mimeType === \"image/png\") {\n return \"png\";\n }\n if (mimeType === \"image/jpeg\") {\n return \"jpg\";\n }\n if (mimeType === \"image/webp\") {\n return \"webp\";\n }\n const suffix = mimeType.startsWith(\"image/\") ? mimeType.slice(6) : \"bin\";\n return sanitizeFilenamePart(suffix, \"bin\").toLowerCase();\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction stringField(\n value: Record<string, unknown>,\n key: string,\n): string | undefined {\n const field = value[key];\n return typeof field === \"string\" ? field : undefined;\n}\n\nasync function writeScreenshotDataUrl(\n result: Record<string, unknown>,\n dataUrl: string,\n): Promise<string | null> {\n const match = DATA_URL_PATTERN.exec(dataUrl);\n if (!match) {\n return null;\n }\n\n const mimeType = match[1] ?? \"\";\n if (!mimeType.startsWith(\"image/\")) {\n throw new Error(`Unsupported screenshot MIME type: ${mimeType}`);\n }\n\n const base64Data = match[2] ?? \"\";\n const appName = sanitizeFilenamePart(result.app, \"app\");\n const snapshotId = sanitizeFilenamePart(result.snapshotId, \"snapshot\");\n const outputPath = join(\n computerUseOutputDir(),\n `${appName}-${snapshotId}.${extensionForMimeType(mimeType)}`,\n );\n\n await writeComputerUseArtifact(outputPath, Buffer.from(base64Data, \"base64\"));\n return outputPath;\n}\n\nfunction screenshotPointerType(value: unknown): \"s3\" | \"expired\" | null {\n if (typeof value !== \"object\" || value === null) {\n return null;\n }\n const type = (value as { readonly type?: unknown }).type;\n return type === \"s3\" || type === \"expired\" ? type : null;\n}\n\nasync function writeScreenshotBytes(\n result: Record<string, unknown>,\n buffer: Buffer,\n mimeType: string,\n): Promise<string> {\n const appName = sanitizeFilenamePart(result.app, \"app\");\n const snapshotId = sanitizeFilenamePart(result.snapshotId, \"snapshot\");\n const outputPath = join(\n computerUseOutputDir(),\n `${appName}-${snapshotId}.${extensionForMimeType(mimeType)}`,\n );\n\n await writeComputerUseArtifact(outputPath, buffer);\n return outputPath;\n}\n\nasync function writeAppStateText(\n result: Record<string, unknown>,\n appState: string,\n): Promise<string> {\n const appName = sanitizeFilenamePart(result.app, \"app\");\n const snapshotId = sanitizeFilenamePart(result.snapshotId, \"snapshot\");\n const outputPath = join(\n computerUseOutputDir(),\n `${appName}-${snapshotId}.appState.txt`,\n );\n\n await writeComputerUseArtifact(outputPath, appState);\n return outputPath;\n}\n\nfunction compactActionResult(\n action: Record<string, unknown>,\n): Record<string, unknown> {\n const compact: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(action)) {\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n compact[key] = value;\n }\n }\n return compact;\n}\n\nexport async function formatComputerUseResultForConsole(\n result: Record<string, unknown>,\n commandId: string,\n): Promise<string> {\n const printable: Record<string, unknown> = { status: \"succeeded\" };\n const apps = result.apps;\n if (Array.isArray(apps)) {\n printable.apps = apps;\n }\n const snapshotId = stringField(result, \"snapshotId\");\n if (snapshotId) {\n printable.snapshotId = snapshotId;\n }\n const appState = stringField(result, \"appState\");\n if (appState) {\n printable.appState = await writeAppStateText(result, appState);\n }\n const screenshot = result.screenshot;\n if (typeof screenshot === \"string\") {\n const screenshotPath = await writeScreenshotDataUrl(result, screenshot);\n printable.screenshot = screenshotPath ?? screenshot;\n } else {\n const pointerType = screenshotPointerType(screenshot);\n if (pointerType === \"s3\") {\n const { buffer, mimeType } = await fetchComputerUseScreenshot(commandId);\n printable.screenshot = await writeScreenshotBytes(\n result,\n buffer,\n mimeType,\n );\n } else if (pointerType === \"expired\") {\n printable.screenshot = \"[screenshot expired]\";\n }\n }\n const action = result.action;\n if (isRecord(action)) {\n printable.action = compactActionResult(action);\n }\n return JSON.stringify(printable, null, 2);\n}\n\nasync function commandOutputText(\n command: ComputerUseCommandResponse,\n): Promise<string> {\n if (!command.result) {\n return \"\";\n }\n return await formatComputerUseResultForConsole(command.result, command.id);\n}\n\nfunction pluginContentPointerType(value: unknown): \"s3\" | \"expired\" | null {\n if (!isRecord(value)) {\n return null;\n }\n const type = value.type;\n return type === \"s3\" || type === \"expired\" ? type : null;\n}\n\nfunction pluginContentFileName(value: unknown): string {\n if (!isRecord(value) || typeof value.fileName !== \"string\") {\n return \"plugin-content.bin\";\n }\n return sanitizeFilenamePart(value.fileName, \"plugin-content.bin\");\n}\n\nasync function writePluginContent(\n commandId: string,\n result: Record<string, unknown>,\n): Promise<string> {\n const downloaded = await fetchComputerUsePluginContent(commandId);\n const pointerFileName = pluginContentFileName(result.pluginContent);\n const directoryName = sanitizeFilenamePart(commandId, \"command\");\n const outputPath = join(\n computerUseOutputDir(),\n \"plugins\",\n directoryName,\n sanitizeFilenamePart(\n downloaded.fileName || pointerFileName,\n pointerFileName,\n ),\n );\n await writeComputerUseArtifact(outputPath, downloaded.buffer);\n return outputPath;\n}\n\nfunction formatHumanValue(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (Array.isArray(value)) {\n return value.map(formatHumanValue).join(\"\\n\");\n }\n if (value === null || value === undefined) {\n return \"\";\n }\n return JSON.stringify(value, null, 2);\n}\n\nasync function pluginCommandOutputText(\n command: ComputerUseCommandResponse,\n): Promise<string> {\n const result = command.result;\n if (!result) {\n return \"\";\n }\n const content = stringField(result, \"content\");\n if (content) {\n return content;\n }\n\n const pluginContentType = pluginContentPointerType(result.pluginContent);\n if (pluginContentType === \"s3\") {\n const outputPath = await writePluginContent(command.id, result);\n const sizeBytes =\n typeof result.sizeBytes === \"number\"\n ? ` (${result.sizeBytes} bytes)`\n : \"\";\n return `Saved plugin content${sizeBytes}: ${outputPath}`;\n }\n if (pluginContentType === \"expired\") {\n return \"Plugin content expired.\";\n }\n\n const lines: string[] = [];\n for (const [key, value] of Object.entries(result)) {\n if (key === \"pluginContent\") {\n continue;\n }\n const formatted = formatHumanValue(value);\n if (formatted) {\n lines.push(`${key}: ${formatted}`);\n }\n }\n return lines.join(\"\\n\");\n}\n\nasync function waitForCommand(\n commandId: string,\n timeoutSeconds: number,\n formatter: (\n command: ComputerUseCommandResponse,\n ) => Promise<string> = commandOutputText,\n): Promise<void> {\n const deadline = Date.now() + timeoutSeconds * 1000;\n while (Date.now() <= deadline) {\n const command = await getComputerUseCommand(commandId);\n if (command.status === \"queued\" || command.status === \"running\") {\n if (process.stdout.isTTY) {\n process.stdout.write(\".\");\n }\n await sleep(500);\n continue;\n }\n\n if (process.stdout.isTTY) {\n process.stdout.write(\"\\n\");\n }\n\n if (command.status === \"failed\") {\n throw new Error(\n command.error\n ? `${command.error.code}: ${command.error.message}`\n : \"Computer-use command failed\",\n );\n }\n\n const text = await formatter(command);\n if (text) {\n console.log(text);\n }\n return;\n }\n\n throw new Error(`Computer-use command timed out: ${commandId}`);\n}\n\nasync function runReadCommand(\n kind: ComputerUseReadCommandKind,\n options: ComputerUseCommandOptions,\n payload: { readonly app?: string } = {},\n): Promise<void> {\n const timeoutSeconds = parseTimeoutSeconds(options.timeout);\n try {\n const created = await createComputerUseReadCommand({\n kind,\n timeoutMs: timeoutSeconds * 1000,\n ...payload,\n });\n await waitForCommand(created.commandId, timeoutSeconds);\n } catch (error) {\n throwComputerUseAuthorizationGuidanceError(error);\n }\n}\n\nasync function runWriteCommand(\n kind: ComputerUseWriteCommandKind,\n options: ComputerUseCommandOptions,\n payload: {\n readonly app: string;\n readonly snapshotId?: string;\n readonly elementId?: string;\n readonly elementIndex?: number;\n readonly x?: number;\n readonly y?: number;\n readonly button?: \"left\" | \"right\" | \"middle\";\n readonly clickCount?: number;\n readonly direction?: \"up\" | \"down\" | \"left\" | \"right\";\n readonly pages?: number;\n readonly value?: string;\n readonly text?: string;\n readonly key?: string;\n readonly action?: string;\n },\n): Promise<void> {\n const timeoutSeconds = parseTimeoutSeconds(options.timeout);\n try {\n const created = await createComputerUseWriteCommand({\n kind,\n timeoutMs: timeoutSeconds * 1000,\n ...payload,\n });\n await waitForCommand(created.commandId, timeoutSeconds);\n } catch (error) {\n throwComputerUseAuthorizationGuidanceError(error);\n }\n}\n\nfunction parseArgumentsJson(\n value: string | undefined,\n): Record<string, unknown> {\n if (!value) {\n return {};\n }\n const parsed: unknown = JSON.parse(value);\n if (!isRecord(parsed)) {\n throw new Error(\"arguments-json must be a JSON object\");\n }\n return parsed;\n}\n\nfunction withArgumentsJson(\n options: ComputerUsePluginOptions,\n fallback: Record<string, unknown>,\n): Record<string, unknown> {\n return options.argumentsJson\n ? parseArgumentsJson(options.argumentsJson)\n : fallback;\n}\n\nfunction parseOptionalPositiveInteger(\n value: string | undefined,\n label: string,\n): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n return parsePositiveInteger(value, label);\n}\n\nasync function runFilesystemPluginCommand(\n tool: ComputerUseFilesystemTool,\n options: ComputerUsePluginOptions,\n args: Record<string, unknown>,\n): Promise<void> {\n const timeoutSeconds = parseTimeoutSeconds(options.timeout);\n const body: ComputerUsePluginCallBody = {\n plugin: COMPUTER_USE_FILESYSTEM_PLUGIN,\n tool,\n arguments: args,\n timeoutMs: timeoutSeconds * 1000,\n };\n try {\n const created = await createComputerUsePluginCommand(body);\n await waitForCommand(\n created.commandId,\n timeoutSeconds,\n pluginCommandOutputText,\n );\n } catch (error) {\n throwComputerUseAuthorizationGuidanceError(error);\n }\n}\n\nfunction addTargetOptions(command: Command): Command {\n return command.option(\"--timeout <seconds>\", \"Maximum time to wait\", \"30\");\n}\n\nfunction addPluginOptions(command: Command): Command {\n return addTargetOptions(command).option(\n \"--arguments-json <json>\",\n \"Raw tool arguments object for advanced cases\",\n );\n}\n\nfunction appOption(command: Command): Command {\n return command.requiredOption(\n \"--app <bundleId>\",\n \"Target app bundle id (e.g. com.google.Chrome); run list-apps to find it\",\n );\n}\n\nconst listAppsCommand = addTargetOptions(\n new Command()\n .name(\"list-apps\")\n .description(\"List apps available to the Desktop Computer Use host\")\n .action(\n withErrorHandler(async (options: ComputerUseCommandOptions) => {\n await runReadCommand(\"apps.list\", options);\n }),\n ),\n);\n\nconst getAppStateCommand = appOption(\n addTargetOptions(\n new Command()\n .name(\"get-app-state\")\n .description(\n \"Get screenshot and accessibility state without activating an app\",\n )\n .action(\n withErrorHandler(async (options: ComputerUseAppOptions) => {\n await runReadCommand(\"app.state\", options, { app: options.app });\n }),\n ),\n ),\n);\n\nconst clickCommand = appOption(\n addTargetOptions(\n new Command()\n .name(\"click\")\n .description(\n \"Click an accessibility element or background screenshot coordinate\",\n )\n .option(\"--snapshot-id <id>\", \"Snapshot id returned by get-app-state\")\n .option(\"--element <id>\", \"Element id from get-app-state\")\n .option(\"--element-index <index>\", \"Element index from get-app-state\")\n .option(\"--x <points>\", \"Screenshot x coordinate fallback\")\n .option(\"--y <points>\", \"Screenshot y coordinate fallback\")\n .option(\"--button <button>\", \"Mouse button\", \"left\")\n .option(\"--click-count <count>\", \"Number of clicks\", \"1\")\n .action(\n withErrorHandler(async (options: ComputerUseClickOptions) => {\n const x = parseOptionalNonNegativeInteger(options.x, \"x\");\n const y = parseOptionalNonNegativeInteger(options.y, \"y\");\n const elementIndex = parseOptionalNonNegativeInteger(\n options.elementIndex,\n \"element-index\",\n );\n await runWriteCommand(\"element.click\", options, {\n app: options.app,\n ...(options.snapshotId ? { snapshotId: options.snapshotId } : {}),\n ...(options.element ? { elementId: options.element } : {}),\n ...(elementIndex !== undefined ? { elementIndex } : {}),\n ...(x !== undefined ? { x } : {}),\n ...(y !== undefined ? { y } : {}),\n button: parseMouseButton(options.button),\n clickCount: parsePositiveInteger(options.clickCount, \"click-count\"),\n });\n }),\n ),\n ),\n);\n\nconst scrollCommand = appOption(\n addTargetOptions(\n new Command()\n .name(\"scroll\")\n .description(\"Scroll an accessibility element\")\n .option(\"--snapshot-id <id>\", \"Snapshot id returned by get-app-state\")\n .option(\"--element <id>\", \"Element id from get-app-state\")\n .option(\"--element-index <index>\", \"Element index from get-app-state\")\n .requiredOption(\n \"--direction <direction>\",\n \"Scroll direction: up, down, left, or right\",\n )\n .option(\"--pages <count>\", \"Number of pages to scroll\", \"1\")\n .action(\n withErrorHandler(async (options: ComputerUseScrollOptions) => {\n await runWriteCommand(\"element.scroll\", options, {\n app: options.app,\n ...(options.snapshotId ? { snapshotId: options.snapshotId } : {}),\n ...elementTargetPayload(options),\n direction: options.direction,\n pages: parsePositiveNumber(options.pages, \"pages\"),\n });\n }),\n ),\n ),\n);\n\nconst setValueCommand = appOption(\n addTargetOptions(\n new Command()\n .name(\"set-value\")\n .description(\"Set the value of a settable accessibility element\")\n .option(\"--snapshot-id <id>\", \"Snapshot id returned by get-app-state\")\n .option(\"--element <id>\", \"Element id from get-app-state\")\n .option(\"--element-index <index>\", \"Element index from get-app-state\")\n .requiredOption(\"--value <text>\", \"Value to assign\")\n .action(\n withErrorHandler(async (options: ComputerUseSetValueOptions) => {\n await runWriteCommand(\"element.set_value\", options, {\n app: options.app,\n ...(options.snapshotId ? { snapshotId: options.snapshotId } : {}),\n ...elementTargetPayload(options),\n value: options.value,\n });\n }),\n ),\n ),\n);\n\nconst typeTextCommand = appOption(\n addTargetOptions(\n new Command()\n .name(\"type-text\")\n .description(\"Type literal keyboard input into the target app\")\n .option(\"--snapshot-id <id>\", \"Snapshot id returned by get-app-state\")\n .requiredOption(\"--text <text>\", \"Text to type\")\n .action(\n withErrorHandler(async (options: ComputerUseTypeTextOptions) => {\n await runWriteCommand(\"keyboard.type_text\", options, {\n app: options.app,\n ...(options.snapshotId ? { snapshotId: options.snapshotId } : {}),\n text: options.text,\n });\n }),\n ),\n ),\n);\n\nconst pressKeyCommand = appOption(\n addTargetOptions(\n new Command()\n .name(\"press-key\")\n .description(\"Send a background key or key combination to the target app\")\n .option(\"--snapshot-id <id>\", \"Snapshot id returned by get-app-state\")\n .requiredOption(\n \"--key <key>\",\n \"Key or xdotool-style combination, for example Command+K, shift+semicolon, or Control_L+J\",\n )\n .action(\n withErrorHandler(async (options: ComputerUsePressKeyOptions) => {\n await runWriteCommand(\"keyboard.press_key\", options, {\n app: options.app,\n ...(options.snapshotId ? { snapshotId: options.snapshotId } : {}),\n key: options.key,\n });\n }),\n ),\n ),\n);\n\nconst performActionCommand = appOption(\n addTargetOptions(\n new Command()\n .name(\"perform-action\")\n .description(\"Invoke a secondary accessibility action\")\n .option(\"--snapshot-id <id>\", \"Snapshot id returned by get-app-state\")\n .option(\"--element <id>\", \"Element id from get-app-state\")\n .option(\"--element-index <index>\", \"Element index from get-app-state\")\n .requiredOption(\"--action <name>\", \"Accessibility action name\")\n .action(\n withErrorHandler(async (options: ComputerUsePerformActionOptions) => {\n await runWriteCommand(\"element.perform_action\", options, {\n app: options.app,\n ...(options.snapshotId ? { snapshotId: options.snapshotId } : {}),\n ...elementTargetPayload(options),\n action: options.action,\n });\n }),\n ),\n ),\n);\n\nconst openAppCommand = appOption(\n addTargetOptions(\n new Command()\n .name(\"open-app\")\n .description(\"Open an app on the Desktop host without activating it\")\n .action(\n withErrorHandler(async (options: ComputerUseAppOptions) => {\n await runWriteCommand(\"app.open\", options, { app: options.app });\n }),\n ),\n ),\n);\n\nconst filesystemListAllowedDirectoriesCommand = addPluginOptions(\n new Command()\n .name(\"list_allowed_directories\")\n .description(\"List directories enabled in Zero Desktop\")\n .action(\n withErrorHandler(async (options: ComputerUsePluginOptions) => {\n await runFilesystemPluginCommand(\n \"list_allowed_directories\",\n options,\n withArgumentsJson(options, {}),\n );\n }),\n ),\n);\n\nconst filesystemReadTextFileCommand = addPluginOptions(\n new Command()\n .name(\"read_text_file\")\n .description(\"Read a text file\")\n .requiredOption(\"--path <path>\", \"File path\")\n .option(\"--head <lines>\", \"Read the first N lines\")\n .option(\"--tail <lines>\", \"Read the last N lines\")\n .action(\n withErrorHandler(async (options: FilesystemReadTextOptions) => {\n await runFilesystemPluginCommand(\n \"read_text_file\",\n options,\n withArgumentsJson(options, {\n path: options.path,\n ...(options.head\n ? { head: parseOptionalPositiveInteger(options.head, \"head\") }\n : {}),\n ...(options.tail\n ? { tail: parseOptionalPositiveInteger(options.tail, \"tail\") }\n : {}),\n }),\n );\n }),\n ),\n);\n\nconst filesystemReadMediaFileCommand = addPluginOptions(\n new Command()\n .name(\"read_media_file\")\n .description(\"Read an image or audio file\")\n .requiredOption(\"--path <path>\", \"File path\")\n .action(\n withErrorHandler(async (options: FilesystemPathOptions) => {\n await runFilesystemPluginCommand(\n \"read_media_file\",\n options,\n withArgumentsJson(options, { path: options.path }),\n );\n }),\n ),\n);\n\nconst filesystemReadMultipleFilesCommand = addPluginOptions(\n new Command()\n .name(\"read_multiple_files\")\n .description(\"Read multiple text files\")\n .requiredOption(\"--path <path...>\", \"File paths\")\n .action(\n withErrorHandler(async (options: FilesystemReadMultipleFilesOptions) => {\n await runFilesystemPluginCommand(\n \"read_multiple_files\",\n options,\n withArgumentsJson(options, { paths: options.path }),\n );\n }),\n ),\n);\n\nconst filesystemWriteFileCommand = addPluginOptions(\n new Command()\n .name(\"write_file\")\n .description(\"Write a file\")\n .requiredOption(\"--path <path>\", \"File path\")\n .requiredOption(\"--content <text>\", \"File content\")\n .action(\n withErrorHandler(async (options: FilesystemWriteFileOptions) => {\n await runFilesystemPluginCommand(\n \"write_file\",\n options,\n withArgumentsJson(options, {\n path: options.path,\n content: options.content,\n }),\n );\n }),\n ),\n);\n\nconst filesystemEditFileCommand = addPluginOptions(\n new Command()\n .name(\"edit_file\")\n .description(\"Edit a file\")\n .requiredOption(\"--path <path>\", \"File path\")\n .option(\"--old-text <text>\", \"Text to replace\")\n .option(\"--new-text <text>\", \"Replacement text\")\n .option(\"--dry-run\", \"Preview changes without writing\")\n .action(\n withErrorHandler(async (options: FilesystemEditFileOptions) => {\n if (\n !options.argumentsJson &&\n (!options.oldText || options.newText === undefined)\n ) {\n throw new Error(\n \"edit_file requires --old-text and --new-text, or --arguments-json\",\n );\n }\n await runFilesystemPluginCommand(\n \"edit_file\",\n options,\n withArgumentsJson(options, {\n path: options.path,\n edits: [\n {\n oldText: options.oldText,\n newText: options.newText,\n },\n ],\n dryRun: options.dryRun === true,\n }),\n );\n }),\n ),\n);\n\nconst filesystemCreateDirectoryCommand = addPluginOptions(\n new Command()\n .name(\"create_directory\")\n .description(\"Create a directory\")\n .requiredOption(\"--path <path>\", \"Directory path\")\n .action(\n withErrorHandler(async (options: FilesystemPathOptions) => {\n await runFilesystemPluginCommand(\n \"create_directory\",\n options,\n withArgumentsJson(options, { path: options.path }),\n );\n }),\n ),\n);\n\nconst filesystemListDirectoryCommand = addPluginOptions(\n new Command()\n .name(\"list_directory\")\n .description(\"List directory entries\")\n .requiredOption(\"--path <path>\", \"Directory path\")\n .action(\n withErrorHandler(async (options: FilesystemPathOptions) => {\n await runFilesystemPluginCommand(\n \"list_directory\",\n options,\n withArgumentsJson(options, { path: options.path }),\n );\n }),\n ),\n);\n\nconst filesystemListDirectoryWithSizesCommand = addPluginOptions(\n new Command()\n .name(\"list_directory_with_sizes\")\n .description(\"List directory entries with sizes\")\n .requiredOption(\"--path <path>\", \"Directory path\")\n .option(\"--sort-by <field>\", \"Sort by name or size\", \"name\")\n .action(\n withErrorHandler(\n async (options: FilesystemListDirectoryWithSizesOptions) => {\n await runFilesystemPluginCommand(\n \"list_directory_with_sizes\",\n options,\n withArgumentsJson(options, {\n path: options.path,\n sortBy: options.sortBy ?? \"name\",\n }),\n );\n },\n ),\n ),\n);\n\nconst filesystemDirectoryTreeCommand = addPluginOptions(\n new Command()\n .name(\"directory_tree\")\n .description(\"Return a directory tree\")\n .requiredOption(\"--path <path>\", \"Directory path\")\n .option(\"--exclude-pattern <pattern...>\", \"Patterns to exclude\")\n .action(\n withErrorHandler(async (options: FilesystemDirectoryTreeOptions) => {\n await runFilesystemPluginCommand(\n \"directory_tree\",\n options,\n withArgumentsJson(options, {\n path: options.path,\n ...(options.excludePattern\n ? { excludePatterns: options.excludePattern }\n : {}),\n }),\n );\n }),\n ),\n);\n\nconst filesystemMoveFileCommand = addPluginOptions(\n new Command()\n .name(\"move_file\")\n .description(\"Move or rename a file\")\n .requiredOption(\"--source <path>\", \"Source path\")\n .requiredOption(\"--destination <path>\", \"Destination path\")\n .action(\n withErrorHandler(async (options: FilesystemMoveFileOptions) => {\n await runFilesystemPluginCommand(\n \"move_file\",\n options,\n withArgumentsJson(options, {\n source: options.source,\n destination: options.destination,\n }),\n );\n }),\n ),\n);\n\nconst filesystemSearchFilesCommand = addPluginOptions(\n new Command()\n .name(\"search_files\")\n .description(\"Search files by name\")\n .requiredOption(\"--path <path>\", \"Directory path\")\n .requiredOption(\"--pattern <pattern>\", \"Search pattern\")\n .option(\"--exclude-pattern <pattern...>\", \"Patterns to exclude\")\n .action(\n withErrorHandler(async (options: FilesystemSearchFilesOptions) => {\n await runFilesystemPluginCommand(\n \"search_files\",\n options,\n withArgumentsJson(options, {\n path: options.path,\n pattern: options.pattern,\n ...(options.excludePattern\n ? { excludePatterns: options.excludePattern }\n : {}),\n }),\n );\n }),\n ),\n);\n\nconst filesystemGetFileInfoCommand = addPluginOptions(\n new Command()\n .name(\"get_file_info\")\n .description(\"Get file metadata\")\n .requiredOption(\"--path <path>\", \"File or directory path\")\n .action(\n withErrorHandler(async (options: FilesystemPathOptions) => {\n await runFilesystemPluginCommand(\n \"get_file_info\",\n options,\n withArgumentsJson(options, { path: options.path }),\n );\n }),\n ),\n);\n\nconst filesystemPluginCommand = new Command()\n .name(\"filesystem\")\n .description(\"Use the Zero Desktop filesystem plugin\")\n .addCommand(filesystemListAllowedDirectoriesCommand)\n .addCommand(filesystemReadTextFileCommand)\n .addCommand(filesystemReadMediaFileCommand)\n .addCommand(filesystemReadMultipleFilesCommand)\n .addCommand(filesystemWriteFileCommand)\n .addCommand(filesystemEditFileCommand)\n .addCommand(filesystemCreateDirectoryCommand)\n .addCommand(filesystemListDirectoryCommand)\n .addCommand(filesystemListDirectoryWithSizesCommand)\n .addCommand(filesystemDirectoryTreeCommand)\n .addCommand(filesystemMoveFileCommand)\n .addCommand(filesystemSearchFilesCommand)\n .addCommand(filesystemGetFileInfoCommand);\n\nconst MCP_SERVER_CAPABILITY_PREFIX = `plugin.${COMPUTER_USE_MCP_PLUGIN}.`;\n\ninterface ComputerUseMcpCallOptions extends ComputerUseCommandOptions {\n readonly args?: string;\n readonly argsFile?: string;\n}\n\nfunction parseMcpToolArguments(\n options: ComputerUseMcpCallOptions,\n): Record<string, unknown> {\n if (options.args && options.argsFile) {\n throw new Error(\"Pass either --args or --args-file, not both\");\n }\n if (options.argsFile) {\n return parseArgumentsJson(readFileSync(options.argsFile, \"utf8\"));\n }\n return parseArgumentsJson(options.args);\n}\n\nasync function runMcpPluginCommand(\n server: string,\n tool: string,\n options: ComputerUseCommandOptions,\n args: Record<string, unknown>,\n): Promise<void> {\n const timeoutSeconds = parseTimeoutSeconds(options.timeout);\n const body: ComputerUseMcpPluginCallBody = {\n plugin: COMPUTER_USE_MCP_PLUGIN,\n server,\n tool,\n arguments: args,\n timeoutMs: timeoutSeconds * 1000,\n };\n try {\n const created = await createComputerUsePluginCommand(body);\n await waitForCommand(\n created.commandId,\n timeoutSeconds,\n pluginCommandOutputText,\n );\n } catch (error) {\n throwComputerUseAuthorizationGuidanceError(error);\n }\n}\n\nasync function printMcpServers(): Promise<void> {\n const hosts = await listComputerUseHosts().catch((error: unknown) => {\n throwComputerUseAuthorizationGuidanceError(error);\n });\n const lines: string[] = [];\n for (const host of hosts) {\n const servers = host.supportedCapabilities\n .filter((capability) => {\n return capability.startsWith(MCP_SERVER_CAPABILITY_PREFIX);\n })\n .map((capability) => {\n return capability.slice(MCP_SERVER_CAPABILITY_PREFIX.length);\n });\n if (servers.length === 0) {\n continue;\n }\n lines.push(`${host.displayName} (${host.status}): ${servers.join(\", \")}`);\n }\n if (lines.length === 0) {\n console.log(\n \"No MCP servers are running on any linked host. Configure and enable them in the Zero Desktop app's Developer Tools section.\",\n );\n return;\n }\n console.log(lines.join(\"\\n\"));\n}\n\nconst mcpListCommand = new Command()\n .name(\"list\")\n .description(\n \"List MCP servers on linked hosts, or a server's tools and schemas\",\n )\n .argument(\"[server]\", \"MCP server name; omit to list available servers\")\n .action(\n withErrorHandler(\n async (\n server: string | undefined,\n _options: Record<string, never>,\n command: Command,\n ) => {\n if (!server) {\n await printMcpServers();\n return;\n }\n await runMcpPluginCommand(\n server,\n COMPUTER_USE_MCP_LIST_TOOLS,\n command.optsWithGlobals<ComputerUseCommandOptions>(),\n {},\n );\n },\n ),\n );\n\nconst mcpCallCommand = new Command()\n .name(\"call\")\n .description(\"Call a tool on a configured MCP server\")\n .argument(\"<server>\", \"MCP server name (see: plugin mcp list)\")\n .argument(\"<tool>\", \"Tool name (see: plugin mcp list <server>)\")\n .option(\"--args <json>\", \"Tool arguments as a JSON object\")\n .option(\"--args-file <path>\", \"Read tool arguments JSON from a file\")\n .action(\n withErrorHandler(\n async (\n server: string,\n tool: string,\n options: ComputerUseMcpCallOptions,\n command: Command,\n ) => {\n await runMcpPluginCommand(\n server,\n tool,\n command.optsWithGlobals<ComputerUseCommandOptions>(),\n parseMcpToolArguments(options),\n );\n },\n ),\n );\n\nconst mcpPluginCommand = new Command()\n .name(\"mcp\")\n .description(\"Use custom MCP servers configured in the Zero Desktop app\")\n .addCommand(mcpListCommand)\n .addCommand(mcpCallCommand);\n\nconst pluginCommand = addTargetOptions(\n new Command()\n .name(\"plugin\")\n .description(\"Use Desktop Computer Use plugins\")\n .addCommand(filesystemPluginCommand)\n .addCommand(mcpPluginCommand),\n);\n\nexport const zeroComputerUseCommand = new Command()\n .name(\"computer-use\")\n .description(\"Desktop app computer use through Zero CLI\")\n .addHelpText(\"after\", COMPUTER_USE_HELP_TEXT)\n .addCommand(listAppsCommand)\n .addCommand(getAppStateCommand)\n .addCommand(clickCommand)\n .addCommand(scrollCommand)\n .addCommand(setValueCommand)\n .addCommand(typeTextCommand)\n .addCommand(pressKeyCommand)\n .addCommand(performActionCommand)\n .addCommand(openAppCommand)\n .addCommand(pluginCommand);\n","import { randomUUID } from \"node:crypto\";\nimport type { Dirent } from \"node:fs\";\nimport {\n chmod,\n lstat,\n mkdir,\n readdir,\n rename,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\n\nconst COMPUTER_USE_OUTPUT_DIR_MODE = 0o700;\nconst COMPUTER_USE_OUTPUT_FILE_MODE = 0o600;\nconst COMPUTER_USE_OUTPUT_TTL_MS = 24 * 60 * 60 * 1000;\nconst DEFAULT_COMPUTER_USE_OUTPUT_DIR = path.join(\n tmpdir(),\n \"vm0\",\n \"computer-use\",\n);\n\nexport function computerUseOutputDir(): string {\n const configured = process.env.VM0_COMPUTER_OUTPUT_DIR?.trim();\n return configured && configured.length > 0\n ? configured\n : DEFAULT_COMPUTER_USE_OUTPUT_DIR;\n}\n\nasync function ensurePrivateDirectory(directory: string): Promise<void> {\n await mkdir(directory, {\n recursive: true,\n mode: COMPUTER_USE_OUTPUT_DIR_MODE,\n });\n const stats = await lstat(directory);\n if (!stats.isDirectory() || stats.isSymbolicLink()) {\n throw new Error(\n `Computer-use output path is not a directory: ${directory}`,\n );\n }\n await chmod(directory, COMPUTER_USE_OUTPUT_DIR_MODE);\n}\n\nasync function removeStaleEntries(\n directory: string,\n cutoffMs: number,\n): Promise<void> {\n let entries: Dirent[];\n try {\n entries = await readdir(directory, { withFileTypes: true });\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return;\n }\n throw error;\n }\n\n for (const entry of entries) {\n const entryPath = path.join(directory, entry.name);\n const stats = await lstat(entryPath).catch(() => {\n return null;\n });\n if (!stats) {\n continue;\n }\n if (entry.isDirectory() && !stats.isSymbolicLink()) {\n await removeStaleEntries(entryPath, cutoffMs);\n continue;\n }\n if (stats.mtimeMs < cutoffMs) {\n await rm(entryPath, { force: true, recursive: entry.isDirectory() });\n }\n }\n}\n\nasync function prepareComputerUseOutputDir(): Promise<string> {\n const outputDir = computerUseOutputDir();\n await ensurePrivateDirectory(outputDir);\n await removeStaleEntries(outputDir, Date.now() - COMPUTER_USE_OUTPUT_TTL_MS);\n return outputDir;\n}\n\nasync function ensureOutputPathDirectory(outputPath: string): Promise<void> {\n const outputDir = await prepareComputerUseOutputDir();\n const directory = path.dirname(outputPath);\n const relative = path.relative(outputDir, directory);\n if (relative.startsWith(\"..\") || path.isAbsolute(relative)) {\n throw new Error(`Computer-use artifact path escapes output directory`);\n }\n\n let current = outputDir;\n for (const part of relative.split(path.sep).filter(Boolean)) {\n current = path.join(current, part);\n await ensurePrivateDirectory(current);\n }\n}\n\nexport async function writeComputerUseArtifact(\n outputPath: string,\n data: string | Buffer,\n): Promise<void> {\n await ensureOutputPathDirectory(outputPath);\n const tempPath = path.join(\n path.dirname(outputPath),\n `.${path.basename(outputPath)}.${process.pid.toString()}.${randomUUID()}.tmp`,\n );\n let moved = false;\n try {\n await writeFile(tempPath, data, {\n flag: \"wx\",\n mode: COMPUTER_USE_OUTPUT_FILE_MODE,\n });\n await chmod(tempPath, COMPUTER_USE_OUTPUT_FILE_MODE);\n await rename(tempPath, outputPath);\n moved = true;\n await chmod(outputPath, COMPUTER_USE_OUTPUT_FILE_MODE);\n } finally {\n if (!moved) {\n await rm(tempPath, { force: true });\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -3,18 +3,14 @@ import { createRequire as __createRequire } from "node:module";
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  findFirewallMetadataPermission
6
- } from "./chunk-ZJENFGWZ.js";
6
+ } from "./chunk-5CZNUTFF.js";
7
7
  import {
8
8
  availableConnectorRefs,
9
9
  findConnectorStatusItem,
10
10
  resolveAgentContext,
11
11
  resolveManualGrantAuthMethod,
12
12
  searchPublicConnectorCatalog
13
- } from "./chunk-ZKWCFMDV.js";
14
- import {
15
- getPlatformOrigin,
16
- toPlatformUrl
17
- } from "./chunk-PD3A7MGG.js";
13
+ } from "./chunk-UNQJRTJQ.js";
18
14
  import {
19
15
  UNKNOWN_PERMISSION_GRANT,
20
16
  connectZeroConnectorManualGrant,
@@ -29,22 +25,27 @@ import {
29
25
  getZeroCustomConnector,
30
26
  listZeroConnectorCatalogStatus,
31
27
  listZeroCustomConnectors
32
- } from "./chunk-3QXK5RR7.js";
33
- import "./chunk-LTDQISD7.js";
28
+ } from "./chunk-ROB3OE37.js";
29
+ import "./chunk-N6TDQYGF.js";
30
+ import {
31
+ getPlatformOrigin,
32
+ toPlatformUrl
33
+ } from "./chunk-JCLLQRCI.js";
34
+ import "./chunk-SB7EZ2ZO.js";
34
35
  import {
35
36
  ApiRequestError,
36
37
  getApiUrl,
37
38
  source_default,
38
39
  withErrorHandler
39
- } from "./chunk-XE764T2N.js";
40
- import "./chunk-LRHXR7JT.js";
40
+ } from "./chunk-BQOOTJNB.js";
41
+ import "./chunk-A2NKQGRI.js";
41
42
  import {
42
43
  Command,
43
44
  Option
44
- } from "./chunk-B3W2RUBP.js";
45
+ } from "./chunk-LD4ZVU4O.js";
45
46
  import {
46
47
  init_esm_shims
47
- } from "./chunk-DIRAZ3YX.js";
48
+ } from "./chunk-3VVCUQPB.js";
48
49
 
49
50
  // src/commands/zero/connector/index.ts
50
51
  init_esm_shims();
@@ -1556,4 +1557,4 @@ var zeroConnectorCommand = new Command().name("connector").description("Manage a
1556
1557
  export {
1557
1558
  zeroConnectorCommand
1558
1559
  };
1559
- //# sourceMappingURL=connector-SCLSWTMT.js.map
1560
+ //# sourceMappingURL=connector-CHZSI2LW.js.map