@vm0/cli 9.264.9 → 9.266.0

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 (106) hide show
  1. package/{agent-MHMP5BOB.js → agent-WJBV6XSO.js} +6 -6
  2. package/{banking-WB4NGHEW.js → banking-MZPWKMV2.js} +4 -4
  3. package/{browser-OO3SXJ66.js → browser-F4J54ATA.js} +13 -33
  4. package/browser-F4J54ATA.js.map +1 -0
  5. package/{chat-IYYYJKVT.js → chat-OTLB5LYG.js} +326 -8
  6. package/chat-OTLB5LYG.js.map +1 -0
  7. package/{chunk-NBF6ONZJ.js → chunk-4TODUWC7.js} +2 -2
  8. package/{chunk-CPLEJWQT.js → chunk-GHMW55CQ.js} +2 -2
  9. package/{chunk-A3GE6ETZ.js → chunk-HHVHHEJ2.js} +2 -2
  10. package/{chunk-IOJHMLKT.js → chunk-JQDFMS4A.js} +2 -2
  11. package/{chunk-MTLPPLPH.js → chunk-M75EI7GB.js} +4 -4
  12. package/{chunk-DOYP2C2B.js → chunk-MIZEZBG6.js} +2 -2
  13. package/{chunk-JUMGFS6V.js → chunk-SP2S4QWX.js} +2 -2
  14. package/{chunk-AOHVC7EW.js → chunk-TNDBFUFP.js} +13 -1
  15. package/chunk-TNDBFUFP.js.map +1 -0
  16. package/{chunk-7DFIPXTO.js → chunk-UP5UOL6Z.js} +209 -262
  17. package/chunk-UP5UOL6Z.js.map +1 -0
  18. package/{chunk-FLWE2Q4D.js → chunk-WTB4K3Z6.js} +471 -172
  19. package/chunk-WTB4K3Z6.js.map +1 -0
  20. package/{computer-use-JPDTT4KX.js → computer-use-GMGAYWFF.js} +4 -4
  21. package/{connector-NI2PWPCC.js → connector-SPL5EGNH.js} +7 -7
  22. package/{credit-RE47VTRH.js → credit-ANE66MN5.js} +5 -5
  23. package/{developer-support-DSPTERLL.js → developer-support-WNWRPWM5.js} +4 -4
  24. package/{doctor-GGFT4M2V.js → doctor-YEBTJKXS.js} +5 -5
  25. package/{feishu-COL55I4I.js → feishu-X6HV3Z75.js} +4 -4
  26. package/{finance-4KCKJTAE.js → finance-3SLPN5ZX.js} +4 -4
  27. package/{generate-NVBPAC3Z.js → generate-VK57QZTH.js} +5 -5
  28. package/{github-KLRR5N7F.js → github-KHQGH7UJ.js} +4 -4
  29. package/{goal-FINXKJ2J.js → goal-NP7LA4H5.js} +4 -4
  30. package/{host-BMUSAUQG.js → host-JSCRRZ3J.js} +4 -4
  31. package/{logs-V3YP5YWY.js → logs-AEIWXRS6.js} +6 -6
  32. package/{mail-JUWPEJBZ.js → mail-CMOTFJRW.js} +6 -6
  33. package/{maps-N7NXJPFL.js → maps-WAWCF444.js} +4 -4
  34. package/{model-Q3RGYM62.js → model-O3H5L3R4.js} +5 -5
  35. package/{model-provider-33TUNFMS.js → model-provider-NWOG4WDP.js} +5 -5
  36. package/{org-SD4IEYST.js → org-H2KYZZHL.js} +4 -4
  37. package/package.json +1 -1
  38. package/{people-search-3UMPCYVU.js → people-search-OYHCUQQ5.js} +4 -4
  39. package/{phone-7BQ3BR3C.js → phone-XDTMDNGG.js} +4 -4
  40. package/{preference-FXATAHDW.js → preference-JJG4RC3V.js} +4 -4
  41. package/{resource-Y67KRIPY.js → resource-QCPLW3RQ.js} +4 -4
  42. package/{scrape-3JQ2OS3K.js → scrape-NX44VHU6.js} +4 -4
  43. package/{search-YESW2FNC.js → search-XMML4Q6A.js} +6 -6
  44. package/{secret-RXYXPWUF.js → secret-RYOMS4YU.js} +4 -4
  45. package/{slack-4DCGDMNB.js → slack-WQ7G3WH7.js} +4 -4
  46. package/{teams-QFD2A6GL.js → teams-XL2GYS3H.js} +4 -4
  47. package/{telegram-RXVJHSUD.js → telegram-E3ILARSU.js} +4 -4
  48. package/{upgrade-BAMSKCN3.js → upgrade-B2QEWNOR.js} +3 -3
  49. package/{variable-W2SCMTCE.js → variable-I5TBQURO.js} +4 -4
  50. package/{video-U54DBG7F.js → video-B644TGB2.js} +3 -3
  51. package/{weather-BQ7XSCCQ.js → weather-ZFYVIQQC.js} +4 -4
  52. package/{web-NSMEQ7KS.js → web-6YP4UZZS.js} +4 -4
  53. package/{web-search-U7HXOGYD.js → web-search-3ZBOMLOF.js} +4 -4
  54. package/{whoami-7GHF4FG6.js → whoami-RCMC3HFF.js} +6 -6
  55. package/{workflow-5IUYLCC5.js → workflow-GZ66ZARR.js} +5 -5
  56. package/zero.js +49 -44
  57. package/zero.js.map +1 -1
  58. package/browser-OO3SXJ66.js.map +0 -1
  59. package/chat-IYYYJKVT.js.map +0 -1
  60. package/chunk-7DFIPXTO.js.map +0 -1
  61. package/chunk-AOHVC7EW.js.map +0 -1
  62. package/chunk-FLWE2Q4D.js.map +0 -1
  63. /package/{agent-MHMP5BOB.js.map → agent-WJBV6XSO.js.map} +0 -0
  64. /package/{banking-WB4NGHEW.js.map → banking-MZPWKMV2.js.map} +0 -0
  65. /package/{chunk-NBF6ONZJ.js.map → chunk-4TODUWC7.js.map} +0 -0
  66. /package/{chunk-CPLEJWQT.js.map → chunk-GHMW55CQ.js.map} +0 -0
  67. /package/{chunk-A3GE6ETZ.js.map → chunk-HHVHHEJ2.js.map} +0 -0
  68. /package/{chunk-IOJHMLKT.js.map → chunk-JQDFMS4A.js.map} +0 -0
  69. /package/{chunk-MTLPPLPH.js.map → chunk-M75EI7GB.js.map} +0 -0
  70. /package/{chunk-DOYP2C2B.js.map → chunk-MIZEZBG6.js.map} +0 -0
  71. /package/{chunk-JUMGFS6V.js.map → chunk-SP2S4QWX.js.map} +0 -0
  72. /package/{computer-use-JPDTT4KX.js.map → computer-use-GMGAYWFF.js.map} +0 -0
  73. /package/{connector-NI2PWPCC.js.map → connector-SPL5EGNH.js.map} +0 -0
  74. /package/{credit-RE47VTRH.js.map → credit-ANE66MN5.js.map} +0 -0
  75. /package/{developer-support-DSPTERLL.js.map → developer-support-WNWRPWM5.js.map} +0 -0
  76. /package/{doctor-GGFT4M2V.js.map → doctor-YEBTJKXS.js.map} +0 -0
  77. /package/{feishu-COL55I4I.js.map → feishu-X6HV3Z75.js.map} +0 -0
  78. /package/{finance-4KCKJTAE.js.map → finance-3SLPN5ZX.js.map} +0 -0
  79. /package/{generate-NVBPAC3Z.js.map → generate-VK57QZTH.js.map} +0 -0
  80. /package/{github-KLRR5N7F.js.map → github-KHQGH7UJ.js.map} +0 -0
  81. /package/{goal-FINXKJ2J.js.map → goal-NP7LA4H5.js.map} +0 -0
  82. /package/{host-BMUSAUQG.js.map → host-JSCRRZ3J.js.map} +0 -0
  83. /package/{logs-V3YP5YWY.js.map → logs-AEIWXRS6.js.map} +0 -0
  84. /package/{mail-JUWPEJBZ.js.map → mail-CMOTFJRW.js.map} +0 -0
  85. /package/{maps-N7NXJPFL.js.map → maps-WAWCF444.js.map} +0 -0
  86. /package/{model-Q3RGYM62.js.map → model-O3H5L3R4.js.map} +0 -0
  87. /package/{model-provider-33TUNFMS.js.map → model-provider-NWOG4WDP.js.map} +0 -0
  88. /package/{org-SD4IEYST.js.map → org-H2KYZZHL.js.map} +0 -0
  89. /package/{people-search-3UMPCYVU.js.map → people-search-OYHCUQQ5.js.map} +0 -0
  90. /package/{phone-7BQ3BR3C.js.map → phone-XDTMDNGG.js.map} +0 -0
  91. /package/{preference-FXATAHDW.js.map → preference-JJG4RC3V.js.map} +0 -0
  92. /package/{resource-Y67KRIPY.js.map → resource-QCPLW3RQ.js.map} +0 -0
  93. /package/{scrape-3JQ2OS3K.js.map → scrape-NX44VHU6.js.map} +0 -0
  94. /package/{search-YESW2FNC.js.map → search-XMML4Q6A.js.map} +0 -0
  95. /package/{secret-RXYXPWUF.js.map → secret-RYOMS4YU.js.map} +0 -0
  96. /package/{slack-4DCGDMNB.js.map → slack-WQ7G3WH7.js.map} +0 -0
  97. /package/{teams-QFD2A6GL.js.map → teams-XL2GYS3H.js.map} +0 -0
  98. /package/{telegram-RXVJHSUD.js.map → telegram-E3ILARSU.js.map} +0 -0
  99. /package/{upgrade-BAMSKCN3.js.map → upgrade-B2QEWNOR.js.map} +0 -0
  100. /package/{variable-W2SCMTCE.js.map → variable-I5TBQURO.js.map} +0 -0
  101. /package/{video-U54DBG7F.js.map → video-B644TGB2.js.map} +0 -0
  102. /package/{weather-BQ7XSCCQ.js.map → weather-ZFYVIQQC.js.map} +0 -0
  103. /package/{web-NSMEQ7KS.js.map → web-6YP4UZZS.js.map} +0 -0
  104. /package/{web-search-U7HXOGYD.js.map → web-search-3ZBOMLOF.js.map} +0 -0
  105. /package/{whoami-7GHF4FG6.js.map → whoami-RCMC3HFF.js.map} +0 -0
  106. /package/{workflow-5IUYLCC5.js.map → workflow-GZ66ZARR.js.map} +0 -0
@@ -4,14 +4,14 @@ const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  loadConnectorPermissionInfos,
6
6
  policyIcon
7
- } from "./chunk-MTLPPLPH.js";
7
+ } from "./chunk-M75EI7GB.js";
8
8
  import {
9
9
  isInteractive,
10
10
  promptConfirm
11
11
  } from "./chunk-NU6ECB2E.js";
12
12
  import {
13
13
  permissionGrantsToFirewallPolicies
14
- } from "./chunk-JUMGFS6V.js";
14
+ } from "./chunk-SP2S4QWX.js";
15
15
  import {
16
16
  createZeroAgent,
17
17
  deleteZeroAgent,
@@ -23,13 +23,13 @@ import {
23
23
  listZeroUserPermissionGrants,
24
24
  updateZeroAgent,
25
25
  updateZeroAgentInstructions
26
- } from "./chunk-FLWE2Q4D.js";
27
- import "./chunk-A3GE6ETZ.js";
26
+ } from "./chunk-WTB4K3Z6.js";
27
+ import "./chunk-HHVHHEJ2.js";
28
28
  import "./chunk-MA22KQYU.js";
29
29
  import {
30
30
  source_default,
31
31
  withErrorHandler
32
- } from "./chunk-DOYP2C2B.js";
32
+ } from "./chunk-MIZEZBG6.js";
33
33
  import "./chunk-MD3YWUKO.js";
34
34
  import {
35
35
  Command
@@ -599,4 +599,4 @@ Notes:
599
599
  export {
600
600
  zeroAgentCommand
601
601
  };
602
- //# sourceMappingURL=agent-MHMP5BOB.js.map
602
+ //# sourceMappingURL=agent-WJBV6XSO.js.map
@@ -3,13 +3,13 @@ import { createRequire as __createRequire } from "node:module";
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  callZeroBanking
6
- } from "./chunk-FLWE2Q4D.js";
7
- import "./chunk-A3GE6ETZ.js";
6
+ } from "./chunk-WTB4K3Z6.js";
7
+ import "./chunk-HHVHHEJ2.js";
8
8
  import "./chunk-MA22KQYU.js";
9
9
  import {
10
10
  source_default,
11
11
  withErrorHandler
12
- } from "./chunk-DOYP2C2B.js";
12
+ } from "./chunk-MIZEZBG6.js";
13
13
  import "./chunk-MD3YWUKO.js";
14
14
  import {
15
15
  Command,
@@ -114,4 +114,4 @@ Notes:
114
114
  export {
115
115
  zeroBankingCommand
116
116
  };
117
- //# sourceMappingURL=banking-WB4NGHEW.js.map
117
+ //# sourceMappingURL=banking-MZPWKMV2.js.map
@@ -2,21 +2,19 @@
2
2
  import { createRequire as __createRequire } from "node:module";
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
- ZERO_BROWSER_DEFAULT_MAX_CREDITS,
6
5
  ZERO_BROWSER_IDLE_LEASE_MINUTES,
7
- ZERO_BROWSER_MAX_CREDITS,
8
6
  createZeroBrowser,
9
7
  getCurrentZeroBrowser,
10
8
  leaseZeroBrowser,
11
9
  useZeroBrowser,
12
10
  zeroBrowserCreateRequestSchema
13
- } from "./chunk-FLWE2Q4D.js";
14
- import "./chunk-A3GE6ETZ.js";
11
+ } from "./chunk-WTB4K3Z6.js";
12
+ import "./chunk-HHVHHEJ2.js";
15
13
  import "./chunk-MA22KQYU.js";
16
14
  import {
17
15
  source_default,
18
16
  withErrorHandler
19
- } from "./chunk-DOYP2C2B.js";
17
+ } from "./chunk-MIZEZBG6.js";
20
18
  import "./chunk-MD3YWUKO.js";
21
19
  import {
22
20
  Command,
@@ -31,22 +29,6 @@ import {
31
29
  init_esm_shims();
32
30
  import { spawnSync } from "child_process";
33
31
  var DEFAULT_AGENT_BROWSER_SESSION = "zero-browser";
34
- function positiveInteger(label, maximum) {
35
- return (value) => {
36
- if (!/^\d+$/u.test(value)) {
37
- throw new InvalidArgumentError(
38
- `${label} must be an integer from 1 to ${maximum}`
39
- );
40
- }
41
- const parsed = Number(value);
42
- if (parsed < 1 || parsed > maximum) {
43
- throw new InvalidArgumentError(
44
- `${label} must be an integer from 1 to ${maximum}`
45
- );
46
- }
47
- return parsed;
48
- };
49
- }
50
32
  function parseCountry(value) {
51
33
  const normalized = value.trim().toLowerCase();
52
34
  if (!/^[a-z]{2}$/u.test(normalized)) {
@@ -63,7 +45,13 @@ function parseAgentSession(value) {
63
45
  return value;
64
46
  }
65
47
  function browserJson(browser) {
66
- const { liveUrl: _liveUrl, ...safeBrowser } = browser;
48
+ const {
49
+ creditsCharged: _creditsCharged,
50
+ grossCredits: _grossCredits,
51
+ liveUrl: _liveUrl,
52
+ maxCredits: _maxCredits,
53
+ ...safeBrowser
54
+ } = browser;
67
55
  return safeBrowser;
68
56
  }
69
57
  function connectAgentBrowser(cdpUrl, sessionName) {
@@ -89,11 +77,6 @@ function reclaimNotice(browser) {
89
77
  function renderBrowser(browser) {
90
78
  console.log(`${browser.name} \xB7 ${browser.status}`);
91
79
  console.log(source_default.dim(` ID: ${browser.id}`));
92
- console.log(
93
- source_default.dim(
94
- ` Credits: ${browser.creditsCharged} charged / ${browser.maxCredits} budget`
95
- )
96
- );
97
80
  console.log(source_default.dim(` ${reclaimNotice(browser)}`));
98
81
  console.log(` ${browser.viewerUrl}`);
99
82
  }
@@ -156,8 +139,6 @@ var newCommand = new Command().name("new").description(
156
139
  "--country <code>",
157
140
  "Residential proxy country; omitted uses lower-cost proxyless egress"
158
141
  ).argParser(parseCountry)
159
- ).addOption(
160
- new Option("--max-credits <credits>", "Logical browser credit budget").default(ZERO_BROWSER_DEFAULT_MAX_CREDITS).argParser(positiveInteger("max-credits", ZERO_BROWSER_MAX_CREDITS))
161
142
  ).addOption(
162
143
  new Option(
163
144
  "--agent-session <name>",
@@ -167,8 +148,7 @@ var newCommand = new Command().name("new").description(
167
148
  withErrorHandler(async (options) => {
168
149
  const request = zeroBrowserCreateRequestSchema.parse({
169
150
  name: options.name,
170
- proxyCountryCode: options.country ?? null,
171
- maxCredits: options.maxCredits
151
+ proxyCountryCode: options.country ?? null
172
152
  });
173
153
  await connectResponse(await createZeroBrowser(request), options);
174
154
  })
@@ -200,7 +180,7 @@ Examples:
200
180
 
201
181
  Notes:
202
182
  - The browser outlives this run; the user can keep working in it from the viewer link
203
- - Zero reclaims it after ${ZERO_BROWSER_IDLE_LEASE_MINUTES} idle minutes and settles its cost then
183
+ - Zero reclaims it after ${ZERO_BROWSER_IDLE_LEASE_MINUTES} idle minutes
204
184
  - \`zero browser use\` restores a reclaimed browser's login profile, not its old tabs
205
185
  - Browser Use credentials and connection URLs are never printed
206
186
  - Threads for the same user and organization share one login profile
@@ -209,4 +189,4 @@ Notes:
209
189
  export {
210
190
  zeroBrowserCommand
211
191
  };
212
- //# sourceMappingURL=browser-OO3SXJ66.js.map
192
+ //# sourceMappingURL=browser-F4J54ATA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/zero/browser/index.ts"],"sourcesContent":["import { spawnSync } from \"node:child_process\";\n\nimport chalk from \"chalk\";\nimport { Command, InvalidArgumentError, Option } from \"commander\";\nimport {\n ZERO_BROWSER_IDLE_LEASE_MINUTES,\n zeroBrowserCreateRequestSchema,\n type ZeroBrowserSession,\n} from \"@vm0/api-contracts/contracts/zero-browser\";\n\nimport {\n createZeroBrowser,\n getCurrentZeroBrowser,\n leaseZeroBrowser,\n useZeroBrowser,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nconst DEFAULT_AGENT_BROWSER_SESSION = \"zero-browser\";\n\ninterface NewOptions {\n readonly name: string;\n readonly country?: string;\n readonly agentSession?: string;\n readonly json?: boolean;\n}\n\ninterface ConnectionOptions {\n readonly agentSession?: string;\n readonly json?: boolean;\n}\n\ninterface OutputOptions {\n readonly json?: boolean;\n}\n\nfunction parseCountry(value: string): string {\n const normalized = value.trim().toLowerCase();\n if (!/^[a-z]{2}$/u.test(normalized)) {\n throw new InvalidArgumentError(\"country must be a two-letter country code\");\n }\n return normalized;\n}\n\nfunction parseAgentSession(value: string): string {\n if (!/^[a-zA-Z0-9_-]{1,64}$/u.test(value)) {\n throw new InvalidArgumentError(\n \"agent-session must contain only letters, numbers, underscores, or hyphens\",\n );\n }\n return value;\n}\n\nfunction browserJson(\n browser: ZeroBrowserSession,\n): Omit<\n ZeroBrowserSession,\n \"creditsCharged\" | \"grossCredits\" | \"liveUrl\" | \"maxCredits\"\n> {\n const {\n creditsCharged: _creditsCharged,\n grossCredits: _grossCredits,\n liveUrl: _liveUrl,\n maxCredits: _maxCredits,\n ...safeBrowser\n } = browser;\n return safeBrowser;\n}\n\nfunction connectAgentBrowser(cdpUrl: string, sessionName: string): void {\n const result = spawnSync(\n \"agent-browser\",\n [\"--session\", sessionName, \"connect\", cdpUrl],\n { stdio: \"ignore\" },\n );\n if (result.error) {\n throw new Error(\"Could not start agent-browser\", {\n cause: result.error,\n });\n }\n if (result.status !== 0) {\n throw new Error(\n `agent-browser connect exited with status ${result.status ?? \"unknown\"}`,\n );\n }\n}\n\nfunction reclaimNotice(browser: ZeroBrowserSession): string {\n return browser.idleExpiresAt\n ? `Zero reclaims this browser at ${browser.idleExpiresAt} unless it is used or leased again`\n : \"This browser has no live window to reclaim\";\n}\n\nfunction renderBrowser(browser: ZeroBrowserSession): void {\n console.log(`${browser.name} · ${browser.status}`);\n console.log(chalk.dim(` ID: ${browser.id}`));\n console.log(chalk.dim(` ${reclaimNotice(browser)}`));\n console.log(` ${browser.viewerUrl}`);\n}\n\nasync function connectResponse(\n response: {\n readonly browser: ZeroBrowserSession;\n readonly cdpUrl: string;\n },\n options: ConnectionOptions,\n): Promise<void> {\n const sessionName = options.agentSession ?? DEFAULT_AGENT_BROWSER_SESSION;\n connectAgentBrowser(response.cdpUrl, sessionName);\n if (options.json) {\n console.log(\n JSON.stringify({\n browser: browserJson(response.browser),\n agentBrowserSession: sessionName,\n }),\n );\n return;\n }\n console.log(chalk.green(\"✓ Managed browser ready\"));\n console.log(chalk.dim(` agent-browser session: ${sessionName}`));\n console.log(chalk.dim(` ${reclaimNotice(response.browser)}`));\n console.log(`[Open live browser](${response.browser.viewerUrl})`);\n}\n\nconst useCommand = new Command()\n .name(\"use\")\n .description(\n \"Create, reuse, or resume this thread's browser, attach it to agent-browser, and extend its lease\",\n )\n .addOption(\n new Option(\n \"--agent-session <name>\",\n \"Named agent-browser session\",\n ).argParser(parseAgentSession),\n )\n .option(\"--json\", \"Print machine-readable output without connection secrets\")\n .action(\n withErrorHandler(async (options: ConnectionOptions) => {\n await connectResponse(await useZeroBrowser(), options);\n }),\n );\n\nconst resumeCommand = new Command()\n .name(\"resume\")\n .description(\"Deprecated alias of use\")\n .addOption(\n new Option(\n \"--agent-session <name>\",\n \"Named agent-browser session\",\n ).argParser(parseAgentSession),\n )\n .option(\"--json\", \"Print machine-readable output without connection secrets\")\n .action(\n withErrorHandler(async (options: ConnectionOptions) => {\n await connectResponse(await useZeroBrowser(), options);\n }),\n );\n\nconst leaseCommand = new Command()\n .name(\"lease\")\n .description(\n `Keep this thread's live browser for another ${ZERO_BROWSER_IDLE_LEASE_MINUTES} minutes`,\n )\n .option(\"--json\", \"Print machine-readable output\")\n .action(\n withErrorHandler(async (options: OutputOptions) => {\n const browser = await leaseZeroBrowser();\n if (options.json) {\n console.log(JSON.stringify({ browser: browserJson(browser) }));\n return;\n }\n console.log(chalk.green(\"✓ Managed browser lease extended\"));\n console.log(chalk.dim(` ${reclaimNotice(browser)}`));\n }),\n );\n\nconst newCommand = new Command()\n .name(\"new\")\n .description(\n \"Create another thread browser with the shared user profile and attach it to agent-browser\",\n )\n .addOption(new Option(\"--name <name>\", \"Browser name\").default(\"browser\"))\n .addOption(\n new Option(\n \"--country <code>\",\n \"Residential proxy country; omitted uses lower-cost proxyless egress\",\n ).argParser(parseCountry),\n )\n .addOption(\n new Option(\n \"--agent-session <name>\",\n \"Named agent-browser session\",\n ).argParser(parseAgentSession),\n )\n .option(\"--json\", \"Print machine-readable output without connection secrets\")\n .action(\n withErrorHandler(async (options: NewOptions) => {\n const request = zeroBrowserCreateRequestSchema.parse({\n name: options.name,\n proxyCountryCode: options.country ?? null,\n });\n await connectResponse(await createZeroBrowser(request), options);\n }),\n );\n\nconst statusCommand = new Command()\n .name(\"status\")\n .description(\"Show the current thread browser status\")\n .option(\"--json\", \"Print machine-readable output\")\n .action(\n withErrorHandler(async (options: OutputOptions) => {\n const browser = await getCurrentZeroBrowser();\n if (options.json) {\n console.log(JSON.stringify({ browser: browserJson(browser) }));\n return;\n }\n renderBrowser(browser);\n }),\n );\n\nconst viewCommand = new Command()\n .name(\"view\")\n .description(\"Print the current thread browser's authenticated viewer link\")\n .action(\n withErrorHandler(async () => {\n console.log((await getCurrentZeroBrowser()).viewerUrl);\n }),\n );\n\nexport const zeroBrowserCommand = new Command()\n .name(\"browser\")\n .description(\"Use a managed remote browser through agent-browser\")\n .addCommand(useCommand)\n .addCommand(leaseCommand)\n .addCommand(resumeCommand)\n .addCommand(newCommand)\n .addCommand(statusCommand)\n .addCommand(viewCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Open this thread's browser: zero browser use\n Keep it alive: zero browser lease\n Create another browser: zero browser new --name booking --country us\n Use the browser: agent-browser --session zero-browser open https://example.com\n Share live view: zero browser view\n\nNotes:\n - The browser outlives this run; the user can keep working in it from the viewer link\n - Zero reclaims it after ${ZERO_BROWSER_IDLE_LEASE_MINUTES} idle minutes\n - \\`zero browser use\\` restores a reclaimed browser's login profile, not its old tabs\n - Browser Use credentials and connection URLs are never printed\n - Threads for the same user and organization share one login profile\n - Threads can use the shared profile in parallel`,\n );\n"],"mappings":"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","names":[]}
@@ -11,24 +11,28 @@ import {
11
11
  } from "./chunk-LN2ATWKS.js";
12
12
  import {
13
13
  formatModelProviderRoute
14
- } from "./chunk-CPLEJWQT.js";
14
+ } from "./chunk-GHMW55CQ.js";
15
15
  import {
16
16
  chatThreadEventSchema,
17
17
  chatThreadSnapshotProjectionSchema,
18
+ foldPendingChatQueueEvents,
18
19
  getZeroChatThread,
20
+ getZeroChatThreadAgentId,
19
21
  getZeroChatThreadSnapshot,
22
+ listZeroChatEvents,
20
23
  listZeroChatThreadEvents,
21
24
  listZeroModelPolicies,
22
25
  renameZeroChatThread,
26
+ sendZeroChatEvent,
23
27
  updateZeroChatThreadModelSelection
24
- } from "./chunk-FLWE2Q4D.js";
25
- import "./chunk-A3GE6ETZ.js";
28
+ } from "./chunk-WTB4K3Z6.js";
29
+ import "./chunk-HHVHHEJ2.js";
26
30
  import "./chunk-MA22KQYU.js";
27
31
  import {
28
32
  getApiUrl,
29
33
  source_default,
30
34
  withErrorHandler
31
- } from "./chunk-DOYP2C2B.js";
35
+ } from "./chunk-MIZEZBG6.js";
32
36
  import {
33
37
  decodeZeroTokenPayload
34
38
  } from "./chunk-MD3YWUKO.js";
@@ -42,6 +46,125 @@ import {
42
46
  // src/commands/zero/chat/index.ts
43
47
  init_esm_shims();
44
48
 
49
+ // src/commands/zero/chat/cancel.ts
50
+ init_esm_shims();
51
+ import { randomUUID } from "crypto";
52
+
53
+ // src/commands/zero/chat/shared.ts
54
+ init_esm_shims();
55
+ function printChatUsageError(message, hint) {
56
+ console.error(source_default.red(`\u2717 ${message}`));
57
+ console.error(source_default.dim(` ${hint}`));
58
+ process.exit(1);
59
+ }
60
+ function resolveChatThreadId(flagThreadId) {
61
+ const threadId = flagThreadId?.trim() || process.env.ZERO_CHAT_THREAD_ID?.trim();
62
+ if (!threadId) {
63
+ printChatUsageError(
64
+ "ZERO_CHAT_THREAD_ID is not set",
65
+ "Pass --thread-id <thread-id> or run inside a Zero web chat thread."
66
+ );
67
+ }
68
+ if (!isUuid(threadId)) {
69
+ printChatUsageError(
70
+ `Invalid thread ID "${threadId}" \u2014 expected a UUID`,
71
+ "Pass a valid UUID with --thread-id <thread-id>."
72
+ );
73
+ }
74
+ return threadId;
75
+ }
76
+
77
+ // src/commands/zero/chat/cancel.ts
78
+ function resolveTarget(options) {
79
+ const runId = options.runId?.trim();
80
+ const eventId = options.eventId?.trim();
81
+ if (runId && eventId) {
82
+ printChatUsageError(
83
+ "Exactly one of --run-id or --event-id is required",
84
+ "Use --run-id for an active run or --event-id for a queued event."
85
+ );
86
+ }
87
+ if (runId) {
88
+ if (!isUuid(runId)) {
89
+ printChatUsageError(
90
+ `Invalid run ID "${runId}" \u2014 expected a UUID`,
91
+ "Pass a valid UUID with --run-id."
92
+ );
93
+ }
94
+ return { kind: "run", id: runId };
95
+ }
96
+ if (eventId) {
97
+ if (!isUuid(eventId)) {
98
+ printChatUsageError(
99
+ `Invalid event ID "${eventId}" \u2014 expected a UUID`,
100
+ "Pass a valid UUID with --event-id."
101
+ );
102
+ }
103
+ return { kind: "event", id: eventId };
104
+ }
105
+ printChatUsageError(
106
+ "Exactly one of --run-id or --event-id is required",
107
+ "Use --run-id for an active run or --event-id for a queued event."
108
+ );
109
+ }
110
+ var cancelCommand = new Command().name("cancel").description("Cancel one active run or queued chat event").option(
111
+ "--thread-id <id>",
112
+ "Chat thread ID (defaults to ZERO_CHAT_THREAD_ID)"
113
+ ).option("--run-id <id>", "Queued, pending, or running run ID to interrupt").option("--event-id <id>", "Queued chat event ID to revoke").option("--json", "Print machine-readable JSON").addHelpText(
114
+ "after",
115
+ `
116
+ Examples:
117
+ Cancel a run: zero chat cancel --thread-id <thread-id> --run-id <run-id>
118
+ Cancel a message: zero chat cancel --thread-id <thread-id> --event-id <event-id>
119
+
120
+ Notes:
121
+ - --run-id and --event-id are mutually exclusive
122
+ - Authenticates via ZERO_TOKEN (requires chat-thread:read and chat-message:write capabilities)`
123
+ ).action(
124
+ withErrorHandler(async (options) => {
125
+ const threadId = resolveChatThreadId(options.threadId);
126
+ const target = resolveTarget(options);
127
+ const agentId = await getZeroChatThreadAgentId({ threadId });
128
+ const controlEventId = randomUUID();
129
+ const result = await sendZeroChatEvent(
130
+ target.kind === "run" ? {
131
+ agentId,
132
+ threadId,
133
+ interruptsRunId: target.id,
134
+ clientEventId: controlEventId
135
+ } : {
136
+ agentId,
137
+ threadId,
138
+ revokesEventId: target.id,
139
+ clientEventId: controlEventId
140
+ }
141
+ );
142
+ const output = {
143
+ threadId: result.threadId,
144
+ controlEventId,
145
+ targetType: target.kind,
146
+ targetId: target.id,
147
+ createdAt: result.createdAt ?? null
148
+ };
149
+ if (options.json) {
150
+ console.log(JSON.stringify(output));
151
+ return;
152
+ }
153
+ console.log(
154
+ source_default.green(
155
+ target.kind === "run" ? "\u2713 Chat run cancelled" : "\u2713 Queued chat event cancelled"
156
+ )
157
+ );
158
+ console.log(source_default.dim(` Thread: ${output.threadId}`));
159
+ console.log(
160
+ source_default.dim(
161
+ ` ${target.kind === "run" ? "Run" : "Event"}: ${target.id}`
162
+ )
163
+ );
164
+ console.log(source_default.dim(` Control: ${controlEventId}`));
165
+ })
166
+ );
167
+
45
168
  // src/commands/zero/chat/get.ts
46
169
  init_esm_shims();
47
170
  function getCurrentChatThreadId() {
@@ -78,6 +201,9 @@ Notes:
78
201
  }
79
202
  console.log(source_default.green("\u2713 Chat thread loaded"));
80
203
  console.log(source_default.dim(` Thread: ${thread.id}`));
204
+ if (thread.agentId) {
205
+ console.log(source_default.dim(` Agent: ${thread.agentId}`));
206
+ }
81
207
  console.log(source_default.dim(` Title: ${thread.title ?? "(untitled)"}`));
82
208
  console.log(
83
209
  source_default.dim(` Model: ${thread.selectedModel ?? "(default)"}`)
@@ -90,7 +216,7 @@ init_esm_shims();
90
216
 
91
217
  // src/commands/zero/chat/chat-thread-cache.ts
92
218
  init_esm_shims();
93
- import { createHash, randomUUID } from "crypto";
219
+ import { createHash, randomUUID as randomUUID2 } from "crypto";
94
220
  import { mkdir, readFile, rename, rm, writeFile } from "fs/promises";
95
221
  import { homedir } from "os";
96
222
  import { dirname, join } from "path";
@@ -290,7 +416,7 @@ async function readCache(path) {
290
416
  }
291
417
  async function writeCache(path, cache) {
292
418
  await mkdir(dirname(path), { recursive: true, mode: 448 });
293
- const temporaryPath = `${path}.${process.pid}.${randomUUID()}.tmp`;
419
+ const temporaryPath = `${path}.${process.pid}.${randomUUID2()}.tmp`;
294
420
  try {
295
421
  await writeFile(temporaryPath, `${JSON.stringify(cache)}
296
422
  `, {
@@ -601,6 +727,109 @@ Notes:
601
727
  )
602
728
  );
603
729
 
730
+ // src/commands/zero/chat/queued.ts
731
+ init_esm_shims();
732
+ var PAGE_LIMIT = 50;
733
+ async function loadAllChatEvents(threadId) {
734
+ let beforeSeqId;
735
+ const newestFirstPages = [];
736
+ const seenCursors = /* @__PURE__ */ new Set();
737
+ for (; ; ) {
738
+ const page = await listZeroChatEvents({
739
+ threadId,
740
+ beforeSeqId,
741
+ limit: PAGE_LIMIT
742
+ });
743
+ newestFirstPages.push([...page.events]);
744
+ if (!page.hasHistoryBefore) {
745
+ return newestFirstPages.reverse().flat();
746
+ }
747
+ const nextCursor = page.events[0]?.seqId;
748
+ if (nextCursor === void 0 || seenCursors.has(nextCursor)) {
749
+ throw new Error("Chat event pagination did not return a usable cursor");
750
+ }
751
+ seenCursors.add(nextCursor);
752
+ beforeSeqId = nextCursor;
753
+ }
754
+ }
755
+ function compactText(value) {
756
+ return (value ?? "").replace(/\s+/g, " ").trim();
757
+ }
758
+ function summarizeQueuedEvent(event) {
759
+ if (event.eventType === "input.prompt") {
760
+ return {
761
+ eventId: event.id,
762
+ eventType: event.eventType,
763
+ createdAt: event.createdAt,
764
+ text: compactText(event.content)
765
+ };
766
+ }
767
+ if (event.eventType === "input.automation") {
768
+ return {
769
+ eventId: event.id,
770
+ eventType: event.eventType,
771
+ createdAt: event.createdAt,
772
+ text: compactText(
773
+ event.triggerBrief ?? event.workflowSnapshot?.triggerBrief ?? event.workflowSnapshot?.displayName ?? event.workflowSnapshot?.name
774
+ )
775
+ };
776
+ }
777
+ return null;
778
+ }
779
+ var queuedCommand = new Command().name("queued").description("List events waiting in a web chat thread queue").option(
780
+ "--thread-id <id>",
781
+ "Chat thread ID (defaults to ZERO_CHAT_THREAD_ID)"
782
+ ).option("--json", "Print machine-readable JSON").addHelpText(
783
+ "after",
784
+ `
785
+ Examples:
786
+ Show this queue: zero chat queued
787
+ Show another queue: zero chat queued --thread-id <thread-id>
788
+ Print JSON: zero chat queued --thread-id <thread-id> --json
789
+
790
+ Notes:
791
+ - Lists the same unassociated user and automation events shown as queued by Platform
792
+ - Event IDs can be passed to zero chat cancel --event-id
793
+ - Authenticates via ZERO_TOKEN (requires chat-message:read capability)`
794
+ ).action(
795
+ withErrorHandler(async (options) => {
796
+ const threadId = resolveChatThreadId(options.threadId);
797
+ const allEvents = await loadAllChatEvents(threadId);
798
+ const queued = foldPendingChatQueueEvents(allEvents).flatMap((event) => {
799
+ const summary = summarizeQueuedEvent(event);
800
+ return summary ? [summary] : [];
801
+ });
802
+ if (options.json) {
803
+ console.log(JSON.stringify({ threadId, total: queued.length, queued }));
804
+ return;
805
+ }
806
+ if (queued.length === 0) {
807
+ console.log(source_default.dim("No queued chat events"));
808
+ return;
809
+ }
810
+ console.log(
811
+ source_default.dim(
812
+ [
813
+ "EVENT ID".padEnd(38),
814
+ "TYPE".padEnd(18),
815
+ "QUEUED".padEnd(20),
816
+ "MESSAGE"
817
+ ].join(" ")
818
+ )
819
+ );
820
+ for (const event of queued) {
821
+ console.log(
822
+ [
823
+ event.eventId.padEnd(38),
824
+ event.eventType.padEnd(18),
825
+ formatIsoTimestamp(event.createdAt).padEnd(20),
826
+ event.text || "(no message text)"
827
+ ].join(" ")
828
+ );
829
+ }
830
+ })
831
+ );
832
+
604
833
  // src/commands/zero/chat/rename.ts
605
834
  init_esm_shims();
606
835
  function getCurrentChatThreadId3() {
@@ -654,11 +883,100 @@ Notes:
654
883
  })
655
884
  );
656
885
 
886
+ // src/commands/zero/chat/send.ts
887
+ init_esm_shims();
888
+ import { randomUUID as randomUUID3 } from "crypto";
889
+ import { readFileSync } from "fs";
890
+ function readMessageText(optionText) {
891
+ let text = optionText;
892
+ if (text === void 0 && !process.stdin.isTTY) {
893
+ try {
894
+ text = readFileSync("/dev/stdin", "utf8");
895
+ } catch {
896
+ }
897
+ }
898
+ const trimmed = text?.trim();
899
+ if (!trimmed) {
900
+ printChatUsageError(
901
+ "Chat message text is required",
902
+ 'Pass --text "message" or pipe the message on stdin.'
903
+ );
904
+ }
905
+ return trimmed;
906
+ }
907
+ var sendCommand = new Command().name("send").description("Send a message to a web chat thread").option(
908
+ "--thread-id <id>",
909
+ "Chat thread ID (defaults to ZERO_CHAT_THREAD_ID)"
910
+ ).option("-t, --text <message>", "Message text (or read it from stdin)").option("--json", "Print machine-readable JSON").addHelpText(
911
+ "after",
912
+ `
913
+ Examples:
914
+ Send to this chat: zero chat send --text "Continue the analysis"
915
+ Send to a thread: zero chat send --thread-id <thread-id> --text "Continue"
916
+ Pipe a message: printf "Continue" | zero chat send --thread-id <thread-id>
917
+ Print JSON: zero chat send --text "Continue" --json
918
+
919
+ Notes:
920
+ - Constructs a version 1 UserMessageDocument with one text part
921
+ - Every normal message enters the thread queue first; an idle queue may dispatch it immediately
922
+ - Authenticates via ZERO_TOKEN (requires chat-thread:read and chat-message:write capabilities)`
923
+ ).action(
924
+ withErrorHandler(async (options) => {
925
+ const threadId = resolveChatThreadId(options.threadId);
926
+ const text = readMessageText(options.text);
927
+ const agentId = await getZeroChatThreadAgentId({ threadId });
928
+ const eventId = randomUUID3();
929
+ const userMessage = {
930
+ version: 1,
931
+ parts: [{ type: "text", text }]
932
+ };
933
+ const result = await sendZeroChatEvent({
934
+ agentId,
935
+ threadId,
936
+ prompt: text,
937
+ hasTextContent: true,
938
+ clientEventId: eventId,
939
+ chatThreadSortEventId: randomUUID3(),
940
+ userMessage
941
+ });
942
+ const queued = result.runId === null;
943
+ if (options.json) {
944
+ console.log(
945
+ JSON.stringify({
946
+ threadId: result.threadId,
947
+ eventId,
948
+ runId: result.runId,
949
+ status: result.status ?? null,
950
+ createdAt: result.createdAt ?? null,
951
+ messageQueued: queued
952
+ })
953
+ );
954
+ return;
955
+ }
956
+ console.log(
957
+ source_default.green(
958
+ queued ? "\u2713 Chat message queued" : "\u2713 Chat message dispatched"
959
+ )
960
+ );
961
+ console.log(source_default.dim(` Thread: ${result.threadId}`));
962
+ console.log(source_default.dim(` Event: ${eventId}`));
963
+ if (result.runId) {
964
+ console.log(source_default.dim(` Run: ${result.runId}`));
965
+ }
966
+ if (result.status) {
967
+ console.log(source_default.dim(` Status: ${result.status}`));
968
+ }
969
+ })
970
+ );
971
+
657
972
  // src/commands/zero/chat/index.ts
658
- var zeroChatCommand = new Command().name("chat").description("Manage web chat threads").addCommand(getCommand).addCommand(listCommand).addCommand(modelCommand).addCommand(renameCommand).addHelpText(
973
+ var zeroChatCommand = new Command().name("chat").description("Manage web chat threads").addCommand(sendCommand).addCommand(queuedCommand).addCommand(cancelCommand).addCommand(getCommand).addCommand(listCommand).addCommand(modelCommand).addCommand(renameCommand).addHelpText(
659
974
  "after",
660
975
  `
661
976
  Examples:
977
+ Send a message: zero chat send --text "Continue"
978
+ Show queued: zero chat queued --thread-id <thread-id>
979
+ Cancel a run: zero chat cancel --thread-id <thread-id> --run-id <run-id>
662
980
  List agent chats: zero chat list
663
981
  Show this chat: zero chat get
664
982
  Switch model: zero chat model claude-sonnet-5
@@ -669,4 +987,4 @@ Examples:
669
987
  export {
670
988
  zeroChatCommand
671
989
  };
672
- //# sourceMappingURL=chat-IYYYJKVT.js.map
990
+ //# sourceMappingURL=chat-OTLB5LYG.js.map