@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.
Files changed (119) hide show
  1. package/{agent-4QRFYL6Q.js → agent-YGPUCBVJ.js} +12 -12
  2. package/agent-YGPUCBVJ.js.map +1 -0
  3. package/{banking-VKKVWIYX.js → banking-JSGFRQ4L.js} +5 -5
  4. package/{browser-VFBMLIUS.js → browser-SNX5PNHT.js} +5 -5
  5. package/{chat-KQRKGQKS.js → chat-HIVVSEA5.js} +209 -24
  6. package/chat-HIVVSEA5.js.map +1 -0
  7. package/{chunk-TNDBFUFP.js → chunk-2EF4BXLJ.js} +2 -13
  8. package/chunk-2EF4BXLJ.js.map +1 -0
  9. package/chunk-2SSDVICG.js +22 -0
  10. package/chunk-2SSDVICG.js.map +1 -0
  11. package/{chunk-CZA5MW3N.js → chunk-46IAE7OE.js} +15 -17
  12. package/chunk-46IAE7OE.js.map +1 -0
  13. package/{chunk-DTZW7RES.js → chunk-AHGVNDOM.js} +3 -9
  14. package/{chunk-DTZW7RES.js.map → chunk-AHGVNDOM.js.map} +1 -1
  15. package/{chunk-VGPSGL5S.js → chunk-H6AOCKEL.js} +193 -81
  16. package/chunk-H6AOCKEL.js.map +1 -0
  17. package/{chunk-NGDZ3M3I.js → chunk-IYGQB2IF.js} +2 -2
  18. package/{chunk-ISZ5CKJ3.js → chunk-KRUM5LAL.js} +2 -2
  19. package/{chunk-QSWNNYV4.js → chunk-LCUAACWT.js} +92 -6
  20. package/chunk-LCUAACWT.js.map +1 -0
  21. package/{chunk-C6KDTR5A.js → chunk-QVPNDW6V.js} +33 -31
  22. package/chunk-QVPNDW6V.js.map +1 -0
  23. package/{chunk-7I3P4REZ.js → chunk-UW4J57OZ.js} +2 -2
  24. package/{chunk-4JA54Z75.js → chunk-VMZYIB6X.js} +2 -2
  25. package/{chunk-MD3YWUKO.js → chunk-ZUHSC7WF.js} +18 -2
  26. package/chunk-ZUHSC7WF.js.map +1 -0
  27. package/{computer-use-LTZEVHCS.js → computer-use-5SW6CWAY.js} +5 -5
  28. package/{connector-MY7K7RJN.js → connector-6YIH3K55.js} +47 -48
  29. package/connector-6YIH3K55.js.map +1 -0
  30. package/{credit-LDEHJIJT.js → credit-RV57VXH4.js} +7 -7
  31. package/{developer-support-ROATSWMP.js → developer-support-D2P6GTAZ.js} +5 -5
  32. package/{doctor-3P6KUY4D.js → doctor-BGVYFKMZ.js} +7 -7
  33. package/{feishu-PHKR2Q36.js → feishu-YP3C3TPQ.js} +5 -5
  34. package/{finance-3LM55SWD.js → finance-3KXG6RV5.js} +5 -5
  35. package/{generate-23ZOL7AI.js → generate-VX35LUBP.js} +12 -12
  36. package/generate-VX35LUBP.js.map +1 -0
  37. package/{github-SC4AB2Q2.js → github-AKWQZEIY.js} +5 -5
  38. package/{goal-FTWV2ADK.js → goal-OQXYFW5Z.js} +5 -5
  39. package/{host-L4BEXBPB.js → host-B6YLXMA6.js} +5 -5
  40. package/{logs-TICCUASU.js → logs-NRY3DWOV.js} +7 -7
  41. package/{mail-ZUBVNRJW.js → mail-43EQ3IYB.js} +7 -7
  42. package/{maps-UAKTZSO2.js → maps-UMTF5FJV.js} +5 -5
  43. package/{model-3N3ZWLZM.js → model-VRHOGMWA.js} +6 -6
  44. package/{model-provider-RI26N5OQ.js → model-provider-L5ZLZIKJ.js} +6 -6
  45. package/{org-IEYB2WBO.js → org-3FNAZTHF.js} +5 -5
  46. package/package.json +1 -1
  47. package/{people-search-5S4TV7RL.js → people-search-FK6RE2NT.js} +5 -5
  48. package/{phone-XV2LWGQT.js → phone-3TFQSWRG.js} +5 -5
  49. package/{preference-6XHDDQUW.js → preference-5IXDGW5E.js} +5 -5
  50. package/{resource-HXS7RGBP.js → resource-NKTI5XPA.js} +5 -5
  51. package/{scrape-NU6T5BQE.js → scrape-LHAVB7NB.js} +5 -5
  52. package/{search-FDG26NWA.js → search-F6NM44DL.js} +7 -7
  53. package/{secret-HN3R3V32.js → secret-HND7KZHJ.js} +5 -5
  54. package/{slack-IWEZU6HY.js → slack-CUKFUUE3.js} +5 -5
  55. package/{teams-6VZAWVC6.js → teams-JS36U3HH.js} +5 -5
  56. package/{telegram-UTCDO5ZB.js → telegram-F5GUYX3P.js} +5 -5
  57. package/{upgrade-EX2F7BFJ.js → upgrade-HPMCJDVW.js} +4 -4
  58. package/{variable-U67PHCBZ.js → variable-3NJ4XN52.js} +5 -5
  59. package/{video-GTQQSN6W.js → video-HZC5EIMX.js} +4 -4
  60. package/{weather-NMEINAIZ.js → weather-VN2P2PL4.js} +5 -5
  61. package/{web-YC7E327U.js → web-CFLVFNUS.js} +5 -5
  62. package/{web-search-TCWP5NDJ.js → web-search-4RP7J2FN.js} +5 -5
  63. package/{whoami-KACAW67A.js → whoami-FDPQTI53.js} +14 -14
  64. package/whoami-FDPQTI53.js.map +1 -0
  65. package/{workflow-TKJF2YY2.js → workflow-OHZEVG7B.js} +100 -9
  66. package/workflow-OHZEVG7B.js.map +1 -0
  67. package/zero.js +47 -47
  68. package/zero.js.map +1 -1
  69. package/agent-4QRFYL6Q.js.map +0 -1
  70. package/chat-KQRKGQKS.js.map +0 -1
  71. package/chunk-C6KDTR5A.js.map +0 -1
  72. package/chunk-CZA5MW3N.js.map +0 -1
  73. package/chunk-MD3YWUKO.js.map +0 -1
  74. package/chunk-QSWNNYV4.js.map +0 -1
  75. package/chunk-TNDBFUFP.js.map +0 -1
  76. package/chunk-VGPSGL5S.js.map +0 -1
  77. package/chunk-ZL7WFWOC.js +0 -97
  78. package/chunk-ZL7WFWOC.js.map +0 -1
  79. package/connector-MY7K7RJN.js.map +0 -1
  80. package/generate-23ZOL7AI.js.map +0 -1
  81. package/whoami-KACAW67A.js.map +0 -1
  82. package/workflow-TKJF2YY2.js.map +0 -1
  83. /package/{banking-VKKVWIYX.js.map → banking-JSGFRQ4L.js.map} +0 -0
  84. /package/{browser-VFBMLIUS.js.map → browser-SNX5PNHT.js.map} +0 -0
  85. /package/{chunk-NGDZ3M3I.js.map → chunk-IYGQB2IF.js.map} +0 -0
  86. /package/{chunk-ISZ5CKJ3.js.map → chunk-KRUM5LAL.js.map} +0 -0
  87. /package/{chunk-7I3P4REZ.js.map → chunk-UW4J57OZ.js.map} +0 -0
  88. /package/{chunk-4JA54Z75.js.map → chunk-VMZYIB6X.js.map} +0 -0
  89. /package/{computer-use-LTZEVHCS.js.map → computer-use-5SW6CWAY.js.map} +0 -0
  90. /package/{credit-LDEHJIJT.js.map → credit-RV57VXH4.js.map} +0 -0
  91. /package/{developer-support-ROATSWMP.js.map → developer-support-D2P6GTAZ.js.map} +0 -0
  92. /package/{doctor-3P6KUY4D.js.map → doctor-BGVYFKMZ.js.map} +0 -0
  93. /package/{feishu-PHKR2Q36.js.map → feishu-YP3C3TPQ.js.map} +0 -0
  94. /package/{finance-3LM55SWD.js.map → finance-3KXG6RV5.js.map} +0 -0
  95. /package/{github-SC4AB2Q2.js.map → github-AKWQZEIY.js.map} +0 -0
  96. /package/{goal-FTWV2ADK.js.map → goal-OQXYFW5Z.js.map} +0 -0
  97. /package/{host-L4BEXBPB.js.map → host-B6YLXMA6.js.map} +0 -0
  98. /package/{logs-TICCUASU.js.map → logs-NRY3DWOV.js.map} +0 -0
  99. /package/{mail-ZUBVNRJW.js.map → mail-43EQ3IYB.js.map} +0 -0
  100. /package/{maps-UAKTZSO2.js.map → maps-UMTF5FJV.js.map} +0 -0
  101. /package/{model-3N3ZWLZM.js.map → model-VRHOGMWA.js.map} +0 -0
  102. /package/{model-provider-RI26N5OQ.js.map → model-provider-L5ZLZIKJ.js.map} +0 -0
  103. /package/{org-IEYB2WBO.js.map → org-3FNAZTHF.js.map} +0 -0
  104. /package/{people-search-5S4TV7RL.js.map → people-search-FK6RE2NT.js.map} +0 -0
  105. /package/{phone-XV2LWGQT.js.map → phone-3TFQSWRG.js.map} +0 -0
  106. /package/{preference-6XHDDQUW.js.map → preference-5IXDGW5E.js.map} +0 -0
  107. /package/{resource-HXS7RGBP.js.map → resource-NKTI5XPA.js.map} +0 -0
  108. /package/{scrape-NU6T5BQE.js.map → scrape-LHAVB7NB.js.map} +0 -0
  109. /package/{search-FDG26NWA.js.map → search-F6NM44DL.js.map} +0 -0
  110. /package/{secret-HN3R3V32.js.map → secret-HND7KZHJ.js.map} +0 -0
  111. /package/{slack-IWEZU6HY.js.map → slack-CUKFUUE3.js.map} +0 -0
  112. /package/{teams-6VZAWVC6.js.map → teams-JS36U3HH.js.map} +0 -0
  113. /package/{telegram-UTCDO5ZB.js.map → telegram-F5GUYX3P.js.map} +0 -0
  114. /package/{upgrade-EX2F7BFJ.js.map → upgrade-HPMCJDVW.js.map} +0 -0
  115. /package/{variable-U67PHCBZ.js.map → variable-3NJ4XN52.js.map} +0 -0
  116. /package/{video-GTQQSN6W.js.map → video-HZC5EIMX.js.map} +0 -0
  117. /package/{weather-NMEINAIZ.js.map → weather-VN2P2PL4.js.map} +0 -0
  118. /package/{web-YC7E327U.js.map → web-CFLVFNUS.js.map} +0 -0
  119. /package/{web-search-TCWP5NDJ.js.map → web-search-4RP7J2FN.js.map} +0 -0
@@ -2,16 +2,16 @@
2
2
  import { createRequire as __createRequire } from "node:module";
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
- loadConnectorPermissionInfos,
6
5
  policyIcon
7
- } from "./chunk-ZL7WFWOC.js";
6
+ } from "./chunk-2SSDVICG.js";
8
7
  import {
9
8
  isInteractive,
10
9
  promptConfirm
11
10
  } from "./chunk-NU6ECB2E.js";
12
11
  import {
13
- permissionGrantsToFirewallPolicies
14
- } from "./chunk-QSWNNYV4.js";
12
+ connectorPermissionGrantsToFirewallPolicies,
13
+ loadConnectorPermissionInfos
14
+ } from "./chunk-LCUAACWT.js";
15
15
  import {
16
16
  createZeroAgent,
17
17
  deleteZeroAgent,
@@ -23,14 +23,14 @@ import {
23
23
  listZeroUserPermissionGrants,
24
24
  updateZeroAgent,
25
25
  updateZeroAgentInstructions
26
- } from "./chunk-VGPSGL5S.js";
27
- import "./chunk-ISZ5CKJ3.js";
26
+ } from "./chunk-H6AOCKEL.js";
27
+ import "./chunk-KRUM5LAL.js";
28
28
  import "./chunk-MA22KQYU.js";
29
29
  import {
30
30
  source_default,
31
31
  withErrorHandler
32
- } from "./chunk-DTZW7RES.js";
33
- import "./chunk-MD3YWUKO.js";
32
+ } from "./chunk-AHGVNDOM.js";
33
+ import "./chunk-ZUHSC7WF.js";
34
34
  import {
35
35
  Command
36
36
  } from "./chunk-CCWPKGTB.js";
@@ -275,7 +275,7 @@ Examples:
275
275
  " - Check authorization status (prints an authorize URL if not authorized):"
276
276
  );
277
277
  console.log(
278
- ` zero connector status <type> --agent ${agent.agentId}`
278
+ ` zero connector status <slug> --agent ${agent.agentId}`
279
279
  );
280
280
  }
281
281
  )
@@ -444,14 +444,14 @@ Examples:
444
444
  ]);
445
445
  const identityMap = new Map(
446
446
  connectorIdentities.connectors.map((c) => {
447
- return [c.type, c];
447
+ return [c.slug, c];
448
448
  })
449
449
  );
450
450
  console.log(source_default.bold(agent.agentId));
451
451
  if (agent.displayName) console.log(source_default.dim(agent.displayName));
452
452
  console.log();
453
453
  console.log(`Agent ID: ${agent.agentId}`);
454
- const storedPolicies = options.permissions ? permissionGrantsToFirewallPolicies(
454
+ const storedPolicies = options.permissions ? connectorPermissionGrantsToFirewallPolicies(
455
455
  await listZeroUserPermissionGrants(agent.agentId)
456
456
  ) : null;
457
457
  const connectorInfos = await loadConnectorPermissionInfos({
@@ -599,4 +599,4 @@ Notes:
599
599
  export {
600
600
  zeroAgentCommand
601
601
  };
602
- //# sourceMappingURL=agent-4QRFYL6Q.js.map
602
+ //# sourceMappingURL=agent-YGPUCBVJ.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 { 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 <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\";\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 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\";\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"]}
@@ -3,14 +3,14 @@ import { createRequire as __createRequire } from "node:module";
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  callZeroBanking
6
- } from "./chunk-VGPSGL5S.js";
7
- import "./chunk-ISZ5CKJ3.js";
6
+ } from "./chunk-H6AOCKEL.js";
7
+ import "./chunk-KRUM5LAL.js";
8
8
  import "./chunk-MA22KQYU.js";
9
9
  import {
10
10
  source_default,
11
11
  withErrorHandler
12
- } from "./chunk-DTZW7RES.js";
13
- import "./chunk-MD3YWUKO.js";
12
+ } from "./chunk-AHGVNDOM.js";
13
+ import "./chunk-ZUHSC7WF.js";
14
14
  import {
15
15
  Command,
16
16
  InvalidArgumentError
@@ -114,4 +114,4 @@ Notes:
114
114
  export {
115
115
  zeroBankingCommand
116
116
  };
117
- //# sourceMappingURL=banking-VKKVWIYX.js.map
117
+ //# sourceMappingURL=banking-JSGFRQ4L.js.map
@@ -8,14 +8,14 @@ import {
8
8
  leaseZeroBrowser,
9
9
  useZeroBrowser,
10
10
  zeroBrowserCreateRequestSchema
11
- } from "./chunk-VGPSGL5S.js";
12
- import "./chunk-ISZ5CKJ3.js";
11
+ } from "./chunk-H6AOCKEL.js";
12
+ import "./chunk-KRUM5LAL.js";
13
13
  import "./chunk-MA22KQYU.js";
14
14
  import {
15
15
  source_default,
16
16
  withErrorHandler
17
- } from "./chunk-DTZW7RES.js";
18
- import "./chunk-MD3YWUKO.js";
17
+ } from "./chunk-AHGVNDOM.js";
18
+ import "./chunk-ZUHSC7WF.js";
19
19
  import {
20
20
  Command,
21
21
  InvalidArgumentError,
@@ -189,4 +189,4 @@ Notes:
189
189
  export {
190
190
  zeroBrowserCommand
191
191
  };
192
- //# sourceMappingURL=browser-VFBMLIUS.js.map
192
+ //# sourceMappingURL=browser-SNX5PNHT.js.map
@@ -11,10 +11,11 @@ import {
11
11
  } from "./chunk-LN2ATWKS.js";
12
12
  import {
13
13
  formatModelProviderRoute
14
- } from "./chunk-4JA54Z75.js";
14
+ } from "./chunk-VMZYIB6X.js";
15
15
  import {
16
16
  chatThreadEventSchema,
17
17
  chatThreadSnapshotProjectionSchema,
18
+ createZeroChatThread,
18
19
  foldPendingChatQueueEvents,
19
20
  getZeroChatThread,
20
21
  getZeroChatThreadAgentId,
@@ -24,18 +25,19 @@ import {
24
25
  listZeroModelPolicies,
25
26
  renameZeroChatThread,
26
27
  sendZeroChatEvent,
27
- updateZeroChatThreadModelSelection
28
- } from "./chunk-VGPSGL5S.js";
29
- import "./chunk-ISZ5CKJ3.js";
28
+ updateZeroChatThreadModelSelection,
29
+ userMessageDocumentSchema
30
+ } from "./chunk-H6AOCKEL.js";
31
+ import "./chunk-KRUM5LAL.js";
30
32
  import "./chunk-MA22KQYU.js";
31
33
  import {
32
34
  getApiUrl,
33
35
  source_default,
34
36
  withErrorHandler
35
- } from "./chunk-DTZW7RES.js";
37
+ } from "./chunk-AHGVNDOM.js";
36
38
  import {
37
39
  decodeZeroTokenPayload
38
- } from "./chunk-MD3YWUKO.js";
40
+ } from "./chunk-ZUHSC7WF.js";
39
41
  import {
40
42
  Command
41
43
  } from "./chunk-CCWPKGTB.js";
@@ -119,7 +121,7 @@ Examples:
119
121
 
120
122
  Notes:
121
123
  - --run-id and --event-id are mutually exclusive
122
- - Authenticates via ZERO_TOKEN (requires chat-thread:read and chat-message:write capabilities)`
124
+ - Authenticates via ZERO_TOKEN (requires chat-thread:read and chat-event:write capabilities)`
123
125
  ).action(
124
126
  withErrorHandler(async (options) => {
125
127
  const threadId = resolveChatThreadId(options.threadId);
@@ -165,6 +167,92 @@ Notes:
165
167
  })
166
168
  );
167
169
 
170
+ // src/commands/zero/chat/create.ts
171
+ init_esm_shims();
172
+ async function resolveAgentId(flagAgentId) {
173
+ const agentId = flagAgentId?.trim();
174
+ if (agentId) {
175
+ return agentId;
176
+ }
177
+ const currentThreadId = process.env.ZERO_CHAT_THREAD_ID?.trim();
178
+ if (!currentThreadId) {
179
+ printChatUsageError(
180
+ "ZERO_CHAT_THREAD_ID is not set",
181
+ "Pass --agent <agent-id> or run inside a Zero web chat thread."
182
+ );
183
+ }
184
+ if (!isUuid(currentThreadId)) {
185
+ printChatUsageError(
186
+ `Invalid thread ID "${currentThreadId}" \u2014 expected a UUID`,
187
+ "Pass --agent <agent-id> to choose the agent explicitly."
188
+ );
189
+ }
190
+ return await getZeroChatThreadAgentId({ threadId: currentThreadId });
191
+ }
192
+ var createCommand = new Command().name("create").description("Create a new web chat thread").argument("<title...>", "Chat title").option(
193
+ "--agent <id>",
194
+ "Agent ID that owns the thread (defaults to this chat's agent)"
195
+ ).option(
196
+ "--model <id>",
197
+ "Model for the thread (defaults to the current run's model)"
198
+ ).option("--json", "Print machine-readable JSON").addHelpText(
199
+ "after",
200
+ `
201
+ Examples:
202
+ Create a chat: zero chat create "Launch plan"
203
+ Pick the model: zero chat create "Launch plan" --model claude-sonnet-5
204
+ Pick the agent: zero chat create "Launch plan" --agent <agent-id>
205
+ Print JSON: zero chat create "Launch plan" --json
206
+
207
+ Notes:
208
+ - Creates an empty thread; send its first message with zero chat send
209
+ - Defaults --agent to the agent of ZERO_CHAT_THREAD_ID
210
+ - Defaults --model to the model of the run that owns ZERO_TOKEN
211
+ - The new thread never inherits this chat's history, so the first message must be self-contained
212
+ - Authenticates via ZERO_TOKEN (requires chat-thread:write, and chat-thread:read to default --agent)`
213
+ ).action(
214
+ withErrorHandler(async (titleParts, options) => {
215
+ const title = titleParts.join(" ").trim();
216
+ if (!title) {
217
+ printChatUsageError(
218
+ "Chat title is required",
219
+ 'Run: zero chat create "New title"'
220
+ );
221
+ }
222
+ const agentId = await resolveAgentId(options.agent);
223
+ const thread = await createZeroChatThread({
224
+ agentId,
225
+ title,
226
+ ...options.model === void 0 ? {} : { model: options.model }
227
+ });
228
+ if (options.json) {
229
+ console.log(
230
+ JSON.stringify({
231
+ threadId: thread.threadId,
232
+ title: thread.title,
233
+ selectedModel: thread.selectedModel,
234
+ agentId
235
+ })
236
+ );
237
+ return;
238
+ }
239
+ console.log(source_default.green("\u2713 Chat thread created"));
240
+ console.log(source_default.dim(` Thread: ${thread.threadId}`));
241
+ console.log(source_default.dim(` Title: ${title}`));
242
+ console.log(
243
+ source_default.dim(` Model: ${thread.selectedModel ?? "(default)"}`)
244
+ );
245
+ console.log(source_default.dim(` Agent: ${agentId}`));
246
+ console.log();
247
+ console.log("Send the first message:");
248
+ console.log(
249
+ source_default.cyan(
250
+ ` zero chat send --thread-id ${thread.threadId} --text "<message>"`
251
+ )
252
+ );
253
+ })
254
+ );
255
+
168
256
  // src/commands/zero/chat/get.ts
169
257
  init_esm_shims();
170
258
  function getCurrentChatThreadId() {
@@ -508,7 +596,7 @@ function printUsageError2(message, hint) {
508
596
  console.error(source_default.dim(` ${hint}`));
509
597
  process.exit(1);
510
598
  }
511
- function resolveAgentId(flagAgentId) {
599
+ function resolveAgentId2(flagAgentId) {
512
600
  const agentId = flagAgentId?.trim() || process.env.ZERO_AGENT_ID?.trim();
513
601
  if (!agentId) {
514
602
  printUsageError2(
@@ -545,7 +633,7 @@ Notes:
545
633
  - Replays cached snapshot and incremental chat thread events`
546
634
  ).action(
547
635
  withErrorHandler(async (options) => {
548
- const agentId = resolveAgentId(options.agent);
636
+ const agentId = resolveAgentId2(options.agent);
549
637
  const limit = options.limit === void 0 ? DEFAULT_LIMIT : parseBoundedLogCount(options.limit, "--limit", 1, MAX_LIMIT);
550
638
  const allThreads = await syncCachedChatThreads();
551
639
  const matchingThreads = allThreads.filter((thread) => {
@@ -790,7 +878,7 @@ Examples:
790
878
  Notes:
791
879
  - Lists the same unassociated user and automation events shown as queued by Platform
792
880
  - Event IDs can be passed to zero chat cancel --event-id
793
- - Authenticates via ZERO_TOKEN (requires chat-message:read capability)`
881
+ - Authenticates via ZERO_TOKEN (requires chat-event:read capability)`
794
882
  ).action(
795
883
  withErrorHandler(async (options) => {
796
884
  const threadId = resolveChatThreadId(options.threadId);
@@ -887,6 +975,25 @@ Notes:
887
975
  init_esm_shims();
888
976
  import { randomUUID as randomUUID3 } from "crypto";
889
977
  import { readFileSync } from "fs";
978
+ var ATTACHED_FILES_PROMPT = "(see attached files)";
979
+ var MESSAGE_PARTS_PROMPT = "(see message parts)";
980
+ var USER_MESSAGE_JSON_HELP = `
981
+ User message JSON (--user-message-file), one version 1 document:
982
+ { "version": 1, "parts": [ <part>, ... ] } at least one part
983
+
984
+ text { "type": "text", "text": "..." }
985
+ chat_thread { "type": "chat_thread", "threadId": "<uuid>",
986
+ "titleSnapshot": "..." }
987
+ template { "type": "template", "titleSnapshot": "...",
988
+ "template": { "type": "presentation" | "video" |
989
+ "illustration" | "workflow" | "website",
990
+ "selection": { ... } } }
991
+ file { "type": "file", "fileId": "...",
992
+ "filenameSnapshot": "...", "contentType": "..." }
993
+ feedback { "type": "feedback", "quote": "...",
994
+ "note": [ text | chat_thread | template parts ],
995
+ "source": { "type": "mail", "id": "...",
996
+ "status": "draft" | "sent", "sentId": "..." } }`;
890
997
  function readMessageText(optionText) {
891
998
  let text = optionText;
892
999
  if (text === void 0 && !process.stdin.isTTY) {
@@ -899,45 +1006,122 @@ function readMessageText(optionText) {
899
1006
  if (!trimmed) {
900
1007
  printChatUsageError(
901
1008
  "Chat message text is required",
902
- 'Pass --text "message" or pipe the message on stdin.'
1009
+ 'Pass --text "message", pipe the message on stdin, or pass --user-message-file <path>.'
903
1010
  );
904
1011
  }
905
1012
  return trimmed;
906
1013
  }
1014
+ function documentText(document) {
1015
+ return document.parts.map((part) => {
1016
+ return part.type === "text" ? part.text : "";
1017
+ }).join("").trim();
1018
+ }
1019
+ function promptForDocument(document) {
1020
+ const text = documentText(document);
1021
+ if (text) {
1022
+ return text;
1023
+ }
1024
+ const hasFilePart = document.parts.some((part) => {
1025
+ return part.type === "file";
1026
+ });
1027
+ return hasFilePart ? ATTACHED_FILES_PROMPT : MESSAGE_PARTS_PROMPT;
1028
+ }
1029
+ function readUserMessageDocument(path) {
1030
+ let content;
1031
+ try {
1032
+ content = readFileSync(path, "utf8");
1033
+ } catch (error) {
1034
+ const message = error instanceof Error ? error.message : String(error);
1035
+ printChatUsageError(
1036
+ `Failed to read user message file "${path}": ${message}`,
1037
+ "Pass a readable JSON file. Run: zero chat send --help"
1038
+ );
1039
+ }
1040
+ let parsed;
1041
+ try {
1042
+ parsed = JSON.parse(content);
1043
+ } catch (error) {
1044
+ const message = error instanceof Error ? error.message : String(error);
1045
+ printChatUsageError(
1046
+ `User message file "${path}" is not valid JSON: ${message}`,
1047
+ "Run: zero chat send --help"
1048
+ );
1049
+ }
1050
+ const result = userMessageDocumentSchema.safeParse(parsed);
1051
+ if (!result.success) {
1052
+ printChatUsageError(
1053
+ `User message file "${path}" is not a valid UserMessageDocument`,
1054
+ result.error.issues.map((issue) => {
1055
+ const issuePath = issue.path.join(".");
1056
+ return `${issuePath === "" ? "(root)" : issuePath}: ${issue.message}`;
1057
+ }).join("\n ")
1058
+ );
1059
+ }
1060
+ return result.data;
1061
+ }
1062
+ function resolveUserMessage(options) {
1063
+ if (options.userMessageFile === void 0) {
1064
+ const text = readMessageText(options.text);
1065
+ return {
1066
+ userMessage: {
1067
+ version: 1,
1068
+ parts: [{ type: "text", text }]
1069
+ },
1070
+ prompt: text,
1071
+ hasTextContent: true
1072
+ };
1073
+ }
1074
+ if (options.text !== void 0) {
1075
+ printChatUsageError(
1076
+ "Pass either --text or --user-message-file, not both",
1077
+ "Use --text for a plain message and --user-message-file for a full document."
1078
+ );
1079
+ }
1080
+ const userMessage = readUserMessageDocument(options.userMessageFile);
1081
+ return {
1082
+ userMessage,
1083
+ prompt: promptForDocument(userMessage),
1084
+ hasTextContent: documentText(userMessage).length > 0
1085
+ };
1086
+ }
907
1087
  var sendCommand = new Command().name("send").description("Send a message to a web chat thread").option(
908
1088
  "--thread-id <id>",
909
1089
  "Chat thread ID (defaults to ZERO_CHAT_THREAD_ID)"
910
- ).option("-t, --text <message>", "Message text (or read it from stdin)").option("--json", "Print machine-readable JSON").addHelpText(
1090
+ ).option("-t, --text <message>", "Message text (or read it from stdin)").option(
1091
+ "--user-message-file <path>",
1092
+ "JSON file holding one full UserMessageDocument (excludes --text)"
1093
+ ).option("--json", "Print machine-readable JSON").addHelpText(
911
1094
  "after",
912
1095
  `
913
1096
  Examples:
914
1097
  Send to this chat: zero chat send --text "Continue the analysis"
915
1098
  Send to a thread: zero chat send --thread-id <thread-id> --text "Continue"
916
1099
  Pipe a message: printf "Continue" | zero chat send --thread-id <thread-id>
1100
+ Send a document: zero chat send --user-message-file ./message.json
917
1101
  Print JSON: zero chat send --text "Continue" --json
1102
+ ${USER_MESSAGE_JSON_HELP}
918
1103
 
919
1104
  Notes:
920
- - Constructs a version 1 UserMessageDocument with one text part
1105
+ - --text wraps the message in a version 1 UserMessageDocument with one text part
1106
+ - --user-message-file sends the document as written, validated before the request
1107
+ - file parts reference an uploaded web file id (zero web upload-file)
1108
+ - The API derives the agent prompt and title state from the document itself
921
1109
  - Every normal message enters the thread queue first; an idle queue may dispatch it immediately
922
- - Authenticates via ZERO_TOKEN (requires chat-thread:read and chat-message:write capabilities)`
1110
+ - Authenticates via ZERO_TOKEN (requires chat-thread:read and chat-event:write capabilities)`
923
1111
  ).action(
924
1112
  withErrorHandler(async (options) => {
925
1113
  const threadId = resolveChatThreadId(options.threadId);
926
- const text = readMessageText(options.text);
1114
+ const message = resolveUserMessage(options);
927
1115
  const agentId = await getZeroChatThreadAgentId({ threadId });
928
1116
  const eventId = randomUUID3();
929
- const userMessage = {
930
- version: 1,
931
- parts: [{ type: "text", text }]
932
- };
933
1117
  const result = await sendZeroChatEvent({
934
1118
  agentId,
935
1119
  threadId,
936
- prompt: text,
937
- hasTextContent: true,
1120
+ prompt: message.prompt,
1121
+ hasTextContent: message.hasTextContent,
938
1122
  clientEventId: eventId,
939
1123
  chatThreadSortEventId: randomUUID3(),
940
- userMessage
1124
+ userMessage: message.userMessage
941
1125
  });
942
1126
  const queued = result.runId === null;
943
1127
  if (options.json) {
@@ -970,10 +1154,11 @@ Notes:
970
1154
  );
971
1155
 
972
1156
  // src/commands/zero/chat/index.ts
973
- var zeroChatCommand = new Command().name("chat").description("Manage web chat threads").addCommand(sendCommand).addCommand(queuedCommand).addCommand(cancelCommand).addCommand(getCommand).addCommand(listCommand).addCommand(modelCommand).addCommand(renameCommand).addHelpText(
1157
+ var zeroChatCommand = new Command().name("chat").description("Manage web chat threads").addCommand(createCommand).addCommand(sendCommand).addCommand(queuedCommand).addCommand(cancelCommand).addCommand(getCommand).addCommand(listCommand).addCommand(modelCommand).addCommand(renameCommand).addHelpText(
974
1158
  "after",
975
1159
  `
976
1160
  Examples:
1161
+ Create a chat: zero chat create "Launch plan"
977
1162
  Send a message: zero chat send --text "Continue"
978
1163
  Show queued: zero chat queued --thread-id <thread-id>
979
1164
  Cancel a run: zero chat cancel --thread-id <thread-id> --run-id <run-id>
@@ -987,4 +1172,4 @@ Examples:
987
1172
  export {
988
1173
  zeroChatCommand
989
1174
  };
990
- //# sourceMappingURL=chat-KQRKGQKS.js.map
1175
+ //# sourceMappingURL=chat-HIVVSEA5.js.map