@vm0/cli 9.268.0 → 9.269.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-4QRFYL6Q.js → agent-YGPUCBVJ.js} +12 -12
- package/agent-YGPUCBVJ.js.map +1 -0
- package/{banking-VKKVWIYX.js → banking-JSGFRQ4L.js} +5 -5
- package/{browser-VFBMLIUS.js → browser-SNX5PNHT.js} +5 -5
- package/{chat-KQRKGQKS.js → chat-HIVVSEA5.js} +209 -24
- package/chat-HIVVSEA5.js.map +1 -0
- package/{chunk-TNDBFUFP.js → chunk-2EF4BXLJ.js} +2 -13
- package/chunk-2EF4BXLJ.js.map +1 -0
- package/chunk-2SSDVICG.js +22 -0
- package/chunk-2SSDVICG.js.map +1 -0
- package/{chunk-CZA5MW3N.js → chunk-46IAE7OE.js} +15 -17
- package/chunk-46IAE7OE.js.map +1 -0
- package/{chunk-DTZW7RES.js → chunk-AHGVNDOM.js} +3 -9
- package/{chunk-DTZW7RES.js.map → chunk-AHGVNDOM.js.map} +1 -1
- package/{chunk-VGPSGL5S.js → chunk-H6AOCKEL.js} +193 -81
- package/chunk-H6AOCKEL.js.map +1 -0
- package/{chunk-NGDZ3M3I.js → chunk-IYGQB2IF.js} +2 -2
- package/{chunk-ISZ5CKJ3.js → chunk-KRUM5LAL.js} +2 -2
- package/{chunk-QSWNNYV4.js → chunk-LCUAACWT.js} +92 -6
- package/chunk-LCUAACWT.js.map +1 -0
- package/{chunk-C6KDTR5A.js → chunk-QVPNDW6V.js} +33 -31
- package/chunk-QVPNDW6V.js.map +1 -0
- package/{chunk-7I3P4REZ.js → chunk-UW4J57OZ.js} +2 -2
- package/{chunk-4JA54Z75.js → chunk-VMZYIB6X.js} +2 -2
- package/{chunk-MD3YWUKO.js → chunk-ZUHSC7WF.js} +18 -2
- package/chunk-ZUHSC7WF.js.map +1 -0
- package/{computer-use-LTZEVHCS.js → computer-use-5SW6CWAY.js} +5 -5
- package/{connector-MY7K7RJN.js → connector-6YIH3K55.js} +47 -48
- package/connector-6YIH3K55.js.map +1 -0
- package/{credit-LDEHJIJT.js → credit-RV57VXH4.js} +7 -7
- package/{developer-support-ROATSWMP.js → developer-support-D2P6GTAZ.js} +5 -5
- package/{doctor-3P6KUY4D.js → doctor-BGVYFKMZ.js} +7 -7
- package/{feishu-PHKR2Q36.js → feishu-YP3C3TPQ.js} +5 -5
- package/{finance-3LM55SWD.js → finance-3KXG6RV5.js} +5 -5
- package/{generate-23ZOL7AI.js → generate-VX35LUBP.js} +12 -12
- package/generate-VX35LUBP.js.map +1 -0
- package/{github-SC4AB2Q2.js → github-AKWQZEIY.js} +5 -5
- package/{goal-FTWV2ADK.js → goal-OQXYFW5Z.js} +5 -5
- package/{host-L4BEXBPB.js → host-B6YLXMA6.js} +5 -5
- package/{logs-TICCUASU.js → logs-NRY3DWOV.js} +7 -7
- package/{mail-ZUBVNRJW.js → mail-43EQ3IYB.js} +7 -7
- package/{maps-UAKTZSO2.js → maps-UMTF5FJV.js} +5 -5
- package/{model-3N3ZWLZM.js → model-VRHOGMWA.js} +6 -6
- package/{model-provider-RI26N5OQ.js → model-provider-L5ZLZIKJ.js} +6 -6
- package/{org-IEYB2WBO.js → org-3FNAZTHF.js} +5 -5
- package/package.json +1 -1
- package/{people-search-5S4TV7RL.js → people-search-FK6RE2NT.js} +5 -5
- package/{phone-XV2LWGQT.js → phone-3TFQSWRG.js} +5 -5
- package/{preference-6XHDDQUW.js → preference-5IXDGW5E.js} +5 -5
- package/{resource-HXS7RGBP.js → resource-NKTI5XPA.js} +5 -5
- package/{scrape-NU6T5BQE.js → scrape-LHAVB7NB.js} +5 -5
- package/{search-FDG26NWA.js → search-F6NM44DL.js} +7 -7
- package/{secret-HN3R3V32.js → secret-HND7KZHJ.js} +5 -5
- package/{slack-IWEZU6HY.js → slack-CUKFUUE3.js} +5 -5
- package/{teams-6VZAWVC6.js → teams-JS36U3HH.js} +5 -5
- package/{telegram-UTCDO5ZB.js → telegram-F5GUYX3P.js} +5 -5
- package/{upgrade-EX2F7BFJ.js → upgrade-HPMCJDVW.js} +4 -4
- package/{variable-U67PHCBZ.js → variable-3NJ4XN52.js} +5 -5
- package/{video-GTQQSN6W.js → video-HZC5EIMX.js} +4 -4
- package/{weather-NMEINAIZ.js → weather-VN2P2PL4.js} +5 -5
- package/{web-YC7E327U.js → web-CFLVFNUS.js} +5 -5
- package/{web-search-TCWP5NDJ.js → web-search-4RP7J2FN.js} +5 -5
- package/{whoami-KACAW67A.js → whoami-FDPQTI53.js} +14 -14
- package/whoami-FDPQTI53.js.map +1 -0
- package/{workflow-TKJF2YY2.js → workflow-OHZEVG7B.js} +100 -9
- package/workflow-OHZEVG7B.js.map +1 -0
- package/zero.js +47 -47
- package/zero.js.map +1 -1
- package/agent-4QRFYL6Q.js.map +0 -1
- package/chat-KQRKGQKS.js.map +0 -1
- package/chunk-C6KDTR5A.js.map +0 -1
- package/chunk-CZA5MW3N.js.map +0 -1
- package/chunk-MD3YWUKO.js.map +0 -1
- package/chunk-QSWNNYV4.js.map +0 -1
- package/chunk-TNDBFUFP.js.map +0 -1
- package/chunk-VGPSGL5S.js.map +0 -1
- package/chunk-ZL7WFWOC.js +0 -97
- package/chunk-ZL7WFWOC.js.map +0 -1
- package/connector-MY7K7RJN.js.map +0 -1
- package/generate-23ZOL7AI.js.map +0 -1
- package/whoami-KACAW67A.js.map +0 -1
- package/workflow-TKJF2YY2.js.map +0 -1
- /package/{banking-VKKVWIYX.js.map → banking-JSGFRQ4L.js.map} +0 -0
- /package/{browser-VFBMLIUS.js.map → browser-SNX5PNHT.js.map} +0 -0
- /package/{chunk-NGDZ3M3I.js.map → chunk-IYGQB2IF.js.map} +0 -0
- /package/{chunk-ISZ5CKJ3.js.map → chunk-KRUM5LAL.js.map} +0 -0
- /package/{chunk-7I3P4REZ.js.map → chunk-UW4J57OZ.js.map} +0 -0
- /package/{chunk-4JA54Z75.js.map → chunk-VMZYIB6X.js.map} +0 -0
- /package/{computer-use-LTZEVHCS.js.map → computer-use-5SW6CWAY.js.map} +0 -0
- /package/{credit-LDEHJIJT.js.map → credit-RV57VXH4.js.map} +0 -0
- /package/{developer-support-ROATSWMP.js.map → developer-support-D2P6GTAZ.js.map} +0 -0
- /package/{doctor-3P6KUY4D.js.map → doctor-BGVYFKMZ.js.map} +0 -0
- /package/{feishu-PHKR2Q36.js.map → feishu-YP3C3TPQ.js.map} +0 -0
- /package/{finance-3LM55SWD.js.map → finance-3KXG6RV5.js.map} +0 -0
- /package/{github-SC4AB2Q2.js.map → github-AKWQZEIY.js.map} +0 -0
- /package/{goal-FTWV2ADK.js.map → goal-OQXYFW5Z.js.map} +0 -0
- /package/{host-L4BEXBPB.js.map → host-B6YLXMA6.js.map} +0 -0
- /package/{logs-TICCUASU.js.map → logs-NRY3DWOV.js.map} +0 -0
- /package/{mail-ZUBVNRJW.js.map → mail-43EQ3IYB.js.map} +0 -0
- /package/{maps-UAKTZSO2.js.map → maps-UMTF5FJV.js.map} +0 -0
- /package/{model-3N3ZWLZM.js.map → model-VRHOGMWA.js.map} +0 -0
- /package/{model-provider-RI26N5OQ.js.map → model-provider-L5ZLZIKJ.js.map} +0 -0
- /package/{org-IEYB2WBO.js.map → org-3FNAZTHF.js.map} +0 -0
- /package/{people-search-5S4TV7RL.js.map → people-search-FK6RE2NT.js.map} +0 -0
- /package/{phone-XV2LWGQT.js.map → phone-3TFQSWRG.js.map} +0 -0
- /package/{preference-6XHDDQUW.js.map → preference-5IXDGW5E.js.map} +0 -0
- /package/{resource-HXS7RGBP.js.map → resource-NKTI5XPA.js.map} +0 -0
- /package/{scrape-NU6T5BQE.js.map → scrape-LHAVB7NB.js.map} +0 -0
- /package/{search-FDG26NWA.js.map → search-F6NM44DL.js.map} +0 -0
- /package/{secret-HN3R3V32.js.map → secret-HND7KZHJ.js.map} +0 -0
- /package/{slack-IWEZU6HY.js.map → slack-CUKFUUE3.js.map} +0 -0
- /package/{teams-6VZAWVC6.js.map → teams-JS36U3HH.js.map} +0 -0
- /package/{telegram-UTCDO5ZB.js.map → telegram-F5GUYX3P.js.map} +0 -0
- /package/{upgrade-EX2F7BFJ.js.map → upgrade-HPMCJDVW.js.map} +0 -0
- /package/{variable-U67PHCBZ.js.map → variable-3NJ4XN52.js.map} +0 -0
- /package/{video-GTQQSN6W.js.map → video-HZC5EIMX.js.map} +0 -0
- /package/{weather-NMEINAIZ.js.map → weather-VN2P2PL4.js.map} +0 -0
- /package/{web-YC7E327U.js.map → web-CFLVFNUS.js.map} +0 -0
- /package/{web-search-TCWP5NDJ.js.map → web-search-4RP7J2FN.js.map} +0 -0
package/agent-4QRFYL6Q.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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 { createZeroAgent, updateZeroAgentInstructions } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\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 <type> --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\";\nimport { withErrorHandler } from \"../../../lib/command\";\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 listZeroConnectors,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { permissionGrantsToFirewallPolicies } from \"@vm0/connectors/firewall-metadata/policy\";\nimport type { ConnectorResponse } from \"@vm0/api-contracts/contracts/connector-schemas\";\nimport { policyIcon } from \"../../../lib/utils/format-utils\";\nimport { formatAvatar } from \"./avatar\";\nimport {\n loadConnectorPermissionInfos,\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(\n connector: ConnectorResponse | undefined,\n): 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?: ConnectorResponse,\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(\n connector: ConnectorResponse | undefined,\n): 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 ConnectorResponse[] };\n }),\n ]);\n\n const identityMap = new Map<string, ConnectorResponse>(\n connectorIdentities.connectors.map((c) => {\n return [c.type, 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 ? permissionGrantsToFirewallPolicies(\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\";\nimport { withErrorHandler } from \"../../../lib/command\";\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 { getZeroAgent, deleteZeroAgent } from \"../../../lib/api\";\nimport { isInteractive, promptConfirm } from \"../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\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"]}
|
package/chat-KQRKGQKS.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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/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 { 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(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 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 { getZeroChatThreadAgentId, sendZeroChatEvent } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\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-message: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 { getZeroChatThread } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\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\";\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\";\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\";\n\nimport {\n getZeroChatThread,\n listZeroModelPolicies,\n updateZeroChatThreadModelSelection,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\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\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { formatIsoTimestamp } from \"../../../lib/utils/time-format\";\nimport { resolveChatThreadId } from \"./shared\";\n\nconst PAGE_LIMIT = 50;\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 const seenCursors = new Set<number>();\n\n for (;;) {\n const page = await listZeroChatEvents({\n threadId,\n beforeSeqId,\n limit: PAGE_LIMIT,\n });\n newestFirstPages.push([...page.events]);\n if (!page.hasHistoryBefore) {\n return newestFirstPages.reverse().flat();\n }\n\n const nextCursor = page.events[0]?.seqId;\n if (nextCursor === undefined || seenCursors.has(nextCursor)) {\n throw new Error(\"Chat event pagination did not return a usable cursor\");\n }\n seenCursors.add(nextCursor);\n beforeSeqId = nextCursor;\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 return {\n eventId: event.id,\n eventType: event.eventType,\n createdAt: event.createdAt,\n text: compactText(\n event.triggerBrief ??\n event.workflowSnapshot?.triggerBrief ??\n event.workflowSnapshot?.displayName ??\n event.workflowSnapshot?.name,\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-message: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\";\nimport { withErrorHandler } from \"../../../lib/command\";\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 type { UserMessageDocument } from \"@vm0/api-contracts/contracts/chat-threads\";\n\nimport { getZeroChatThreadAgentId, sendZeroChatEvent } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { printChatUsageError, resolveChatThreadId } from \"./shared\";\n\ninterface SendOptions {\n readonly json?: boolean;\n readonly text?: string;\n readonly threadId?: string;\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\" or pipe the message on stdin.',\n );\n }\n return trimmed;\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(\"--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 Print JSON: zero chat send --text \"Continue\" --json\n\nNotes:\n - Constructs a version 1 UserMessageDocument with one text part\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-message:write capabilities)`,\n )\n .action(\n withErrorHandler(async (options: SendOptions) => {\n const threadId = resolveChatThreadId(options.threadId);\n const text = readMessageText(options.text);\n const agentId = await getZeroChatThreadAgentId({ threadId });\n const eventId = randomUUID();\n const userMessage = {\n version: 1,\n parts: [{ type: \"text\", text }],\n } satisfies UserMessageDocument;\n\n const result = await sendZeroChatEvent({\n agentId,\n threadId,\n prompt: text,\n hasTextContent: true,\n clientEventId: eventId,\n chatThreadSortEventId: randomUUID(),\n 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","getCurrentChatThreadId","printUsageError","getCurrentChatThreadId","printUsageError","randomUUID","randomUUID"]}
|