@vm0/cli 9.238.1 → 9.238.2
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-6OA2V3OO.js → agent-232YB3UW.js} +5 -5
- package/agent-232YB3UW.js.map +1 -0
- package/{banking-WWVG2CP7.js → banking-W4YOUOGR.js} +3 -3
- package/{chat-D475VWGE.js → chat-U7IY4EFM.js} +4 -4
- package/{chunk-YCG6O3ZK.js → chunk-5BTPFZG2.js} +2 -2
- package/{chunk-SZJIY7B5.js → chunk-5IL2HDF6.js} +2 -2
- package/chunk-63SY7N6Y.js +133 -0
- package/chunk-63SY7N6Y.js.map +1 -0
- package/{chunk-FKRO4PMB.js → chunk-H3PJLBYQ.js} +7 -5
- package/chunk-H3PJLBYQ.js.map +1 -0
- package/{chunk-37U2ZGBH.js → chunk-HVKP7UPZ.js} +28 -5
- package/chunk-HVKP7UPZ.js.map +1 -0
- package/{chunk-JSHFBBDU.js → chunk-LKJRJF2G.js} +3 -3
- package/{chunk-VBI53K3Q.js → chunk-LSV2VNTU.js} +2 -2
- package/{chunk-ROLHZ5OO.js → chunk-PT3JWQPE.js} +2 -2
- package/{chunk-4ZHQYU4E.js → chunk-QRWCZFSW.js} +4 -4
- package/{chunk-L6RCBAZE.js → chunk-TDHY3N5U.js} +2 -2
- package/{chunk-I76SZJXM.js → chunk-V2OYP5BZ.js} +3 -15
- package/{chunk-I76SZJXM.js.map → chunk-V2OYP5BZ.js.map} +1 -1
- package/{computer-use-ALMIBYF4.js → computer-use-FMWOZUIP.js} +3 -3
- package/{connector-R524H5MQ.js → connector-YOH3JOKV.js} +4 -4
- package/{credit-24OGXS2M.js → credit-BSKBYVKJ.js} +4 -4
- package/{developer-support-JHHS2QGT.js → developer-support-MLHK3AS5.js} +3 -3
- package/{doctor-WZ3VB4FR.js → doctor-AXSIJ2XY.js} +1118 -11
- package/doctor-AXSIJ2XY.js.map +1 -0
- package/{generate-DYP65QJ5.js → generate-IX7Y7HZH.js} +4 -4
- package/{github-UEL4IJ3N.js → github-DLJEXA4P.js} +3 -3
- package/{goal-QAV2T6MM.js → goal-R6NDTIHJ.js} +3 -3
- package/{host-SXD5YBTX.js → host-VD5GWO4T.js} +3 -3
- package/index.js +14 -14
- package/{logs-NPH6LNKC.js → logs-NQI3ITVT.js} +7 -7
- package/{maps-S6CRPCRM.js → maps-XLAARX76.js} +3 -3
- package/{memory-N7QS7HLX.js → memory-UUNI5B2C.js} +3 -3
- package/{model-45AKVBWH.js → model-LMW4L5P6.js} +4 -4
- package/{model-provider-EQWIHKDL.js → model-provider-2FCSBI3H.js} +4 -4
- package/{org-4B4XMULZ.js → org-N6CEZGPY.js} +3 -3
- package/package.json +1 -1
- package/{phone-FT2BBNYB.js → phone-LZ5VKEA5.js} +3 -3
- package/{preference-TGWW3TGU.js → preference-F2IDGWK3.js} +3 -3
- package/{relationship-K4X2EMG6.js → relationship-7EV3WLB3.js} +3 -3
- package/{resource-Z3Y4LKFV.js → resource-MJISJ52Q.js} +3 -3
- package/{search-2WYLKHGZ.js → search-SEXZVPOC.js} +7 -7
- package/{secret-ZBRGELVV.js → secret-Z3CACK36.js} +4 -4
- package/{slack-YHQCPNIL.js → slack-QDZZZ2AV.js} +3 -3
- package/{teams-XQVJ6FCA.js → teams-LG4URJER.js} +3 -3
- package/{telegram-IBWT2FZR.js → telegram-GLGHTNGM.js} +3 -3
- package/{variable-3VLG2R3E.js → variable-TXYIWD3G.js} +3 -3
- package/{video-GXRYJ6A5.js → video-E56LX44R.js} +2 -2
- package/{web-6DYQEUTW.js → web-Q3NRMNK3.js} +3 -3
- package/{whoami-O22ANAJS.js → whoami-HRHU43T7.js} +5 -5
- package/whoami-HRHU43T7.js.map +1 -0
- package/{workflow-INK3CNLQ.js → workflow-S46MZV7Z.js} +3 -3
- package/zero.js +34 -34
- package/agent-6OA2V3OO.js.map +0 -1
- package/chunk-37U2ZGBH.js.map +0 -1
- package/chunk-FKRO4PMB.js.map +0 -1
- package/chunk-GU2OYDJY.js +0 -1258
- package/chunk-GU2OYDJY.js.map +0 -1
- package/doctor-WZ3VB4FR.js.map +0 -1
- package/whoami-O22ANAJS.js.map +0 -1
- /package/{banking-WWVG2CP7.js.map → banking-W4YOUOGR.js.map} +0 -0
- /package/{chat-D475VWGE.js.map → chat-U7IY4EFM.js.map} +0 -0
- /package/{chunk-YCG6O3ZK.js.map → chunk-5BTPFZG2.js.map} +0 -0
- /package/{chunk-SZJIY7B5.js.map → chunk-5IL2HDF6.js.map} +0 -0
- /package/{chunk-JSHFBBDU.js.map → chunk-LKJRJF2G.js.map} +0 -0
- /package/{chunk-VBI53K3Q.js.map → chunk-LSV2VNTU.js.map} +0 -0
- /package/{chunk-ROLHZ5OO.js.map → chunk-PT3JWQPE.js.map} +0 -0
- /package/{chunk-4ZHQYU4E.js.map → chunk-QRWCZFSW.js.map} +0 -0
- /package/{chunk-L6RCBAZE.js.map → chunk-TDHY3N5U.js.map} +0 -0
- /package/{computer-use-ALMIBYF4.js.map → computer-use-FMWOZUIP.js.map} +0 -0
- /package/{connector-R524H5MQ.js.map → connector-YOH3JOKV.js.map} +0 -0
- /package/{credit-24OGXS2M.js.map → credit-BSKBYVKJ.js.map} +0 -0
- /package/{developer-support-JHHS2QGT.js.map → developer-support-MLHK3AS5.js.map} +0 -0
- /package/{generate-DYP65QJ5.js.map → generate-IX7Y7HZH.js.map} +0 -0
- /package/{github-UEL4IJ3N.js.map → github-DLJEXA4P.js.map} +0 -0
- /package/{goal-QAV2T6MM.js.map → goal-R6NDTIHJ.js.map} +0 -0
- /package/{host-SXD5YBTX.js.map → host-VD5GWO4T.js.map} +0 -0
- /package/{logs-NPH6LNKC.js.map → logs-NQI3ITVT.js.map} +0 -0
- /package/{maps-S6CRPCRM.js.map → maps-XLAARX76.js.map} +0 -0
- /package/{memory-N7QS7HLX.js.map → memory-UUNI5B2C.js.map} +0 -0
- /package/{model-45AKVBWH.js.map → model-LMW4L5P6.js.map} +0 -0
- /package/{model-provider-EQWIHKDL.js.map → model-provider-2FCSBI3H.js.map} +0 -0
- /package/{org-4B4XMULZ.js.map → org-N6CEZGPY.js.map} +0 -0
- /package/{phone-FT2BBNYB.js.map → phone-LZ5VKEA5.js.map} +0 -0
- /package/{preference-TGWW3TGU.js.map → preference-F2IDGWK3.js.map} +0 -0
- /package/{relationship-K4X2EMG6.js.map → relationship-7EV3WLB3.js.map} +0 -0
- /package/{resource-Z3Y4LKFV.js.map → resource-MJISJ52Q.js.map} +0 -0
- /package/{search-2WYLKHGZ.js.map → search-SEXZVPOC.js.map} +0 -0
- /package/{secret-ZBRGELVV.js.map → secret-Z3CACK36.js.map} +0 -0
- /package/{slack-YHQCPNIL.js.map → slack-QDZZZ2AV.js.map} +0 -0
- /package/{teams-XQVJ6FCA.js.map → teams-LG4URJER.js.map} +0 -0
- /package/{telegram-IBWT2FZR.js.map → telegram-GLGHTNGM.js.map} +0 -0
- /package/{variable-3VLG2R3E.js.map → variable-TXYIWD3G.js.map} +0 -0
- /package/{video-GXRYJ6A5.js.map → video-E56LX44R.js.map} +0 -0
- /package/{web-6DYQEUTW.js.map → web-Q3NRMNK3.js.map} +0 -0
- /package/{workflow-INK3CNLQ.js.map → workflow-S46MZV7Z.js.map} +0 -0
|
@@ -4,10 +4,10 @@ const require = __createRequire(import.meta.url);
|
|
|
4
4
|
import {
|
|
5
5
|
loadConnectorPermissionInfos,
|
|
6
6
|
policyIcon
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-H3PJLBYQ.js";
|
|
8
8
|
import {
|
|
9
9
|
permissionGrantsToFirewallPolicies
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-63SY7N6Y.js";
|
|
11
11
|
import {
|
|
12
12
|
isInteractive,
|
|
13
13
|
promptConfirm
|
|
@@ -23,11 +23,11 @@ import {
|
|
|
23
23
|
listZeroUserPermissionGrants,
|
|
24
24
|
updateZeroAgent,
|
|
25
25
|
updateZeroAgentInstructions
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-HVKP7UPZ.js";
|
|
27
27
|
import "./chunk-LTDQISD7.js";
|
|
28
28
|
import {
|
|
29
29
|
withErrorHandler
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-LSV2VNTU.js";
|
|
31
31
|
import {
|
|
32
32
|
source_default
|
|
33
33
|
} from "./chunk-JUTUEPIR.js";
|
|
@@ -595,4 +595,4 @@ Notes:
|
|
|
595
595
|
export {
|
|
596
596
|
zeroAgentCommand
|
|
597
597
|
};
|
|
598
|
-
//# sourceMappingURL=agent-
|
|
598
|
+
//# sourceMappingURL=agent-232YB3UW.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 <type> --agent ${agent.agentId}`,\n );\n },\n ),\n );\n","const SKIN_MAP: Record<string, number> = {\n light: 0,\n \"light-medium\": 1,\n medium: 2,\n \"medium-dark\": 3,\n dark: 4,\n};\n\nconst HAIR_COLOR_MAP: Record<string, number> = {\n blonde: 1,\n teal: 2,\n grey: 3,\n pink: 4,\n brown: 5,\n};\n\nconst EXPRESSION_MAP: Record<string, number> = {\n calm: 1,\n content: 2,\n neutral: 3,\n pleasant: 4,\n excited: 5,\n};\n\nconst INTENSITY_MAP: Record<string, \"d\" | \"m\" | \"h\"> = {\n chill: \"d\",\n normal: \"m\",\n hyped: \"h\",\n};\n\nfunction lookupRequired<T>(\n value: string,\n map: Readonly<Record<string, T>>,\n flag: string,\n): T {\n if (!(value in map)) {\n throw new Error(\n `Invalid ${flag} \"${value}\". Must be one of: ${Object.keys(map).join(\", \")}`,\n );\n }\n return map[value]!;\n}\n\nfunction parseIntRange(\n value: string,\n flag: string,\n min: number,\n max: number,\n): number {\n const n = Number(value);\n if (!Number.isInteger(n) || n < min || n > max) {\n throw new Error(`Invalid ${flag} \"${value}\". Must be ${min}–${max}`);\n }\n return n;\n}\n\nfunction buildCustomSvgAvatar(opts: AvatarOptions): string {\n const r =\n opts.avatarRotation !== undefined\n ? parseIntRange(opts.avatarRotation, \"--avatar-rotation\", 1, 5)\n : 3;\n const h =\n opts.avatarHairStyle !== undefined\n ? parseIntRange(opts.avatarHairStyle, \"--avatar-hair-style\", 1, 5)\n : 1;\n const s =\n opts.avatarSkin !== undefined\n ? lookupRequired(opts.avatarSkin, SKIN_MAP, \"--avatar-skin\")\n : 2;\n const c =\n opts.avatarHairColor !== undefined\n ? lookupRequired(\n opts.avatarHairColor,\n HAIR_COLOR_MAP,\n \"--avatar-hair-color\",\n )\n : 5;\n const f =\n opts.avatarExpression !== undefined\n ? lookupRequired(\n opts.avatarExpression,\n EXPRESSION_MAP,\n \"--avatar-expression\",\n )\n : 1;\n const i =\n opts.avatarIntensity !== undefined\n ? lookupRequired(\n opts.avatarIntensity,\n INTENSITY_MAP,\n \"--avatar-intensity\",\n )\n : \"m\";\n return `svg:r${r}s${s}h${h}c${c}f${f}${i}`;\n}\n\nexport interface AvatarOptions {\n avatar?: string;\n avatarRotation?: string;\n avatarSkin?: string;\n avatarHairStyle?: string;\n avatarHairColor?: string;\n avatarExpression?: string;\n avatarIntensity?: string;\n}\n\nexport function resolveAvatarUrl(opts: AvatarOptions): string | undefined {\n const hasPreset = opts.avatar !== undefined;\n const hasCustom =\n opts.avatarRotation !== undefined ||\n opts.avatarSkin !== undefined ||\n opts.avatarHairStyle !== undefined ||\n opts.avatarHairColor !== undefined ||\n opts.avatarExpression !== undefined ||\n opts.avatarIntensity !== undefined;\n\n if (!hasPreset && !hasCustom) return undefined;\n\n if (hasPreset && hasCustom) {\n throw new Error(\n \"--avatar cannot be combined with --avatar-* attribute options\",\n );\n }\n\n if (hasPreset) {\n if (!/^preset:[0-4]$/.test(opts.avatar!)) {\n throw new Error(\n `Invalid --avatar \"${opts.avatar}\". Use preset:0 through preset:4`,\n );\n }\n return opts.avatar;\n }\n\n return buildCustomSvgAvatar(opts);\n}\n\nconst REVERSE_SKIN_MAP: Record<number, string> = {\n 0: \"light\",\n 1: \"light-medium\",\n 2: \"medium\",\n 3: \"medium-dark\",\n 4: \"dark\",\n};\n\nconst REVERSE_HAIR_COLOR_MAP: Record<number, string> = {\n 1: \"blonde\",\n 2: \"teal\",\n 3: \"grey\",\n 4: \"pink\",\n 5: \"brown\",\n};\n\nconst REVERSE_EXPRESSION_MAP: Record<number, string> = {\n 1: \"calm\",\n 2: \"content\",\n 3: \"neutral\",\n 4: \"pleasant\",\n 5: \"excited\",\n};\n\nconst REVERSE_INTENSITY_MAP: Record<string, string> = {\n d: \"chill\",\n m: \"normal\",\n h: \"hyped\",\n};\n\nconst PRESET_DESCRIPTIONS: Record<string, string> = {\n \"preset:0\": \"light skin, brown hair, calm, hyped\",\n \"preset:1\": \"light-medium skin, grey hair, calm, normal\",\n \"preset:2\": \"medium skin, pink hair, neutral, chill\",\n \"preset:3\": \"medium-dark skin, blonde hair, pleasant, hyped\",\n \"preset:4\": \"dark skin, teal hair, excited, normal\",\n};\n\nfunction parseSvgAvatar(svg: string): string | undefined {\n const match = svg.match(/^svg:r(\\d)s(\\d)h(\\d)c(\\d)f(\\d)([dmh])$/);\n if (!match) return undefined;\n\n const [, r, s, h, c, f, i] = match as RegExpExecArray;\n const parts: string[] = [];\n\n const skin = REVERSE_SKIN_MAP[Number(s)];\n if (skin) parts.push(`${skin} skin`);\n\n const hairColor = REVERSE_HAIR_COLOR_MAP[Number(c)];\n if (hairColor) parts.push(`${hairColor} hair`);\n\n const expression = REVERSE_EXPRESSION_MAP[Number(f)];\n if (expression) parts.push(expression);\n\n const intensity = REVERSE_INTENSITY_MAP[i!];\n if (intensity) parts.push(intensity);\n\n if (parts.length === 0) return undefined;\n\n let desc = parts.join(\", \");\n if (r !== \"3\") {\n const rotationLabels: Record<string, string> = {\n \"1\": \"far-left\",\n \"2\": \"left\",\n \"4\": \"right\",\n \"5\": \"far-right\",\n };\n const rot = rotationLabels[r!];\n if (rot) desc += `, ${rot}`;\n }\n if (h !== \"1\") {\n desc += `, hair style ${h}`;\n }\n\n return desc;\n}\n\nexport function formatAvatar(\n avatarUrl: string | null | undefined,\n): string | undefined {\n if (!avatarUrl) return undefined;\n\n if (avatarUrl.startsWith(\"preset:\")) {\n const desc = PRESET_DESCRIPTIONS[avatarUrl];\n return desc ? `${avatarUrl} (${desc})` : avatarUrl;\n }\n\n if (avatarUrl.startsWith(\"svg:\")) {\n const desc = parseSvgAvatar(avatarUrl);\n return desc ? `custom (${desc})` : avatarUrl;\n }\n\n return avatarUrl;\n}\n","import { Command } from \"commander\";\nimport { readFileSync } from \"node:fs\";\nimport chalk from \"chalk\";\nimport {\n getZeroAgent,\n updateZeroAgent,\n updateZeroAgentInstructions,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { type AvatarOptions, resolveAvatarUrl } from \"./avatar\";\n\ninterface AgentEditOptions extends AvatarOptions {\n displayName?: string;\n description?: string;\n sound?: string;\n instructionsFile?: string;\n}\n\nfunction hasAvatarUpdate(options: AvatarOptions): boolean {\n return (\n options.avatar !== undefined ||\n options.avatarRotation !== undefined ||\n options.avatarSkin !== undefined ||\n options.avatarHairStyle !== undefined ||\n options.avatarHairColor !== undefined ||\n options.avatarExpression !== undefined ||\n options.avatarIntensity !== undefined\n );\n}\n\nfunction hasAgentFieldUpdate(options: AgentEditOptions): boolean {\n return (\n options.displayName !== undefined ||\n options.description !== undefined ||\n options.sound !== undefined ||\n hasAvatarUpdate(options)\n );\n}\n\nasync function applyAgentUpdate(\n agentId: string,\n options: AgentEditOptions,\n): Promise<void> {\n const hasAvatar = hasAvatarUpdate(options);\n const resolvedAvatarUrl = hasAvatar ? resolveAvatarUrl(options) : undefined;\n\n const current = await getZeroAgent(agentId);\n\n const avatarUrl = hasAvatar\n ? resolvedAvatarUrl\n : (current.avatarUrl ?? undefined);\n\n await updateZeroAgent(agentId, {\n displayName:\n options.displayName !== undefined\n ? options.displayName\n : (current.displayName ?? undefined),\n description:\n options.description !== undefined\n ? options.description\n : (current.description ?? undefined),\n sound:\n options.sound !== undefined\n ? options.sound\n : (current.sound ?? undefined),\n avatarUrl,\n });\n}\n\nexport const editCommand = new Command()\n .name(\"edit\")\n .description(\"Edit a zero agent\")\n .argument(\"<agent-id>\", \"Agent ID\")\n .option(\"--display-name <name>\", \"New display name\")\n .option(\"--description <text>\", \"New description\")\n .option(\n \"--sound <tone>\",\n \"New tone: professional, friendly, direct, supportive\",\n )\n .option(\"--avatar <preset>\", \"Avatar preset: preset:0 through preset:4\")\n .option(\n \"--avatar-rotation <1-5>\",\n \"Head angle: 1=far-left 3=center 5=far-right\",\n )\n .option(\n \"--avatar-skin <tone>\",\n \"Skin tone: light | light-medium | medium | medium-dark | dark\",\n )\n .option(\"--avatar-hair-style <1-5>\", \"Hair style: 1–5\")\n .option(\n \"--avatar-hair-color <color>\",\n \"Hair color: blonde | teal | grey | pink | brown\",\n )\n .option(\n \"--avatar-expression <expr>\",\n \"Expression: calm | content | neutral | pleasant | excited\",\n )\n .option(\"--avatar-intensity <level>\", \"Intensity: chill | normal | hyped\")\n .option(\"--instructions-file <path>\", \"Path to new instructions file\")\n .addHelpText(\n \"after\",\n `\nAvatar:\n Quick presets (--avatar):\n preset:0 light skin, brown hair, calm, hyped\n preset:1 light-medium skin, grey hair, calm, normal\n preset:2 medium skin, pink hair, neutral, chill\n preset:3 medium-dark skin, blonde hair, pleasant, hyped\n preset:4 dark skin, teal hair, excited, normal\n\n Custom attributes (--avatar-* flags, replace the entire avatar):\n --avatar-rotation 1=far-left 3=center(default) 5=far-right\n --avatar-skin light / light-medium / medium(default) / medium-dark / dark\n --avatar-hair-style 1–5 (default: 1)\n --avatar-hair-color blonde / teal / grey / pink / brown(default)\n --avatar-expression calm(default) / content / neutral / pleasant / excited\n --avatar-intensity chill / normal(default) / hyped\n\n Note: --avatar and --avatar-* cannot be used together.\n\nExamples:\n Update description: zero agent edit <agent-id> --description \"new role\"\n Update tone: zero agent edit <agent-id> --sound friendly\n Quick preset avatar: zero agent edit <agent-id> --avatar preset:2\n Custom avatar: zero agent edit <agent-id> --avatar-skin dark --avatar-hair-color teal --avatar-intensity hyped\n Update instructions: zero agent edit <agent-id> --instructions-file ./instructions.md\n Update yourself: zero agent edit $ZERO_AGENT_ID --description \"new role\"\n\nNotes:\n - At least one option is required\n - Unspecified fields are preserved (not cleared)\n - To attach workflows to agents, use: zero workflow attach --help`,\n )\n .action(\n withErrorHandler(async (agentId: string, options: AgentEditOptions) => {\n const hasAgentUpdate = hasAgentFieldUpdate(options);\n\n if (!hasAgentUpdate && !options.instructionsFile) {\n throw new Error(\n \"At least one option is required (--display-name, --description, --sound, --avatar, --avatar-*, --instructions-file)\",\n );\n }\n\n if (hasAgentUpdate) {\n await applyAgentUpdate(agentId, options);\n }\n\n if (options.instructionsFile) {\n const content = readFileSync(options.instructionsFile, \"utf-8\");\n await updateZeroAgentInstructions(agentId, content);\n }\n\n console.log(chalk.green(`✓ Agent \"${agentId}\" updated`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n getZeroAgent,\n getZeroAgentInstructions,\n getZeroAgentUserConnectors,\n listZeroUserPermissionGrants,\n listZeroConnectors,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { permissionGrantsToFirewallPolicies } from \"@vm0/connectors/firewall-metadata/policy\";\nimport type { ConnectorResponse } from \"@vm0/api-contracts/contracts/connector-schemas\";\nimport { policyIcon } from \"../../../lib/utils/format-utils\";\nimport { formatAvatar } from \"./avatar\";\nimport {\n loadConnectorPermissionInfos,\n type ConnectorPermissionInfo,\n} from \"../shared/firewall-permissions\";\n\nfunction printDetailedPermissions(info: ConnectorPermissionInfo): void {\n if (!info.policies) {\n const icon = policyIcon(info.unknownPolicy);\n console.log(` ${icon} unknown endpoints`);\n return;\n }\n\n const nameWidth = Math.max(\n \"unknown endpoints\".length,\n ...info.permissions.map((p) => {\n return p.name.length;\n }),\n );\n\n for (const perm of info.permissions) {\n const policy = info.policies[perm.name] ?? \"deny\";\n const desc = perm.description ?? \"\";\n console.log(\n ` ${policyIcon(policy)} ${perm.name.padEnd(nameWidth)} ${desc}`,\n );\n }\n\n const unknownIcon = policyIcon(info.unknownPolicy);\n console.log(\n ` ${unknownIcon} ${\"unknown endpoints\".padEnd(nameWidth)} Endpoints not matching any rule`,\n );\n}\n\nfunction formatConnectorIdentity(\n connector: ConnectorResponse | undefined,\n): string {\n if (!connector) return \"\";\n if (connector.externalUsername) return `@${connector.externalUsername}`;\n if (connector.externalEmail) return connector.externalEmail;\n return \"\";\n}\n\nfunction formatConnectorSummary(\n info: ConnectorPermissionInfo,\n identity?: ConnectorResponse,\n): string {\n const id = formatConnectorIdentity(identity);\n const idStr = id ? ` ${id}` : \"\";\n if (!info.hasPermissions) return `${info.type}${idStr}`;\n if (!info.policies) return `${info.type}${idStr} (full access)`;\n return `${info.type}${idStr} (${info.allowed}/${info.total} allowed)`;\n}\n\nfunction formatDetailIdentity(\n connector: ConnectorResponse | undefined,\n): string {\n if (!connector) return \"\";\n let identity = \"\";\n if (connector.externalUsername && connector.externalEmail) {\n identity = `@${connector.externalUsername} (${connector.externalEmail})`;\n } else if (connector.externalUsername) {\n identity = `@${connector.externalUsername}`;\n } else if (connector.externalEmail) {\n identity = connector.externalEmail;\n }\n if (!identity) return \"\";\n if (connector.connectionStatus === \"reconnect-required\") {\n identity += ` ${chalk.yellow(\"(needs reconnect)\")}`;\n }\n return identity;\n}\n\nexport const viewCommand = new Command()\n .name(\"view\")\n .description(\"View a zero agent\")\n .argument(\"<agent-id>\", \"Agent ID\")\n .option(\"--instructions\", \"Also show instructions content\")\n .option(\"--permissions\", \"Show full permission details for each connector\")\n .addHelpText(\n \"after\",\n `\nExamples:\n View basic info: zero agent view <agent-id>\n Include instructions: zero agent view <agent-id> --instructions\n Show permissions: zero agent view <agent-id> --permissions\n View yourself: zero agent view $ZERO_AGENT_ID --instructions`,\n )\n .action(\n withErrorHandler(\n async (\n agentId: string,\n options: { instructions?: boolean; permissions?: boolean },\n ) => {\n const [agent, connectorTypes, connectorIdentities] = await Promise.all([\n getZeroAgent(agentId),\n getZeroAgentUserConnectors(agentId),\n listZeroConnectors().catch(() => {\n return { connectors: [] as ConnectorResponse[] };\n }),\n ]);\n\n const identityMap = new Map<string, ConnectorResponse>(\n connectorIdentities.connectors.map((c) => {\n return [c.type, c];\n }),\n );\n\n console.log(chalk.bold(agent.agentId));\n if (agent.displayName) console.log(chalk.dim(agent.displayName));\n console.log();\n console.log(`Agent ID: ${agent.agentId}`);\n\n const storedPolicies = options.permissions\n ? permissionGrantsToFirewallPolicies(\n await listZeroUserPermissionGrants(agent.agentId),\n )\n : null;\n const connectorInfos = await loadConnectorPermissionInfos({\n displayTypes: connectorTypes,\n defaultPolicyTypes: connectorTypes,\n storedPolicies,\n });\n\n if (connectorInfos.length > 0) {\n const summaries = connectorInfos.map((info) => {\n return formatConnectorSummary(info, identityMap.get(info.type));\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(identityMap.get(info.type));\n console.log(` ${info.type.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,11 +3,11 @@ import { createRequire as __createRequire } from "node:module";
|
|
|
3
3
|
const require = __createRequire(import.meta.url);
|
|
4
4
|
import {
|
|
5
5
|
callZeroBanking
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-HVKP7UPZ.js";
|
|
7
7
|
import "./chunk-LTDQISD7.js";
|
|
8
8
|
import {
|
|
9
9
|
withErrorHandler
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-LSV2VNTU.js";
|
|
11
11
|
import {
|
|
12
12
|
source_default
|
|
13
13
|
} from "./chunk-JUTUEPIR.js";
|
|
@@ -115,4 +115,4 @@ Notes:
|
|
|
115
115
|
export {
|
|
116
116
|
zeroBankingCommand
|
|
117
117
|
};
|
|
118
|
-
//# sourceMappingURL=banking-
|
|
118
|
+
//# sourceMappingURL=banking-W4YOUOGR.js.map
|
|
@@ -3,17 +3,17 @@ import { createRequire as __createRequire } from "node:module";
|
|
|
3
3
|
const require = __createRequire(import.meta.url);
|
|
4
4
|
import {
|
|
5
5
|
formatModelProviderRoute
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-TDHY3N5U.js";
|
|
7
7
|
import {
|
|
8
8
|
getZeroChatThread,
|
|
9
9
|
listZeroModelPolicies,
|
|
10
10
|
renameZeroChatThread,
|
|
11
11
|
updateZeroChatThreadModelSelection
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-HVKP7UPZ.js";
|
|
13
13
|
import "./chunk-LTDQISD7.js";
|
|
14
14
|
import {
|
|
15
15
|
withErrorHandler
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-LSV2VNTU.js";
|
|
17
17
|
import {
|
|
18
18
|
source_default
|
|
19
19
|
} from "./chunk-JUTUEPIR.js";
|
|
@@ -244,4 +244,4 @@ Examples:
|
|
|
244
244
|
export {
|
|
245
245
|
zeroChatCommand
|
|
246
246
|
};
|
|
247
|
-
//# sourceMappingURL=chat-
|
|
247
|
+
//# sourceMappingURL=chat-U7IY4EFM.js.map
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
splitPathSegments,
|
|
11
11
|
validateAuthBaseUrl,
|
|
12
12
|
validateBaseUrl
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-HVKP7UPZ.js";
|
|
14
14
|
import {
|
|
15
15
|
init_esm_shims
|
|
16
16
|
} from "./chunk-DIRAZ3YX.js";
|
|
@@ -1298,4 +1298,4 @@ export {
|
|
|
1298
1298
|
matchFirewallBaseUrl,
|
|
1299
1299
|
matchFirewallRequestDecision
|
|
1300
1300
|
};
|
|
1301
|
-
//# sourceMappingURL=chunk-
|
|
1301
|
+
//# sourceMappingURL=chunk-5BTPFZG2.js.map
|
|
@@ -3,7 +3,7 @@ import { createRequire as __createRequire } from "node:module";
|
|
|
3
3
|
const require = __createRequire(import.meta.url);
|
|
4
4
|
import {
|
|
5
5
|
external_exports
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-LSV2VNTU.js";
|
|
7
7
|
import {
|
|
8
8
|
init_esm_shims
|
|
9
9
|
} from "./chunk-DIRAZ3YX.js";
|
|
@@ -14555,4 +14555,4 @@ export {
|
|
|
14555
14555
|
getConnectorStoredSecretDisplayInfo,
|
|
14556
14556
|
getDiagnosticConnectorTypeForRuntimeEnvName
|
|
14557
14557
|
};
|
|
14558
|
-
//# sourceMappingURL=chunk-
|
|
14558
|
+
//# sourceMappingURL=chunk-5IL2HDF6.js.map
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createRequire as __createRequire } from "node:module";
|
|
3
|
+
const require = __createRequire(import.meta.url);
|
|
4
|
+
import {
|
|
5
|
+
UNKNOWN_PERMISSION_GRANT
|
|
6
|
+
} from "./chunk-HVKP7UPZ.js";
|
|
7
|
+
import {
|
|
8
|
+
init_esm_shims
|
|
9
|
+
} from "./chunk-DIRAZ3YX.js";
|
|
10
|
+
|
|
11
|
+
// ../../packages/connectors/src/firewall-metadata/policy.ts
|
|
12
|
+
init_esm_shims();
|
|
13
|
+
|
|
14
|
+
// ../../packages/connectors/src/firewall-metadata/policy-resolver.ts
|
|
15
|
+
init_esm_shims();
|
|
16
|
+
function buildMetadataOverrideLookup(metadata) {
|
|
17
|
+
const overrides = metadata.defaultPolicy.permissionOverrides;
|
|
18
|
+
const lookup = /* @__PURE__ */ new Map();
|
|
19
|
+
if (!overrides) {
|
|
20
|
+
return lookup;
|
|
21
|
+
}
|
|
22
|
+
for (const permission of overrides.allow ?? []) {
|
|
23
|
+
lookup.set(permission, "allow");
|
|
24
|
+
}
|
|
25
|
+
for (const permission of overrides.deny ?? []) {
|
|
26
|
+
lookup.set(permission, "deny");
|
|
27
|
+
}
|
|
28
|
+
for (const permission of overrides.ask ?? []) {
|
|
29
|
+
lookup.set(permission, "ask");
|
|
30
|
+
}
|
|
31
|
+
return lookup;
|
|
32
|
+
}
|
|
33
|
+
function getOwnPermissionOverride(overrides, name) {
|
|
34
|
+
if (!overrides || !Object.prototype.hasOwnProperty.call(overrides, name)) {
|
|
35
|
+
return void 0;
|
|
36
|
+
}
|
|
37
|
+
return overrides[name];
|
|
38
|
+
}
|
|
39
|
+
function createFirewallMetadataPolicyResolver(metadata, overlay) {
|
|
40
|
+
const metadataOverrides = buildMetadataOverrideLookup(metadata);
|
|
41
|
+
function metadataPermission(name) {
|
|
42
|
+
return metadataOverrides.get(name) ?? metadata.defaultPolicy.permissionDefault;
|
|
43
|
+
}
|
|
44
|
+
function permission(name) {
|
|
45
|
+
return getOwnPermissionOverride(overlay?.permissionOverrides, name) ?? overlay?.permissionDefault ?? metadataPermission(name);
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
permission,
|
|
49
|
+
unknown: () => {
|
|
50
|
+
return overlay?.unknownPolicy ?? metadata.defaultPolicy.unknownPolicy;
|
|
51
|
+
},
|
|
52
|
+
list: (permissionNames) => {
|
|
53
|
+
let first = null;
|
|
54
|
+
for (const name of permissionNames) {
|
|
55
|
+
const current = permission(name);
|
|
56
|
+
if (first === null) {
|
|
57
|
+
first = current;
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
if (first !== current) {
|
|
61
|
+
return "mixed";
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return first ?? "mixed";
|
|
65
|
+
},
|
|
66
|
+
isPermissionOverridden: (name) => {
|
|
67
|
+
return permission(name) !== metadataPermission(name);
|
|
68
|
+
},
|
|
69
|
+
isUnknownOverridden: () => {
|
|
70
|
+
return (overlay?.unknownPolicy ?? metadata.defaultPolicy.unknownPolicy) !== metadata.defaultPolicy.unknownPolicy;
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// ../../packages/connectors/src/firewall-metadata/policy.ts
|
|
76
|
+
function metadataConnectorRef(metadata) {
|
|
77
|
+
return metadata.connectorRef ?? metadata.type;
|
|
78
|
+
}
|
|
79
|
+
function expandFirewallMetadataDefaultPolicy(metadata) {
|
|
80
|
+
const resolver = createFirewallMetadataPolicyResolver(metadata);
|
|
81
|
+
const policies = {};
|
|
82
|
+
for (const permission of metadata.permissions) {
|
|
83
|
+
policies[permission.name] = resolver.permission(permission.name);
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
policies,
|
|
87
|
+
unknownPolicy: resolver.unknown()
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function findFirewallMetadataPermission(metadata, name) {
|
|
91
|
+
return metadata.permissions.find((permission) => {
|
|
92
|
+
return permission.name === name;
|
|
93
|
+
}) ?? null;
|
|
94
|
+
}
|
|
95
|
+
function resolveFirewallMetadataPolicies(stored, metadata) {
|
|
96
|
+
let resolved = stored;
|
|
97
|
+
for (const detail of metadata) {
|
|
98
|
+
const connectorRef = metadataConnectorRef(detail);
|
|
99
|
+
const defaults = expandFirewallMetadataDefaultPolicy(detail);
|
|
100
|
+
const existing = resolved?.[connectorRef];
|
|
101
|
+
resolved = {
|
|
102
|
+
...resolved,
|
|
103
|
+
[connectorRef]: {
|
|
104
|
+
policies: { ...defaults.policies, ...existing?.policies },
|
|
105
|
+
...existing?.unknownPolicy !== void 0 ? { unknownPolicy: existing.unknownPolicy } : { unknownPolicy: defaults.unknownPolicy }
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
return resolved;
|
|
110
|
+
}
|
|
111
|
+
function permissionGrantsToFirewallPolicies(grants) {
|
|
112
|
+
const policies = {};
|
|
113
|
+
for (const grant of grants) {
|
|
114
|
+
const current = policies[grant.connectorRef] ?? { policies: {} };
|
|
115
|
+
if (grant.permission === UNKNOWN_PERMISSION_GRANT) {
|
|
116
|
+
policies[grant.connectorRef] = {
|
|
117
|
+
...current,
|
|
118
|
+
unknownPolicy: grant.action
|
|
119
|
+
};
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
current.policies[grant.permission] = grant.action;
|
|
123
|
+
policies[grant.connectorRef] = current;
|
|
124
|
+
}
|
|
125
|
+
return Object.keys(policies).length > 0 ? policies : null;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export {
|
|
129
|
+
findFirewallMetadataPermission,
|
|
130
|
+
resolveFirewallMetadataPolicies,
|
|
131
|
+
permissionGrantsToFirewallPolicies
|
|
132
|
+
};
|
|
133
|
+
//# sourceMappingURL=chunk-63SY7N6Y.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../packages/connectors/src/firewall-metadata/policy.ts","../../../packages/connectors/src/firewall-metadata/policy-resolver.ts"],"sourcesContent":["import {\n UNKNOWN_PERMISSION_GRANT,\n type FirewallPolicies,\n type FirewallPolicy,\n type FirewallPolicyValue,\n} from \"../firewall-types\";\nimport { createFirewallMetadataPolicyResolver } from \"./policy-resolver\";\n\nexport type {\n FirewallMetadataPolicyListState,\n FirewallMetadataPolicyOverlay,\n FirewallMetadataPolicyResolver,\n} from \"./policy-resolver\";\n\nexport interface FirewallPermissionPolicyMetadataPermission {\n readonly name: string;\n readonly description?: string;\n}\n\nexport interface FirewallPermissionPolicyCategoryMetadata {\n readonly categories: Readonly<Record<string, string>>;\n readonly displayOrder: readonly string[];\n}\n\nexport type FirewallPermissionPolicyDefaultOverrides = Readonly<\n Partial<Record<FirewallPolicyValue, readonly string[]>>\n>;\n\nexport interface FirewallPermissionPolicyDefaultMetadata {\n readonly permissionDefault: FirewallPolicyValue;\n readonly permissionOverrides?: FirewallPermissionPolicyDefaultOverrides;\n readonly unknownPolicy: FirewallPolicyValue;\n}\n\ninterface FirewallPermissionPolicyMetadataBase {\n readonly label: string;\n readonly permissionCount: number;\n readonly permissions: readonly FirewallPermissionPolicyMetadataPermission[];\n readonly categories?: FirewallPermissionPolicyCategoryMetadata | null;\n readonly defaultPolicy: FirewallPermissionPolicyDefaultMetadata;\n}\n\nexport type FirewallPermissionPolicyMetadata =\n FirewallPermissionPolicyMetadataBase &\n (\n | { readonly connectorRef: string; readonly type?: string }\n | { readonly connectorRef?: undefined; readonly type: string }\n );\n\nexport interface FirewallMetadataPermissionGroup<T extends { name: string }> {\n readonly category: string;\n readonly permissions: T[];\n}\n\nexport type FirewallPermissionGrantAction = Extract<\n FirewallPolicyValue,\n \"allow\" | \"deny\"\n>;\n\nexport interface FirewallPermissionGrant {\n readonly connectorRef: string;\n readonly permission: string;\n readonly action: FirewallPermissionGrantAction;\n}\n\nfunction metadataConnectorRef(\n metadata: FirewallPermissionPolicyMetadata,\n): string {\n return metadata.connectorRef ?? metadata.type;\n}\n\nexport { createFirewallMetadataPolicyResolver };\n\nexport function expandFirewallMetadataDefaultPolicy(\n metadata: FirewallPermissionPolicyMetadata,\n): FirewallPolicy {\n const resolver = createFirewallMetadataPolicyResolver(metadata);\n const policies: Record<string, FirewallPolicyValue> = {};\n\n for (const permission of metadata.permissions) {\n policies[permission.name] = resolver.permission(permission.name);\n }\n\n return {\n policies,\n unknownPolicy: resolver.unknown(),\n };\n}\n\nexport function findFirewallMetadataPermission(\n metadata: FirewallPermissionPolicyMetadata,\n name: string,\n): FirewallPermissionPolicyMetadata[\"permissions\"][number] | null {\n return (\n metadata.permissions.find((permission) => {\n return permission.name === name;\n }) ?? null\n );\n}\n\nexport function groupFirewallMetadataPermissionsByCategory<\n T extends { name: string },\n>(\n permissions: readonly T[],\n metadata: FirewallPermissionPolicyMetadata,\n): FirewallMetadataPermissionGroup<T>[] | null {\n if (!metadata.categories) {\n return null;\n }\n\n const grouped = new Map<string, T[]>();\n for (const category of metadata.categories.displayOrder) {\n grouped.set(category, []);\n }\n\n for (const permission of permissions) {\n const category = metadata.categories.categories[permission.name];\n if (!category) {\n continue;\n }\n grouped.get(category)?.push(permission);\n }\n\n return [...grouped.entries()]\n .filter(([, groupPermissions]) => {\n return groupPermissions.length > 0;\n })\n .map(([category, groupPermissions]) => {\n return { category, permissions: groupPermissions };\n });\n}\n\nexport function resolveFirewallMetadataPolicies(\n stored: FirewallPolicies | null,\n metadata: readonly FirewallPermissionPolicyMetadata[],\n): FirewallPolicies | null {\n let resolved: FirewallPolicies | null = stored;\n for (const detail of metadata) {\n const connectorRef = metadataConnectorRef(detail);\n const defaults = expandFirewallMetadataDefaultPolicy(detail);\n const existing = resolved?.[connectorRef];\n resolved = {\n ...resolved,\n [connectorRef]: {\n policies: { ...defaults.policies, ...existing?.policies },\n ...(existing?.unknownPolicy !== undefined\n ? { unknownPolicy: existing.unknownPolicy }\n : { unknownPolicy: defaults.unknownPolicy }),\n },\n };\n }\n return resolved;\n}\n\nexport function permissionGrantsToFirewallPolicies(\n grants: readonly FirewallPermissionGrant[],\n): FirewallPolicies | null {\n const policies: FirewallPolicies = {};\n for (const grant of grants) {\n const current = policies[grant.connectorRef] ?? { policies: {} };\n if (grant.permission === UNKNOWN_PERMISSION_GRANT) {\n policies[grant.connectorRef] = {\n ...current,\n unknownPolicy: grant.action,\n };\n continue;\n }\n current.policies[grant.permission] = grant.action;\n policies[grant.connectorRef] = current;\n }\n return Object.keys(policies).length > 0 ? policies : null;\n}\n","import type { FirewallPolicyValue } from \"../firewall-types\";\n\ninterface FirewallMetadataPolicyResolverMetadata {\n readonly defaultPolicy: {\n readonly permissionDefault: FirewallPolicyValue;\n readonly permissionOverrides?: Readonly<\n Partial<Record<FirewallPolicyValue, readonly string[]>>\n >;\n readonly unknownPolicy: FirewallPolicyValue;\n };\n}\n\nexport interface FirewallMetadataPolicyOverlay {\n readonly permissionDefault?: FirewallPolicyValue;\n readonly permissionOverrides?: Readonly<Record<string, FirewallPolicyValue>>;\n readonly unknownPolicy?: FirewallPolicyValue;\n}\n\nexport type FirewallMetadataPolicyListState = FirewallPolicyValue | \"mixed\";\n\n/**\n * Resolves generated metadata defaults with an optional sparse policy overlay.\n * Permission name validation belongs to callers; unknown endpoints use unknown().\n */\nexport interface FirewallMetadataPolicyResolver {\n permission(name: string): FirewallPolicyValue;\n unknown(): FirewallPolicyValue;\n list(permissionNames: readonly string[]): FirewallMetadataPolicyListState;\n isPermissionOverridden(name: string): boolean;\n isUnknownOverridden(): boolean;\n}\n\nfunction buildMetadataOverrideLookup(\n metadata: FirewallMetadataPolicyResolverMetadata,\n): ReadonlyMap<string, FirewallPolicyValue> {\n const overrides = metadata.defaultPolicy.permissionOverrides;\n const lookup = new Map<string, FirewallPolicyValue>();\n if (!overrides) {\n return lookup;\n }\n\n for (const permission of overrides.allow ?? []) {\n lookup.set(permission, \"allow\");\n }\n for (const permission of overrides.deny ?? []) {\n lookup.set(permission, \"deny\");\n }\n for (const permission of overrides.ask ?? []) {\n lookup.set(permission, \"ask\");\n }\n\n return lookup;\n}\n\nfunction getOwnPermissionOverride(\n overrides: Readonly<Record<string, FirewallPolicyValue>> | undefined,\n name: string,\n): FirewallPolicyValue | undefined {\n if (!overrides || !Object.prototype.hasOwnProperty.call(overrides, name)) {\n return undefined;\n }\n return overrides[name];\n}\n\nexport function createFirewallMetadataPolicyResolver(\n metadata: FirewallMetadataPolicyResolverMetadata,\n overlay?: FirewallMetadataPolicyOverlay,\n): FirewallMetadataPolicyResolver {\n const metadataOverrides = buildMetadataOverrideLookup(metadata);\n\n function metadataPermission(name: string): FirewallPolicyValue {\n return (\n metadataOverrides.get(name) ?? metadata.defaultPolicy.permissionDefault\n );\n }\n\n function permission(name: string): FirewallPolicyValue {\n return (\n getOwnPermissionOverride(overlay?.permissionOverrides, name) ??\n overlay?.permissionDefault ??\n metadataPermission(name)\n );\n }\n\n return {\n permission,\n unknown: () => {\n return overlay?.unknownPolicy ?? metadata.defaultPolicy.unknownPolicy;\n },\n list: (permissionNames) => {\n let first: FirewallPolicyValue | null = null;\n for (const name of permissionNames) {\n const current = permission(name);\n if (first === null) {\n first = current;\n continue;\n }\n if (first !== current) {\n return \"mixed\";\n }\n }\n return first ?? \"mixed\";\n },\n isPermissionOverridden: (name) => {\n return permission(name) !== metadataPermission(name);\n },\n isUnknownOverridden: () => {\n return (\n (overlay?.unknownPolicy ?? metadata.defaultPolicy.unknownPolicy) !==\n metadata.defaultPolicy.unknownPolicy\n );\n },\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
import { createRequire as __createRequire } from "node:module";
|
|
3
3
|
const require = __createRequire(import.meta.url);
|
|
4
4
|
import {
|
|
5
|
-
loadFirewallPermissionMetadata,
|
|
6
5
|
resolveFirewallMetadataPolicies
|
|
7
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-63SY7N6Y.js";
|
|
7
|
+
import {
|
|
8
|
+
getZeroConnectorCatalogPermissions
|
|
9
|
+
} from "./chunk-HVKP7UPZ.js";
|
|
8
10
|
import {
|
|
9
11
|
source_default
|
|
10
12
|
} from "./chunk-JUTUEPIR.js";
|
|
@@ -26,7 +28,7 @@ async function loadPermissionMetadataByType(types) {
|
|
|
26
28
|
const uniqueTypes = [...new Set(types)];
|
|
27
29
|
const entries = await Promise.all(
|
|
28
30
|
uniqueTypes.map(async (type) => {
|
|
29
|
-
return [type, await
|
|
31
|
+
return [type, await getZeroConnectorCatalogPermissions(type)];
|
|
30
32
|
})
|
|
31
33
|
);
|
|
32
34
|
return new Map(entries);
|
|
@@ -44,7 +46,7 @@ function connectorPermissionInfo(args) {
|
|
|
44
46
|
total: 0
|
|
45
47
|
};
|
|
46
48
|
}
|
|
47
|
-
const refPolicy = args.resolvedPolicies?.[args.metadata.
|
|
49
|
+
const refPolicy = args.resolvedPolicies?.[args.metadata.connectorRef];
|
|
48
50
|
const policies = refPolicy && Object.keys(refPolicy.policies).length > 0 ? refPolicy.policies : null;
|
|
49
51
|
const total = args.metadata.permissions.length;
|
|
50
52
|
const allowed = policies ? args.metadata.permissions.filter((permission) => {
|
|
@@ -87,4 +89,4 @@ export {
|
|
|
87
89
|
policyIcon,
|
|
88
90
|
loadConnectorPermissionInfos
|
|
89
91
|
};
|
|
90
|
-
//# sourceMappingURL=chunk-
|
|
92
|
+
//# sourceMappingURL=chunk-H3PJLBYQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/utils/format-utils.ts","../src/commands/zero/shared/firewall-permissions.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport type { FirewallPolicyValue } from \"@vm0/connectors/firewall-types\";\n\nexport function policyIcon(policy: FirewallPolicyValue): string {\n if (policy === \"allow\") return chalk.green(\"✓\");\n if (policy === \"ask\") return chalk.yellow(\"?\");\n return chalk.dim(\"✗\");\n}\n","import type { PublicConnectorCatalogPermissionDetail } from \"@vm0/api-contracts/contracts/zero-connector-catalog\";\nimport { resolveFirewallMetadataPolicies } from \"@vm0/connectors/firewall-metadata/policy\";\nimport type {\n FirewallPolicies,\n FirewallPolicyValue,\n} from \"@vm0/connectors/firewall-types\";\nimport { getZeroConnectorCatalogPermissions } from \"../../../lib/api\";\n\nexport interface ConnectorPermissionInfo {\n readonly type: string;\n readonly hasPermissions: boolean;\n readonly hasPolicyEntry: boolean;\n readonly permissions: readonly PublicConnectorCatalogPermissionDetail[\"permissions\"][number][];\n readonly policies: Readonly<Record<string, FirewallPolicyValue>> | null;\n readonly unknownPolicy: FirewallPolicyValue;\n readonly allowed: number;\n readonly total: number;\n}\n\ntype PermissionMetadataByType = Map<\n string,\n PublicConnectorCatalogPermissionDetail | null\n>;\n\nasync function loadPermissionMetadataByType(\n types: readonly string[],\n): Promise<PermissionMetadataByType> {\n const uniqueTypes = [...new Set(types)];\n const entries = await Promise.all(\n uniqueTypes.map(async (type) => {\n return [type, await getZeroConnectorCatalogPermissions(type)] as const;\n }),\n );\n return new Map(entries);\n}\n\nfunction connectorPermissionInfo(args: {\n readonly type: string;\n readonly metadata: PublicConnectorCatalogPermissionDetail | null;\n readonly resolvedPolicies: FirewallPolicies | null;\n}): ConnectorPermissionInfo {\n if (!args.metadata) {\n return {\n type: args.type,\n hasPermissions: false,\n hasPolicyEntry: false,\n permissions: [],\n policies: null,\n unknownPolicy: \"allow\",\n allowed: 0,\n total: 0,\n };\n }\n\n const refPolicy = args.resolvedPolicies?.[args.metadata.connectorRef];\n const policies =\n refPolicy && Object.keys(refPolicy.policies).length > 0\n ? refPolicy.policies\n : null;\n const total = args.metadata.permissions.length;\n const allowed = policies\n ? args.metadata.permissions.filter((permission) => {\n return policies[permission.name] === \"allow\";\n }).length\n : 0;\n\n return {\n type: args.type,\n hasPermissions: true,\n hasPolicyEntry: refPolicy !== undefined,\n permissions: args.metadata.permissions,\n policies,\n unknownPolicy: refPolicy?.unknownPolicy ?? \"allow\",\n allowed,\n total,\n };\n}\n\nexport async function loadConnectorPermissionInfos(args: {\n readonly displayTypes: readonly string[];\n readonly defaultPolicyTypes: readonly string[];\n readonly storedPolicies: FirewallPolicies | null;\n}): Promise<ConnectorPermissionInfo[]> {\n const metadataByType = await loadPermissionMetadataByType([\n ...args.displayTypes,\n ...args.defaultPolicyTypes,\n ]);\n const defaultPolicyMetadata = args.defaultPolicyTypes.flatMap((type) => {\n const metadata = metadataByType.get(type);\n return metadata ? [metadata] : [];\n });\n const resolvedPolicies = resolveFirewallMetadataPolicies(\n args.storedPolicies,\n defaultPolicyMetadata,\n );\n\n return args.displayTypes.map((type) => {\n return connectorPermissionInfo({\n type,\n metadata: metadataByType.get(type) ?? null,\n resolvedPolicies,\n });\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAGO,SAAS,WAAW,QAAqC;AAC9D,MAAI,WAAW,QAAS,QAAO,eAAM,MAAM,QAAG;AAC9C,MAAI,WAAW,MAAO,QAAO,eAAM,OAAO,GAAG;AAC7C,SAAO,eAAM,IAAI,QAAG;AACtB;;;ACPA;AAwBA,eAAe,6BACb,OACmC;AACnC,QAAM,cAAc,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC;AACtC,QAAM,UAAU,MAAM,QAAQ;AAAA,IAC5B,YAAY,IAAI,OAAO,SAAS;AAC9B,aAAO,CAAC,MAAM,MAAM,mCAAmC,IAAI,CAAC;AAAA,IAC9D,CAAC;AAAA,EACH;AACA,SAAO,IAAI,IAAI,OAAO;AACxB;AAEA,SAAS,wBAAwB,MAIL;AAC1B,MAAI,CAAC,KAAK,UAAU;AAClB,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,aAAa,CAAC;AAAA,MACd,UAAU;AAAA,MACV,eAAe;AAAA,MACf,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,YAAY,KAAK,mBAAmB,KAAK,SAAS,YAAY;AACpE,QAAM,WACJ,aAAa,OAAO,KAAK,UAAU,QAAQ,EAAE,SAAS,IAClD,UAAU,WACV;AACN,QAAM,QAAQ,KAAK,SAAS,YAAY;AACxC,QAAM,UAAU,WACZ,KAAK,SAAS,YAAY,OAAO,CAAC,eAAe;AAC/C,WAAO,SAAS,WAAW,IAAI,MAAM;AAAA,EACvC,CAAC,EAAE,SACH;AAEJ,SAAO;AAAA,IACL,MAAM,KAAK;AAAA,IACX,gBAAgB;AAAA,IAChB,gBAAgB,cAAc;AAAA,IAC9B,aAAa,KAAK,SAAS;AAAA,IAC3B;AAAA,IACA,eAAe,WAAW,iBAAiB;AAAA,IAC3C;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,6BAA6B,MAIZ;AACrC,QAAM,iBAAiB,MAAM,6BAA6B;AAAA,IACxD,GAAG,KAAK;AAAA,IACR,GAAG,KAAK;AAAA,EACV,CAAC;AACD,QAAM,wBAAwB,KAAK,mBAAmB,QAAQ,CAAC,SAAS;AACtE,UAAM,WAAW,eAAe,IAAI,IAAI;AACxC,WAAO,WAAW,CAAC,QAAQ,IAAI,CAAC;AAAA,EAClC,CAAC;AACD,QAAM,mBAAmB;AAAA,IACvB,KAAK;AAAA,IACL;AAAA,EACF;AAEA,SAAO,KAAK,aAAa,IAAI,CAAC,SAAS;AACrC,WAAO,wBAAwB;AAAA,MAC7B;AAAA,MACA,UAAU,eAAe,IAAI,IAAI,KAAK;AAAA,MACtC;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;","names":[]}
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
headersWithCliClientHeaders,
|
|
15
15
|
initClient,
|
|
16
16
|
initContract
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-LSV2VNTU.js";
|
|
18
18
|
import {
|
|
19
19
|
init_esm_shims
|
|
20
20
|
} from "./chunk-DIRAZ3YX.js";
|
|
@@ -6437,7 +6437,7 @@ var artifactsContract = c15.router({
|
|
|
6437
6437
|
401: apiErrorSchema,
|
|
6438
6438
|
403: apiErrorSchema
|
|
6439
6439
|
},
|
|
6440
|
-
summary: "List
|
|
6440
|
+
summary: "List artifacts for the caller's current organization (keyset-paginated)"
|
|
6441
6441
|
},
|
|
6442
6442
|
favorite: {
|
|
6443
6443
|
method: "POST",
|
|
@@ -6451,7 +6451,7 @@ var artifactsContract = c15.router({
|
|
|
6451
6451
|
403: apiErrorSchema,
|
|
6452
6452
|
404: apiErrorSchema
|
|
6453
6453
|
},
|
|
6454
|
-
summary: "Favorite
|
|
6454
|
+
summary: "Favorite an artifact for the caller"
|
|
6455
6455
|
},
|
|
6456
6456
|
unfavorite: {
|
|
6457
6457
|
method: "POST",
|
|
@@ -6465,7 +6465,7 @@ var artifactsContract = c15.router({
|
|
|
6465
6465
|
403: apiErrorSchema,
|
|
6466
6466
|
404: apiErrorSchema
|
|
6467
6467
|
},
|
|
6468
|
-
summary: "Remove
|
|
6468
|
+
summary: "Remove an artifact favorite for the caller"
|
|
6469
6469
|
}
|
|
6470
6470
|
});
|
|
6471
6471
|
|
|
@@ -7817,6 +7817,28 @@ async function listZeroConnectorCatalogStatus() {
|
|
|
7817
7817
|
}
|
|
7818
7818
|
handleError(result, "Failed to list connector catalog status");
|
|
7819
7819
|
}
|
|
7820
|
+
async function getZeroConnectorCatalogPermissions(connectorRef) {
|
|
7821
|
+
const config = await getClientConfig();
|
|
7822
|
+
const client = initClient(zeroConnectorCatalogContract, config);
|
|
7823
|
+
const result = await client.permissions({
|
|
7824
|
+
params: { connectorRef }
|
|
7825
|
+
});
|
|
7826
|
+
if (result.status === 200) {
|
|
7827
|
+
if (result.body.permissions.connectorRef !== connectorRef) {
|
|
7828
|
+
throw new Error(
|
|
7829
|
+
`Permission metadata connectorRef mismatch: expected ${connectorRef}, got ${result.body.permissions.connectorRef}`
|
|
7830
|
+
);
|
|
7831
|
+
}
|
|
7832
|
+
return result.body.permissions;
|
|
7833
|
+
}
|
|
7834
|
+
if (result.status === 404) {
|
|
7835
|
+
return null;
|
|
7836
|
+
}
|
|
7837
|
+
handleError(
|
|
7838
|
+
result,
|
|
7839
|
+
`Failed to get connector permission metadata for "${connectorRef}"`
|
|
7840
|
+
);
|
|
7841
|
+
}
|
|
7820
7842
|
async function getZeroConnector(type) {
|
|
7821
7843
|
const config = await getClientConfig();
|
|
7822
7844
|
const client = initClient(zeroConnectorsByTypeContract, config);
|
|
@@ -15292,6 +15314,7 @@ export {
|
|
|
15292
15314
|
searchZeroConnectors,
|
|
15293
15315
|
listZeroConnectorCatalog,
|
|
15294
15316
|
listZeroConnectorCatalogStatus,
|
|
15317
|
+
getZeroConnectorCatalogPermissions,
|
|
15295
15318
|
getZeroConnector,
|
|
15296
15319
|
connectZeroConnectorManualGrant,
|
|
15297
15320
|
listZeroCustomConnectors,
|
|
@@ -15361,4 +15384,4 @@ export {
|
|
|
15361
15384
|
completeHostedSite,
|
|
15362
15385
|
getHostedSiteFiles
|
|
15363
15386
|
};
|
|
15364
|
-
//# sourceMappingURL=chunk-
|
|
15387
|
+
//# sourceMappingURL=chunk-HVKP7UPZ.js.map
|