@vm0/cli 9.255.0 → 9.257.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 (105) hide show
  1. package/{agent-YXVPOZDT.js → agent-6PNU7NKA.js} +7 -7
  2. package/{banking-K734DGW4.js → banking-LIKZNNA3.js} +5 -5
  3. package/{browser-GMLGBTV7.js → browser-4R2YDR62.js} +49 -23
  4. package/browser-4R2YDR62.js.map +1 -0
  5. package/{chat-I2URW23Z.js → chat-PSSM3NZI.js} +6 -6
  6. package/{chunk-DQB537B5.js → chunk-AXPECIRA.js} +8 -7
  7. package/chunk-AXPECIRA.js.map +1 -0
  8. package/{chunk-MDKQRZ7S.js → chunk-DIK5B4ZQ.js} +79 -57
  9. package/{chunk-MDKQRZ7S.js.map → chunk-DIK5B4ZQ.js.map} +1 -1
  10. package/{chunk-BKR7J5QP.js → chunk-GF22PXYF.js} +2 -2
  11. package/{chunk-RKXDWJW5.js → chunk-KDNGT5NT.js} +2 -30
  12. package/chunk-KDNGT5NT.js.map +1 -0
  13. package/{chunk-24QJ7H5R.js → chunk-NAXSTGVS.js} +2 -2
  14. package/{chunk-UKQRMBLJ.js → chunk-OMZ7JNGC.js} +2 -2
  15. package/{chunk-7PFY5Y77.js → chunk-RKOGVYZD.js} +3 -3
  16. package/{chunk-ZLP3TODB.js → chunk-RLKJ2XNZ.js} +2 -2
  17. package/{chunk-45FQJCB2.js → chunk-TP7AVH5K.js} +2 -2
  18. package/{chunk-H4LRAOOF.js → chunk-X5FAOKYK.js} +2 -3
  19. package/{chunk-H4LRAOOF.js.map → chunk-X5FAOKYK.js.map} +1 -1
  20. package/{chunk-BYD553JQ.js → chunk-ZQOFNY34.js} +4 -4
  21. package/{computer-use-OVYDVFLM.js → computer-use-54M26ZHL.js} +5 -5
  22. package/{connector-ZJ4GNXOR.js → connector-NQP2OC55.js} +8 -8
  23. package/{credit-5F56FMHI.js → credit-IHTXTFPT.js} +7 -7
  24. package/{developer-support-DMN7JGPX.js → developer-support-Z2A6DWF7.js} +5 -5
  25. package/{doctor-Y724BLON.js → doctor-KTLE2XJI.js} +7 -7
  26. package/{feishu-T5ZIWV53.js → feishu-GKPQY3AW.js} +5 -5
  27. package/{finance-4ZRCXMFS.js → finance-KIIZG3ZI.js} +5 -5
  28. package/{generate-JFRB6NBZ.js → generate-76I6OUDC.js} +7 -7
  29. package/{github-ZXWGL5Q6.js → github-YU7FN4T4.js} +5 -5
  30. package/{goal-22N3CH3F.js → goal-XJUAREVX.js} +5 -5
  31. package/{host-I7S5PYUY.js → host-7BZHM6UL.js} +5 -5
  32. package/{logs-4HV44EMA.js → logs-6HBWQTDR.js} +6 -6
  33. package/{mail-U5LPAC7X.js → mail-UHSIDK2L.js} +7 -7
  34. package/{maps-PF5WHYEC.js → maps-E7UDZIQW.js} +5 -5
  35. package/{model-JMQSUUFJ.js → model-JNX4ATJD.js} +6 -6
  36. package/{model-provider-AJCWCCNB.js → model-provider-3OJOREKY.js} +6 -6
  37. package/{org-7Q3J66NB.js → org-HFW3TZVX.js} +5 -5
  38. package/package.json +1 -1
  39. package/{people-search-GUIJICYT.js → people-search-P4DUITUE.js} +5 -5
  40. package/{phone-6U27VFNC.js → phone-HEDFCVAX.js} +5 -5
  41. package/{preference-BFLHPME6.js → preference-ZFGOHT3I.js} +5 -5
  42. package/{resource-C3PAGM7Y.js → resource-JOLB3ZCJ.js} +5 -5
  43. package/{scrape-5XL47HZY.js → scrape-YMTMJRHW.js} +5 -5
  44. package/{search-B2V6NTUP.js → search-ZJJZXAVE.js} +6 -6
  45. package/{secret-QORKNSMC.js → secret-HE7UT6PO.js} +5 -5
  46. package/{slack-MD6HYUDE.js → slack-CMNXWUKS.js} +5 -5
  47. package/{teams-LO3PPNA2.js → teams-ZSHKKQUD.js} +5 -5
  48. package/{telegram-BZUBR4QS.js → telegram-VLCEN6MM.js} +5 -5
  49. package/{upgrade-63B4TM4E.js → upgrade-WX3U7MZI.js} +4 -4
  50. package/{variable-FW7F63SB.js → variable-H54WRRXG.js} +5 -5
  51. package/{video-RWCQZ4XP.js → video-XJJZZYSG.js} +4 -4
  52. package/{weather-ST6CIHV4.js → weather-XWXK6CZY.js} +5 -5
  53. package/{web-GBSYVVYF.js → web-5UY5AYFW.js} +5 -5
  54. package/{web-search-AZXILILB.js → web-search-4MQUXAQH.js} +5 -5
  55. package/{whoami-UI67766P.js → whoami-XWFEH6TT.js} +7 -7
  56. package/{workflow-CXWRSWUP.js → workflow-GAXXRI6N.js} +5 -5
  57. package/zero.js +43 -43
  58. package/browser-GMLGBTV7.js.map +0 -1
  59. package/chunk-DQB537B5.js.map +0 -1
  60. package/chunk-RKXDWJW5.js.map +0 -1
  61. /package/{agent-YXVPOZDT.js.map → agent-6PNU7NKA.js.map} +0 -0
  62. /package/{banking-K734DGW4.js.map → banking-LIKZNNA3.js.map} +0 -0
  63. /package/{chat-I2URW23Z.js.map → chat-PSSM3NZI.js.map} +0 -0
  64. /package/{chunk-BKR7J5QP.js.map → chunk-GF22PXYF.js.map} +0 -0
  65. /package/{chunk-24QJ7H5R.js.map → chunk-NAXSTGVS.js.map} +0 -0
  66. /package/{chunk-UKQRMBLJ.js.map → chunk-OMZ7JNGC.js.map} +0 -0
  67. /package/{chunk-7PFY5Y77.js.map → chunk-RKOGVYZD.js.map} +0 -0
  68. /package/{chunk-ZLP3TODB.js.map → chunk-RLKJ2XNZ.js.map} +0 -0
  69. /package/{chunk-45FQJCB2.js.map → chunk-TP7AVH5K.js.map} +0 -0
  70. /package/{chunk-BYD553JQ.js.map → chunk-ZQOFNY34.js.map} +0 -0
  71. /package/{computer-use-OVYDVFLM.js.map → computer-use-54M26ZHL.js.map} +0 -0
  72. /package/{connector-ZJ4GNXOR.js.map → connector-NQP2OC55.js.map} +0 -0
  73. /package/{credit-5F56FMHI.js.map → credit-IHTXTFPT.js.map} +0 -0
  74. /package/{developer-support-DMN7JGPX.js.map → developer-support-Z2A6DWF7.js.map} +0 -0
  75. /package/{doctor-Y724BLON.js.map → doctor-KTLE2XJI.js.map} +0 -0
  76. /package/{feishu-T5ZIWV53.js.map → feishu-GKPQY3AW.js.map} +0 -0
  77. /package/{finance-4ZRCXMFS.js.map → finance-KIIZG3ZI.js.map} +0 -0
  78. /package/{generate-JFRB6NBZ.js.map → generate-76I6OUDC.js.map} +0 -0
  79. /package/{github-ZXWGL5Q6.js.map → github-YU7FN4T4.js.map} +0 -0
  80. /package/{goal-22N3CH3F.js.map → goal-XJUAREVX.js.map} +0 -0
  81. /package/{host-I7S5PYUY.js.map → host-7BZHM6UL.js.map} +0 -0
  82. /package/{logs-4HV44EMA.js.map → logs-6HBWQTDR.js.map} +0 -0
  83. /package/{mail-U5LPAC7X.js.map → mail-UHSIDK2L.js.map} +0 -0
  84. /package/{maps-PF5WHYEC.js.map → maps-E7UDZIQW.js.map} +0 -0
  85. /package/{model-JMQSUUFJ.js.map → model-JNX4ATJD.js.map} +0 -0
  86. /package/{model-provider-AJCWCCNB.js.map → model-provider-3OJOREKY.js.map} +0 -0
  87. /package/{org-7Q3J66NB.js.map → org-HFW3TZVX.js.map} +0 -0
  88. /package/{people-search-GUIJICYT.js.map → people-search-P4DUITUE.js.map} +0 -0
  89. /package/{phone-6U27VFNC.js.map → phone-HEDFCVAX.js.map} +0 -0
  90. /package/{preference-BFLHPME6.js.map → preference-ZFGOHT3I.js.map} +0 -0
  91. /package/{resource-C3PAGM7Y.js.map → resource-JOLB3ZCJ.js.map} +0 -0
  92. /package/{scrape-5XL47HZY.js.map → scrape-YMTMJRHW.js.map} +0 -0
  93. /package/{search-B2V6NTUP.js.map → search-ZJJZXAVE.js.map} +0 -0
  94. /package/{secret-QORKNSMC.js.map → secret-HE7UT6PO.js.map} +0 -0
  95. /package/{slack-MD6HYUDE.js.map → slack-CMNXWUKS.js.map} +0 -0
  96. /package/{teams-LO3PPNA2.js.map → teams-ZSHKKQUD.js.map} +0 -0
  97. /package/{telegram-BZUBR4QS.js.map → telegram-VLCEN6MM.js.map} +0 -0
  98. /package/{upgrade-63B4TM4E.js.map → upgrade-WX3U7MZI.js.map} +0 -0
  99. /package/{variable-FW7F63SB.js.map → variable-H54WRRXG.js.map} +0 -0
  100. /package/{video-RWCQZ4XP.js.map → video-XJJZZYSG.js.map} +0 -0
  101. /package/{weather-ST6CIHV4.js.map → weather-XWXK6CZY.js.map} +0 -0
  102. /package/{web-GBSYVVYF.js.map → web-5UY5AYFW.js.map} +0 -0
  103. /package/{web-search-AZXILILB.js.map → web-search-4MQUXAQH.js.map} +0 -0
  104. /package/{whoami-UI67766P.js.map → whoami-XWFEH6TT.js.map} +0 -0
  105. /package/{workflow-CXWRSWUP.js.map → workflow-GAXXRI6N.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-BYD553JQ.js";
7
+ } from "./chunk-ZQOFNY34.js";
8
8
  import {
9
9
  isInteractive,
10
10
  promptConfirm
11
11
  } from "./chunk-X2545RBX.js";
12
12
  import {
13
13
  permissionGrantsToFirewallPolicies
14
- } from "./chunk-45FQJCB2.js";
14
+ } from "./chunk-TP7AVH5K.js";
15
15
  import {
16
16
  createZeroAgent,
17
17
  deleteZeroAgent,
@@ -23,14 +23,14 @@ import {
23
23
  listZeroUserPermissionGrants,
24
24
  updateZeroAgent,
25
25
  updateZeroAgentInstructions
26
- } from "./chunk-MDKQRZ7S.js";
27
- import "./chunk-RKXDWJW5.js";
26
+ } from "./chunk-DIK5B4ZQ.js";
27
+ import "./chunk-KDNGT5NT.js";
28
28
  import "./chunk-SB7EZ2ZO.js";
29
29
  import {
30
30
  source_default,
31
31
  withErrorHandler
32
- } from "./chunk-DQB537B5.js";
33
- import "./chunk-H4LRAOOF.js";
32
+ } from "./chunk-AXPECIRA.js";
33
+ import "./chunk-X5FAOKYK.js";
34
34
  import {
35
35
  Command
36
36
  } from "./chunk-LD4ZVU4O.js";
@@ -594,4 +594,4 @@ Notes:
594
594
  export {
595
595
  zeroAgentCommand
596
596
  };
597
- //# sourceMappingURL=agent-YXVPOZDT.js.map
597
+ //# sourceMappingURL=agent-6PNU7NKA.js.map
@@ -3,14 +3,14 @@ import { createRequire as __createRequire } from "node:module";
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  callZeroBanking
6
- } from "./chunk-MDKQRZ7S.js";
7
- import "./chunk-RKXDWJW5.js";
6
+ } from "./chunk-DIK5B4ZQ.js";
7
+ import "./chunk-KDNGT5NT.js";
8
8
  import "./chunk-SB7EZ2ZO.js";
9
9
  import {
10
10
  source_default,
11
11
  withErrorHandler
12
- } from "./chunk-DQB537B5.js";
13
- import "./chunk-H4LRAOOF.js";
12
+ } from "./chunk-AXPECIRA.js";
13
+ import "./chunk-X5FAOKYK.js";
14
14
  import {
15
15
  Command,
16
16
  InvalidArgumentError
@@ -114,4 +114,4 @@ Notes:
114
114
  export {
115
115
  zeroBankingCommand
116
116
  };
117
- //# sourceMappingURL=banking-K734DGW4.js.map
117
+ //# sourceMappingURL=banking-LIKZNNA3.js.map
@@ -3,21 +3,21 @@ import { createRequire as __createRequire } from "node:module";
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  ZERO_BROWSER_DEFAULT_MAX_CREDITS,
6
- ZERO_BROWSER_DEFAULT_TIMEOUT_MINUTES,
6
+ ZERO_BROWSER_IDLE_LEASE_MINUTES,
7
7
  ZERO_BROWSER_MAX_CREDITS,
8
- ZERO_BROWSER_MAX_TIMEOUT_MINUTES,
9
8
  createZeroBrowser,
10
9
  getCurrentZeroBrowser,
11
- resumeZeroBrowser,
10
+ leaseZeroBrowser,
11
+ useZeroBrowser,
12
12
  zeroBrowserCreateRequestSchema
13
- } from "./chunk-MDKQRZ7S.js";
14
- import "./chunk-RKXDWJW5.js";
13
+ } from "./chunk-DIK5B4ZQ.js";
14
+ import "./chunk-KDNGT5NT.js";
15
15
  import "./chunk-SB7EZ2ZO.js";
16
16
  import {
17
17
  source_default,
18
18
  withErrorHandler
19
- } from "./chunk-DQB537B5.js";
20
- import "./chunk-H4LRAOOF.js";
19
+ } from "./chunk-AXPECIRA.js";
20
+ import "./chunk-X5FAOKYK.js";
21
21
  import {
22
22
  Command,
23
23
  InvalidArgumentError,
@@ -83,6 +83,9 @@ function connectAgentBrowser(cdpUrl, sessionName) {
83
83
  );
84
84
  }
85
85
  }
86
+ function reclaimNotice(browser) {
87
+ return browser.idleExpiresAt ? `Zero reclaims this browser at ${browser.idleExpiresAt} unless it is used or leased again` : "This browser has no live window to reclaim";
88
+ }
86
89
  function renderBrowser(browser) {
87
90
  console.log(`${browser.name} \xB7 ${browser.status}`);
88
91
  console.log(source_default.dim(` ID: ${browser.id}`));
@@ -91,7 +94,7 @@ function renderBrowser(browser) {
91
94
  ` Credits: ${browser.creditsCharged} charged / ${browser.maxCredits} budget`
92
95
  )
93
96
  );
94
- console.log(source_default.dim(` Per-run timeout: ${browser.timeoutMinutes}m`));
97
+ console.log(source_default.dim(` ${reclaimNotice(browser)}`));
95
98
  console.log(` ${browser.viewerUrl}`);
96
99
  }
97
100
  async function connectResponse(response, options) {
@@ -108,10 +111,11 @@ async function connectResponse(response, options) {
108
111
  }
109
112
  console.log(source_default.green("\u2713 Managed browser ready"));
110
113
  console.log(source_default.dim(` agent-browser session: ${sessionName}`));
114
+ console.log(source_default.dim(` ${reclaimNotice(response.browser)}`));
111
115
  console.log(`[Open live browser](${response.browser.viewerUrl})`);
112
116
  }
113
- var resumeCommand = new Command().name("resume").description(
114
- "Resume the current thread browser and attach it to agent-browser"
117
+ var useCommand = new Command().name("use").description(
118
+ "Create, reuse, or resume this thread's browser, attach it to agent-browser, and extend its lease"
115
119
  ).addOption(
116
120
  new Option(
117
121
  "--agent-session <name>",
@@ -119,18 +123,39 @@ var resumeCommand = new Command().name("resume").description(
119
123
  ).argParser(parseAgentSession)
120
124
  ).option("--json", "Print machine-readable output without connection secrets").action(
121
125
  withErrorHandler(async (options) => {
122
- await connectResponse(await resumeZeroBrowser(), options);
126
+ await connectResponse(await useZeroBrowser(), options);
127
+ })
128
+ );
129
+ var resumeCommand = new Command().name("resume").description("Deprecated alias of use").addOption(
130
+ new Option(
131
+ "--agent-session <name>",
132
+ "Named agent-browser session"
133
+ ).argParser(parseAgentSession)
134
+ ).option("--json", "Print machine-readable output without connection secrets").action(
135
+ withErrorHandler(async (options) => {
136
+ await connectResponse(await useZeroBrowser(), options);
137
+ })
138
+ );
139
+ var leaseCommand = new Command().name("lease").description(
140
+ `Keep this thread's live browser for another ${ZERO_BROWSER_IDLE_LEASE_MINUTES} minutes`
141
+ ).option("--json", "Print machine-readable output").action(
142
+ withErrorHandler(async (options) => {
143
+ const browser = await leaseZeroBrowser();
144
+ if (options.json) {
145
+ console.log(JSON.stringify({ browser: browserJson(browser) }));
146
+ return;
147
+ }
148
+ console.log(source_default.green("\u2713 Managed browser lease extended"));
149
+ console.log(source_default.dim(` ${reclaimNotice(browser)}`));
123
150
  })
124
151
  );
125
152
  var newCommand = new Command().name("new").description(
126
- "Create a new thread browser with the shared user profile and attach it to agent-browser"
153
+ "Create another thread browser with the shared user profile and attach it to agent-browser"
127
154
  ).addOption(new Option("--name <name>", "Browser name").default("browser")).addOption(
128
155
  new Option(
129
156
  "--country <code>",
130
157
  "Residential proxy country; omitted uses lower-cost proxyless egress"
131
158
  ).argParser(parseCountry)
132
- ).addOption(
133
- new Option("--timeout <minutes>", "Provider lifetime for this run").default(ZERO_BROWSER_DEFAULT_TIMEOUT_MINUTES).argParser(positiveInteger("timeout", ZERO_BROWSER_MAX_TIMEOUT_MINUTES))
134
159
  ).addOption(
135
160
  new Option("--max-credits <credits>", "Logical browser credit budget").default(ZERO_BROWSER_DEFAULT_MAX_CREDITS).argParser(positiveInteger("max-credits", ZERO_BROWSER_MAX_CREDITS))
136
161
  ).addOption(
@@ -143,7 +168,6 @@ var newCommand = new Command().name("new").description(
143
168
  const request = zeroBrowserCreateRequestSchema.parse({
144
169
  name: options.name,
145
170
  proxyCountryCode: options.country ?? null,
146
- timeoutMinutes: options.timeout,
147
171
  maxCredits: options.maxCredits
148
172
  });
149
173
  await connectResponse(await createZeroBrowser(request), options);
@@ -164,18 +188,20 @@ var viewCommand = new Command().name("view").description("Print the current thre
164
188
  console.log((await getCurrentZeroBrowser()).viewerUrl);
165
189
  })
166
190
  );
167
- var zeroBrowserCommand = new Command().name("browser").description("Use a managed remote browser through agent-browser").addCommand(resumeCommand).addCommand(newCommand).addCommand(statusCommand).addCommand(viewCommand).addHelpText(
191
+ var zeroBrowserCommand = new Command().name("browser").description("Use a managed remote browser through agent-browser").addCommand(useCommand).addCommand(leaseCommand).addCommand(resumeCommand).addCommand(newCommand).addCommand(statusCommand).addCommand(viewCommand).addHelpText(
168
192
  "after",
169
193
  `
170
194
  Examples:
171
- Resume this thread: zero browser resume
172
- Create another browser: zero browser new --name booking --country us
173
- Use the browser: agent-browser --session zero-browser open https://example.com
174
- Share live view: zero browser view
195
+ Open this thread's browser: zero browser use
196
+ Keep it alive: zero browser lease
197
+ Create another browser: zero browser new --name booking --country us
198
+ Use the browser: agent-browser --session zero-browser open https://example.com
199
+ Share live view: zero browser view
175
200
 
176
201
  Notes:
177
- - Zero stops and settles the provider instance automatically when the run ends
178
- - There are no manual stop or suspend commands
202
+ - 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
204
+ - \`zero browser use\` restores a reclaimed browser's login profile, not its old tabs
179
205
  - Browser Use credentials and connection URLs are never printed
180
206
  - Threads for the same user and organization share one login profile
181
207
  - Threads can use the shared profile in parallel`
@@ -183,4 +209,4 @@ Notes:
183
209
  export {
184
210
  zeroBrowserCommand
185
211
  };
186
- //# sourceMappingURL=browser-GMLGBTV7.js.map
212
+ //# sourceMappingURL=browser-4R2YDR62.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_DEFAULT_MAX_CREDITS,\n ZERO_BROWSER_IDLE_LEASE_MINUTES,\n ZERO_BROWSER_MAX_CREDITS,\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 maxCredits: number;\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 positiveInteger(\n label: string,\n maximum: number,\n): (value: string) => number {\n return (value) => {\n if (!/^\\d+$/u.test(value)) {\n throw new InvalidArgumentError(\n `${label} must be an integer from 1 to ${maximum}`,\n );\n }\n const parsed = Number(value);\n if (parsed < 1 || parsed > maximum) {\n throw new InvalidArgumentError(\n `${label} must be an integer from 1 to ${maximum}`,\n );\n }\n return parsed;\n };\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<ZeroBrowserSession, \"liveUrl\"> {\n const { liveUrl: _liveUrl, ...safeBrowser } = 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(\n chalk.dim(\n ` Credits: ${browser.creditsCharged} charged / ${browser.maxCredits} budget`,\n ),\n );\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(\"--max-credits <credits>\", \"Logical browser credit budget\")\n .default(ZERO_BROWSER_DEFAULT_MAX_CREDITS)\n .argParser(positiveInteger(\"max-credits\", ZERO_BROWSER_MAX_CREDITS)),\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 maxCredits: options.maxCredits,\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 and settles its cost then\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":[]}
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-B6ELBBRJ.js";
9
9
  import {
10
10
  formatModelProviderRoute
11
- } from "./chunk-UKQRMBLJ.js";
11
+ } from "./chunk-OMZ7JNGC.js";
12
12
  import {
13
13
  chatThreadEventSchema,
14
14
  chatThreadSnapshotProjectionSchema,
@@ -18,17 +18,17 @@ import {
18
18
  listZeroModelPolicies,
19
19
  renameZeroChatThread,
20
20
  updateZeroChatThreadModelSelection
21
- } from "./chunk-MDKQRZ7S.js";
22
- import "./chunk-RKXDWJW5.js";
21
+ } from "./chunk-DIK5B4ZQ.js";
22
+ import "./chunk-KDNGT5NT.js";
23
23
  import "./chunk-SB7EZ2ZO.js";
24
24
  import {
25
25
  getApiUrl,
26
26
  source_default,
27
27
  withErrorHandler
28
- } from "./chunk-DQB537B5.js";
28
+ } from "./chunk-AXPECIRA.js";
29
29
  import {
30
30
  decodeZeroTokenPayload
31
- } from "./chunk-H4LRAOOF.js";
31
+ } from "./chunk-X5FAOKYK.js";
32
32
  import {
33
33
  Command
34
34
  } from "./chunk-LD4ZVU4O.js";
@@ -619,4 +619,4 @@ Examples:
619
619
  export {
620
620
  zeroChatCommand
621
621
  };
622
- //# sourceMappingURL=chat-I2URW23Z.js.map
622
+ //# sourceMappingURL=chat-PSSM3NZI.js.map
@@ -4,7 +4,7 @@ const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  decodeZeroTokenPayload,
6
6
  isFeatureEnabled
7
- } from "./chunk-H4LRAOOF.js";
7
+ } from "./chunk-X5FAOKYK.js";
8
8
  import {
9
9
  __export,
10
10
  init_esm_shims
@@ -15374,6 +15374,7 @@ function initClient(contract, config2) {
15374
15374
  }
15375
15375
 
15376
15376
  // src/lib/api/client-headers.ts
15377
+ var VERCEL_PROTECTION_BYPASS_HEADER = "x-vercel-protection-bypass";
15377
15378
  function createCliClientHeaderInjector(options) {
15378
15379
  const createUuid = options.createUuid ?? randomUUID;
15379
15380
  const clientSessionId = createUuid();
@@ -15385,10 +15386,14 @@ function createCliClientHeaderInjector(options) {
15385
15386
  };
15386
15387
  }
15387
15388
  var addDefaultCliClientHeaders = createCliClientHeaderInjector({
15388
- clientVersion: "9.255.0"
15389
+ clientVersion: "9.257.0"
15389
15390
  });
15390
15391
  function addCliClientHeaders(headers) {
15391
15392
  addDefaultCliClientHeaders(headers);
15393
+ const bypassSecret = process.env.VERCEL_AUTOMATION_BYPASS_SECRET;
15394
+ if (bypassSecret) {
15395
+ headers.set(VERCEL_PROTECTION_BYPASS_HEADER, bypassSecret);
15396
+ }
15392
15397
  }
15393
15398
  function headersWithCliClientHeaders(headers) {
15394
15399
  const mergedHeaders = new Headers(headers);
@@ -15417,10 +15422,6 @@ function buildHeaders(token) {
15417
15422
  const headers = {
15418
15423
  Authorization: `Bearer ${token}`
15419
15424
  };
15420
- const bypassSecret = process.env.VERCEL_AUTOMATION_BYPASS_SECRET;
15421
- if (bypassSecret) {
15422
- headers["x-vercel-protection-bypass"] = bypassSecret;
15423
- }
15424
15425
  return headers;
15425
15426
  }
15426
15427
  async function getBaseUrl() {
@@ -16783,4 +16784,4 @@ export {
16783
16784
  apiErrorSchema,
16784
16785
  withErrorHandler
16785
16786
  };
16786
- //# sourceMappingURL=chunk-DQB537B5.js.map
16787
+ //# sourceMappingURL=chunk-AXPECIRA.js.map