@vm0/cli 9.277.3 → 9.278.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{agent-ZH5AKOA7.js → agent-4F3XAJWN.js} +12 -6
- package/agent-4F3XAJWN.js.map +1 -0
- package/{banking-BZ77LHW3.js → banking-CWQFQKZB.js} +61 -7
- package/banking-CWQFQKZB.js.map +1 -0
- package/{browser-AHNWLXVC.js → browser-BI6UFWPH.js} +4 -5
- package/browser-BI6UFWPH.js.map +1 -0
- package/{chat-RXYX7ONH.js → chat-MKIW4FPP.js} +24 -16
- package/chat-MKIW4FPP.js.map +1 -0
- package/chunk-2SJTFDC2.js +189 -0
- package/chunk-2SJTFDC2.js.map +1 -0
- package/chunk-4FTIKZKP.js +64 -0
- package/chunk-4FTIKZKP.js.map +1 -0
- package/chunk-7UZXNER2.js +568 -0
- package/chunk-7UZXNER2.js.map +1 -0
- package/chunk-A6ZRMNM3.js +102 -0
- package/chunk-A6ZRMNM3.js.map +1 -0
- package/{chunk-CNKLF32K.js → chunk-C62A6LD6.js} +2 -2
- package/chunk-CCTF3YVW.js +52 -0
- package/chunk-CCTF3YVW.js.map +1 -0
- package/chunk-CD2BLKGC.js +188 -0
- package/chunk-CD2BLKGC.js.map +1 -0
- package/chunk-CEJGHPF3.js +55 -0
- package/chunk-CEJGHPF3.js.map +1 -0
- package/chunk-DUA6CF7E.js +2053 -0
- package/chunk-DUA6CF7E.js.map +1 -0
- package/chunk-E2TQAKNL.js +1300 -0
- package/chunk-E2TQAKNL.js.map +1 -0
- package/{chunk-W3Z5TMVI.js → chunk-GHKWW4NC.js} +6 -6
- package/chunk-GHKWW4NC.js.map +1 -0
- package/chunk-GV3PG6CZ.js +114 -0
- package/chunk-GV3PG6CZ.js.map +1 -0
- package/chunk-GY7D76EZ.js +81 -0
- package/chunk-GY7D76EZ.js.map +1 -0
- package/chunk-HHHHZMTA.js +434 -0
- package/chunk-HHHHZMTA.js.map +1 -0
- package/chunk-HZYOJTEE.js +1275 -0
- package/chunk-HZYOJTEE.js.map +1 -0
- package/chunk-J3ZRXVI6.js +740 -0
- package/chunk-J3ZRXVI6.js.map +1 -0
- package/chunk-JJWFO27K.js +31 -0
- package/chunk-JJWFO27K.js.map +1 -0
- package/chunk-JV6LM2YC.js +39 -0
- package/chunk-JV6LM2YC.js.map +1 -0
- package/chunk-KER77KJB.js +105 -0
- package/chunk-KER77KJB.js.map +1 -0
- package/{chunk-FWACFGXV.js → chunk-KKO2XGLQ.js} +1 -7
- package/chunk-KKO2XGLQ.js.map +1 -0
- package/chunk-LIYPTQAO.js +198 -0
- package/chunk-LIYPTQAO.js.map +1 -0
- package/chunk-LYLDVUHT.js +131 -0
- package/chunk-LYLDVUHT.js.map +1 -0
- package/chunk-PFWBO2VK.js +801 -0
- package/chunk-PFWBO2VK.js.map +1 -0
- package/chunk-RTCRU35A.js +194 -0
- package/chunk-RTCRU35A.js.map +1 -0
- package/{chunk-AOL57FX7.js → chunk-RTEEWZUT.js} +2 -2
- package/{chunk-AOL57FX7.js.map → chunk-RTEEWZUT.js.map} +1 -1
- package/{chunk-JCXH3DJW.js → chunk-RUKMHBNQ.js} +2 -2
- package/chunk-SA4DYSBR.js +31 -0
- package/chunk-SA4DYSBR.js.map +1 -0
- package/chunk-SJPOFQJU.js +792 -0
- package/chunk-SJPOFQJU.js.map +1 -0
- package/{chunk-XUK2BILU.js → chunk-SMPSKBAP.js} +25 -774
- package/chunk-SMPSKBAP.js.map +1 -0
- package/{chunk-JBQRGOPE.js → chunk-T2X2EGV2.js} +4 -4
- package/chunk-T2X2EGV2.js.map +1 -0
- package/chunk-U2GQH6AD.js +309 -0
- package/chunk-U2GQH6AD.js.map +1 -0
- package/chunk-U6A2RPHO.js +66 -0
- package/chunk-U6A2RPHO.js.map +1 -0
- package/chunk-UIXUGVZB.js +362 -0
- package/chunk-UIXUGVZB.js.map +1 -0
- package/chunk-XRZKJACM.js +49 -0
- package/chunk-XRZKJACM.js.map +1 -0
- package/chunk-YDS3X7KB.js +202 -0
- package/chunk-YDS3X7KB.js.map +1 -0
- package/{chunk-DSILKRQ7.js → chunk-ZKNJW4K6.js} +1412 -334
- package/chunk-ZKNJW4K6.js.map +1 -0
- package/chunk-ZXSCBS77.js +90 -0
- package/chunk-ZXSCBS77.js.map +1 -0
- package/{computer-use-MSFO3WPF.js → computer-use-6AEVW47F.js} +9 -7
- package/computer-use-6AEVW47F.js.map +1 -0
- package/{connector-IIVOX2PE.js → connector-XDQ6JEBU.js} +25 -13
- package/connector-XDQ6JEBU.js.map +1 -0
- package/{credit-QEW5A5HI.js → credit-JPQA5XPA.js} +8 -10
- package/credit-JPQA5XPA.js.map +1 -0
- package/{developer-support-YMAFVROQ.js → developer-support-V7NZOU2P.js} +27 -7
- package/developer-support-V7NZOU2P.js.map +1 -0
- package/{doctor-UCXIPG3N.js → doctor-FJO24TG3.js} +13 -11
- package/doctor-FJO24TG3.js.map +1 -0
- package/{feishu-C6RFK23B.js → feishu-PNOAM33Q.js} +99 -9
- package/feishu-PNOAM33Q.js.map +1 -0
- package/{finance-FWHZZDHV.js → finance-55OJ6GYP.js} +49 -9
- package/finance-55OJ6GYP.js.map +1 -0
- package/{generate-ZPHZEKPA.js → generate-XUKBK523.js} +26 -21
- package/generate-XUKBK523.js.map +1 -0
- package/{github-HN4GNXAK.js → github-V4MD2PMM.js} +83 -8
- package/github-V4MD2PMM.js.map +1 -0
- package/{goal-PMOUUCFA.js → goal-FS5FJKVU.js} +69 -13
- package/goal-FS5FJKVU.js.map +1 -0
- package/{host-MJHIXUAY.js → host-GITTJ6PR.js} +124 -10
- package/host-GITTJ6PR.js.map +1 -0
- package/{logs-YDYLNB7C.js → logs-EEUIGYUD.js} +51 -11
- package/logs-EEUIGYUD.js.map +1 -0
- package/{mail-4QK3SBSA.js → mail-G4SAJSBD.js} +39 -8
- package/mail-G4SAJSBD.js.map +1 -0
- package/{maps-5KEDKI5K.js → maps-7ANNU3BX.js} +65 -11
- package/maps-7ANNU3BX.js.map +1 -0
- package/{model-6A47KM5J.js → model-DSPDCJLB.js} +6 -6
- package/model-DSPDCJLB.js.map +1 -0
- package/{model-provider-WII3JIC2.js → model-provider-RZQ45PNG.js} +6 -6
- package/model-provider-RZQ45PNG.js.map +1 -0
- package/package.json +1 -1
- package/{people-search-32IRBQ6M.js → people-search-I7PUMF5M.js} +22 -6
- package/people-search-I7PUMF5M.js.map +1 -0
- package/{phone-CZZVZNG3.js → phone-SSAPGMTW.js} +90 -9
- package/phone-SSAPGMTW.js.map +1 -0
- package/{recognize-T2SL5TXQ.js → recognize-D7VORZBN.js} +27 -9
- package/recognize-D7VORZBN.js.map +1 -0
- package/{resource-ULP6MJD5.js → resource-76IV3TMW.js} +21 -7
- package/resource-76IV3TMW.js.map +1 -0
- package/{scrape-4NAMXDHI.js → scrape-JBDLNTLB.js} +22 -6
- package/scrape-JBDLNTLB.js.map +1 -0
- package/{search-6R4Y3ME2.js → search-UNZNUTZX.js} +29 -9
- package/search-UNZNUTZX.js.map +1 -0
- package/{slack-Y47DQGAJ.js → slack-AAH6GG2W.js} +103 -11
- package/slack-AAH6GG2W.js.map +1 -0
- package/{teams-TOHTW3CG.js → teams-6OPXE4TX.js} +90 -9
- package/teams-6OPXE4TX.js.map +1 -0
- package/{telegram-PUREW6O3.js → telegram-RRZG73RT.js} +101 -10
- package/telegram-RRZG73RT.js.map +1 -0
- package/{upgrade-7XZEYRDY.js → upgrade-I5IL4UQL.js} +3 -4
- package/upgrade-I5IL4UQL.js.map +1 -0
- package/{video-IGMHZRYE.js → video-HV44W4X7.js} +5 -4
- package/video-HV44W4X7.js.map +1 -0
- package/{weather-K6ETWEZZ.js → weather-EQ7CSADB.js} +70 -16
- package/weather-EQ7CSADB.js.map +1 -0
- package/{web-C4FWCJ2V.js → web-6LIMWEOZ.js} +5 -5
- package/web-6LIMWEOZ.js.map +1 -0
- package/{web-search-UD6ODWOQ.js → web-search-AT7WONZN.js} +22 -6
- package/web-search-AT7WONZN.js.map +1 -0
- package/{whoami-2GTNF4PK.js → whoami-RKTLLSI4.js} +16 -7
- package/whoami-RKTLLSI4.js.map +1 -0
- package/{workflow-QFTHJK6H.js → workflow-ZH32P622.js} +135 -39
- package/workflow-ZH32P622.js.map +1 -0
- package/zero.js +40 -40
- package/agent-ZH5AKOA7.js.map +0 -1
- package/banking-BZ77LHW3.js.map +0 -1
- package/browser-AHNWLXVC.js.map +0 -1
- package/chat-RXYX7ONH.js.map +0 -1
- package/chunk-2W73DZDW.js +0 -32
- package/chunk-2W73DZDW.js.map +0 -1
- package/chunk-ANOLYIPL.js +0 -10
- package/chunk-ANOLYIPL.js.map +0 -1
- package/chunk-DSILKRQ7.js.map +0 -1
- package/chunk-FWACFGXV.js.map +0 -1
- package/chunk-HOKSKXDR.js +0 -11405
- package/chunk-HOKSKXDR.js.map +0 -1
- package/chunk-JBQRGOPE.js.map +0 -1
- package/chunk-W3Z5TMVI.js.map +0 -1
- package/chunk-XUK2BILU.js.map +0 -1
- package/computer-use-MSFO3WPF.js.map +0 -1
- package/connector-IIVOX2PE.js.map +0 -1
- package/credit-QEW5A5HI.js.map +0 -1
- package/developer-support-YMAFVROQ.js.map +0 -1
- package/doctor-UCXIPG3N.js.map +0 -1
- package/feishu-C6RFK23B.js.map +0 -1
- package/finance-FWHZZDHV.js.map +0 -1
- package/generate-ZPHZEKPA.js.map +0 -1
- package/github-HN4GNXAK.js.map +0 -1
- package/goal-PMOUUCFA.js.map +0 -1
- package/host-MJHIXUAY.js.map +0 -1
- package/logs-YDYLNB7C.js.map +0 -1
- package/mail-4QK3SBSA.js.map +0 -1
- package/maps-5KEDKI5K.js.map +0 -1
- package/model-6A47KM5J.js.map +0 -1
- package/model-provider-WII3JIC2.js.map +0 -1
- package/people-search-32IRBQ6M.js.map +0 -1
- package/phone-CZZVZNG3.js.map +0 -1
- package/recognize-T2SL5TXQ.js.map +0 -1
- package/resource-ULP6MJD5.js.map +0 -1
- package/scrape-4NAMXDHI.js.map +0 -1
- package/search-6R4Y3ME2.js.map +0 -1
- package/slack-Y47DQGAJ.js.map +0 -1
- package/teams-TOHTW3CG.js.map +0 -1
- package/telegram-PUREW6O3.js.map +0 -1
- package/upgrade-7XZEYRDY.js.map +0 -1
- package/video-IGMHZRYE.js.map +0 -1
- package/weather-K6ETWEZZ.js.map +0 -1
- package/web-C4FWCJ2V.js.map +0 -1
- package/web-search-UD6ODWOQ.js.map +0 -1
- package/whoami-2GTNF4PK.js.map +0 -1
- package/workflow-QFTHJK6H.js.map +0 -1
- /package/{chunk-CNKLF32K.js.map → chunk-C62A6LD6.js.map} +0 -0
- /package/{chunk-JCXH3DJW.js.map → chunk-RUKMHBNQ.js.map} +0 -0
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
connectorPermissionGrantsToFirewallPolicies,
|
|
6
6
|
loadConnectorPermissionInfos,
|
|
7
7
|
policyIcon
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-T2X2EGV2.js";
|
|
9
9
|
import {
|
|
10
10
|
isInteractive,
|
|
11
11
|
promptConfirm
|
|
@@ -21,13 +21,19 @@ import {
|
|
|
21
21
|
listZeroUserPermissionGrants,
|
|
22
22
|
updateZeroAgent,
|
|
23
23
|
updateZeroAgentInstructions
|
|
24
|
-
} from "./chunk-
|
|
25
|
-
import "./chunk-
|
|
26
|
-
import "./chunk-
|
|
24
|
+
} from "./chunk-U2GQH6AD.js";
|
|
25
|
+
import "./chunk-HZYOJTEE.js";
|
|
26
|
+
import "./chunk-HHHHZMTA.js";
|
|
27
|
+
import "./chunk-DUA6CF7E.js";
|
|
28
|
+
import "./chunk-YDS3X7KB.js";
|
|
29
|
+
import "./chunk-LIYPTQAO.js";
|
|
30
|
+
import "./chunk-SMPSKBAP.js";
|
|
31
|
+
import "./chunk-A6ZRMNM3.js";
|
|
32
|
+
import "./chunk-JV6LM2YC.js";
|
|
27
33
|
import {
|
|
28
34
|
source_default,
|
|
29
35
|
withErrorHandler
|
|
30
|
-
} from "./chunk-
|
|
36
|
+
} from "./chunk-GHKWW4NC.js";
|
|
31
37
|
import "./chunk-32FE3MDA.js";
|
|
32
38
|
import {
|
|
33
39
|
Command
|
|
@@ -597,4 +603,4 @@ Notes:
|
|
|
597
603
|
export {
|
|
598
604
|
zeroAgentCommand
|
|
599
605
|
};
|
|
600
|
-
//# sourceMappingURL=agent-
|
|
606
|
+
//# sourceMappingURL=agent-4F3XAJWN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/zero/agent/index.ts","../src/commands/zero/agent/create.ts","../src/commands/zero/agent/avatar.ts","../src/commands/zero/agent/edit.ts","../src/commands/zero/agent/view.ts","../src/commands/zero/agent/list.ts","../src/commands/zero/agent/delete.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { createCommand } from \"./create\";\nimport { editCommand } from \"./edit\";\nimport { viewCommand } from \"./view\";\nimport { listCommand } from \"./list\";\nimport { deleteCommand } from \"./delete\";\n\nexport const zeroAgentCommand = new Command(\"agent\")\n .description(\"View or manage zero agents\")\n .addCommand(createCommand)\n .addCommand(editCommand)\n .addCommand(viewCommand)\n .addCommand(listCommand)\n .addCommand(deleteCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Your agent ID is in $ZERO_AGENT_ID (or run: zero whoami)\n View your config: zero agent view $ZERO_AGENT_ID --instructions\n Update description: zero agent edit $ZERO_AGENT_ID --description \"new role\"\n Update tone: zero agent edit $ZERO_AGENT_ID --sound friendly\n Update instructions: zero agent edit $ZERO_AGENT_ID --instructions-file <path>\n Attach a workflow: zero workflow attach <name> --agent $ZERO_AGENT_ID\n\nNotes:\n Manage workflows with 'zero workflow --help'`,\n );\n","import { Command } from \"commander\";\nimport { readFileSync } from \"node:fs\";\nimport chalk from \"chalk\";\nimport {\n createZeroAgent,\n updateZeroAgentInstructions,\n} from \"../../../lib/api/domains/zero-agents\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\nimport { resolveAvatarUrl } from \"./avatar\";\n\nexport const createCommand = new Command()\n .name(\"create\")\n .description(\"Create a new zero agent\")\n .option(\"--display-name <name>\", \"Agent display name\")\n .option(\"--description <text>\", \"Agent description\")\n .option(\n \"--sound <tone>\",\n \"Agent tone: professional, friendly, direct, supportive\",\n )\n .option(\"--avatar <preset>\", \"Avatar preset: preset:0 through preset:4\")\n .option(\n \"--avatar-rotation <1-5>\",\n \"Head angle: 1=far-left 3=center 5=far-right\",\n )\n .option(\n \"--avatar-skin <tone>\",\n \"Skin tone: light | light-medium | medium | medium-dark | dark\",\n )\n .option(\"--avatar-hair-style <1-5>\", \"Hair style: 1–5\")\n .option(\n \"--avatar-hair-color <color>\",\n \"Hair color: blonde | teal | grey | pink | brown\",\n )\n .option(\n \"--avatar-expression <expr>\",\n \"Expression: calm | content | neutral | pleasant | excited\",\n )\n .option(\"--avatar-intensity <level>\", \"Intensity: chill | normal | hyped\")\n .option(\"--instructions-file <path>\", \"Path to instructions file\")\n .addHelpText(\n \"after\",\n `\nAvatar:\n Quick presets (--avatar):\n preset:0 light skin, brown hair, calm, hyped\n preset:1 light-medium skin, grey hair, calm, normal\n preset:2 medium skin, pink hair, neutral, chill\n preset:3 medium-dark skin, blonde hair, pleasant, hyped\n preset:4 dark skin, teal hair, excited, normal\n\n Custom attributes (--avatar-* flags, omitted fields use defaults):\n --avatar-rotation 1=far-left 3=center(default) 5=far-right\n --avatar-skin light / light-medium / medium(default) / medium-dark / dark\n --avatar-hair-style 1–5 (default: 1)\n --avatar-hair-color blonde / teal / grey / pink / brown(default)\n --avatar-expression calm(default) / content / neutral / pleasant / excited\n --avatar-intensity chill / normal(default) / hyped\n\n Note: --avatar and --avatar-* cannot be used together.\n\nExamples:\n Minimal: zero agent create --display-name \"My Agent\"\n Quick preset: zero agent create --display-name \"My Agent\" --avatar preset:2\n Custom avatar: zero agent create --display-name \"My Agent\" --avatar-skin dark --avatar-hair-color teal --avatar-intensity hyped\n With instructions: zero agent create --display-name \"My Agent\" --instructions-file ./instructions.md`,\n )\n .action(\n withErrorHandler(\n async (options: {\n displayName?: string;\n description?: string;\n sound?: string;\n avatar?: string;\n avatarRotation?: string;\n avatarSkin?: string;\n avatarHairStyle?: string;\n avatarHairColor?: string;\n avatarExpression?: string;\n avatarIntensity?: string;\n instructionsFile?: string;\n }) => {\n const avatarUrl = resolveAvatarUrl(options);\n\n const agent = await createZeroAgent({\n displayName: options.displayName,\n description: options.description,\n sound: options.sound,\n avatarUrl,\n });\n\n if (options.instructionsFile) {\n const content = readFileSync(options.instructionsFile, \"utf-8\");\n await updateZeroAgentInstructions(agent.agentId, content);\n }\n\n console.log(chalk.green(`✓ Agent \"${agent.agentId}\" created`));\n console.log(` Agent ID: ${agent.agentId}`);\n if (agent.displayName) {\n console.log(` Display Name: ${agent.displayName}`);\n }\n\n console.log();\n console.log(\"Next steps to authorize connectors for this agent:\");\n console.log(\" - Search connectors this agent needs:\");\n console.log(\n ` zero connector search <keyword> --agent ${agent.agentId}`,\n );\n console.log(\n \" - Check authorization status (prints an authorize URL if not authorized):\",\n );\n console.log(\n ` zero connector status <slug> --agent ${agent.agentId}`,\n );\n },\n ),\n );\n","const SKIN_MAP: Record<string, number> = {\n light: 0,\n \"light-medium\": 1,\n medium: 2,\n \"medium-dark\": 3,\n dark: 4,\n};\n\nconst HAIR_COLOR_MAP: Record<string, number> = {\n blonde: 1,\n teal: 2,\n grey: 3,\n pink: 4,\n brown: 5,\n};\n\nconst EXPRESSION_MAP: Record<string, number> = {\n calm: 1,\n content: 2,\n neutral: 3,\n pleasant: 4,\n excited: 5,\n};\n\nconst INTENSITY_MAP: Record<string, \"d\" | \"m\" | \"h\"> = {\n chill: \"d\",\n normal: \"m\",\n hyped: \"h\",\n};\n\nfunction lookupRequired<T>(\n value: string,\n map: Readonly<Record<string, T>>,\n flag: string,\n): T {\n if (!(value in map)) {\n throw new Error(\n `Invalid ${flag} \"${value}\". Must be one of: ${Object.keys(map).join(\", \")}`,\n );\n }\n return map[value]!;\n}\n\nfunction parseIntRange(\n value: string,\n flag: string,\n min: number,\n max: number,\n): number {\n const n = Number(value);\n if (!Number.isInteger(n) || n < min || n > max) {\n throw new Error(`Invalid ${flag} \"${value}\". Must be ${min}–${max}`);\n }\n return n;\n}\n\nfunction buildCustomSvgAvatar(opts: AvatarOptions): string {\n const r =\n opts.avatarRotation !== undefined\n ? parseIntRange(opts.avatarRotation, \"--avatar-rotation\", 1, 5)\n : 3;\n const h =\n opts.avatarHairStyle !== undefined\n ? parseIntRange(opts.avatarHairStyle, \"--avatar-hair-style\", 1, 5)\n : 1;\n const s =\n opts.avatarSkin !== undefined\n ? lookupRequired(opts.avatarSkin, SKIN_MAP, \"--avatar-skin\")\n : 2;\n const c =\n opts.avatarHairColor !== undefined\n ? lookupRequired(\n opts.avatarHairColor,\n HAIR_COLOR_MAP,\n \"--avatar-hair-color\",\n )\n : 5;\n const f =\n opts.avatarExpression !== undefined\n ? lookupRequired(\n opts.avatarExpression,\n EXPRESSION_MAP,\n \"--avatar-expression\",\n )\n : 1;\n const i =\n opts.avatarIntensity !== undefined\n ? lookupRequired(\n opts.avatarIntensity,\n INTENSITY_MAP,\n \"--avatar-intensity\",\n )\n : \"m\";\n return `svg:r${r}s${s}h${h}c${c}f${f}${i}`;\n}\n\nexport interface AvatarOptions {\n avatar?: string;\n avatarRotation?: string;\n avatarSkin?: string;\n avatarHairStyle?: string;\n avatarHairColor?: string;\n avatarExpression?: string;\n avatarIntensity?: string;\n}\n\nexport function resolveAvatarUrl(opts: AvatarOptions): string | undefined {\n const hasPreset = opts.avatar !== undefined;\n const hasCustom =\n opts.avatarRotation !== undefined ||\n opts.avatarSkin !== undefined ||\n opts.avatarHairStyle !== undefined ||\n opts.avatarHairColor !== undefined ||\n opts.avatarExpression !== undefined ||\n opts.avatarIntensity !== undefined;\n\n if (!hasPreset && !hasCustom) return undefined;\n\n if (hasPreset && hasCustom) {\n throw new Error(\n \"--avatar cannot be combined with --avatar-* attribute options\",\n );\n }\n\n if (hasPreset) {\n if (!/^preset:[0-4]$/.test(opts.avatar!)) {\n throw new Error(\n `Invalid --avatar \"${opts.avatar}\". Use preset:0 through preset:4`,\n );\n }\n return opts.avatar;\n }\n\n return buildCustomSvgAvatar(opts);\n}\n\nconst REVERSE_SKIN_MAP: Record<number, string> = {\n 0: \"light\",\n 1: \"light-medium\",\n 2: \"medium\",\n 3: \"medium-dark\",\n 4: \"dark\",\n};\n\nconst REVERSE_HAIR_COLOR_MAP: Record<number, string> = {\n 1: \"blonde\",\n 2: \"teal\",\n 3: \"grey\",\n 4: \"pink\",\n 5: \"brown\",\n};\n\nconst REVERSE_EXPRESSION_MAP: Record<number, string> = {\n 1: \"calm\",\n 2: \"content\",\n 3: \"neutral\",\n 4: \"pleasant\",\n 5: \"excited\",\n};\n\nconst REVERSE_INTENSITY_MAP: Record<string, string> = {\n d: \"chill\",\n m: \"normal\",\n h: \"hyped\",\n};\n\nconst PRESET_DESCRIPTIONS: Record<string, string> = {\n \"preset:0\": \"light skin, brown hair, calm, hyped\",\n \"preset:1\": \"light-medium skin, grey hair, calm, normal\",\n \"preset:2\": \"medium skin, pink hair, neutral, chill\",\n \"preset:3\": \"medium-dark skin, blonde hair, pleasant, hyped\",\n \"preset:4\": \"dark skin, teal hair, excited, normal\",\n};\n\nfunction parseSvgAvatar(svg: string): string | undefined {\n const match = svg.match(/^svg:r(\\d)s(\\d)h(\\d)c(\\d)f(\\d)([dmh])$/);\n if (!match) return undefined;\n\n const [, r, s, h, c, f, i] = match as RegExpExecArray;\n const parts: string[] = [];\n\n const skin = REVERSE_SKIN_MAP[Number(s)];\n if (skin) parts.push(`${skin} skin`);\n\n const hairColor = REVERSE_HAIR_COLOR_MAP[Number(c)];\n if (hairColor) parts.push(`${hairColor} hair`);\n\n const expression = REVERSE_EXPRESSION_MAP[Number(f)];\n if (expression) parts.push(expression);\n\n const intensity = REVERSE_INTENSITY_MAP[i!];\n if (intensity) parts.push(intensity);\n\n if (parts.length === 0) return undefined;\n\n let desc = parts.join(\", \");\n if (r !== \"3\") {\n const rotationLabels: Record<string, string> = {\n \"1\": \"far-left\",\n \"2\": \"left\",\n \"4\": \"right\",\n \"5\": \"far-right\",\n };\n const rot = rotationLabels[r!];\n if (rot) desc += `, ${rot}`;\n }\n if (h !== \"1\") {\n desc += `, hair style ${h}`;\n }\n\n return desc;\n}\n\nexport function formatAvatar(\n avatarUrl: string | null | undefined,\n): string | undefined {\n if (!avatarUrl) return undefined;\n\n if (avatarUrl.startsWith(\"preset:\")) {\n const desc = PRESET_DESCRIPTIONS[avatarUrl];\n return desc ? `${avatarUrl} (${desc})` : avatarUrl;\n }\n\n if (avatarUrl.startsWith(\"svg:\")) {\n const desc = parseSvgAvatar(avatarUrl);\n return desc ? `custom (${desc})` : avatarUrl;\n }\n\n return avatarUrl;\n}\n","import { Command } from \"commander\";\nimport { readFileSync } from \"node:fs\";\nimport chalk from \"chalk\";\nimport {\n getZeroAgent,\n updateZeroAgent,\n updateZeroAgentInstructions,\n} from \"../../../lib/api/domains/zero-agents\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\nimport { type AvatarOptions, resolveAvatarUrl } from \"./avatar\";\n\ninterface AgentEditOptions extends AvatarOptions {\n displayName?: string;\n description?: string;\n sound?: string;\n instructionsFile?: string;\n}\n\nfunction hasAvatarUpdate(options: AvatarOptions): boolean {\n return (\n options.avatar !== undefined ||\n options.avatarRotation !== undefined ||\n options.avatarSkin !== undefined ||\n options.avatarHairStyle !== undefined ||\n options.avatarHairColor !== undefined ||\n options.avatarExpression !== undefined ||\n options.avatarIntensity !== undefined\n );\n}\n\nfunction hasAgentFieldUpdate(options: AgentEditOptions): boolean {\n return (\n options.displayName !== undefined ||\n options.description !== undefined ||\n options.sound !== undefined ||\n hasAvatarUpdate(options)\n );\n}\n\nasync function applyAgentUpdate(\n agentId: string,\n options: AgentEditOptions,\n): Promise<void> {\n const hasAvatar = hasAvatarUpdate(options);\n const resolvedAvatarUrl = hasAvatar ? resolveAvatarUrl(options) : undefined;\n\n const current = await getZeroAgent(agentId);\n\n const avatarUrl = hasAvatar\n ? resolvedAvatarUrl\n : (current.avatarUrl ?? undefined);\n\n await updateZeroAgent(agentId, {\n displayName:\n options.displayName !== undefined\n ? options.displayName\n : (current.displayName ?? undefined),\n description:\n options.description !== undefined\n ? options.description\n : (current.description ?? undefined),\n sound:\n options.sound !== undefined\n ? options.sound\n : (current.sound ?? undefined),\n avatarUrl,\n });\n}\n\nexport const editCommand = new Command()\n .name(\"edit\")\n .description(\"Edit a zero agent\")\n .argument(\"<agent-id>\", \"Agent ID\")\n .option(\"--display-name <name>\", \"New display name\")\n .option(\"--description <text>\", \"New description\")\n .option(\n \"--sound <tone>\",\n \"New tone: professional, friendly, direct, supportive\",\n )\n .option(\"--avatar <preset>\", \"Avatar preset: preset:0 through preset:4\")\n .option(\n \"--avatar-rotation <1-5>\",\n \"Head angle: 1=far-left 3=center 5=far-right\",\n )\n .option(\n \"--avatar-skin <tone>\",\n \"Skin tone: light | light-medium | medium | medium-dark | dark\",\n )\n .option(\"--avatar-hair-style <1-5>\", \"Hair style: 1–5\")\n .option(\n \"--avatar-hair-color <color>\",\n \"Hair color: blonde | teal | grey | pink | brown\",\n )\n .option(\n \"--avatar-expression <expr>\",\n \"Expression: calm | content | neutral | pleasant | excited\",\n )\n .option(\"--avatar-intensity <level>\", \"Intensity: chill | normal | hyped\")\n .option(\"--instructions-file <path>\", \"Path to new instructions file\")\n .addHelpText(\n \"after\",\n `\nAvatar:\n Quick presets (--avatar):\n preset:0 light skin, brown hair, calm, hyped\n preset:1 light-medium skin, grey hair, calm, normal\n preset:2 medium skin, pink hair, neutral, chill\n preset:3 medium-dark skin, blonde hair, pleasant, hyped\n preset:4 dark skin, teal hair, excited, normal\n\n Custom attributes (--avatar-* flags, replace the entire avatar):\n --avatar-rotation 1=far-left 3=center(default) 5=far-right\n --avatar-skin light / light-medium / medium(default) / medium-dark / dark\n --avatar-hair-style 1–5 (default: 1)\n --avatar-hair-color blonde / teal / grey / pink / brown(default)\n --avatar-expression calm(default) / content / neutral / pleasant / excited\n --avatar-intensity chill / normal(default) / hyped\n\n Note: --avatar and --avatar-* cannot be used together.\n\nExamples:\n Update description: zero agent edit <agent-id> --description \"new role\"\n Update tone: zero agent edit <agent-id> --sound friendly\n Quick preset avatar: zero agent edit <agent-id> --avatar preset:2\n Custom avatar: zero agent edit <agent-id> --avatar-skin dark --avatar-hair-color teal --avatar-intensity hyped\n Update instructions: zero agent edit <agent-id> --instructions-file ./instructions.md\n Update yourself: zero agent edit $ZERO_AGENT_ID --description \"new role\"\n\nNotes:\n - At least one option is required\n - Unspecified fields are preserved (not cleared)\n - To attach workflows to agents, use: zero workflow attach --help`,\n )\n .action(\n withErrorHandler(async (agentId: string, options: AgentEditOptions) => {\n const hasAgentUpdate = hasAgentFieldUpdate(options);\n\n if (!hasAgentUpdate && !options.instructionsFile) {\n throw new Error(\n \"At least one option is required (--display-name, --description, --sound, --avatar, --avatar-*, --instructions-file)\",\n );\n }\n\n if (hasAgentUpdate) {\n await applyAgentUpdate(agentId, options);\n }\n\n if (options.instructionsFile) {\n const content = readFileSync(options.instructionsFile, \"utf-8\");\n await updateZeroAgentInstructions(agentId, content);\n }\n\n console.log(chalk.green(`✓ Agent \"${agentId}\" updated`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n getZeroAgent,\n getZeroAgentInstructions,\n getZeroAgentUserConnectors,\n listZeroUserPermissionGrants,\n} from \"../../../lib/api/domains/zero-agents\";\nimport { listZeroConnectors } from \"../../../lib/api/domains/zero-connectors\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\nimport type { ZeroConnector } from \"../../../lib/api/domains/zero-connectors\";\nimport { policyIcon } from \"../../../lib/utils/format-utils\";\nimport { formatAvatar } from \"./avatar\";\nimport {\n loadConnectorPermissionInfos,\n connectorPermissionGrantsToFirewallPolicies,\n type ConnectorPermissionInfo,\n} from \"../shared/firewall-permissions\";\n\nfunction printDetailedPermissions(info: ConnectorPermissionInfo): void {\n if (!info.policies) {\n const icon = policyIcon(info.unknownPolicy);\n console.log(` ${icon} unknown endpoints`);\n return;\n }\n\n const nameWidth = Math.max(\n \"unknown endpoints\".length,\n ...info.permissions.map((p) => {\n return p.name.length;\n }),\n );\n\n for (const perm of info.permissions) {\n const policy = info.policies[perm.name] ?? \"deny\";\n const desc = perm.description ?? \"\";\n console.log(\n ` ${policyIcon(policy)} ${perm.name.padEnd(nameWidth)} ${desc}`,\n );\n }\n\n const unknownIcon = policyIcon(info.unknownPolicy);\n console.log(\n ` ${unknownIcon} ${\"unknown endpoints\".padEnd(nameWidth)} Endpoints not matching any rule`,\n );\n}\n\nfunction formatConnectorIdentity(connector: ZeroConnector | undefined): string {\n if (!connector) return \"\";\n if (connector.externalUsername) return `@${connector.externalUsername}`;\n if (connector.externalEmail) return connector.externalEmail;\n return \"\";\n}\n\nfunction formatConnectorSummary(\n info: ConnectorPermissionInfo,\n identity?: ZeroConnector,\n): string {\n const id = formatConnectorIdentity(identity);\n const idStr = id ? ` ${id}` : \"\";\n if (!info.hasPermissions) return `${info.connectorSlug}${idStr}`;\n if (!info.policies) return `${info.connectorSlug}${idStr} (full access)`;\n return `${info.connectorSlug}${idStr} (${info.allowed}/${info.total} allowed)`;\n}\n\nfunction formatDetailIdentity(connector: ZeroConnector | undefined): string {\n if (!connector) return \"\";\n let identity = \"\";\n if (connector.externalUsername && connector.externalEmail) {\n identity = `@${connector.externalUsername} (${connector.externalEmail})`;\n } else if (connector.externalUsername) {\n identity = `@${connector.externalUsername}`;\n } else if (connector.externalEmail) {\n identity = connector.externalEmail;\n }\n if (!identity) return \"\";\n if (connector.connectionStatus === \"reconnect-required\") {\n identity += ` ${chalk.yellow(\"(needs reconnect)\")}`;\n }\n return identity;\n}\n\nexport const viewCommand = new Command()\n .name(\"view\")\n .description(\"View a zero agent\")\n .argument(\"<agent-id>\", \"Agent ID\")\n .option(\"--instructions\", \"Also show instructions content\")\n .option(\"--permissions\", \"Show full permission details for each connector\")\n .addHelpText(\n \"after\",\n `\nExamples:\n View basic info: zero agent view <agent-id>\n Include instructions: zero agent view <agent-id> --instructions\n Show permissions: zero agent view <agent-id> --permissions\n View yourself: zero agent view $ZERO_AGENT_ID --instructions`,\n )\n .action(\n withErrorHandler(\n async (\n agentId: string,\n options: { instructions?: boolean; permissions?: boolean },\n ) => {\n const [agent, connectorSlugs, connectorIdentities] = await Promise.all([\n getZeroAgent(agentId),\n getZeroAgentUserConnectors(agentId),\n listZeroConnectors().catch(() => {\n return { connectors: [] as ZeroConnector[] };\n }),\n ]);\n\n const identityMap = new Map<string, ZeroConnector>(\n connectorIdentities.connectors.map((c) => {\n return [c.slug, c];\n }),\n );\n\n console.log(chalk.bold(agent.agentId));\n if (agent.displayName) console.log(chalk.dim(agent.displayName));\n console.log();\n console.log(`Agent ID: ${agent.agentId}`);\n\n const storedPolicies = options.permissions\n ? connectorPermissionGrantsToFirewallPolicies(\n await listZeroUserPermissionGrants(agent.agentId),\n )\n : null;\n const connectorInfos = await loadConnectorPermissionInfos({\n displayConnectorSlugs: connectorSlugs,\n defaultPolicyConnectorSlugs: connectorSlugs,\n storedPolicies,\n });\n\n if (connectorInfos.length > 0) {\n const summaries = connectorInfos.map((info) => {\n return formatConnectorSummary(\n info,\n identityMap.get(info.connectorSlug),\n );\n });\n console.log(`Connectors: ${summaries.join(\", \")}`);\n }\n\n if (agent.description)\n console.log(`Description: ${agent.description}`);\n if (agent.sound) console.log(`Sound: ${agent.sound}`);\n const avatar = formatAvatar(agent.avatarUrl);\n if (avatar) console.log(`Avatar: ${avatar}`);\n\n if (options.permissions && connectorInfos.length > 0) {\n console.log();\n console.log(chalk.bold(\"Connectors:\"));\n for (const info of connectorInfos) {\n const identity = formatDetailIdentity(\n identityMap.get(info.connectorSlug),\n );\n console.log(` ${info.connectorSlug.padEnd(14)}${identity}`);\n if (info.hasPermissions) {\n printDetailedPermissions(info);\n }\n }\n }\n\n if (options.instructions) {\n console.log();\n const result = await getZeroAgentInstructions(agentId);\n if (result.content) {\n console.log(chalk.dim(\"── Instructions ──\"));\n console.log(result.content);\n } else {\n console.log(chalk.dim(\"No instructions set\"));\n }\n }\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroAgents } from \"../../../lib/api/domains/zero-agents\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all zero agents\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero agent list\n\nNotes:\n - Use this to discover teammate agent IDs`,\n )\n .action(\n withErrorHandler(async () => {\n const agents = await listZeroAgents();\n\n if (agents.length === 0) {\n console.log(chalk.dim(\"No zero agents found\"));\n console.log(\n chalk.dim(\n ' Create one with: zero agent create --display-name \"My Agent\"',\n ),\n );\n return;\n }\n\n const idWidth = Math.max(\n 8,\n ...agents.map((a) => {\n return a.agentId.length;\n }),\n );\n const displayWidth = Math.max(\n 12,\n ...agents.map((a) => {\n return (a.displayName ?? \"\").length;\n }),\n );\n\n const header = [\n \"AGENT ID\".padEnd(idWidth),\n \"DISPLAY NAME\".padEnd(displayWidth),\n ].join(\" \");\n console.log(chalk.dim(header));\n\n for (const agent of agents) {\n const row = [\n agent.agentId.padEnd(idWidth),\n (agent.displayName ?? \"-\").padEnd(displayWidth),\n ].join(\" \");\n console.log(row);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n getZeroAgent,\n deleteZeroAgent,\n} from \"../../../lib/api/domains/zero-agents\";\nimport { isInteractive, promptConfirm } from \"../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\n\nexport const deleteCommand = new Command()\n .name(\"delete\")\n .alias(\"rm\")\n .description(\"Delete a zero agent\")\n .argument(\"<agent-id>\", \"Agent ID\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero agent delete <agent-id>\n zero agent delete <agent-id> -y\n\nNotes:\n - Use -y to skip confirmation in non-interactive mode`,\n )\n .action(\n withErrorHandler(async (agentId: string, options: { yes?: boolean }) => {\n await getZeroAgent(agentId);\n\n if (!options.yes) {\n if (!isInteractive()) {\n throw new Error(\"--yes flag is required in non-interactive mode\");\n }\n const confirmed = await promptConfirm(\n `Delete zero agent '${agentId}'?`,\n false,\n );\n if (!confirmed) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n }\n\n await deleteZeroAgent(agentId);\n console.log(chalk.green(`✓ Agent \"${agentId}\" deleted`));\n }),\n );\n"],"mappings":"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","names":["readFileSync","readFileSync"]}
|
|
@@ -2,14 +2,13 @@
|
|
|
2
2
|
import { createRequire as __createRequire } from "node:module";
|
|
3
3
|
const require = __createRequire(import.meta.url);
|
|
4
4
|
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
import {
|
|
5
|
+
ApiRequestError,
|
|
6
|
+
getActiveToken,
|
|
7
|
+
getBaseUrl,
|
|
8
|
+
headersWithCliClientHeaders,
|
|
10
9
|
source_default,
|
|
11
10
|
withErrorHandler
|
|
12
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-GHKWW4NC.js";
|
|
13
12
|
import "./chunk-32FE3MDA.js";
|
|
14
13
|
import {
|
|
15
14
|
Command,
|
|
@@ -21,6 +20,61 @@ import {
|
|
|
21
20
|
|
|
22
21
|
// src/commands/zero/banking/index.ts
|
|
23
22
|
init_esm_shims();
|
|
23
|
+
|
|
24
|
+
// src/lib/api/domains/zero-banking.ts
|
|
25
|
+
init_esm_shims();
|
|
26
|
+
function authenticatedJsonHeaders(token) {
|
|
27
|
+
const headers = {
|
|
28
|
+
Authorization: `Bearer ${token}`,
|
|
29
|
+
"Content-Type": "application/json"
|
|
30
|
+
};
|
|
31
|
+
return headers;
|
|
32
|
+
}
|
|
33
|
+
function isRecord(value) {
|
|
34
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
35
|
+
}
|
|
36
|
+
async function parseErrorBody(response) {
|
|
37
|
+
let message = `Zero Banking request failed (HTTP ${response.status})`;
|
|
38
|
+
let code = response.status === 404 ? "NOT_FOUND" : "UNKNOWN";
|
|
39
|
+
try {
|
|
40
|
+
const body = await response.json();
|
|
41
|
+
if (isRecord(body) && isRecord(body.error)) {
|
|
42
|
+
if (typeof body.error.message === "string") {
|
|
43
|
+
message = body.error.message;
|
|
44
|
+
}
|
|
45
|
+
if (typeof body.error.code === "string") {
|
|
46
|
+
code = body.error.code;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
} catch {
|
|
50
|
+
}
|
|
51
|
+
if (response.status === 404 && code === "NOT_FOUND") {
|
|
52
|
+
message = "Zero Banking API is not available on this server yet. Try again after the banking backend is deployed.";
|
|
53
|
+
}
|
|
54
|
+
return { message, code };
|
|
55
|
+
}
|
|
56
|
+
async function callZeroBanking(operation, body) {
|
|
57
|
+
const baseUrl = await getBaseUrl();
|
|
58
|
+
const token = await getActiveToken();
|
|
59
|
+
if (!token) {
|
|
60
|
+
throw new ApiRequestError("Not authenticated", "UNAUTHORIZED", 401);
|
|
61
|
+
}
|
|
62
|
+
const response = await fetch(
|
|
63
|
+
new URL(`/api/zero/banking/${operation}`, baseUrl),
|
|
64
|
+
{
|
|
65
|
+
method: "POST",
|
|
66
|
+
headers: headersWithCliClientHeaders(authenticatedJsonHeaders(token)),
|
|
67
|
+
body: JSON.stringify(body)
|
|
68
|
+
}
|
|
69
|
+
);
|
|
70
|
+
if (!response.ok) {
|
|
71
|
+
const { message, code } = await parseErrorBody(response);
|
|
72
|
+
throw new ApiRequestError(message, code, response.status);
|
|
73
|
+
}
|
|
74
|
+
return await response.json();
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// src/commands/zero/banking/index.ts
|
|
24
78
|
function parseLimit(value) {
|
|
25
79
|
const parsed = Number(value);
|
|
26
80
|
if (!Number.isInteger(parsed) || parsed < 1 || parsed > 1e3) {
|
|
@@ -114,4 +168,4 @@ Notes:
|
|
|
114
168
|
export {
|
|
115
169
|
zeroBankingCommand
|
|
116
170
|
};
|
|
117
|
-
//# sourceMappingURL=banking-
|
|
171
|
+
//# sourceMappingURL=banking-CWQFQKZB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/zero/banking/index.ts","../src/lib/api/domains/zero-banking.ts"],"sourcesContent":["import { Command, InvalidArgumentError } from \"commander\";\nimport chalk from \"chalk\";\n\nimport {\n callZeroBanking,\n type ZeroBankingResponse,\n} from \"../../../lib/api/domains/zero-banking\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\n\ninterface JsonOption {\n readonly json?: boolean;\n}\n\ninterface BalancesOptions extends JsonOption {\n readonly accountId: string;\n}\n\ninterface TransactionsOptions extends JsonOption {\n readonly accountId: string;\n readonly from: string;\n readonly to: string;\n readonly limit: number;\n}\n\nfunction parseLimit(value: string): number {\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed < 1 || parsed > 1000) {\n throw new InvalidArgumentError(\"limit must be between 1 and 1000\");\n }\n return parsed;\n}\n\nfunction parseDateOnly(value: string): string {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) {\n throw new InvalidArgumentError(\"date must be formatted as YYYY-MM-DD\");\n }\n return value;\n}\n\nfunction renderBankingResponse(\n label: string,\n response: ZeroBankingResponse,\n): void {\n console.log(chalk.green(`✓ ${label}`));\n console.log(chalk.dim(` Provider: ${response.provider}`));\n\n if (response.accounts) {\n console.log(JSON.stringify(response.accounts, null, 2));\n return;\n }\n if (response.balance) {\n console.log(JSON.stringify(response.balance, null, 2));\n return;\n }\n console.log(JSON.stringify(response.transactions ?? [], null, 2));\n}\n\nasync function runBankingRequest(\n label: string,\n operation: \"accounts\" | \"balances\" | \"transactions\",\n payload: Record<string, unknown>,\n options: JsonOption,\n): Promise<void> {\n const response = await callZeroBanking(operation, payload);\n if (options.json) {\n console.log(JSON.stringify(response));\n return;\n }\n renderBankingResponse(label, response);\n}\n\nconst accountsCommand = new Command()\n .name(\"accounts\")\n .description(\"List enabled banking accounts\")\n .option(\"--json\", \"Print the raw banking response as JSON\")\n .action(\n withErrorHandler(async (options: JsonOption) => {\n await runBankingRequest(\n \"Banking accounts loaded\",\n \"accounts\",\n {},\n options,\n );\n }),\n );\n\nconst balancesCommand = new Command()\n .name(\"balances\")\n .description(\"Read an enabled account balance\")\n .requiredOption(\"--account-id <id>\", \"Enabled provider account ID\")\n .option(\"--json\", \"Print the raw banking response as JSON\")\n .action(\n withErrorHandler(async (options: BalancesOptions) => {\n await runBankingRequest(\n \"Banking balance loaded\",\n \"balances\",\n { accountId: options.accountId },\n options,\n );\n }),\n );\n\nconst transactionsCommand = new Command()\n .name(\"transactions\")\n .description(\"Read transactions for an enabled account\")\n .requiredOption(\"--account-id <id>\", \"Enabled provider account ID\")\n .requiredOption(\n \"--from <date>\",\n \"Start date, formatted as YYYY-MM-DD\",\n parseDateOnly,\n )\n .requiredOption(\n \"--to <date>\",\n \"End date, formatted as YYYY-MM-DD\",\n parseDateOnly,\n )\n .option(\"--limit <n>\", \"Maximum transactions to return\", parseLimit, 100)\n .option(\"--json\", \"Print the raw banking response as JSON\")\n .action(\n withErrorHandler(async (options: TransactionsOptions) => {\n await runBankingRequest(\n \"Banking transactions loaded\",\n \"transactions\",\n {\n accountId: options.accountId,\n from: options.from,\n to: options.to,\n limit: options.limit,\n },\n options,\n );\n }),\n );\n\nexport const zeroBankingCommand = new Command()\n .name(\"banking\")\n .description(\"Use managed zero banking services\")\n .addCommand(accountsCommand)\n .addCommand(balancesCommand)\n .addCommand(transactionsCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n List accounts: zero banking accounts --json\n Get balance: zero banking balances --account-id <id> --json\n Get transactions: zero banking transactions --account-id <id> --from 2026-01-01 --to 2026-01-31 --json\n\nNotes:\n - Authenticates via ZERO_TOKEN (requires banking:read capability)\n - Finicity credentials and app tokens stay on the vm0 API server\n - Access is limited to accounts enabled for the current agent`,\n );\n","import { ApiRequestError, getBaseUrl } from \"../core/client-factory\";\nimport { getActiveToken } from \"../config\";\nimport { headersWithCliClientHeaders } from \"../client-headers\";\n\nexport type ZeroBankingOperation = \"accounts\" | \"balances\" | \"transactions\";\n\nexport interface ZeroBankingResponse {\n readonly operation: ZeroBankingOperation;\n readonly provider: \"finicity\";\n readonly accounts?: unknown[];\n readonly balance?: unknown;\n readonly accountId?: string;\n readonly transactions?: unknown[];\n}\n\nfunction authenticatedJsonHeaders(token: string): Record<string, string> {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n };\n return headers;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nasync function parseErrorBody(\n response: Response,\n): Promise<{ message: string; code: string }> {\n let message = `Zero Banking request failed (HTTP ${response.status})`;\n let code = response.status === 404 ? \"NOT_FOUND\" : \"UNKNOWN\";\n\n try {\n const body: unknown = await response.json();\n if (isRecord(body) && isRecord(body.error)) {\n if (typeof body.error.message === \"string\") {\n message = body.error.message;\n }\n if (typeof body.error.code === \"string\") {\n code = body.error.code;\n }\n }\n } catch {\n // Keep the status-based fallback when the response is not JSON.\n }\n\n if (response.status === 404 && code === \"NOT_FOUND\") {\n message =\n \"Zero Banking API is not available on this server yet. Try again after the banking backend is deployed.\";\n }\n\n return { message, code };\n}\n\nexport async function callZeroBanking(\n operation: ZeroBankingOperation,\n body: Record<string, unknown>,\n): Promise<ZeroBankingResponse> {\n const baseUrl = await getBaseUrl();\n const token = await getActiveToken();\n if (!token) {\n throw new ApiRequestError(\"Not authenticated\", \"UNAUTHORIZED\", 401);\n }\n\n const response = await fetch(\n new URL(`/api/zero/banking/${operation}`, baseUrl),\n {\n method: \"POST\",\n headers: headersWithCliClientHeaders(authenticatedJsonHeaders(token)),\n body: JSON.stringify(body),\n },\n );\n\n if (!response.ok) {\n const { message, code } = await parseErrorBody(response);\n throw new ApiRequestError(message, code, response.status);\n }\n\n return (await response.json()) as ZeroBankingResponse;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -8,13 +8,12 @@ import {
|
|
|
8
8
|
leaseZeroBrowser,
|
|
9
9
|
useZeroBrowser,
|
|
10
10
|
zeroBrowserCreateRequestSchema
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-ANOLYIPL.js";
|
|
11
|
+
} from "./chunk-UIXUGVZB.js";
|
|
12
|
+
import "./chunk-JV6LM2YC.js";
|
|
14
13
|
import {
|
|
15
14
|
source_default,
|
|
16
15
|
withErrorHandler
|
|
17
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-GHKWW4NC.js";
|
|
18
17
|
import "./chunk-32FE3MDA.js";
|
|
19
18
|
import {
|
|
20
19
|
Command,
|
|
@@ -173,4 +172,4 @@ Notes:
|
|
|
173
172
|
export {
|
|
174
173
|
zeroBrowserCommand
|
|
175
174
|
};
|
|
176
|
-
//# sourceMappingURL=browser-
|
|
175
|
+
//# sourceMappingURL=browser-BI6UFWPH.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/domains/zero-browser\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\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<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(` Thread ID: ${browser.threadId}`));\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 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 an isolated 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(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 and reopens saved tab URLs when possible\n - Browser Use credentials and connection URLs are never printed\n - Each thread keeps an isolated login profile\n - Threads can run their browsers in parallel`,\n );\n"],"mappings":"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","names":[]}
|
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire as __createRequire } from "node:module";
|
|
3
3
|
const require = __createRequire(import.meta.url);
|
|
4
|
+
import {
|
|
5
|
+
createZeroChatThread,
|
|
6
|
+
getZeroChatThread,
|
|
7
|
+
getZeroChatThreadAgentId,
|
|
8
|
+
getZeroChatThreadSnapshot,
|
|
9
|
+
listZeroChatEvents,
|
|
10
|
+
listZeroChatThreadEvents,
|
|
11
|
+
renameZeroChatThread,
|
|
12
|
+
sendZeroChatEvent,
|
|
13
|
+
updateZeroChatThreadModelSelection
|
|
14
|
+
} from "./chunk-2SJTFDC2.js";
|
|
4
15
|
import {
|
|
5
16
|
formatIsoTimestamp,
|
|
6
17
|
isUuid,
|
|
@@ -11,30 +22,27 @@ import {
|
|
|
11
22
|
} from "./chunk-SVFOPAWB.js";
|
|
12
23
|
import {
|
|
13
24
|
formatModelProviderRoute
|
|
14
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-C62A6LD6.js";
|
|
26
|
+
import {
|
|
27
|
+
listZeroModelPolicies
|
|
28
|
+
} from "./chunk-SA4DYSBR.js";
|
|
29
|
+
import "./chunk-CEJGHPF3.js";
|
|
15
30
|
import {
|
|
16
31
|
chatThreadEventSchema,
|
|
17
32
|
chatThreadSnapshotProjectionSchema,
|
|
18
|
-
createZeroChatThread,
|
|
19
33
|
foldPendingChatQueueEvents,
|
|
20
|
-
getZeroChatThread,
|
|
21
|
-
getZeroChatThreadAgentId,
|
|
22
|
-
getZeroChatThreadSnapshot,
|
|
23
|
-
listZeroChatEvents,
|
|
24
|
-
listZeroChatThreadEvents,
|
|
25
|
-
listZeroModelPolicies,
|
|
26
|
-
renameZeroChatThread,
|
|
27
|
-
sendZeroChatEvent,
|
|
28
|
-
updateZeroChatThreadModelSelection,
|
|
29
34
|
userMessageDocumentSchema
|
|
30
|
-
} from "./chunk-
|
|
31
|
-
import "./chunk-
|
|
32
|
-
import "./chunk-
|
|
35
|
+
} from "./chunk-DUA6CF7E.js";
|
|
36
|
+
import "./chunk-YDS3X7KB.js";
|
|
37
|
+
import "./chunk-LIYPTQAO.js";
|
|
38
|
+
import "./chunk-SMPSKBAP.js";
|
|
39
|
+
import "./chunk-A6ZRMNM3.js";
|
|
40
|
+
import "./chunk-JV6LM2YC.js";
|
|
33
41
|
import {
|
|
34
42
|
getApiUrl,
|
|
35
43
|
source_default,
|
|
36
44
|
withErrorHandler
|
|
37
|
-
} from "./chunk-
|
|
45
|
+
} from "./chunk-GHKWW4NC.js";
|
|
38
46
|
import {
|
|
39
47
|
decodeZeroTokenPayload
|
|
40
48
|
} from "./chunk-32FE3MDA.js";
|
|
@@ -1171,4 +1179,4 @@ Examples:
|
|
|
1171
1179
|
export {
|
|
1172
1180
|
zeroChatCommand
|
|
1173
1181
|
};
|
|
1174
|
-
//# sourceMappingURL=chat-
|
|
1182
|
+
//# sourceMappingURL=chat-MKIW4FPP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/zero/chat/index.ts","../src/commands/zero/chat/cancel.ts","../src/commands/zero/chat/shared.ts","../src/commands/zero/chat/create.ts","../src/commands/zero/chat/get.ts","../src/commands/zero/chat/list.ts","../src/commands/zero/chat/chat-thread-cache.ts","../../../packages/core/src/chat-thread-event-replay.ts","../src/commands/zero/chat/model.ts","../src/commands/zero/chat/queued.ts","../src/commands/zero/chat/rename.ts","../src/commands/zero/chat/send.ts"],"sourcesContent":["import { Command } from \"commander\";\n\nimport { cancelCommand } from \"./cancel\";\nimport { createCommand } from \"./create\";\nimport { getCommand } from \"./get\";\nimport { listCommand } from \"./list\";\nimport { modelCommand } from \"./model\";\nimport { queuedCommand } from \"./queued\";\nimport { renameCommand } from \"./rename\";\nimport { sendCommand } from \"./send\";\n\nexport const zeroChatCommand = new Command()\n .name(\"chat\")\n .description(\"Manage web chat threads\")\n .addCommand(createCommand)\n .addCommand(sendCommand)\n .addCommand(queuedCommand)\n .addCommand(cancelCommand)\n .addCommand(getCommand)\n .addCommand(listCommand)\n .addCommand(modelCommand)\n .addCommand(renameCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Create a chat: zero chat create \"Launch plan\"\n Send a message: zero chat send --text \"Continue\"\n Show queued: zero chat queued --thread-id <thread-id>\n Cancel a run: zero chat cancel --thread-id <thread-id> --run-id <run-id>\n List agent chats: zero chat list\n Show this chat: zero chat get\n Switch model: zero chat model claude-sonnet-5\n Switch another: zero chat model --thread <thread-id> claude-sonnet-5\n Rename this chat: zero chat rename \"Launch plan\"\n Rename another: zero chat rename --thread <thread-id> \"Launch plan\"`,\n );\n","import { randomUUID } from \"node:crypto\";\n\nimport chalk from \"chalk\";\nimport { Command } from \"commander\";\n\nimport {\n getZeroChatThreadAgentId,\n sendZeroChatEvent,\n} from \"../../../lib/api/domains/zero-chat\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\nimport { isUuid } from \"../../../lib/utils/uuid\";\nimport { printChatUsageError, resolveChatThreadId } from \"./shared\";\n\ninterface CancelOptions {\n readonly eventId?: string;\n readonly json?: boolean;\n readonly runId?: string;\n readonly threadId?: string;\n}\n\nfunction resolveTarget(\n options: CancelOptions,\n):\n | { readonly kind: \"run\"; readonly id: string }\n | { readonly kind: \"event\"; readonly id: string } {\n const runId = options.runId?.trim();\n const eventId = options.eventId?.trim();\n if (runId && eventId) {\n printChatUsageError(\n \"Exactly one of --run-id or --event-id is required\",\n \"Use --run-id for an active run or --event-id for a queued event.\",\n );\n }\n\n if (runId) {\n if (!isUuid(runId)) {\n printChatUsageError(\n `Invalid run ID \"${runId}\" — expected a UUID`,\n \"Pass a valid UUID with --run-id.\",\n );\n }\n return { kind: \"run\", id: runId };\n }\n if (eventId) {\n if (!isUuid(eventId)) {\n printChatUsageError(\n `Invalid event ID \"${eventId}\" — expected a UUID`,\n \"Pass a valid UUID with --event-id.\",\n );\n }\n return { kind: \"event\", id: eventId };\n }\n\n printChatUsageError(\n \"Exactly one of --run-id or --event-id is required\",\n \"Use --run-id for an active run or --event-id for a queued event.\",\n );\n}\n\nexport const cancelCommand = new Command()\n .name(\"cancel\")\n .description(\"Cancel one active run or queued chat event\")\n .option(\n \"--thread-id <id>\",\n \"Chat thread ID (defaults to ZERO_CHAT_THREAD_ID)\",\n )\n .option(\"--run-id <id>\", \"Queued, pending, or running run ID to interrupt\")\n .option(\"--event-id <id>\", \"Queued chat event ID to revoke\")\n .option(\"--json\", \"Print machine-readable JSON\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Cancel a run: zero chat cancel --thread-id <thread-id> --run-id <run-id>\n Cancel a message: zero chat cancel --thread-id <thread-id> --event-id <event-id>\n\nNotes:\n - --run-id and --event-id are mutually exclusive\n - Authenticates via ZERO_TOKEN (requires chat-thread:read and chat-event:write capabilities)`,\n )\n .action(\n withErrorHandler(async (options: CancelOptions) => {\n const threadId = resolveChatThreadId(options.threadId);\n const target = resolveTarget(options);\n const agentId = await getZeroChatThreadAgentId({ threadId });\n const controlEventId = randomUUID();\n const result = await sendZeroChatEvent(\n target.kind === \"run\"\n ? {\n agentId,\n threadId,\n interruptsRunId: target.id,\n clientEventId: controlEventId,\n }\n : {\n agentId,\n threadId,\n revokesEventId: target.id,\n clientEventId: controlEventId,\n },\n );\n\n const output = {\n threadId: result.threadId,\n controlEventId,\n targetType: target.kind,\n targetId: target.id,\n createdAt: result.createdAt ?? null,\n };\n if (options.json) {\n console.log(JSON.stringify(output));\n return;\n }\n\n console.log(\n chalk.green(\n target.kind === \"run\"\n ? \"✓ Chat run cancelled\"\n : \"✓ Queued chat event cancelled\",\n ),\n );\n console.log(chalk.dim(` Thread: ${output.threadId}`));\n console.log(\n chalk.dim(\n ` ${target.kind === \"run\" ? \"Run\" : \"Event\"}: ${target.id}`,\n ),\n );\n console.log(chalk.dim(` Control: ${controlEventId}`));\n }),\n );\n","import chalk from \"chalk\";\n\nimport { isUuid } from \"../../../lib/utils/uuid\";\n\nexport function printChatUsageError(message: string, hint: string): never {\n console.error(chalk.red(`✗ ${message}`));\n console.error(chalk.dim(` ${hint}`));\n process.exit(1);\n}\n\nexport function resolveChatThreadId(flagThreadId: string | undefined): string {\n const threadId =\n flagThreadId?.trim() || process.env.ZERO_CHAT_THREAD_ID?.trim();\n if (!threadId) {\n printChatUsageError(\n \"ZERO_CHAT_THREAD_ID is not set\",\n \"Pass --thread-id <thread-id> or run inside a Zero web chat thread.\",\n );\n }\n if (!isUuid(threadId)) {\n printChatUsageError(\n `Invalid thread ID \"${threadId}\" — expected a UUID`,\n \"Pass a valid UUID with --thread-id <thread-id>.\",\n );\n }\n return threadId;\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\n\nimport {\n createZeroChatThread,\n getZeroChatThreadAgentId,\n} from \"../../../lib/api/domains/zero-chat\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\nimport { isUuid } from \"../../../lib/utils/uuid\";\nimport { printChatUsageError } from \"./shared\";\n\ninterface CreateOptions {\n readonly agent?: string;\n readonly json?: boolean;\n readonly model?: string;\n}\n\n/**\n * Agent that owns the new thread: an explicit `--agent`, otherwise the agent of\n * the chat the command runs in.\n */\nasync function resolveAgentId(\n flagAgentId: string | undefined,\n): Promise<string> {\n const agentId = flagAgentId?.trim();\n if (agentId) {\n return agentId;\n }\n\n const currentThreadId = process.env.ZERO_CHAT_THREAD_ID?.trim();\n if (!currentThreadId) {\n printChatUsageError(\n \"ZERO_CHAT_THREAD_ID is not set\",\n \"Pass --agent <agent-id> or run inside a Zero web chat thread.\",\n );\n }\n if (!isUuid(currentThreadId)) {\n printChatUsageError(\n `Invalid thread ID \"${currentThreadId}\" — expected a UUID`,\n \"Pass --agent <agent-id> to choose the agent explicitly.\",\n );\n }\n\n return await getZeroChatThreadAgentId({ threadId: currentThreadId });\n}\n\nexport const createCommand = new Command()\n .name(\"create\")\n .description(\"Create a new web chat thread\")\n .argument(\"<title...>\", \"Chat title\")\n .option(\n \"--agent <id>\",\n \"Agent ID that owns the thread (defaults to this chat's agent)\",\n )\n .option(\n \"--model <id>\",\n \"Model for the thread (defaults to the current run's model)\",\n )\n .option(\"--json\", \"Print machine-readable JSON\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Create a chat: zero chat create \"Launch plan\"\n Pick the model: zero chat create \"Launch plan\" --model claude-sonnet-5\n Pick the agent: zero chat create \"Launch plan\" --agent <agent-id>\n Print JSON: zero chat create \"Launch plan\" --json\n\nNotes:\n - Creates an empty thread; send its first message with zero chat send\n - Defaults --agent to the agent of ZERO_CHAT_THREAD_ID\n - Defaults --model to the model of the run that owns ZERO_TOKEN\n - The new thread never inherits this chat's history, so the first message must be self-contained\n - Authenticates via ZERO_TOKEN (requires chat-thread:write, and chat-thread:read to default --agent)`,\n )\n .action(\n withErrorHandler(async (titleParts: string[], options: CreateOptions) => {\n const title = titleParts.join(\" \").trim();\n if (!title) {\n printChatUsageError(\n \"Chat title is required\",\n 'Run: zero chat create \"New title\"',\n );\n }\n\n const agentId = await resolveAgentId(options.agent);\n const thread = await createZeroChatThread({\n agentId,\n title,\n ...(options.model === undefined ? {} : { model: options.model }),\n });\n\n if (options.json) {\n console.log(\n JSON.stringify({\n threadId: thread.threadId,\n title: thread.title,\n selectedModel: thread.selectedModel,\n agentId,\n }),\n );\n return;\n }\n\n console.log(chalk.green(\"✓ Chat thread created\"));\n console.log(chalk.dim(` Thread: ${thread.threadId}`));\n console.log(chalk.dim(` Title: ${title}`));\n console.log(\n chalk.dim(` Model: ${thread.selectedModel ?? \"(default)\"}`),\n );\n console.log(chalk.dim(` Agent: ${agentId}`));\n console.log();\n console.log(\"Send the first message:\");\n console.log(\n chalk.cyan(\n ` zero chat send --thread-id ${thread.threadId} --text \"<message>\"`,\n ),\n );\n }),\n );\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\n\nimport { getZeroChatThread } from \"../../../lib/api/domains/zero-chat\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\n\ninterface GetOptions {\n readonly json?: boolean;\n}\n\nfunction getCurrentChatThreadId(): string | undefined {\n return process.env.ZERO_CHAT_THREAD_ID?.trim() || undefined;\n}\n\nfunction printUsageError(message: string, hint: string): never {\n console.error(chalk.red(`✗ ${message}`));\n console.error(chalk.dim(` ${hint}`));\n process.exit(1);\n}\n\nexport const getCommand = new Command()\n .name(\"get\")\n .description(\"Show the current web chat thread\")\n .option(\"--json\", \"Print machine-readable JSON\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Show this chat: zero chat get\n Print JSON: zero chat get --json\n\nNotes:\n - Uses ZERO_CHAT_THREAD_ID from the current web chat thread\n - Authenticates via ZERO_TOKEN (requires chat-thread:read capability)`,\n )\n .action(\n withErrorHandler(async (options: GetOptions) => {\n const threadId = getCurrentChatThreadId();\n if (!threadId) {\n printUsageError(\n \"ZERO_CHAT_THREAD_ID is not set\",\n \"Run this command from a Zero web chat thread.\",\n );\n }\n\n const thread = await getZeroChatThread({ threadId });\n if (options.json) {\n console.log(JSON.stringify(thread));\n return;\n }\n\n console.log(chalk.green(\"✓ Chat thread loaded\"));\n console.log(chalk.dim(` Thread: ${thread.id}`));\n if (thread.agentId) {\n console.log(chalk.dim(` Agent: ${thread.agentId}`));\n }\n console.log(chalk.dim(` Title: ${thread.title ?? \"(untitled)\"}`));\n console.log(\n chalk.dim(` Model: ${thread.selectedModel ?? \"(default)\"}`),\n );\n }),\n );\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\n\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\nimport { formatIsoTimestamp } from \"../../../lib/utils/time-format\";\nimport { parseBoundedLogCount } from \"../../../lib/utils/log-pagination\";\nimport { isUuid } from \"../../../lib/utils/uuid\";\nimport { syncCachedChatThreads } from \"./chat-thread-cache\";\n\nconst DEFAULT_LIMIT = 20;\nconst MAX_LIMIT = 100;\n\ninterface ListOptions {\n readonly agent?: string;\n readonly json?: boolean;\n readonly limit?: string;\n}\n\nfunction printUsageError(message: string, hint: string): never {\n console.error(chalk.red(`✗ ${message}`));\n console.error(chalk.dim(` ${hint}`));\n process.exit(1);\n}\n\nfunction resolveAgentId(flagAgentId: string | undefined): string {\n const agentId = flagAgentId?.trim() || process.env.ZERO_AGENT_ID?.trim();\n if (!agentId) {\n printUsageError(\n \"ZERO_AGENT_ID is not set\",\n \"Pass --agent <agent-id> or run inside an agent sandbox.\",\n );\n }\n if (!isUuid(agentId)) {\n printUsageError(\n `Invalid agent ID \"${agentId}\" — expected a UUID`,\n \"Pass a valid UUID with --agent <agent-id>.\",\n );\n }\n return agentId;\n}\n\nfunction titleForDisplay(title: string | null): string {\n return (title ?? \"(untitled)\").replace(/\\s+/g, \" \");\n}\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List web chat threads for an agent\")\n .option(\"--agent <id>\", \"Filter by Zero agent ID (defaults to ZERO_AGENT_ID)\")\n .option(\n \"--limit <n>\",\n `Maximum number of threads to print (default: ${DEFAULT_LIMIT}, max: ${MAX_LIMIT})`,\n )\n .option(\"--json\", \"Print machine-readable JSON\")\n .addHelpText(\n \"after\",\n `\nExamples:\n List this agent's chats: zero chat list\n List another agent: zero chat list --agent <agent-id>\n Limit the output: zero chat list --limit 10\n Print JSON: zero chat list --json\n\nNotes:\n - Defaults --agent to ZERO_AGENT_ID\n - Authenticates via ZERO_TOKEN (requires chat-thread:read capability)\n - Replays cached snapshot and incremental chat thread events`,\n )\n .action(\n withErrorHandler(async (options: ListOptions) => {\n const agentId = resolveAgentId(options.agent);\n const limit =\n options.limit === undefined\n ? DEFAULT_LIMIT\n : parseBoundedLogCount(options.limit, \"--limit\", 1, MAX_LIMIT);\n const allThreads = await syncCachedChatThreads();\n const matchingThreads = allThreads.filter((thread) => {\n return thread.agentId === agentId;\n });\n const threads = matchingThreads.slice(0, limit);\n\n if (options.json) {\n console.log(\n JSON.stringify({\n agentId,\n total: matchingThreads.length,\n threads,\n }),\n );\n return;\n }\n\n if (threads.length === 0) {\n console.log(chalk.dim(\"No chat threads found\"));\n return;\n }\n\n const header = [\n \"THREAD ID\".padEnd(38),\n \"SORTED\".padEnd(20),\n \"PINNED\".padEnd(6),\n \"TITLE\",\n ].join(\" \");\n console.log(chalk.dim(header));\n for (const thread of threads) {\n console.log(\n [\n thread.id.padEnd(38),\n formatIsoTimestamp(thread.sortAt).padEnd(20),\n (thread.pinnedAt === null ? \"-\" : \"yes\").padEnd(6),\n titleForDisplay(thread.title),\n ].join(\" \"),\n );\n }\n\n if (threads.length < matchingThreads.length) {\n console.log();\n console.log(\n chalk.dim(\n ` Showing ${threads.length} of ${matchingThreads.length} threads. Use --limit to adjust.`,\n ),\n );\n }\n }),\n );\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { mkdir, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nimport {\n chatThreadEventSchema,\n chatThreadSnapshotProjectionSchema,\n} from \"@vm0/api-contracts/contracts/chat-threads\";\nimport {\n replayChatThreadEvents,\n type EventDrivenChatThread,\n} from \"@vm0/core/chat-thread-event-replay\";\n\nimport {\n getZeroChatThreadSnapshot,\n listZeroChatThreadEvents,\n type ZeroChatThreadEvent,\n type ZeroChatThreadSnapshot,\n} from \"../../../lib/api/domains/zero-chat\";\nimport { decodeZeroTokenPayload, getApiUrl } from \"../../../lib/api/config\";\n\nconst CACHE_VERSION = 2;\nconst MAX_EVENT_PAGES_PER_SYNC = 20;\n\ninterface ChatThreadCache {\n readonly version: typeof CACHE_VERSION;\n readonly snapshot: ZeroChatThreadSnapshot;\n readonly events: readonly ZeroChatThreadEvent[];\n}\n\ninterface ChatThreadEventCursor {\n readonly eventId: string;\n readonly seqId?: number;\n}\n\nconst cachedChatThreadEventSchema = chatThreadEventSchema.extend({\n seqId: chatThreadEventSchema.shape.seqId.optional(),\n});\n\nfunction eventHasSeqId(\n event: ZeroChatThreadEvent,\n): event is ZeroChatThreadEvent & { readonly seqId: number } {\n return event.seqId !== undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction parseCache(raw: string): ChatThreadCache | null {\n let value: unknown;\n try {\n value = JSON.parse(raw);\n } catch (error) {\n if (error instanceof SyntaxError) {\n return null;\n }\n throw error;\n }\n\n if (\n !isRecord(value) ||\n value.version !== CACHE_VERSION ||\n !isRecord(value.snapshot)\n ) {\n return null;\n }\n\n const chatThreads = chatThreadSnapshotProjectionSchema\n .array()\n .safeParse(value.snapshot.chatThreads);\n const events = cachedChatThreadEventSchema.array().safeParse(value.events);\n const latestEventId = value.snapshot.latestEventId;\n const latestSeqId = value.snapshot.latestSeqId;\n if (\n !chatThreads.success ||\n !events.success ||\n (latestEventId !== null && typeof latestEventId !== \"string\") ||\n (latestSeqId !== null &&\n (typeof latestSeqId !== \"number\" ||\n !Number.isSafeInteger(latestSeqId) ||\n latestSeqId <= 0))\n ) {\n return null;\n }\n\n return {\n version: CACHE_VERSION,\n snapshot: {\n chatThreads: chatThreads.data,\n latestEventId,\n latestSeqId,\n },\n events: events.data,\n };\n}\n\nfunction cacheRoot(): string {\n return process.env.XDG_CACHE_HOME?.trim() || join(homedir(), \".cache\");\n}\n\nasync function cachePath(): Promise<string> {\n const token = decodeZeroTokenPayload();\n if (!token) {\n throw new Error(\"ZERO_TOKEN does not contain a valid Zero cache scope\");\n }\n const apiUrl = await getApiUrl();\n const scope = createHash(\"sha256\")\n .update(`${apiUrl}\\0${token.orgId}\\0${token.userId}`)\n .digest(\"hex\");\n return join(cacheRoot(), \"vm0\", \"zero\", \"chat-threads\", `${scope}.json`);\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n\nasync function readCache(path: string): Promise<ChatThreadCache | null> {\n let raw: string;\n try {\n raw = await readFile(path, \"utf8\");\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n return parseCache(raw);\n}\n\nasync function writeCache(path: string, cache: ChatThreadCache): Promise<void> {\n await mkdir(dirname(path), { recursive: true, mode: 0o700 });\n const temporaryPath = `${path}.${process.pid}.${randomUUID()}.tmp`;\n try {\n await writeFile(temporaryPath, `${JSON.stringify(cache)}\\n`, {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: 0o600,\n });\n await rename(temporaryPath, path);\n } finally {\n await rm(temporaryPath, { force: true });\n }\n}\n\nfunction mergeEvents(\n existing: readonly ZeroChatThreadEvent[],\n incoming: readonly ZeroChatThreadEvent[],\n): ZeroChatThreadEvent[] {\n const byId = new Map<string, ZeroChatThreadEvent>();\n for (const event of existing) {\n byId.set(event.id, event);\n }\n for (const event of incoming) {\n byId.set(event.id, event);\n }\n const merged = [...byId.values()];\n return merged.every(eventHasSeqId)\n ? merged.sort((left, right) => {\n return left.seqId - right.seqId;\n })\n : merged;\n}\n\nasync function freshCache(): Promise<ChatThreadCache> {\n return {\n version: CACHE_VERSION,\n snapshot: await getZeroChatThreadSnapshot(),\n events: [],\n };\n}\n\nfunction latestEventCursor(\n cache: ChatThreadCache,\n): ChatThreadEventCursor | undefined {\n const event = cache.events.at(-1);\n if (event) {\n return {\n eventId: event.id,\n ...(event.seqId !== undefined ? { seqId: event.seqId } : {}),\n };\n }\n if (cache.snapshot.latestEventId === null) {\n return undefined;\n }\n return {\n eventId: cache.snapshot.latestEventId,\n ...(cache.snapshot.latestSeqId !== null\n ? { seqId: cache.snapshot.latestSeqId }\n : {}),\n };\n}\n\nexport async function syncCachedChatThreads(): Promise<\n EventDrivenChatThread[]\n> {\n const path = await cachePath();\n let cache = (await readCache(path)) ?? (await freshCache());\n let cursor = latestEventCursor(cache);\n\n for (let page = 0; page < MAX_EVENT_PAGES_PER_SYNC; page++) {\n const result = await listZeroChatThreadEvents({\n sinceSeqId: cursor?.seqId,\n sinceEventId: cursor?.eventId,\n });\n if (result.kind === \"expired\") {\n cache = await freshCache();\n cursor = latestEventCursor(cache);\n continue;\n }\n\n if (result.events.length > 0) {\n cache = {\n ...cache,\n events: mergeEvents(cache.events, result.events),\n };\n const lastEvent = result.events.at(-1);\n if (lastEvent) {\n cursor = {\n eventId: lastEvent.id,\n ...(lastEvent.seqId !== undefined ? { seqId: lastEvent.seqId } : {}),\n };\n }\n }\n\n if (!result.hasMore || result.events.length === 0) {\n break;\n }\n }\n\n await writeCache(path, cache);\n return replayChatThreadEvents(cache.snapshot.chatThreads, cache.events);\n}\n","import type {\n ChatThreadEvent,\n ChatThreadSnapshotProjection,\n} from \"@vm0/api-contracts/contracts/chat-threads\";\n\nexport type ReplayChatThreadEvent = Omit<ChatThreadEvent, \"seqId\">;\n\nexport interface EventDrivenChatThread extends ChatThreadSnapshotProjection {\n readonly sortAt: string;\n readonly cloudBrowserEnabled: boolean;\n}\n\nfunction compareThreadOrder(\n left: EventDrivenChatThread,\n right: EventDrivenChatThread,\n): number {\n const leftPinned = left.pinnedAt !== null;\n const rightPinned = right.pinnedAt !== null;\n if (leftPinned !== rightPinned) {\n return leftPinned ? -1 : 1;\n }\n const sortCompare = right.sortAt.localeCompare(left.sortAt);\n if (sortCompare !== 0) {\n return sortCompare;\n }\n return right.id.localeCompare(left.id);\n}\n\nfunction applyEvent(\n threads: Map<string, EventDrivenChatThread>,\n event: ReplayChatThreadEvent,\n pendingThreadUpdates: Map<string, ReplayChatThreadEvent[]>,\n) {\n if (event.kind === \"created\") {\n threads.set(event.chatThreadId, {\n id: event.chatThreadId,\n agentId: event.agentId,\n title: event.title,\n sortAt: event.createdAt,\n createdAt: event.createdAt,\n updatedAt: event.createdAt,\n pinnedAt: null,\n renamedAt: null,\n selectedModel: event.selectedModel,\n serviceTier: event.serviceTier,\n computerUseHostId: event.computerUseHostId,\n cloudBrowserEnabled: event.cloudBrowserEnabled ?? false,\n });\n const pendingUpdates = pendingThreadUpdates.get(event.chatThreadId) ?? [];\n pendingThreadUpdates.delete(event.chatThreadId);\n for (const pendingUpdate of pendingUpdates) {\n if (pendingUpdate.createdAt.localeCompare(event.createdAt) >= 0) {\n applyEvent(threads, pendingUpdate, pendingThreadUpdates);\n }\n }\n return;\n }\n\n if (event.kind === \"deleted\") {\n threads.delete(event.chatThreadId);\n return;\n }\n\n const thread = threads.get(event.chatThreadId);\n if (!thread) {\n if (\n event.kind === \"model_selection_updated\" ||\n event.kind === \"service_tier_updated\" ||\n event.kind === \"computer_use_host_updated\"\n ) {\n const pendingUpdates = pendingThreadUpdates.get(event.chatThreadId) ?? [];\n pendingThreadUpdates.set(event.chatThreadId, [...pendingUpdates, event]);\n }\n return;\n }\n\n if (event.kind === \"renamed\") {\n threads.set(event.chatThreadId, {\n ...thread,\n title: event.title,\n renamedAt: event.createdAt,\n updatedAt: event.createdAt,\n });\n return;\n }\n\n if (event.kind === \"pinned\") {\n threads.set(event.chatThreadId, {\n ...thread,\n pinnedAt: event.createdAt,\n updatedAt: event.createdAt,\n });\n return;\n }\n\n if (event.kind === \"unpinned\") {\n threads.set(event.chatThreadId, {\n ...thread,\n pinnedAt: null,\n updatedAt: event.createdAt,\n });\n return;\n }\n\n if (event.kind === \"model_selection_updated\") {\n threads.set(event.chatThreadId, {\n ...thread,\n selectedModel: event.selectedModel,\n updatedAt: event.createdAt,\n });\n return;\n }\n\n if (event.kind === \"service_tier_updated\") {\n threads.set(event.chatThreadId, {\n ...thread,\n serviceTier: event.serviceTier,\n updatedAt: event.createdAt,\n });\n return;\n }\n\n if (event.kind === \"computer_use_host_updated\") {\n threads.set(event.chatThreadId, {\n ...thread,\n computerUseHostId: event.computerUseHostId,\n cloudBrowserEnabled: event.cloudBrowserEnabled ?? false,\n updatedAt: event.createdAt,\n });\n return;\n }\n\n threads.set(event.chatThreadId, {\n ...thread,\n sortAt: event.createdAt,\n });\n}\n\nexport function replayChatThreadEvents(\n snapshot: readonly ChatThreadSnapshotProjection[],\n events: readonly ReplayChatThreadEvent[],\n): EventDrivenChatThread[] {\n const threads = new Map<string, EventDrivenChatThread>();\n for (const thread of snapshot) {\n threads.set(thread.id, {\n ...thread,\n selectedModel: thread.selectedModel ?? null,\n serviceTier: thread.serviceTier ?? null,\n computerUseHostId: thread.computerUseHostId ?? null,\n cloudBrowserEnabled: thread.cloudBrowserEnabled ?? false,\n });\n }\n const pendingThreadUpdates = new Map<string, ReplayChatThreadEvent[]>();\n for (const event of events) {\n applyEvent(threads, event, pendingThreadUpdates);\n }\n return [...threads.values()].sort(compareThreadOrder);\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport type { ChatThreadMetadata } from \"@vm0/api-contracts/contracts/chat-threads\";\nimport type {\n OrgModelPoliciesResponse,\n OrgModelPolicy,\n} from \"@vm0/api-contracts/contracts/model-providers\";\nimport { getModelDisplayName } from \"@vm0/core/model-display-name\";\nimport {\n getZeroChatThread,\n updateZeroChatThreadModelSelection,\n} from \"../../../lib/api/domains/zero-chat\";\nimport { listZeroModelPolicies } from \"../../../lib/api/domains/zero-model-policies\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\nimport { formatModelProviderRoute } from \"../../../lib/domain/model-policy-display\";\nimport { isUuid } from \"../../../lib/utils/uuid\";\n\ninterface ModelOptions {\n readonly help?: boolean;\n readonly thread?: string;\n}\n\nfunction getCurrentChatThreadId(): string | undefined {\n return process.env.ZERO_CHAT_THREAD_ID?.trim() || undefined;\n}\n\nfunction printUsageError(message: string, hint: string): never {\n console.error(chalk.red(`✗ ${message}`));\n console.error(chalk.dim(` ${hint}`));\n process.exit(1);\n}\n\nfunction switchablePolicies(policies: readonly OrgModelPolicy[]) {\n return policies.filter((policy) => {\n return policy.routeStatus === \"valid\";\n });\n}\n\nfunction formatModelName(policy: OrgModelPolicy): string {\n return `${policy.modelLabel} ${chalk.dim(`(${policy.model})`)}`;\n}\n\nfunction printSwitchableModels(policies: readonly OrgModelPolicy[]): void {\n const switchable = switchablePolicies(policies);\n if (switchable.length === 0) {\n console.log(chalk.dim(\"No switchable models are available for this user\"));\n return;\n }\n\n for (const policy of switchable) {\n const defaultMarker = policy.isDefault ? chalk.dim(\" (default)\") : \"\";\n console.log(` - ${formatModelName(policy)}${defaultMarker}`);\n console.log(` provider: ${formatModelProviderRoute(policy)}`);\n }\n}\n\nfunction formatThreadModel(\n thread: ChatThreadMetadata,\n policies: OrgModelPoliciesResponse,\n): string {\n const model = thread.selectedModel ?? policies.workspaceDefaultModel;\n if (!model) {\n return \"(default)\";\n }\n const policy = policies.policies.find((candidate) => {\n return candidate.model === model;\n });\n return `${policy?.modelLabel ?? getModelDisplayName(model)} (${model})`;\n}\n\nfunction printCurrentModel(\n thread: ChatThreadMetadata,\n policies: OrgModelPoliciesResponse,\n): void {\n console.log(chalk.green(\"✓ Chat thread loaded\"));\n console.log(chalk.dim(` Thread: ${thread.id}`));\n console.log(chalk.dim(` Title: ${thread.title ?? \"(untitled)\"}`));\n console.log(chalk.dim(` Model: ${formatThreadModel(thread, policies)}`));\n}\n\nasync function printModelHelp(command: Command): Promise<void> {\n const result = await listZeroModelPolicies();\n console.log(command.helpInformation().trimEnd());\n console.log();\n console.log(chalk.bold(\"Switchable models:\"));\n printSwitchableModels(result.policies);\n console.log();\n console.log(\"Use the model id in parentheses:\");\n console.log(chalk.cyan(\" zero chat model [--thread <thread-id>] <model>\"));\n}\n\nasync function printCurrentModelAndChoices(threadId: string): Promise<void> {\n const [thread, result] = await Promise.all([\n getZeroChatThread({ threadId }),\n listZeroModelPolicies(),\n ]);\n\n printCurrentModel(thread, result);\n console.log();\n console.log(chalk.bold(\"Switchable models:\"));\n printSwitchableModels(result.policies);\n console.log();\n console.log(\"Switch models:\");\n console.log(chalk.cyan(` zero chat model --thread ${threadId} <model>`));\n}\n\nasync function switchModel(threadId: string, model: string): Promise<void> {\n const result = await listZeroModelPolicies();\n const policy = result.policies.find((candidate) => {\n return candidate.model === model;\n });\n\n if (!policy) {\n printUsageError(`Unknown model: ${model}`, \"Run: zero chat model --help\");\n }\n\n if (policy.routeStatus !== \"valid\") {\n const reason = policy.routeStatusReason\n ? ` (${policy.routeStatusReason})`\n : \"\";\n printUsageError(\n `Model is not switchable: ${model}${reason}`,\n \"Run: zero chat model --help\",\n );\n }\n\n const updated = await updateZeroChatThreadModelSelection({\n threadId,\n model,\n });\n\n console.log(chalk.green(\"✓ Chat model updated\"));\n console.log(chalk.dim(` Thread: ${updated.threadId}`));\n console.log(chalk.dim(` Model: ${policy.modelLabel} (${model})`));\n}\n\nexport const modelCommand = new Command()\n .name(\"model\")\n .description(\"Show or switch the current web chat thread model\")\n .argument(\"[model]\", \"Model id to use for this chat thread\")\n .helpOption(false)\n .option(\"--thread <id>\", \"Chat thread ID (defaults to ZERO_CHAT_THREAD_ID)\")\n .option(\"-h, --help\", \"Show help with switchable models\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Show this chat model: zero chat model\n Show another chat model: zero chat model --thread <thread-id>\n Switch this model: zero chat model claude-sonnet-5\n Switch another model: zero chat model --thread <thread-id> claude-sonnet-5\n\nNotes:\n - Defaults --thread to ZERO_CHAT_THREAD_ID\n - Authenticates via ZERO_TOKEN (requires chat-thread:write capability to switch)`,\n )\n .action(\n withErrorHandler(\n async (model: string | undefined, options: ModelOptions) => {\n if (options.help) {\n await printModelHelp(modelCommand);\n return;\n }\n\n const threadId = options.thread?.trim() || getCurrentChatThreadId();\n if (!threadId) {\n printUsageError(\n \"ZERO_CHAT_THREAD_ID is not set\",\n \"Pass --thread <thread-id> or run inside a Zero web chat thread.\",\n );\n }\n if (!isUuid(threadId)) {\n printUsageError(\n `Invalid thread ID \"${threadId}\" — expected a UUID`,\n \"Pass a valid UUID with --thread <thread-id>.\",\n );\n }\n\n if (!model) {\n await printCurrentModelAndChoices(threadId);\n return;\n }\n\n await switchModel(threadId, model);\n },\n ),\n );\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { foldPendingChatQueueEvents } from \"@vm0/api-contracts/contracts/chat-events\";\nimport type { ChatEvent } from \"@vm0/api-contracts/contracts/chat-threads\";\n\nimport { listZeroChatEvents } from \"../../../lib/api/domains/zero-chat\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\nimport { formatIsoTimestamp } from \"../../../lib/utils/time-format\";\nimport { resolveChatThreadId } from \"./shared\";\n\nconst PAGE_LIMIT = 50;\n\n/** Per-thread chat event sequences start at 1, so this marks the oldest event. */\nconst FIRST_CHAT_EVENT_SEQ_ID = 1;\n\ninterface QueuedOptions {\n readonly json?: boolean;\n readonly threadId?: string;\n}\n\ninterface QueuedEventSummary {\n readonly eventId: string;\n readonly eventType: \"input.prompt\" | \"input.automation\";\n readonly createdAt: string;\n readonly text: string;\n}\n\nasync function loadAllChatEvents(threadId: string): Promise<ChatEvent[]> {\n let beforeSeqId: number | undefined;\n const newestFirstPages: ChatEvent[][] = [];\n\n for (;;) {\n const events = await listZeroChatEvents({\n threadId,\n beforeSeqId,\n limit: PAGE_LIMIT,\n });\n newestFirstPages.push([...events]);\n\n // A thread's first event always carries seqId 1, so reaching it is the only\n // stop condition. The cursor strictly decreases, so the walk terminates.\n const oldestInPage = events[0];\n if (\n oldestInPage === undefined ||\n oldestInPage.seqId <= FIRST_CHAT_EVENT_SEQ_ID\n ) {\n return newestFirstPages.reverse().flat();\n }\n beforeSeqId = oldestInPage.seqId;\n }\n}\n\nfunction compactText(value: string | null | undefined): string {\n return (value ?? \"\").replace(/\\s+/g, \" \").trim();\n}\n\nfunction summarizeQueuedEvent(event: ChatEvent): QueuedEventSummary | null {\n if (event.eventType === \"input.prompt\") {\n return {\n eventId: event.id,\n eventType: event.eventType,\n createdAt: event.createdAt,\n text: compactText(event.content),\n };\n }\n if (event.eventType === \"input.automation\") {\n const automationPart = event.userMessage?.parts.find((part) => {\n return part.type === \"automation\";\n });\n return {\n eventId: event.id,\n eventType: event.eventType,\n createdAt: event.createdAt,\n text: compactText(\n automationPart?.type === \"automation\"\n ? (automationPart.automationBrief ?? automationPart.workflowName)\n : undefined,\n ),\n };\n }\n return null;\n}\n\nexport const queuedCommand = new Command()\n .name(\"queued\")\n .description(\"List events waiting in a web chat thread queue\")\n .option(\n \"--thread-id <id>\",\n \"Chat thread ID (defaults to ZERO_CHAT_THREAD_ID)\",\n )\n .option(\"--json\", \"Print machine-readable JSON\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Show this queue: zero chat queued\n Show another queue: zero chat queued --thread-id <thread-id>\n Print JSON: zero chat queued --thread-id <thread-id> --json\n\nNotes:\n - Lists the same unassociated user and automation events shown as queued by Platform\n - Event IDs can be passed to zero chat cancel --event-id\n - Authenticates via ZERO_TOKEN (requires chat-event:read capability)`,\n )\n .action(\n withErrorHandler(async (options: QueuedOptions) => {\n const threadId = resolveChatThreadId(options.threadId);\n const allEvents = await loadAllChatEvents(threadId);\n const queued = foldPendingChatQueueEvents(allEvents).flatMap((event) => {\n const summary = summarizeQueuedEvent(event);\n return summary ? [summary] : [];\n });\n\n if (options.json) {\n console.log(JSON.stringify({ threadId, total: queued.length, queued }));\n return;\n }\n\n if (queued.length === 0) {\n console.log(chalk.dim(\"No queued chat events\"));\n return;\n }\n\n console.log(\n chalk.dim(\n [\n \"EVENT ID\".padEnd(38),\n \"TYPE\".padEnd(18),\n \"QUEUED\".padEnd(20),\n \"MESSAGE\",\n ].join(\" \"),\n ),\n );\n for (const event of queued) {\n console.log(\n [\n event.eventId.padEnd(38),\n event.eventType.padEnd(18),\n formatIsoTimestamp(event.createdAt).padEnd(20),\n event.text || \"(no message text)\",\n ].join(\" \"),\n );\n }\n }),\n );\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\n\nimport { renameZeroChatThread } from \"../../../lib/api/domains/zero-chat\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\nimport { isUuid } from \"../../../lib/utils/uuid\";\n\ninterface RenameOptions {\n readonly json?: boolean;\n readonly thread?: string;\n}\n\nfunction getCurrentChatThreadId(): string | undefined {\n return process.env.ZERO_CHAT_THREAD_ID?.trim() || undefined;\n}\n\nfunction printUsageError(message: string, hint: string): never {\n console.error(chalk.red(`✗ ${message}`));\n console.error(chalk.dim(` ${hint}`));\n process.exit(1);\n}\n\nexport const renameCommand = new Command()\n .name(\"rename\")\n .description(\"Rename a web chat thread\")\n .argument(\"<title...>\", \"New chat title\")\n .option(\"--thread <id>\", \"Chat thread ID (defaults to ZERO_CHAT_THREAD_ID)\")\n .option(\"--json\", \"Print machine-readable JSON\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Rename this chat: zero chat rename \"Launch plan\"\n Rename another: zero chat rename --thread <thread-id> \"Launch plan\"\n\nNotes:\n - Defaults --thread to ZERO_CHAT_THREAD_ID\n - Authenticates via ZERO_TOKEN (requires chat-thread:write capability)`,\n )\n .action(\n withErrorHandler(async (titleParts: string[], options: RenameOptions) => {\n const title = titleParts.join(\" \").trim();\n if (!title) {\n printUsageError(\n \"Title is required\",\n 'Run: zero chat rename \"New title\"',\n );\n }\n\n const threadId = options.thread?.trim() || getCurrentChatThreadId();\n if (!threadId) {\n printUsageError(\n \"ZERO_CHAT_THREAD_ID is not set\",\n \"Pass --thread <thread-id> or run inside a Zero web chat thread.\",\n );\n }\n if (!isUuid(threadId)) {\n printUsageError(\n `Invalid thread ID \"${threadId}\" — expected a UUID`,\n \"Pass a valid UUID with --thread <thread-id>.\",\n );\n }\n\n const result = await renameZeroChatThread({ threadId, title });\n if (options.json) {\n console.log(JSON.stringify(result));\n return;\n }\n\n console.log(chalk.green(\"✓ Chat title updated\"));\n console.log(chalk.dim(` Thread: ${result.threadId}`));\n console.log(chalk.dim(` Title: ${result.title}`));\n }),\n );\n","import { randomUUID } from \"node:crypto\";\nimport { readFileSync } from \"node:fs\";\n\nimport chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport {\n type UserMessageDocument,\n userMessageDocumentSchema,\n} from \"@vm0/api-contracts/contracts/chat-threads\";\n\nimport {\n getZeroChatThreadAgentId,\n sendZeroChatEvent,\n} from \"../../../lib/api/domains/zero-chat\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\nimport { printChatUsageError, resolveChatThreadId } from \"./shared\";\n\n// Non-authoritative plain-text views of a document that carries no text part.\n// The API re-derives the agent prompt from the document itself; the web app\n// sends the same file placeholder for attachment-only messages.\nconst ATTACHED_FILES_PROMPT = \"(see attached files)\";\nconst MESSAGE_PARTS_PROMPT = \"(see message parts)\";\n\nconst USER_MESSAGE_JSON_HELP = `\nUser message JSON (--user-message-file), one version 1 document:\n { \"version\": 1, \"parts\": [ <part>, ... ] } at least one part\n\n text { \"type\": \"text\", \"text\": \"...\" }\n chat_thread { \"type\": \"chat_thread\", \"threadId\": \"<uuid>\",\n \"titleSnapshot\": \"...\" }\n template { \"type\": \"template\", \"titleSnapshot\": \"...\",\n \"template\": { \"type\": \"presentation\" | \"video\" |\n \"illustration\" | \"workflow\" | \"website\",\n \"selection\": { ... } } }\n file { \"type\": \"file\", \"fileId\": \"...\",\n \"filenameSnapshot\": \"...\", \"contentType\": \"...\" }\n feedback { \"type\": \"feedback\", \"quote\": \"...\",\n \"note\": [ text | chat_thread | template parts ],\n \"source\": { \"type\": \"mail\", \"id\": \"...\",\n \"status\": \"draft\" | \"sent\", \"sentId\": \"...\" } }`;\n\ninterface SendOptions {\n readonly json?: boolean;\n readonly text?: string;\n readonly threadId?: string;\n readonly userMessageFile?: string;\n}\n\ninterface ResolvedUserMessage {\n readonly userMessage: UserMessageDocument;\n readonly prompt: string;\n readonly hasTextContent: boolean;\n}\n\nfunction readMessageText(optionText: string | undefined): string {\n let text = optionText;\n if (text === undefined && !process.stdin.isTTY) {\n try {\n text = readFileSync(\"/dev/stdin\", \"utf8\");\n } catch {\n // stdin is not readable (for example in a test runner); the validation\n // below prints the same usage error as an interactive invocation.\n }\n }\n\n const trimmed = text?.trim();\n if (!trimmed) {\n printChatUsageError(\n \"Chat message text is required\",\n 'Pass --text \"message\", pipe the message on stdin, or pass --user-message-file <path>.',\n );\n }\n return trimmed;\n}\n\nfunction documentText(document: UserMessageDocument): string {\n return document.parts\n .map((part) => {\n return part.type === \"text\" ? part.text : \"\";\n })\n .join(\"\")\n .trim();\n}\n\nfunction promptForDocument(document: UserMessageDocument): string {\n const text = documentText(document);\n if (text) {\n return text;\n }\n const hasFilePart = document.parts.some((part) => {\n return part.type === \"file\";\n });\n return hasFilePart ? ATTACHED_FILES_PROMPT : MESSAGE_PARTS_PROMPT;\n}\n\nfunction readUserMessageDocument(path: string): UserMessageDocument {\n let content: string;\n try {\n content = readFileSync(path, \"utf8\");\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n printChatUsageError(\n `Failed to read user message file \"${path}\": ${message}`,\n \"Pass a readable JSON file. Run: zero chat send --help\",\n );\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(content);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n printChatUsageError(\n `User message file \"${path}\" is not valid JSON: ${message}`,\n \"Run: zero chat send --help\",\n );\n }\n\n const result = userMessageDocumentSchema.safeParse(parsed);\n if (!result.success) {\n printChatUsageError(\n `User message file \"${path}\" is not a valid UserMessageDocument`,\n result.error.issues\n .map((issue) => {\n const issuePath = issue.path.join(\".\");\n return `${issuePath === \"\" ? \"(root)\" : issuePath}: ${issue.message}`;\n })\n .join(\"\\n \"),\n );\n }\n return result.data;\n}\n\nfunction resolveUserMessage(options: SendOptions): ResolvedUserMessage {\n if (options.userMessageFile === undefined) {\n const text = readMessageText(options.text);\n return {\n userMessage: {\n version: 1,\n parts: [{ type: \"text\", text }],\n },\n prompt: text,\n hasTextContent: true,\n };\n }\n\n if (options.text !== undefined) {\n printChatUsageError(\n \"Pass either --text or --user-message-file, not both\",\n \"Use --text for a plain message and --user-message-file for a full document.\",\n );\n }\n\n const userMessage = readUserMessageDocument(options.userMessageFile);\n return {\n userMessage,\n prompt: promptForDocument(userMessage),\n hasTextContent: documentText(userMessage).length > 0,\n };\n}\n\nexport const sendCommand = new Command()\n .name(\"send\")\n .description(\"Send a message to a web chat thread\")\n .option(\n \"--thread-id <id>\",\n \"Chat thread ID (defaults to ZERO_CHAT_THREAD_ID)\",\n )\n .option(\"-t, --text <message>\", \"Message text (or read it from stdin)\")\n .option(\n \"--user-message-file <path>\",\n \"JSON file holding one full UserMessageDocument (excludes --text)\",\n )\n .option(\"--json\", \"Print machine-readable JSON\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Send to this chat: zero chat send --text \"Continue the analysis\"\n Send to a thread: zero chat send --thread-id <thread-id> --text \"Continue\"\n Pipe a message: printf \"Continue\" | zero chat send --thread-id <thread-id>\n Send a document: zero chat send --user-message-file ./message.json\n Print JSON: zero chat send --text \"Continue\" --json\n${USER_MESSAGE_JSON_HELP}\n\nNotes:\n - --text wraps the message in a version 1 UserMessageDocument with one text part\n - --user-message-file sends the document as written, validated before the request\n - file parts reference an uploaded web file id (zero web upload-file)\n - The API derives the agent prompt and title state from the document itself\n - Every normal message enters the thread queue first; an idle queue may dispatch it immediately\n - Authenticates via ZERO_TOKEN (requires chat-thread:read and chat-event:write capabilities)`,\n )\n .action(\n withErrorHandler(async (options: SendOptions) => {\n const threadId = resolveChatThreadId(options.threadId);\n const message = resolveUserMessage(options);\n const agentId = await getZeroChatThreadAgentId({ threadId });\n const eventId = randomUUID();\n\n const result = await sendZeroChatEvent({\n agentId,\n threadId,\n prompt: message.prompt,\n hasTextContent: message.hasTextContent,\n clientEventId: eventId,\n chatThreadSortEventId: randomUUID(),\n userMessage: message.userMessage,\n });\n const queued = result.runId === null;\n\n if (options.json) {\n console.log(\n JSON.stringify({\n threadId: result.threadId,\n eventId,\n runId: result.runId,\n status: result.status ?? null,\n createdAt: result.createdAt ?? null,\n messageQueued: queued,\n }),\n );\n return;\n }\n\n console.log(\n chalk.green(\n queued ? \"✓ Chat message queued\" : \"✓ Chat message dispatched\",\n ),\n );\n console.log(chalk.dim(` Thread: ${result.threadId}`));\n console.log(chalk.dim(` Event: ${eventId}`));\n if (result.runId) {\n console.log(chalk.dim(` Run: ${result.runId}`));\n }\n if (result.status) {\n console.log(chalk.dim(` Status: ${result.status}`));\n }\n }),\n );\n"],"mappings":"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","names":["randomUUID","randomUUID","printUsageError","resolveAgentId","getCurrentChatThreadId","printUsageError","getCurrentChatThreadId","printUsageError","randomUUID","randomUUID"]}
|