@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
|
@@ -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-
|
|
6
|
+
} from "./chunk-2SSDVICG.js";
|
|
8
7
|
import {
|
|
9
8
|
isInteractive,
|
|
10
9
|
promptConfirm
|
|
11
10
|
} from "./chunk-NU6ECB2E.js";
|
|
12
11
|
import {
|
|
13
|
-
|
|
14
|
-
|
|
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-
|
|
27
|
-
import "./chunk-
|
|
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-
|
|
33
|
-
import "./chunk-
|
|
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 <
|
|
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.
|
|
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 ?
|
|
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-
|
|
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-
|
|
7
|
-
import "./chunk-
|
|
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-
|
|
13
|
-
import "./chunk-
|
|
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-
|
|
117
|
+
//# sourceMappingURL=banking-JSGFRQ4L.js.map
|
|
@@ -8,14 +8,14 @@ import {
|
|
|
8
8
|
leaseZeroBrowser,
|
|
9
9
|
useZeroBrowser,
|
|
10
10
|
zeroBrowserCreateRequestSchema
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import "./chunk-
|
|
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-
|
|
18
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
29
|
-
|
|
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-
|
|
37
|
+
} from "./chunk-AHGVNDOM.js";
|
|
36
38
|
import {
|
|
37
39
|
decodeZeroTokenPayload
|
|
38
|
-
} from "./chunk-
|
|
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-
|
|
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
|
|
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 =
|
|
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-
|
|
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"
|
|
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(
|
|
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
|
-
-
|
|
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-
|
|
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
|
|
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:
|
|
937
|
-
hasTextContent:
|
|
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-
|
|
1175
|
+
//# sourceMappingURL=chat-HIVVSEA5.js.map
|