@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.
- package/{agent-MHMP5BOB.js → agent-WJBV6XSO.js} +6 -6
- package/{banking-WB4NGHEW.js → banking-MZPWKMV2.js} +4 -4
- package/{browser-OO3SXJ66.js → browser-F4J54ATA.js} +13 -33
- package/browser-F4J54ATA.js.map +1 -0
- package/{chat-IYYYJKVT.js → chat-OTLB5LYG.js} +326 -8
- package/chat-OTLB5LYG.js.map +1 -0
- package/{chunk-NBF6ONZJ.js → chunk-4TODUWC7.js} +2 -2
- package/{chunk-CPLEJWQT.js → chunk-GHMW55CQ.js} +2 -2
- package/{chunk-A3GE6ETZ.js → chunk-HHVHHEJ2.js} +2 -2
- package/{chunk-IOJHMLKT.js → chunk-JQDFMS4A.js} +2 -2
- package/{chunk-MTLPPLPH.js → chunk-M75EI7GB.js} +4 -4
- package/{chunk-DOYP2C2B.js → chunk-MIZEZBG6.js} +2 -2
- package/{chunk-JUMGFS6V.js → chunk-SP2S4QWX.js} +2 -2
- package/{chunk-AOHVC7EW.js → chunk-TNDBFUFP.js} +13 -1
- package/chunk-TNDBFUFP.js.map +1 -0
- package/{chunk-7DFIPXTO.js → chunk-UP5UOL6Z.js} +209 -262
- package/chunk-UP5UOL6Z.js.map +1 -0
- package/{chunk-FLWE2Q4D.js → chunk-WTB4K3Z6.js} +471 -172
- package/chunk-WTB4K3Z6.js.map +1 -0
- package/{computer-use-JPDTT4KX.js → computer-use-GMGAYWFF.js} +4 -4
- package/{connector-NI2PWPCC.js → connector-SPL5EGNH.js} +7 -7
- package/{credit-RE47VTRH.js → credit-ANE66MN5.js} +5 -5
- package/{developer-support-DSPTERLL.js → developer-support-WNWRPWM5.js} +4 -4
- package/{doctor-GGFT4M2V.js → doctor-YEBTJKXS.js} +5 -5
- package/{feishu-COL55I4I.js → feishu-X6HV3Z75.js} +4 -4
- package/{finance-4KCKJTAE.js → finance-3SLPN5ZX.js} +4 -4
- package/{generate-NVBPAC3Z.js → generate-VK57QZTH.js} +5 -5
- package/{github-KLRR5N7F.js → github-KHQGH7UJ.js} +4 -4
- package/{goal-FINXKJ2J.js → goal-NP7LA4H5.js} +4 -4
- package/{host-BMUSAUQG.js → host-JSCRRZ3J.js} +4 -4
- package/{logs-V3YP5YWY.js → logs-AEIWXRS6.js} +6 -6
- package/{mail-JUWPEJBZ.js → mail-CMOTFJRW.js} +6 -6
- package/{maps-N7NXJPFL.js → maps-WAWCF444.js} +4 -4
- package/{model-Q3RGYM62.js → model-O3H5L3R4.js} +5 -5
- package/{model-provider-33TUNFMS.js → model-provider-NWOG4WDP.js} +5 -5
- package/{org-SD4IEYST.js → org-H2KYZZHL.js} +4 -4
- package/package.json +1 -1
- package/{people-search-3UMPCYVU.js → people-search-OYHCUQQ5.js} +4 -4
- package/{phone-7BQ3BR3C.js → phone-XDTMDNGG.js} +4 -4
- package/{preference-FXATAHDW.js → preference-JJG4RC3V.js} +4 -4
- package/{resource-Y67KRIPY.js → resource-QCPLW3RQ.js} +4 -4
- package/{scrape-3JQ2OS3K.js → scrape-NX44VHU6.js} +4 -4
- package/{search-YESW2FNC.js → search-XMML4Q6A.js} +6 -6
- package/{secret-RXYXPWUF.js → secret-RYOMS4YU.js} +4 -4
- package/{slack-4DCGDMNB.js → slack-WQ7G3WH7.js} +4 -4
- package/{teams-QFD2A6GL.js → teams-XL2GYS3H.js} +4 -4
- package/{telegram-RXVJHSUD.js → telegram-E3ILARSU.js} +4 -4
- package/{upgrade-BAMSKCN3.js → upgrade-B2QEWNOR.js} +3 -3
- package/{variable-W2SCMTCE.js → variable-I5TBQURO.js} +4 -4
- package/{video-U54DBG7F.js → video-B644TGB2.js} +3 -3
- package/{weather-BQ7XSCCQ.js → weather-ZFYVIQQC.js} +4 -4
- package/{web-NSMEQ7KS.js → web-6YP4UZZS.js} +4 -4
- package/{web-search-U7HXOGYD.js → web-search-3ZBOMLOF.js} +4 -4
- package/{whoami-7GHF4FG6.js → whoami-RCMC3HFF.js} +6 -6
- package/{workflow-5IUYLCC5.js → workflow-GZ66ZARR.js} +5 -5
- package/zero.js +49 -44
- package/zero.js.map +1 -1
- package/browser-OO3SXJ66.js.map +0 -1
- package/chat-IYYYJKVT.js.map +0 -1
- package/chunk-7DFIPXTO.js.map +0 -1
- package/chunk-AOHVC7EW.js.map +0 -1
- package/chunk-FLWE2Q4D.js.map +0 -1
- /package/{agent-MHMP5BOB.js.map → agent-WJBV6XSO.js.map} +0 -0
- /package/{banking-WB4NGHEW.js.map → banking-MZPWKMV2.js.map} +0 -0
- /package/{chunk-NBF6ONZJ.js.map → chunk-4TODUWC7.js.map} +0 -0
- /package/{chunk-CPLEJWQT.js.map → chunk-GHMW55CQ.js.map} +0 -0
- /package/{chunk-A3GE6ETZ.js.map → chunk-HHVHHEJ2.js.map} +0 -0
- /package/{chunk-IOJHMLKT.js.map → chunk-JQDFMS4A.js.map} +0 -0
- /package/{chunk-MTLPPLPH.js.map → chunk-M75EI7GB.js.map} +0 -0
- /package/{chunk-DOYP2C2B.js.map → chunk-MIZEZBG6.js.map} +0 -0
- /package/{chunk-JUMGFS6V.js.map → chunk-SP2S4QWX.js.map} +0 -0
- /package/{computer-use-JPDTT4KX.js.map → computer-use-GMGAYWFF.js.map} +0 -0
- /package/{connector-NI2PWPCC.js.map → connector-SPL5EGNH.js.map} +0 -0
- /package/{credit-RE47VTRH.js.map → credit-ANE66MN5.js.map} +0 -0
- /package/{developer-support-DSPTERLL.js.map → developer-support-WNWRPWM5.js.map} +0 -0
- /package/{doctor-GGFT4M2V.js.map → doctor-YEBTJKXS.js.map} +0 -0
- /package/{feishu-COL55I4I.js.map → feishu-X6HV3Z75.js.map} +0 -0
- /package/{finance-4KCKJTAE.js.map → finance-3SLPN5ZX.js.map} +0 -0
- /package/{generate-NVBPAC3Z.js.map → generate-VK57QZTH.js.map} +0 -0
- /package/{github-KLRR5N7F.js.map → github-KHQGH7UJ.js.map} +0 -0
- /package/{goal-FINXKJ2J.js.map → goal-NP7LA4H5.js.map} +0 -0
- /package/{host-BMUSAUQG.js.map → host-JSCRRZ3J.js.map} +0 -0
- /package/{logs-V3YP5YWY.js.map → logs-AEIWXRS6.js.map} +0 -0
- /package/{mail-JUWPEJBZ.js.map → mail-CMOTFJRW.js.map} +0 -0
- /package/{maps-N7NXJPFL.js.map → maps-WAWCF444.js.map} +0 -0
- /package/{model-Q3RGYM62.js.map → model-O3H5L3R4.js.map} +0 -0
- /package/{model-provider-33TUNFMS.js.map → model-provider-NWOG4WDP.js.map} +0 -0
- /package/{org-SD4IEYST.js.map → org-H2KYZZHL.js.map} +0 -0
- /package/{people-search-3UMPCYVU.js.map → people-search-OYHCUQQ5.js.map} +0 -0
- /package/{phone-7BQ3BR3C.js.map → phone-XDTMDNGG.js.map} +0 -0
- /package/{preference-FXATAHDW.js.map → preference-JJG4RC3V.js.map} +0 -0
- /package/{resource-Y67KRIPY.js.map → resource-QCPLW3RQ.js.map} +0 -0
- /package/{scrape-3JQ2OS3K.js.map → scrape-NX44VHU6.js.map} +0 -0
- /package/{search-YESW2FNC.js.map → search-XMML4Q6A.js.map} +0 -0
- /package/{secret-RXYXPWUF.js.map → secret-RYOMS4YU.js.map} +0 -0
- /package/{slack-4DCGDMNB.js.map → slack-WQ7G3WH7.js.map} +0 -0
- /package/{teams-QFD2A6GL.js.map → teams-XL2GYS3H.js.map} +0 -0
- /package/{telegram-RXVJHSUD.js.map → telegram-E3ILARSU.js.map} +0 -0
- /package/{upgrade-BAMSKCN3.js.map → upgrade-B2QEWNOR.js.map} +0 -0
- /package/{variable-W2SCMTCE.js.map → variable-I5TBQURO.js.map} +0 -0
- /package/{video-U54DBG7F.js.map → video-B644TGB2.js.map} +0 -0
- /package/{weather-BQ7XSCCQ.js.map → weather-ZFYVIQQC.js.map} +0 -0
- /package/{web-NSMEQ7KS.js.map → web-6YP4UZZS.js.map} +0 -0
- /package/{web-search-U7HXOGYD.js.map → web-search-3ZBOMLOF.js.map} +0 -0
- /package/{whoami-7GHF4FG6.js.map → whoami-RCMC3HFF.js.map} +0 -0
- /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-
|
|
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-
|
|
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-
|
|
27
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
7
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
14
|
-
import "./chunk-
|
|
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-
|
|
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 {
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
25
|
-
import "./chunk-
|
|
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-
|
|
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}.${
|
|
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-
|
|
990
|
+
//# sourceMappingURL=chat-OTLB5LYG.js.map
|