@vm0/cli 9.137.2 → 9.138.0
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/{chunk-FODJBXTT.js → chunk-TTVNVT6Q.js} +68130 -45922
- package/chunk-TTVNVT6Q.js.map +1 -0
- package/index.js +36 -7448
- package/index.js.map +1 -1
- package/package.json +1 -1
- package/zero.js +22 -12283
- package/zero.js.map +1 -1
- package/chunk-FODJBXTT.js.map +0 -1
package/zero.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/zero.ts","../src/commands/zero/org/index.ts","../src/commands/zero/org/status.ts","../src/commands/zero/org/set.ts","../src/commands/zero/org/list.ts","../src/commands/zero/org/use.ts","../src/commands/zero/org/members.ts","../src/commands/zero/org/invite.ts","../src/commands/zero/org/remove.ts","../src/commands/zero/org/leave.ts","../src/commands/zero/org/delete.ts","../src/commands/zero/org/secret/index.ts","../src/commands/zero/org/secret/list.ts","../src/commands/zero/org/secret/set.ts","../src/commands/zero/org/secret/remove.ts","../src/commands/zero/org/variable/index.ts","../src/commands/zero/org/variable/list.ts","../src/commands/zero/org/variable/set.ts","../src/commands/zero/org/variable/remove.ts","../src/commands/zero/org/model-provider/index.ts","../src/commands/zero/org/model-provider/list.ts","../src/commands/zero/org/model-provider/setup.ts","../src/lib/domain/model-provider/shared.ts","../src/commands/zero/org/model-provider/remove.ts","../src/commands/zero/org/model-provider/set-default.ts","../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","../../../packages/connectors/src/firewalls/index.ts","../../../packages/connectors/src/firewalls/gmail.generated.ts","../../../packages/connectors/src/firewalls/slack.generated.ts","../../../packages/connectors/src/firewalls/vercel.generated.ts","../../../packages/connectors/src/connector-utils.ts","../../../packages/connectors/src/firewalls/agentmail.generated.ts","../../../packages/connectors/src/firewalls/amplitude.generated.ts","../../../packages/connectors/src/firewalls/anthropic-managed-agents.generated.ts","../../../packages/connectors/src/firewalls/ahrefs.generated.ts","../../../packages/connectors/src/firewalls/airtable.generated.ts","../../../packages/connectors/src/firewalls/apollo.generated.ts","../../../packages/connectors/src/firewalls/apify.generated.ts","../../../packages/connectors/src/firewalls/pika.generated.ts","../../../packages/connectors/src/firewalls/doppler.generated.ts","../../../packages/connectors/src/firewalls/infisical.generated.ts","../../../packages/connectors/src/firewalls/asana.generated.ts","../../../packages/connectors/src/firewalls/attio.generated.ts","../../../packages/connectors/src/firewalls/atlassian.generated.ts","../../../packages/connectors/src/firewalls/axiom.generated.ts","../../../packages/connectors/src/firewalls/bitrix.generated.ts","../../../packages/connectors/src/firewalls/brave-search.generated.ts","../../../packages/connectors/src/firewalls/brevo.generated.ts","../../../packages/connectors/src/firewalls/bright-data.generated.ts","../../../packages/connectors/src/firewalls/browserbase.generated.ts","../../../packages/connectors/src/firewalls/browser-use.generated.ts","../../../packages/connectors/src/firewalls/browserless.generated.ts","../../../packages/connectors/src/firewalls/buffer.generated.ts","../../../packages/connectors/src/firewalls/cal-com.generated.ts","../../../packages/connectors/src/firewalls/calendly.generated.ts","../../../packages/connectors/src/firewalls/canva.generated.ts","../../../packages/connectors/src/firewalls/chatwoot.generated.ts","../../../packages/connectors/src/firewalls/clickup.generated.ts","../../../packages/connectors/src/firewalls/close.generated.ts","../../../packages/connectors/src/firewalls/cloudflare.generated.ts","../../../packages/connectors/src/firewalls/coda.generated.ts","../../../packages/connectors/src/firewalls/cronlytic.generated.ts","../../../packages/connectors/src/firewalls/customer-io.generated.ts","../../../packages/connectors/src/firewalls/deepseek.generated.ts","../../../packages/connectors/src/firewalls/deel.generated.ts","../../../packages/connectors/src/firewalls/devto.generated.ts","../../../packages/connectors/src/firewalls/dify.generated.ts","../../../packages/connectors/src/firewalls/discord.generated.ts","../../../packages/connectors/src/firewalls/discord-webhook.generated.ts","../../../packages/connectors/src/firewalls/docusign.generated.ts","../../../packages/connectors/src/firewalls/db9.generated.ts","../../../packages/connectors/src/firewalls/drive9.generated.ts","../../../packages/connectors/src/firewalls/dropbox.generated.ts","../../../packages/connectors/src/firewalls/dropbox-sign.generated.ts","../../../packages/connectors/src/firewalls/duffel.generated.ts","../../../packages/connectors/src/firewalls/e2b.generated.ts","../../../packages/connectors/src/firewalls/elevenlabs.generated.ts","../../../packages/connectors/src/firewalls/etsy.generated.ts","../../../packages/connectors/src/firewalls/exa.generated.ts","../../../packages/connectors/src/firewalls/explorium.generated.ts","../../../packages/connectors/src/firewalls/fal.generated.ts","../../../packages/connectors/src/firewalls/figma.generated.ts","../../../packages/connectors/src/firewalls/firecrawl.generated.ts","../../../packages/connectors/src/firewalls/fireflies.generated.ts","../../../packages/connectors/src/firewalls/freshdesk.generated.ts","../../../packages/connectors/src/firewalls/gamma.generated.ts","../../../packages/connectors/src/firewalls/garmin-connect.generated.ts","../../../packages/connectors/src/firewalls/github.generated.ts","../../../packages/connectors/src/firewalls/gitlab.generated.ts","../../../packages/connectors/src/firewalls/google-calendar.generated.ts","../../../packages/connectors/src/firewalls/google-docs.generated.ts","../../../packages/connectors/src/firewalls/google-drive.generated.ts","../../../packages/connectors/src/firewalls/google-meet.generated.ts","../../../packages/connectors/src/firewalls/google-sheets.generated.ts","../../../packages/connectors/src/firewalls/granola.generated.ts","../../../packages/connectors/src/firewalls/greenhouse.generated.ts","../../../packages/connectors/src/firewalls/groq.generated.ts","../../../packages/connectors/src/firewalls/heygen.generated.ts","../../../packages/connectors/src/firewalls/helicone.generated.ts","../../../packages/connectors/src/firewalls/htmlcsstoimage.generated.ts","../../../packages/connectors/src/firewalls/hubspot.generated.ts","../../../packages/connectors/src/firewalls/hugging-face.generated.ts","../../../packages/connectors/src/firewalls/hume.generated.ts","../../../packages/connectors/src/firewalls/imgur.generated.ts","../../../packages/connectors/src/firewalls/instagram.generated.ts","../../../packages/connectors/src/firewalls/instantly.generated.ts","../../../packages/connectors/src/firewalls/intercom.generated.ts","../../../packages/connectors/src/firewalls/intervals-icu.generated.ts","../../../packages/connectors/src/firewalls/jam.generated.ts","../../../packages/connectors/src/firewalls/jira.generated.ts","../../../packages/connectors/src/firewalls/jotform.generated.ts","../../../packages/connectors/src/firewalls/klaviyo.generated.ts","../../../packages/connectors/src/firewalls/kommo.generated.ts","../../../packages/connectors/src/firewalls/lark.generated.ts","../../../packages/connectors/src/firewalls/langfuse.generated.ts","../../../packages/connectors/src/firewalls/langsmith.generated.ts","../../../packages/connectors/src/firewalls/line.generated.ts","../../../packages/connectors/src/firewalls/linear.generated.ts","../../../packages/connectors/src/firewalls/loops.generated.ts","../../../packages/connectors/src/firewalls/luma.generated.ts","../../../packages/connectors/src/firewalls/mailchimp.generated.ts","../../../packages/connectors/src/firewalls/make.generated.ts","../../../packages/connectors/src/firewalls/mailsac.generated.ts","../../../packages/connectors/src/firewalls/manus.generated.ts","../../../packages/connectors/src/firewalls/mem0.generated.ts","../../../packages/connectors/src/firewalls/mercury.generated.ts","../../../packages/connectors/src/firewalls/metabase.generated.ts","../../../packages/connectors/src/firewalls/meta-ads.generated.ts","../../../packages/connectors/src/firewalls/minimax.generated.ts","../../../packages/connectors/src/firewalls/miro.generated.ts","../../../packages/connectors/src/firewalls/mixpanel.generated.ts","../../../packages/connectors/src/firewalls/monday.generated.ts","../../../packages/connectors/src/firewalls/msg9.generated.ts","../../../packages/connectors/src/firewalls/n8n.generated.ts","../../../packages/connectors/src/firewalls/neon.generated.ts","../../../packages/connectors/src/firewalls/notion.generated.ts","../../../packages/connectors/src/firewalls/onyx.generated.ts","../../../packages/connectors/src/firewalls/openai.generated.ts","../../../packages/connectors/src/firewalls/outlook-calendar.generated.ts","../../../packages/connectors/src/firewalls/outlook-mail.generated.ts","../../../packages/connectors/src/firewalls/pandadoc.generated.ts","../../../packages/connectors/src/firewalls/pdf4me.generated.ts","../../../packages/connectors/src/firewalls/pdfco.generated.ts","../../../packages/connectors/src/firewalls/pinecone.generated.ts","../../../packages/connectors/src/firewalls/pdforge.generated.ts","../../../packages/connectors/src/firewalls/perplexity.generated.ts","../../../packages/connectors/src/firewalls/pipedrive.generated.ts","../../../packages/connectors/src/firewalls/plain.generated.ts","../../../packages/connectors/src/firewalls/plausible.generated.ts","../../../packages/connectors/src/firewalls/podchaser.generated.ts","../../../packages/connectors/src/firewalls/posthog.generated.ts","../../../packages/connectors/src/firewalls/productlane.generated.ts","../../../packages/connectors/src/firewalls/prisma-postgres.generated.ts","../../../packages/connectors/src/firewalls/pushinator.generated.ts","../../../packages/connectors/src/firewalls/qdrant.generated.ts","../../../packages/connectors/src/firewalls/qiita.generated.ts","../../../packages/connectors/src/firewalls/reddit.generated.ts","../../../packages/connectors/src/firewalls/reportei.generated.ts","../../../packages/connectors/src/firewalls/replicate.generated.ts","../../../packages/connectors/src/firewalls/resend.generated.ts","../../../packages/connectors/src/firewalls/revenuecat.generated.ts","../../../packages/connectors/src/firewalls/runway.generated.ts","../../../packages/connectors/src/firewalls/salesforce.generated.ts","../../../packages/connectors/src/firewalls/scrapeninja.generated.ts","../../../packages/connectors/src/firewalls/sentry.generated.ts","../../../packages/connectors/src/firewalls/serpapi.generated.ts","../../../packages/connectors/src/firewalls/shopify.generated.ts","../../../packages/connectors/src/firewalls/shortio.generated.ts","../../../packages/connectors/src/firewalls/stability-ai.generated.ts","../../../packages/connectors/src/firewalls/similarweb.generated.ts","../../../packages/connectors/src/firewalls/slack-webhook.generated.ts","../../../packages/connectors/src/firewalls/spotify.generated.ts","../../../packages/connectors/src/firewalls/strava.generated.ts","../../../packages/connectors/src/firewalls/strapi.generated.ts","../../../packages/connectors/src/firewalls/streak.generated.ts","../../../packages/connectors/src/firewalls/stripe.generated.ts","../../../packages/connectors/src/firewalls/supabase.generated.ts","../../../packages/connectors/src/firewalls/supadata.generated.ts","../../../packages/connectors/src/firewalls/tavily.generated.ts","../../../packages/connectors/src/firewalls/test-oauth.generated.ts","../../../packages/connectors/src/firewalls/tldv.generated.ts","../../../packages/connectors/src/firewalls/todoist.generated.ts","../../../packages/connectors/src/firewalls/together.generated.ts","../../../packages/connectors/src/firewalls/twenty.generated.ts","../../../packages/connectors/src/firewalls/typeform.generated.ts","../../../packages/connectors/src/firewalls/v0.generated.ts","../../../packages/connectors/src/firewalls/wandb.generated.ts","../../../packages/connectors/src/firewalls/webflow.generated.ts","../../../packages/connectors/src/firewalls/wix.generated.ts","../../../packages/connectors/src/firewalls/workos.generated.ts","../../../packages/connectors/src/firewalls/wrike.generated.ts","../../../packages/connectors/src/firewalls/x.generated.ts","../../../packages/connectors/src/firewalls/xero.generated.ts","../../../packages/connectors/src/firewalls/youtube.generated.ts","../../../packages/connectors/src/firewalls/zapier.generated.ts","../../../packages/connectors/src/firewalls/zapsign.generated.ts","../../../packages/connectors/src/firewalls/zendesk.generated.ts","../../../packages/connectors/src/firewalls/zep.generated.ts","../../../packages/connectors/src/firewalls/zeptomail.generated.ts","../../../packages/connectors/src/firewalls/zoom.generated.ts","../src/lib/utils/format-utils.ts","../src/commands/zero/agent/list.ts","../src/commands/zero/agent/delete.ts","../src/commands/zero/connector/index.ts","../src/commands/zero/connector/list.ts","../../../packages/core/src/feature-switch.ts","../../../packages/core/src/feature-switch-key.ts","../../../packages/core/src/identity-hash.ts","../src/commands/zero/connector/agent-context.ts","../src/commands/zero/connector/connected-as.ts","../src/commands/zero/connector/search.ts","../src/commands/zero/connector/status.ts","../src/lib/domain/schedule-utils.ts","../src/commands/zero/doctor/platform-url.ts","../src/commands/zero/doctor/index.ts","../src/commands/zero/doctor/check-connector.ts","../../../packages/connectors/src/firewall-rule-matcher.ts","../src/commands/zero/doctor/permission-deny.ts","../src/commands/zero/doctor/permission-change.ts","../src/commands/zero/doctor/resolve-role.ts","../src/commands/zero/preference/index.ts","../src/commands/zero/run/index.ts","../src/commands/zero/run/run.ts","../src/commands/zero/run/shared.ts","../src/commands/zero/run/continue.ts","../src/commands/zero/schedule/index.ts","../src/commands/zero/schedule/setup.ts","../src/commands/zero/schedule/list.ts","../src/commands/zero/schedule/status.ts","../src/commands/zero/schedule/delete.ts","../src/commands/zero/schedule/enable.ts","../src/commands/zero/schedule/disable.ts","../src/commands/zero/secret/index.ts","../src/commands/zero/secret/list.ts","../src/commands/zero/secret/set.ts","../src/commands/zero/secret/delete.ts","../src/commands/zero/chat/index.ts","../src/commands/zero/chat/message/index.ts","../src/commands/zero/chat/message/send.ts","../src/commands/zero/slack/index.ts","../src/commands/zero/slack/message/index.ts","../src/commands/zero/slack/message/send.ts","../src/commands/zero/slack/upload-file.ts","../src/commands/zero/slack/download-file.ts","../src/commands/zero/telegram/index.ts","../src/commands/zero/telegram/bot/index.ts","../src/commands/zero/telegram/bot/list.ts","../src/commands/zero/telegram/download-file.ts","../src/commands/zero/telegram/message/index.ts","../src/commands/zero/telegram/message/send.ts","../src/commands/zero/telegram/upload-file.ts","../src/commands/zero/variable/index.ts","../src/commands/zero/variable/list.ts","../src/commands/zero/variable/set.ts","../src/commands/zero/variable/delete.ts","../src/commands/zero/whoami.ts","../src/commands/zero/skill/index.ts","../src/commands/zero/skill/create.ts","../src/lib/skill-directory.ts","../src/commands/zero/skill/edit.ts","../src/commands/zero/skill/view.ts","../src/commands/zero/skill/list.ts","../src/commands/zero/skill/delete.ts","../src/commands/zero/logs/index.ts","../src/commands/zero/logs/list.ts","../src/commands/zero/logs/search.ts","../src/commands/zero/search/index.ts","../src/commands/zero/developer-support.ts","../src/commands/zero/computer-use/index.ts","../src/commands/zero/computer-use/host.ts","../src/lib/computer-use/desktop-server.ts","../src/lib/computer-use/screencapture.ts","../src/lib/computer-use/cliclick.ts","../src/lib/computer-use/scroll.ts","../src/lib/computer-use/clipboard.ts","../src/lib/computer-use/application.ts","../src/lib/computer-use/ngrok.ts","../src/commands/zero/computer-use/client.ts","../src/lib/computer-use/client.ts","../src/commands/zero/web/index.ts","../src/commands/zero/web/download-file.ts","../src/commands/zero/web/upload-file.ts"],"sourcesContent":["// Zero CLI entry point - standalone binary for zero platform commands\n// Sentry must be initialized before any other imports\nimport \"./instrument.js\";\nimport { Command } from \"commander\";\nimport { configureGlobalProxyFromEnv } from \"./lib/network/proxy.js\";\nimport { zeroOrgCommand } from \"./commands/zero/org\";\nimport { zeroAgentCommand } from \"./commands/zero/agent\";\nimport { zeroConnectorCommand } from \"./commands/zero/connector\";\nimport { zeroDoctorCommand } from \"./commands/zero/doctor\";\nimport { zeroPreferenceCommand } from \"./commands/zero/preference\";\nimport { zeroRunCommand } from \"./commands/zero/run\";\nimport { zeroScheduleCommand } from \"./commands/zero/schedule\";\nimport { zeroSecretCommand } from \"./commands/zero/secret\";\nimport { zeroChatCommand } from \"./commands/zero/chat\";\nimport { zeroSlackCommand } from \"./commands/zero/slack\";\nimport { zeroTelegramCommand } from \"./commands/zero/telegram\";\nimport { zeroVariableCommand } from \"./commands/zero/variable\";\nimport { zeroWhoamiCommand } from \"./commands/zero/whoami\";\nimport { zeroSkillCommand } from \"./commands/zero/skill\";\nimport { zeroLogsCommand } from \"./commands/zero/logs\";\nimport { zeroSearchCommand } from \"./commands/zero/search\";\nimport { zeroDeveloperSupportCommand } from \"./commands/zero/developer-support\";\nimport { zeroComputerUseCommand } from \"./commands/zero/computer-use\";\nimport { zeroWebCommand } from \"./commands/zero/web\";\nimport {\n decodeZeroTokenPayload,\n type ZeroTokenPayload,\n} from \"./lib/api/zero-token.js\";\n\n/**\n * Map of command names to the capability required to see them.\n * Commands not in this map are hidden when ZERO_TOKEN is active.\n * Use an array when a top-level command has subcommands with different\n * capability gates and any one of them should make the command visible.\n * Use `null` for commands that should always be visible in sandbox.\n */\nconst COMMAND_CAPABILITY_MAP: Record<\n string,\n string | readonly string[] | null\n> = {\n agent: \"agent:read\",\n skill: \"agent:read\",\n connector: \"connector:read\",\n run: \"agent-run:write\",\n schedule: \"schedule:read\",\n doctor: null,\n logs: \"agent-run:read\",\n search: \"chat-message:read\",\n chat: \"chat-message:write\",\n slack: \"slack:write\",\n telegram: [\"telegram:read\", \"telegram:write\"],\n whoami: null,\n \"developer-support\": null,\n \"computer-use\": \"computer-use:write\",\n web: null,\n};\n\nconst DEFAULT_COMMANDS: Command[] = [\n zeroOrgCommand,\n zeroAgentCommand,\n zeroConnectorCommand,\n zeroDoctorCommand,\n zeroPreferenceCommand,\n zeroRunCommand,\n zeroScheduleCommand,\n zeroSecretCommand,\n zeroChatCommand,\n zeroSlackCommand,\n zeroTelegramCommand,\n zeroVariableCommand,\n zeroLogsCommand,\n zeroSearchCommand,\n zeroWhoamiCommand,\n zeroSkillCommand,\n zeroDeveloperSupportCommand,\n zeroComputerUseCommand,\n zeroWebCommand,\n];\n\nfunction shouldHideCommand(\n name: string,\n payload: ZeroTokenPayload | undefined,\n): boolean {\n if (!payload) return false;\n const requiredCap = COMMAND_CAPABILITY_MAP[name];\n if (requiredCap === undefined) return true;\n if (requiredCap === null) return false;\n if (typeof requiredCap !== \"string\") {\n return !requiredCap.some((capability) => {\n return payload.capabilities.includes(capability);\n });\n }\n return !payload.capabilities.includes(requiredCap);\n}\n\n/**\n * Register commands with visibility based on ZERO_TOKEN capabilities.\n * Commands not granted by the token are registered as hidden via\n * Commander's public `addCommand(cmd, { hidden: true })` API.\n * When no ZERO_TOKEN is present, all commands remain visible.\n *\n * @param commands - override default commands (used in tests)\n */\nexport function registerZeroCommands(\n prog: Command,\n commands?: Command[],\n): void {\n const token = process.env.ZERO_TOKEN;\n const payload = token ? decodeZeroTokenPayload(token) : undefined;\n\n for (const cmd of commands ?? DEFAULT_COMMANDS) {\n const hidden = shouldHideCommand(cmd.name(), payload);\n prog.addCommand(cmd, hidden ? { hidden: true } : {});\n }\n}\n\nconst program = new Command();\n\ndeclare const __CLI_VERSION__: string;\n\nprogram\n .name(\"zero\")\n .description(\n \"Zero CLI — interact with the zero platform from inside the sandbox\",\n )\n .version(__CLI_VERSION__)\n .addHelpText(\n \"after\",\n `\nExamples:\n Check a connector? zero doctor check-connector --env-name <ENV_NAME>\n Send a Slack message? zero slack message send --help\n List Telegram bots? zero telegram bot list\n Send Telegram? zero telegram message send --help\n Upload Telegram? zero telegram upload-file --help\n Download Telegram? zero telegram download-file --help\n Set up a schedule? zero schedule setup --help\n Update yourself? zero agent --help\n Manage custom skills? zero skill --help\n Check your identity? zero whoami`,\n );\n\nexport { program };\n\nif (\n process.argv[1]?.endsWith(\"zero.js\") ||\n process.argv[1]?.endsWith(\"zero.ts\") ||\n process.argv[1]?.endsWith(\"zero\")\n) {\n configureGlobalProxyFromEnv();\n registerZeroCommands(program);\n program.parse();\n}\n","import { Command } from \"commander\";\nimport { statusCommand } from \"./status\";\nimport { setCommand } from \"./set\";\nimport { listCommand } from \"./list\";\nimport { useCommand } from \"./use\";\nimport { membersCommand } from \"./members\";\nimport { inviteCommand } from \"./invite\";\nimport { removeCommand } from \"./remove\";\nimport { leaveCommand } from \"./leave\";\nimport { deleteCommand } from \"./delete\";\nimport { zeroOrgSecretCommand } from \"./secret\";\nimport { zeroOrgVariableCommand } from \"./variable\";\nimport { zeroOrgModelProviderCommand } from \"./model-provider\";\n\nexport const zeroOrgCommand = new Command()\n .name(\"org\")\n .description(\"Manage organization settings, members, and providers\")\n .addCommand(statusCommand)\n .addCommand(setCommand)\n .addCommand(listCommand)\n .addCommand(useCommand)\n .addCommand(membersCommand)\n .addCommand(inviteCommand)\n .addCommand(removeCommand)\n .addCommand(leaveCommand)\n .addCommand(deleteCommand)\n .addCommand(zeroOrgSecretCommand)\n .addCommand(zeroOrgVariableCommand)\n .addCommand(zeroOrgModelProviderCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getZeroOrg } from \"../../../lib/api\";\nimport { ApiRequestError } from \"../../../lib/api/core/client-factory\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const statusCommand = new Command()\n .name(\"status\")\n .description(\"View current organization status\")\n .action(\n withErrorHandler(async () => {\n try {\n const org = await getZeroOrg();\n\n console.log(chalk.bold(\"Organization Information:\"));\n console.log(` Slug: ${chalk.green(org.slug)}`);\n } catch (error) {\n if (error instanceof ApiRequestError && error.status === 404) {\n throw new Error(\"No organization configured\", {\n cause: new Error(\"Set your organization with: zero org set <slug>\"),\n });\n }\n throw error;\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getZeroOrg, updateZeroOrg, switchZeroOrg } from \"../../../lib/api\";\nimport { saveConfig } from \"../../../lib/api/config\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const setCommand = new Command()\n .name(\"set\")\n .description(\"Rename your organization slug\")\n .argument(\"<slug>\", \"The new organization slug\")\n .option(\n \"--force\",\n \"Force change existing organization (may break references)\",\n )\n .action(\n withErrorHandler(async (slug: string, options: { force?: boolean }) => {\n try {\n const existingOrg = await getZeroOrg();\n\n if (!options.force) {\n throw new Error(\n `You already have an organization: ${existingOrg.slug}`,\n {\n cause: new Error(`To change, use: zero org set ${slug} --force`),\n },\n );\n }\n\n const org = await updateZeroOrg({ slug, force: true });\n\n const result = await switchZeroOrg(org.slug);\n await saveConfig({\n token: result.access_token,\n });\n\n console.log(chalk.green(`✓ Organization updated to ${org.slug}`));\n console.log();\n console.log(\"Your agents will now be namespaced as:\");\n console.log(chalk.cyan(` ${org.slug}/<agent-name>`));\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\"already exists\")\n ) {\n throw new Error(\n `Organization \"${slug}\" is already taken. Please choose a different slug.`,\n );\n }\n throw error;\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroOrgs } from \"../../../lib/api\";\nimport { getActiveOrg } from \"../../../lib/api/config\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .description(\"List all accessible organizations\")\n .action(\n withErrorHandler(async () => {\n const result = await listZeroOrgs();\n const activeOrg = await getActiveOrg();\n\n console.log(chalk.bold(\"Available organizations:\"));\n for (const org of result.orgs) {\n const isCurrent = org.slug === activeOrg;\n const marker = isCurrent ? chalk.green(\"* \") : \" \";\n const roleLabel = org.role ? ` (${org.role})` : \"\";\n const currentLabel = isCurrent ? chalk.dim(\" ← current\") : \"\";\n console.log(`${marker}${org.slug}${roleLabel}${currentLabel}`);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroOrgs, switchZeroOrg } from \"../../../lib/api\";\nimport { saveConfig } from \"../../../lib/api/config\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const useCommand = new Command()\n .name(\"use\")\n .description(\"Switch to a different organization\")\n .argument(\"<slug>\", \"Organization slug to switch to\")\n .action(\n withErrorHandler(async (slug: string) => {\n const orgList = await listZeroOrgs();\n const target = orgList.orgs.find((s) => {\n return s.slug === slug;\n });\n if (!target) {\n throw new Error(`Organization '${slug}' not found or not accessible.`);\n }\n\n const result = await switchZeroOrg(slug);\n await saveConfig({\n token: result.access_token,\n });\n console.log(chalk.green(`✓ Switched to organization: ${slug}`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getZeroOrgMembers } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const membersCommand = new Command()\n .name(\"members\")\n .description(\"View organization members\")\n .action(\n withErrorHandler(async () => {\n const status = await getZeroOrgMembers();\n\n console.log(chalk.bold(`Organization: ${status.slug}`));\n console.log(` Role: ${status.role}`);\n console.log(\n ` Created: ${new Date(status.createdAt).toLocaleDateString()}`,\n );\n console.log();\n console.log(chalk.bold(\"Members:\"));\n for (const member of status.members) {\n const roleTag =\n member.role === \"admin\"\n ? chalk.yellow(` (${member.role})`)\n : chalk.dim(` (${member.role})`);\n console.log(` ${member.email}${roleTag}`);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { inviteZeroOrgMember } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const inviteCommand = new Command()\n .name(\"invite\")\n .description(\"Invite a member to the current organization\")\n .requiredOption(\"--email <email>\", \"Email address of the member to invite\")\n .option(\n \"--role <role>\",\n \"Role for the invited member (member or admin)\",\n \"member\",\n )\n .action(\n withErrorHandler(async (options: { email: string; role: string }) => {\n if (options.role !== \"member\" && options.role !== \"admin\") {\n throw new Error(\n `Invalid role \"${options.role}\". Must be \"member\" or \"admin\".`,\n );\n }\n await inviteZeroOrgMember(options.email, options.role);\n console.log(\n chalk.green(`✓ Invitation sent to ${options.email} as ${options.role}`),\n );\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { removeZeroOrgMember } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const removeCommand = new Command()\n .name(\"remove\")\n .description(\"Remove a member from the current organization\")\n .argument(\"<email>\", \"Email address of the member to remove\")\n .action(\n withErrorHandler(async (email: string) => {\n await removeZeroOrgMember(email);\n console.log(chalk.green(`✓ Removed ${email} from organization`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { leaveZeroOrg, listZeroOrgs, switchZeroOrg } from \"../../../lib/api\";\nimport { saveConfig } from \"../../../lib/api/config\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const leaveCommand = new Command()\n .name(\"leave\")\n .description(\"Leave the current organization\")\n .action(\n withErrorHandler(async () => {\n await leaveZeroOrg();\n\n const { orgs } = await listZeroOrgs();\n if (orgs.length === 0) {\n await saveConfig({ token: undefined });\n console.log(chalk.green(\"✓ Left organization.\"));\n console.log(\n chalk.yellow(\"No remaining organizations. Run: vm0 auth login\"),\n );\n return;\n }\n\n const nextOrg = orgs[0]!.slug;\n const result = await switchZeroOrg(nextOrg);\n await saveConfig({\n token: result.access_token,\n });\n console.log(chalk.green(`✓ Left organization. Switched to: ${nextOrg}`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { deleteZeroOrg } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const deleteCommand = new Command()\n .name(\"delete\")\n .description(\"Delete the current organization (admin only)\")\n .argument(\"<slug>\", \"Organization slug to confirm deletion\")\n .action(\n withErrorHandler(async (slug: string) => {\n await deleteZeroOrg(slug);\n console.log(chalk.green(`✓ Organization '${slug}' has been deleted.`));\n }),\n );\n","import { Command } from \"commander\";\nimport { listCommand } from \"./list\";\nimport { setCommand } from \"./set\";\nimport { removeCommand } from \"./remove\";\n\nexport const zeroOrgSecretCommand = new Command()\n .name(\"secret\")\n .description(\"Manage org-level secrets (admin)\")\n .addCommand(listCommand)\n .addCommand(setCommand)\n .addCommand(removeCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroOrgSecrets } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all org-level secrets\")\n .action(\n withErrorHandler(async () => {\n const result = await listZeroOrgSecrets();\n\n if (result.secrets.length === 0) {\n console.log(chalk.dim(\"No org secrets found\"));\n console.log();\n console.log(\"To add an org secret:\");\n console.log(\n chalk.cyan(\" zero org secret set MY_API_KEY --body <value>\"),\n );\n return;\n }\n\n console.log(chalk.bold(\"Org Secrets:\"));\n console.log();\n\n for (const secret of result.secrets) {\n console.log(` ${chalk.cyan(secret.name)}`);\n if (secret.description) {\n console.log(` ${chalk.dim(secret.description)}`);\n }\n console.log(\n ` ${chalk.dim(`Updated: ${new Date(secret.updatedAt).toLocaleString()}`)}`,\n );\n console.log();\n }\n\n console.log(chalk.dim(`Total: ${result.secrets.length} secret(s)`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { setZeroOrgSecret } from \"../../../../lib/api\";\nimport {\n isInteractive,\n promptPassword,\n} from \"../../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const setCommand = new Command()\n .name(\"set\")\n .description(\"Create or update an org-level secret (admin only)\")\n .argument(\"<name>\", \"Secret name (uppercase, e.g., MY_API_KEY)\")\n .option(\n \"-b, --body <value>\",\n \"Secret value (required in non-interactive mode)\",\n )\n .option(\"-d, --description <description>\", \"Optional description\")\n .action(\n withErrorHandler(\n async (\n name: string,\n options: { body?: string; description?: string },\n ) => {\n let value: string;\n\n if (options.body !== undefined) {\n value = options.body;\n } else if (isInteractive()) {\n const prompted = await promptPassword(\"Enter secret value:\");\n if (prompted === undefined) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n value = prompted;\n } else {\n throw new Error(\"--body is required in non-interactive mode\", {\n cause: new Error(\n `Usage: zero org secret set ${name} --body \"your-secret-value\"`,\n ),\n });\n }\n\n let secret;\n try {\n secret = await setZeroOrgSecret({\n name,\n value,\n description: options.description,\n });\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\"must contain only uppercase\")\n ) {\n throw new Error(error.message, {\n cause: new Error(\n \"Examples of valid secret names: MY_API_KEY, GITHUB_TOKEN, AWS_ACCESS_KEY_ID\",\n ),\n });\n }\n throw error;\n }\n\n console.log(chalk.green(`✓ Org secret \"${secret.name}\" saved`));\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { deleteZeroOrgSecret } from \"../../../../lib/api\";\nimport {\n isInteractive,\n promptConfirm,\n} from \"../../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const removeCommand = new Command()\n .name(\"remove\")\n .description(\"Delete an org-level secret (admin only)\")\n .argument(\"<name>\", \"Secret name to delete\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .action(\n withErrorHandler(async (name: string, options: { yes?: boolean }) => {\n if (!options.yes) {\n if (!isInteractive()) {\n throw new Error(\"--yes flag is required in non-interactive mode\");\n }\n\n const confirmed = await promptConfirm(\n `Are you sure you want to delete org secret \"${name}\"?`,\n false,\n );\n\n if (!confirmed) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n }\n\n await deleteZeroOrgSecret(name);\n console.log(chalk.green(`✓ Org secret \"${name}\" deleted`));\n }),\n );\n","import { Command } from \"commander\";\nimport { listCommand } from \"./list\";\nimport { setCommand } from \"./set\";\nimport { removeCommand } from \"./remove\";\n\nexport const zeroOrgVariableCommand = new Command()\n .name(\"variable\")\n .description(\"Manage org-level variables (admin)\")\n .addCommand(listCommand)\n .addCommand(setCommand)\n .addCommand(removeCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroOrgVariables } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\n/**\n * Truncate value for display if too long\n */\nfunction truncateValue(value: string, maxLength: number = 60): string {\n if (value.length <= maxLength) {\n return value;\n }\n return value.slice(0, maxLength - 15) + \"... [truncated]\";\n}\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all org-level variables\")\n .action(\n withErrorHandler(async () => {\n const result = await listZeroOrgVariables();\n\n if (result.variables.length === 0) {\n console.log(chalk.dim(\"No org variables found\"));\n console.log();\n console.log(\"To add an org variable:\");\n console.log(chalk.cyan(\" zero org variable set MY_VAR <value>\"));\n return;\n }\n\n console.log(chalk.bold(\"Org Variables:\"));\n console.log();\n\n for (const variable of result.variables) {\n const displayValue = truncateValue(variable.value);\n console.log(` ${chalk.cyan(variable.name)} = ${displayValue}`);\n if (variable.description) {\n console.log(` ${chalk.dim(variable.description)}`);\n }\n console.log(\n ` ${chalk.dim(`Updated: ${new Date(variable.updatedAt).toLocaleString()}`)}`,\n );\n console.log();\n }\n\n console.log(chalk.dim(`Total: ${result.variables.length} variable(s)`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { setZeroOrgVariable } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const setCommand = new Command()\n .name(\"set\")\n .description(\"Create or update an org-level variable (admin only)\")\n .argument(\"<name>\", \"Variable name (uppercase, e.g., MY_VAR)\")\n .argument(\"<value>\", \"Variable value\")\n .option(\"-d, --description <description>\", \"Optional description\")\n .action(\n withErrorHandler(\n async (\n name: string,\n value: string,\n options: { description?: string },\n ) => {\n let variable;\n try {\n variable = await setZeroOrgVariable({\n name,\n value,\n description: options.description,\n });\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\"must contain only uppercase\")\n ) {\n throw new Error(error.message, {\n cause: new Error(\n \"Examples of valid variable names: MY_VAR, API_URL, DEBUG_MODE\",\n ),\n });\n }\n throw error;\n }\n\n console.log(chalk.green(`✓ Org variable \"${variable.name}\" saved`));\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { deleteZeroOrgVariable } from \"../../../../lib/api\";\nimport {\n isInteractive,\n promptConfirm,\n} from \"../../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const removeCommand = new Command()\n .name(\"remove\")\n .description(\"Delete an org-level variable (admin only)\")\n .argument(\"<name>\", \"Variable name to delete\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .action(\n withErrorHandler(async (name: string, options: { yes?: boolean }) => {\n if (!options.yes) {\n if (!isInteractive()) {\n throw new Error(\"--yes flag is required in non-interactive mode\");\n }\n\n const confirmed = await promptConfirm(\n `Are you sure you want to delete org variable \"${name}\"?`,\n false,\n );\n\n if (!confirmed) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n }\n\n await deleteZeroOrgVariable(name);\n console.log(chalk.green(`✓ Org variable \"${name}\" deleted`));\n }),\n );\n","import { Command } from \"commander\";\nimport { listCommand } from \"./list\";\nimport { setupCommand } from \"./setup\";\nimport { removeCommand } from \"./remove\";\nimport { setDefaultCommand } from \"./set-default\";\n\nexport const zeroOrgModelProviderCommand = new Command()\n .name(\"model-provider\")\n .description(\"Manage org-level model providers\")\n .addCommand(listCommand)\n .addCommand(setupCommand)\n .addCommand(removeCommand)\n .addCommand(setDefaultCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n MODEL_PROVIDER_TYPES,\n allowsCustomModel,\n getModels,\n type ModelProviderType,\n} from \"@vm0/api-contracts/contracts/model-providers\";\nimport { listZeroOrgModelProviders } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all org-level model providers\")\n .action(\n withErrorHandler(async () => {\n const result = await listZeroOrgModelProviders();\n\n if (result.modelProviders.length === 0) {\n console.log(chalk.dim(\"No org-level model providers configured\"));\n console.log();\n console.log(\"To add an org-level model provider:\");\n console.log(chalk.cyan(\" zero org model-provider setup\"));\n return;\n }\n\n // Group by framework\n const byFramework = result.modelProviders.reduce(\n (acc, p) => {\n const fw = p.framework;\n if (!acc[fw]) {\n acc[fw] = [];\n }\n acc[fw].push(p);\n return acc;\n },\n {} as Record<string, typeof result.modelProviders>,\n );\n\n console.log(chalk.bold(\"Org Model Providers:\"));\n console.log();\n\n for (const [framework, providers] of Object.entries(byFramework)) {\n console.log(` ${chalk.cyan(framework)}:`);\n for (const provider of providers) {\n const defaultTag = provider.isDefault\n ? chalk.green(\" (default)\")\n : \"\";\n const modelTag = provider.selectedModel\n ? chalk.dim(` [${provider.selectedModel}]`)\n : \"\";\n console.log(` ${provider.type}${defaultTag}${modelTag}`);\n console.log(chalk.dim(` ID: ${provider.id}`));\n if (provider.type in MODEL_PROVIDER_TYPES) {\n const type = provider.type as ModelProviderType;\n const available = getModels(type) ?? [];\n if (available.length > 0) {\n console.log(\n chalk.dim(` Available models: ${available.join(\", \")}`),\n );\n } else if (allowsCustomModel(type)) {\n console.log(\n chalk.dim(\" Available models: (custom — any model name)\"),\n );\n }\n }\n console.log(\n chalk.dim(\n ` Updated: ${new Date(provider.updatedAt).toLocaleString()}`,\n ),\n );\n }\n console.log();\n }\n\n console.log(\n chalk.dim(`Total: ${result.modelProviders.length} provider(s)`),\n );\n console.log();\n console.log(\n chalk.dim(\n \"Use a provider ID with: zero agent edit <agent-id> --model-provider <id> --model <name>\",\n ),\n );\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport prompts from \"prompts\";\nimport {\n listZeroOrgModelProviders,\n upsertZeroOrgModelProvider,\n updateZeroOrgModelProviderModel,\n setZeroOrgModelProviderDefault,\n} from \"../../../../lib/api\";\nimport {\n MODEL_PROVIDER_TYPES,\n hasModelSelection,\n hasAuthMethods,\n getSelectableProviderTypes,\n type ModelProviderType,\n} from \"@vm0/api-contracts/contracts/model-providers\";\nimport { isInteractive } from \"../../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../../lib/command\";\nimport {\n type SetupInput,\n handleNonInteractiveMode,\n promptForModelSelection,\n promptForAuthMethod,\n promptForSecrets,\n collectSecrets,\n} from \"../../../../lib/domain/model-provider/shared\";\n\nasync function handleInteractiveMode(): Promise<SetupInput | null> {\n if (!isInteractive()) {\n throw new Error(\"Interactive mode requires a TTY\", {\n cause: new Error(\n 'Use non-interactive mode: zero org model-provider setup --type <type> --secret \"<value>\"',\n ),\n });\n }\n\n let cancelled = false;\n const onCancel = () => {\n cancelled = true;\n return false;\n };\n\n // Fetch configured org providers to annotate choices\n const { modelProviders: configuredProviders } =\n await listZeroOrgModelProviders();\n const configuredTypes = new Set(\n configuredProviders.map((p) => {\n return p.type;\n }),\n );\n\n // Build provider choices with configuration status (only selectable providers)\n const annotatedChoices = getSelectableProviderTypes().map((type) => {\n const config = MODEL_PROVIDER_TYPES[type];\n const isConfigured = configuredTypes.has(type);\n const isExperimental = hasAuthMethods(type);\n let title: string = config.label;\n if (isConfigured) {\n title = `${title} ✓`;\n }\n if (isExperimental) {\n title = `${title} ${chalk.dim(\"(experimental)\")}`;\n }\n return {\n title,\n value: type,\n };\n });\n\n const typeResponse = await prompts(\n {\n type: \"select\",\n name: \"type\",\n message: \"Select provider type:\",\n choices: annotatedChoices,\n },\n { onCancel },\n );\n\n if (cancelled) {\n console.log(chalk.dim(\"Cancelled\"));\n return null;\n }\n\n const type = typeResponse.type as ModelProviderType;\n\n // Check if provider is already configured using the list we already fetched\n const existingProvider = configuredProviders.find((p) => {\n return p.type === type;\n });\n\n if (existingProvider) {\n console.log();\n console.log(`\"${type}\" is already configured`);\n console.log();\n\n const actionResponse = await prompts(\n {\n type: \"select\",\n name: \"action\",\n message: \"\",\n choices: [\n { title: \"Keep existing secret\", value: \"keep\" },\n { title: \"Update secret\", value: \"update\" },\n ],\n },\n { onCancel },\n );\n\n if (cancelled) {\n console.log(chalk.dim(\"Cancelled\"));\n return null;\n }\n\n if (actionResponse.action === \"keep\") {\n const selectedModel = await promptForModelSelection(type);\n return {\n type,\n keepExistingSecret: true,\n selectedModel,\n isInteractiveMode: true,\n };\n }\n // Fall through to secret prompt for \"update\"\n }\n\n const config = MODEL_PROVIDER_TYPES[type];\n\n console.log();\n if (\"helpText\" in config) {\n console.log(chalk.dim(config.helpText));\n }\n console.log();\n\n // Handle multi-auth providers\n if (hasAuthMethods(type)) {\n const authMethod = await promptForAuthMethod(type);\n const secrets = await promptForSecrets(type, authMethod);\n const selectedModel = await promptForModelSelection(type);\n\n return {\n type,\n authMethod,\n secrets,\n selectedModel,\n isInteractiveMode: true,\n };\n }\n\n // Single-secret provider (legacy)\n const secretLabel = \"secretLabel\" in config ? config.secretLabel : \"secret\";\n\n const secretResponse = await prompts(\n {\n type: \"password\",\n name: \"secret\",\n message: `Enter your ${secretLabel}:`,\n validate: (value: string) => {\n return value.length > 0 || `${secretLabel} is required`;\n },\n },\n { onCancel },\n );\n\n if (cancelled) {\n console.log(chalk.dim(\"Cancelled\"));\n return null;\n }\n\n const secret = secretResponse.secret as string;\n const selectedModel = await promptForModelSelection(type);\n\n return { type, secret, selectedModel, isInteractiveMode: true };\n}\n\nasync function promptSetAsDefault(\n type: ModelProviderType,\n framework: string,\n isDefault: boolean,\n): Promise<void> {\n if (isDefault) return;\n\n let cancelled = false;\n const response = await prompts(\n {\n type: \"confirm\",\n name: \"setDefault\",\n message: \"Set this provider as default?\",\n initial: false,\n },\n {\n onCancel: () => {\n cancelled = true;\n return false;\n },\n },\n );\n\n if (cancelled) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n\n if (response.setDefault) {\n await setZeroOrgModelProviderDefault(type);\n console.log(chalk.green(`✓ Default for ${framework} set to \"${type}\"`));\n }\n}\n\nexport const setupCommand = new Command()\n .name(\"setup\")\n .description(\"Configure an org-level model provider\")\n .option(\"-t, --type <type>\", \"Provider type (for non-interactive mode)\")\n .option(\n \"-s, --secret <value>\",\n \"Secret value (can be used multiple times, supports VALUE or KEY=VALUE format)\",\n collectSecrets,\n [],\n )\n .option(\n \"-a, --auth-method <method>\",\n \"Auth method (required for multi-auth providers like aws-bedrock)\",\n )\n .option(\"-m, --model <model>\", \"Model selection (for non-interactive mode)\")\n .action(\n withErrorHandler(\n async (options: {\n type?: string;\n secret?: string[];\n authMethod?: string;\n model?: string;\n }) => {\n let input: SetupInput;\n const secretArgs = options.secret ?? [];\n\n if (options.type && secretArgs.length > 0) {\n input = handleNonInteractiveMode({\n type: options.type,\n secret: secretArgs,\n authMethod: options.authMethod,\n model: options.model,\n commandPrefix: \"zero org model-provider setup\",\n });\n } else if (options.type || secretArgs.length > 0) {\n throw new Error(\"Both --type and --secret are required\");\n } else {\n const result = await handleInteractiveMode();\n if (result === null) {\n return;\n }\n input = result;\n }\n\n // Handle \"keep existing secret\" flow\n if (input.keepExistingSecret) {\n const provider = await updateZeroOrgModelProviderModel(\n input.type,\n input.selectedModel,\n );\n\n const defaultNote = provider.isDefault\n ? ` (default for ${provider.framework})`\n : \"\";\n const modelNote = provider.selectedModel\n ? ` with model: ${provider.selectedModel}`\n : \"\";\n\n if (!hasModelSelection(input.type)) {\n console.log(\n chalk.green(`✓ Org model provider \"${input.type}\" unchanged`),\n );\n } else {\n console.log(\n chalk.green(\n `✓ Org model provider \"${input.type}\" updated${defaultNote}${modelNote}`,\n ),\n );\n }\n if (input.isInteractiveMode) {\n await promptSetAsDefault(\n input.type,\n provider.framework,\n provider.isDefault,\n );\n }\n return;\n }\n\n // Standard upsert flow with secret\n const { provider, created } = await upsertZeroOrgModelProvider({\n type: input.type,\n secret: input.secret,\n authMethod: input.authMethod,\n secrets: input.secrets,\n selectedModel: input.selectedModel,\n });\n\n const action = created ? \"created\" : \"updated\";\n const defaultNote = provider.isDefault\n ? ` (default for ${provider.framework})`\n : \"\";\n const modelNote = provider.selectedModel\n ? ` with model: ${provider.selectedModel}`\n : \"\";\n console.log(\n chalk.green(\n `✓ Org model provider \"${input.type}\" ${action}${defaultNote}${modelNote}`,\n ),\n );\n if (input.isInteractiveMode) {\n await promptSetAsDefault(\n input.type,\n provider.framework,\n provider.isDefault,\n );\n }\n },\n ),\n );\n","import chalk from \"chalk\";\nimport prompts from \"prompts\";\nimport {\n MODEL_PROVIDER_TYPES,\n getModels,\n getDefaultModel,\n hasModelSelection,\n allowsCustomModel,\n getCustomModelPlaceholder,\n hasAuthMethods,\n getAuthMethodsForType,\n getDefaultAuthMethod,\n getSecretsForAuthMethod,\n type ModelProviderType,\n} from \"@vm0/api-contracts/contracts/model-providers\";\n\nexport interface SetupInput {\n type: ModelProviderType;\n secret?: string;\n // Multi-auth support\n authMethod?: string;\n secrets?: Record<string, string>;\n selectedModel?: string;\n keepExistingSecret?: boolean;\n isInteractiveMode?: boolean;\n}\n\nfunction validateProviderType(typeStr: string): ModelProviderType {\n if (!Object.keys(MODEL_PROVIDER_TYPES).includes(typeStr)) {\n const validTypes = Object.keys(MODEL_PROVIDER_TYPES).join(\", \");\n throw new Error(`Invalid type \"${typeStr}\"`, {\n cause: new Error(`Valid types: ${validTypes}`),\n });\n }\n return typeStr as ModelProviderType;\n}\n\nfunction validateModel(\n type: ModelProviderType,\n modelStr: string,\n): string | never {\n const models = getModels(type);\n\n // Allow any model if provider supports custom models\n if (allowsCustomModel(type)) {\n return modelStr;\n }\n\n if (models && !models.includes(modelStr)) {\n throw new Error(`Invalid model \"${modelStr}\"`, {\n cause: new Error(`Valid models: ${models.join(\", \")}`),\n });\n }\n return modelStr;\n}\n\nfunction validateAuthMethod(\n type: ModelProviderType,\n authMethodStr: string,\n): string | never {\n const authMethods = getAuthMethodsForType(type);\n if (!authMethods || !(authMethodStr in authMethods)) {\n const validMethods = authMethods\n ? Object.keys(authMethods).join(\", \")\n : \"none\";\n throw new Error(`Invalid auth method \"${authMethodStr}\"`, {\n cause: new Error(`Valid auth methods: ${validMethods}`),\n });\n }\n return authMethodStr;\n}\n\n/**\n * Parse secret arguments into a secrets object.\n * Supports two formats:\n * - Single value (e.g., \"sk-xxx\") - auto-mapped to the provider's secret name\n * - KEY=VALUE format (e.g., \"AWS_REGION=us-east-1\") - explicit mapping\n */\nfunction parseSecrets(\n type: ModelProviderType,\n authMethod: string,\n secretArgs: string[],\n): Record<string, string> {\n const secretsConfig = getSecretsForAuthMethod(type, authMethod);\n if (!secretsConfig) {\n throw new Error(`Invalid auth method \"${authMethod}\"`);\n }\n\n const secretNames = Object.keys(secretsConfig);\n\n // Single value without = sign: only allowed for single-secret auth methods\n const firstArg = secretArgs[0];\n if (secretArgs.length === 1 && firstArg && !firstArg.includes(\"=\")) {\n if (secretNames.length !== 1) {\n throw new Error(\n \"Must use KEY=VALUE format for multi-secret auth methods\",\n { cause: new Error(`Required secrets: ${secretNames.join(\", \")}`) },\n );\n }\n const firstSecretName = secretNames[0];\n if (!firstSecretName) {\n throw new Error(\"No secrets defined for this auth method\");\n }\n return { [firstSecretName]: firstArg };\n }\n\n // KEY=VALUE format\n const secrets: Record<string, string> = {};\n for (const arg of secretArgs) {\n const eqIndex = arg.indexOf(\"=\");\n if (eqIndex === -1) {\n throw new Error(`Invalid secret format \"${arg}\"`, {\n cause: new Error(\"Use KEY=VALUE format (e.g., AWS_REGION=us-east-1)\"),\n });\n }\n const key = arg.slice(0, eqIndex);\n const value = arg.slice(eqIndex + 1);\n secrets[key] = value;\n }\n return secrets;\n}\n\n/**\n * Validate secrets against the auth method config.\n */\nfunction validateSecrets(\n type: ModelProviderType,\n authMethod: string,\n secrets: Record<string, string>,\n): void {\n const secretsConfig = getSecretsForAuthMethod(type, authMethod);\n if (!secretsConfig) {\n throw new Error(`Invalid auth method \"${authMethod}\"`);\n }\n\n // Check required fields\n for (const [name, fieldConfig] of Object.entries(secretsConfig)) {\n if (fieldConfig.required && !secrets[name]) {\n const requiredNames = Object.entries(secretsConfig)\n .filter(([, fc]) => {\n return fc.required;\n })\n .map(([n]) => {\n return n;\n })\n .join(\", \");\n throw new Error(`Missing required secret: ${name}`, {\n cause: new Error(`Required secrets: ${requiredNames}`),\n });\n }\n }\n\n // Check for unknown fields\n for (const name of Object.keys(secrets)) {\n if (!(name in secretsConfig)) {\n const validNames = Object.keys(secretsConfig).join(\", \");\n throw new Error(`Unknown secret: ${name}`, {\n cause: new Error(`Valid secrets: ${validNames}`),\n });\n }\n }\n}\n\nexport function handleNonInteractiveMode(options: {\n type: string;\n secret: string[];\n authMethod?: string;\n model?: string;\n commandPrefix?: string;\n}): SetupInput {\n const type = validateProviderType(options.type);\n const cmdPrefix = options.commandPrefix ?? \"zero org model-provider setup\";\n\n let selectedModel: string | undefined;\n\n if (options.model) {\n selectedModel = validateModel(type, options.model);\n } else if (hasModelSelection(type)) {\n const defaultModel = getDefaultModel(type);\n // Empty defaultModel means \"auto\" mode - don't set selectedModel\n selectedModel = defaultModel || undefined;\n }\n\n // Handle multi-auth providers\n if (hasAuthMethods(type)) {\n // Determine auth method\n let authMethod: string;\n if (options.authMethod) {\n authMethod = validateAuthMethod(type, options.authMethod);\n } else {\n const defaultAuthMethod = getDefaultAuthMethod(type);\n const authMethods = getAuthMethodsForType(type);\n if (!defaultAuthMethod || !authMethods) {\n throw new Error(`Provider \"${type}\" requires --auth-method`);\n }\n // If there's only one auth method, use it; otherwise require explicit selection\n const authMethodNames = Object.keys(authMethods);\n if (authMethodNames.length === 1) {\n authMethod = authMethodNames[0]!;\n } else {\n const methods = authMethodNames.join(\", \");\n throw new Error(\n `--auth-method is required for \"${type}\" (multiple auth methods available)`,\n {\n cause: new Error(\n `Available: ${methods}. Example: ${cmdPrefix} --type ${type} --auth-method ${authMethodNames[0]} --secret KEY=VALUE`,\n ),\n },\n );\n }\n }\n\n // Parse and validate secrets\n const secrets = parseSecrets(type, authMethod, options.secret);\n validateSecrets(type, authMethod, secrets);\n\n return {\n type,\n authMethod,\n secrets,\n selectedModel,\n isInteractiveMode: false,\n };\n }\n\n // Single-secret provider (legacy)\n // Accept single value or KEY=VALUE format\n const secretArgs = options.secret;\n const firstArg = secretArgs[0];\n if (!firstArg) {\n throw new Error(\"Secret is required\");\n }\n\n // If KEY=VALUE format, extract the value\n let secret: string;\n if (firstArg.includes(\"=\")) {\n secret = firstArg.slice(firstArg.indexOf(\"=\") + 1);\n } else {\n secret = firstArg;\n }\n\n return {\n type,\n secret,\n selectedModel,\n isInteractiveMode: false,\n };\n}\n\nexport async function promptForModelSelection(\n type: ModelProviderType,\n): Promise<string | undefined> {\n if (!hasModelSelection(type)) {\n return undefined;\n }\n\n const models = getModels(type) ?? [];\n const defaultModel = getDefaultModel(type);\n const supportsCustomModel = allowsCustomModel(type);\n\n // Build choices\n const modelChoices: { title: string; value: string }[] = [];\n\n // Add auto option if defaultModel is empty string\n if (defaultModel === \"\") {\n modelChoices.push({ title: \"auto (Recommended)\", value: \"\" });\n }\n\n // Add predefined models\n for (const model of models) {\n modelChoices.push({\n title: model === defaultModel ? `${model} (Recommended)` : model,\n value: model,\n });\n }\n\n // Add custom model option if supported\n if (supportsCustomModel) {\n modelChoices.push({ title: \"Custom model ID\", value: \"__custom__\" });\n }\n\n const modelResponse = await prompts(\n {\n type: \"select\",\n name: \"model\",\n message: \"Select model:\",\n choices: modelChoices,\n },\n {\n onCancel: () => {\n return process.exit(0);\n },\n },\n );\n\n const selected = modelResponse.model as string;\n\n // Handle custom model input\n if (selected === \"__custom__\") {\n const placeholder = getCustomModelPlaceholder(type);\n if (placeholder) {\n console.log(chalk.dim(`Example: ${placeholder}`));\n }\n const customResponse = await prompts(\n {\n type: \"text\",\n name: \"customModel\",\n message: \"Enter model ID:\",\n validate: (value: string) => {\n return value.length > 0 || \"Model ID is required\";\n },\n },\n {\n onCancel: () => {\n return process.exit(0);\n },\n },\n );\n return customResponse.customModel as string;\n }\n\n // Return undefined for auto mode (empty string)\n return selected === \"\" ? undefined : selected;\n}\n\n/**\n * Prompt for auth method selection (only for multi-auth providers)\n */\nexport async function promptForAuthMethod(\n type: ModelProviderType,\n): Promise<string> {\n const authMethods = getAuthMethodsForType(type);\n const defaultAuthMethod = getDefaultAuthMethod(type);\n\n if (!authMethods) {\n return \"default\";\n }\n\n const choices = Object.entries(authMethods).map(([method, config]) => {\n return {\n title:\n method === defaultAuthMethod\n ? `${config.label} (Recommended)`\n : config.label,\n value: method,\n };\n });\n\n const response = await prompts(\n {\n type: \"select\",\n name: \"authMethod\",\n message: \"Select authentication method:\",\n choices,\n },\n {\n onCancel: () => {\n return process.exit(0);\n },\n },\n );\n\n return response.authMethod as string;\n}\n\n/**\n * Determine if a secret should be masked (password type)\n * Non-secret values like region should be visible\n */\nfunction isSensitiveSecret(name: string): boolean {\n const nonSecretPatterns = [\"REGION\", \"ENDPOINT\", \"URL\"];\n return !nonSecretPatterns.some((pattern) => {\n return name.toUpperCase().includes(pattern);\n });\n}\n\nexport async function promptForSecrets(\n type: ModelProviderType,\n authMethod: string,\n): Promise<Record<string, string>> {\n const secretsConfig = getSecretsForAuthMethod(type, authMethod);\n\n if (!secretsConfig) {\n throw new Error(`Invalid auth method \"${authMethod}\"`);\n }\n\n const secrets: Record<string, string> = {};\n\n for (const [name, fieldConfig] of Object.entries(secretsConfig)) {\n if (fieldConfig.helpText) {\n console.log(chalk.dim(fieldConfig.helpText));\n }\n\n const isSensitive = isSensitiveSecret(name);\n const placeholder =\n \"placeholder\" in fieldConfig ? (fieldConfig.placeholder as string) : \"\";\n\n if (fieldConfig.required) {\n const response = await prompts(\n {\n type: isSensitive ? \"password\" : \"text\",\n name: \"value\",\n message: `${fieldConfig.label}:`,\n initial: placeholder ? \"\" : undefined,\n validate: (value: string) => {\n return value.length > 0 || `${fieldConfig.label} is required`;\n },\n },\n {\n onCancel: () => {\n return process.exit(0);\n },\n },\n );\n secrets[name] = response.value as string;\n } else {\n // Optional field\n const response = await prompts(\n {\n type: isSensitive ? \"password\" : \"text\",\n name: \"value\",\n message: `${fieldConfig.label} (optional):`,\n },\n {\n onCancel: () => {\n return process.exit(0);\n },\n },\n );\n const value = response.value as string;\n if (value && value.trim()) {\n secrets[name] = value.trim();\n }\n }\n }\n\n return secrets;\n}\n\n/**\n * Collect secret values from repeatable --secret option\n */\nexport function collectSecrets(value: string, previous: string[]): string[] {\n return previous.concat([value]);\n}\n\n/**\n * Parse a CLI model/model-provider flag value.\n *\n * Returns:\n * - `undefined` when the flag was not provided (preserve existing value)\n * - `null` when the user passed \"default\" (clear the override, inherit from org)\n * - the string value otherwise (set the specific model/provider)\n */\nexport function parseModelFlag(\n value: string | undefined,\n): string | null | undefined {\n if (value === undefined) return undefined;\n if (value === \"default\") return null;\n return value;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { deleteZeroOrgModelProvider } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\nimport {\n MODEL_PROVIDER_TYPES,\n type ModelProviderType,\n} from \"@vm0/api-contracts/contracts/model-providers\";\n\nexport const removeCommand = new Command()\n .name(\"remove\")\n .description(\"Remove an org-level model provider\")\n .argument(\"<type>\", \"Model provider type to remove\")\n .action(\n withErrorHandler(async (type: string) => {\n if (!Object.keys(MODEL_PROVIDER_TYPES).includes(type)) {\n const validTypes = Object.keys(MODEL_PROVIDER_TYPES).join(\", \");\n throw new Error(`Invalid type \"${type}\"`, {\n cause: new Error(`Valid types: ${validTypes}`),\n });\n }\n\n await deleteZeroOrgModelProvider(type as ModelProviderType);\n console.log(chalk.green(`✓ Org model provider \"${type}\" removed`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { setZeroOrgModelProviderDefault } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\nimport {\n MODEL_PROVIDER_TYPES,\n type ModelProviderType,\n} from \"@vm0/api-contracts/contracts/model-providers\";\n\nexport const setDefaultCommand = new Command()\n .name(\"set-default\")\n .description(\"Set an org-level model provider as default for its framework\")\n .argument(\"<type>\", \"Model provider type to set as default\")\n .action(\n withErrorHandler(async (type: string) => {\n if (!Object.keys(MODEL_PROVIDER_TYPES).includes(type)) {\n const validTypes = Object.keys(MODEL_PROVIDER_TYPES).join(\", \");\n throw new Error(`Invalid type \"${type}\"`, {\n cause: new Error(`Valid types: ${validTypes}`),\n });\n }\n\n const provider = await setZeroOrgModelProviderDefault(\n type as ModelProviderType,\n );\n console.log(\n chalk.green(\n `✓ Default for ${provider.framework} set to \"${provider.type}\"`,\n ),\n );\n }),\n );\n","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 Add a custom skill: zero agent edit $ZERO_AGENT_ID --add-skill my-skill\n Remove a skill: zero agent edit $ZERO_AGENT_ID --remove-skill my-skill\n\nNotes:\n Manage custom skills with 'zero skill --help'`,\n );\n","import { Command } from \"commander\";\nimport { readFileSync } from \"node:fs\";\nimport chalk from \"chalk\";\nimport { zeroAgentCustomSkillNameSchema } from \"@vm0/api-contracts/contracts/zero-agents\";\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(\n \"--skills <items>\",\n \"Comma-separated custom skill names to attach (e.g. my-skill,other-skill)\",\n )\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 skills: zero agent create --skills my-skill,other-skill --display-name \"My Agent\"\n With instructions: zero agent create --display-name \"My Agent\" --instructions-file ./instructions.md`,\n )\n .action(\n withErrorHandler(\n async (options: {\n skills?: string;\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 customSkills = options.skills\n ? options.skills.split(\",\").map((s) => {\n return s.trim();\n })\n : undefined;\n\n if (customSkills) {\n for (const name of customSkills) {\n const result = zeroAgentCustomSkillNameSchema.safeParse(name);\n if (!result.success) {\n throw new Error(\n `Invalid skill name \"${name}\": must be 2-64 characters, lowercase alphanumeric and hyphens only (e.g. my-skill)`,\n );\n }\n }\n }\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 customSkills,\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 (customSkills?.length) {\n console.log(` Skills: ${customSkills.join(\", \")}`);\n }\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 { zeroAgentCustomSkillNameSchema } from \"@vm0/api-contracts/contracts/zero-agents\";\nimport {\n getZeroAgent,\n updateZeroAgent,\n updateZeroAgentInstructions,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { parseModelFlag } from \"../../../lib/domain/model-provider/shared\";\nimport { type AvatarOptions, resolveAvatarUrl } from \"./avatar\";\n\ninterface AgentEditOptions extends AvatarOptions {\n displayName?: string;\n description?: string;\n sound?: string;\n skills?: string;\n addSkill?: string;\n removeSkill?: string;\n instructionsFile?: string;\n modelProvider?: string;\n model?: 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 options.skills !== undefined ||\n options.addSkill !== undefined ||\n options.removeSkill !== undefined ||\n options.modelProvider !== undefined ||\n options.model !== undefined\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 const customSkills = resolveCustomSkills(options, current.customSkills ?? []);\n\n const modelProviderId =\n options.modelProvider !== undefined\n ? parseModelFlag(options.modelProvider)\n : current.modelProviderId;\n const selectedModel =\n options.model !== undefined\n ? parseModelFlag(options.model)\n : current.selectedModel;\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 customSkills,\n modelProviderId,\n selectedModel,\n });\n}\n\nfunction validateSkillName(name: string): void {\n const result = zeroAgentCustomSkillNameSchema.safeParse(name);\n if (!result.success) {\n throw new Error(\n `Invalid skill name \"${name}\": must be 2-64 characters, lowercase alphanumeric and hyphens only (e.g. my-skill)`,\n );\n }\n}\n\nfunction resolveCustomSkills(\n options: { skills?: string; addSkill?: string; removeSkill?: string },\n existing: string[],\n): string[] | undefined {\n if (options.skills && (options.addSkill || options.removeSkill)) {\n throw new Error(\"Cannot use --skills with --add-skill or --remove-skill\");\n }\n\n if (options.skills) {\n const names = options.skills.split(\",\").map((s) => {\n return s.trim();\n });\n for (const name of names) {\n validateSkillName(name);\n }\n return names;\n }\n\n if (options.addSkill) {\n validateSkillName(options.addSkill);\n if (existing.includes(options.addSkill)) {\n throw new Error(\n `Skill \"${options.addSkill}\" is already attached to this agent`,\n );\n }\n return [...existing, options.addSkill];\n }\n\n if (options.removeSkill) {\n if (!existing.includes(options.removeSkill)) {\n throw new Error(\n `Skill \"${options.removeSkill}\" is not attached to this agent`,\n );\n }\n return existing.filter((s) => {\n return s !== options.removeSkill;\n });\n }\n\n return undefined;\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(\n \"--skills <items>\",\n \"Comma-separated custom skill names to attach (replaces existing)\",\n )\n .option(\"--add-skill <name>\", \"Add a custom skill to the agent\")\n .option(\"--remove-skill <name>\", \"Remove a custom skill from the agent\")\n .option(\"--instructions-file <path>\", \"Path to new instructions file\")\n .option(\n \"--model-provider <id>\",\n \"Model provider UUID, or 'default' to inherit org default\",\n )\n .option(\n \"--model <name>\",\n \"Model name (e.g. claude-sonnet-4-6, MiniMax-M2.7), or 'default' to inherit provider default\",\n )\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 Replace all skills: zero agent edit <agent-id> --skills my-skill,other-skill\n Add a skill: zero agent edit <agent-id> --add-skill my-skill\n Remove a skill: zero agent edit <agent-id> --remove-skill my-skill\n Update instructions: zero agent edit <agent-id> --instructions-file ./instructions.md\n Set model: zero agent edit <agent-id> --model-provider <provider-id> --model MiniMax-M2.7\n Reset model: zero agent edit <agent-id> --model-provider default --model default\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 - --skills replaces the entire skill list; --add-skill/--remove-skill modify incrementally\n - --skills cannot be combined with --add-skill or --remove-skill\n - Use 'zero org model-provider list' to see available providers and models\n - To create or edit skill content, use: zero skill --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-*, --skills, --add-skill, --remove-skill, --model-provider, --model, --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 listZeroConnectors,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport {\n isFirewallConnectorType,\n getConnectorFirewall,\n resolveFirewallPolicies,\n} from \"@vm0/connectors/firewalls\";\nimport type {\n FirewallPolicies,\n FirewallPolicyValue,\n} from \"@vm0/connectors/firewall-types\";\nimport type { ConnectorResponse } from \"@vm0/api-contracts/contracts/connector-schemas\";\nimport { policyIcon } from \"../../../lib/utils/format-utils\";\nimport { formatAvatar } from \"./avatar\";\n\ninterface ConnectorPermissionInfo {\n type: string;\n hasPermissions: boolean;\n permissions: Array<{ name: string; description?: string }>;\n policies: Record<string, FirewallPolicyValue> | null;\n unknownPolicy: FirewallPolicyValue;\n allowed: number;\n total: number;\n}\n\nfunction getConnectorPermissionInfo(\n type: string,\n resolvedPolicies: FirewallPolicies | null,\n): ConnectorPermissionInfo {\n if (!isFirewallConnectorType(type)) {\n return {\n type,\n hasPermissions: false,\n permissions: [],\n policies: null,\n unknownPolicy: \"allow\",\n allowed: 0,\n total: 0,\n };\n }\n\n const refPolicy = resolvedPolicies?.[type];\n const policies =\n refPolicy && Object.keys(refPolicy.policies).length > 0\n ? refPolicy.policies\n : null;\n const config = getConnectorFirewall(type);\n const permissions = config.apis.flatMap((a) => {\n return a.permissions ?? [];\n });\n const total = permissions.length;\n const allowed = policies\n ? permissions.filter((p) => {\n return policies[p.name] === \"allow\";\n }).length\n : 0;\n\n const unknownPolicy = refPolicy?.unknownPolicy ?? \"allow\";\n return {\n type,\n hasPermissions: true,\n permissions,\n policies,\n unknownPolicy,\n allowed,\n total,\n };\n}\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.needsReconnect) {\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 resolvedPolicies = resolveFirewallPolicies(\n agent.permissionPolicies,\n connectorTypes,\n );\n\n const connectorInfos = connectorTypes.map((type) => {\n return getConnectorPermissionInfo(type, resolvedPolicies);\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.customSkills?.length > 0) {\n console.log(`Skills: ${agent.customSkills.join(\", \")}`);\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","/**\n * Builtin firewall configs registry.\n *\n * Generated configs are imported here and exposed as a lookup map.\n * The firewall loader checks this registry before falling back to\n * remote GitHub fetch.\n */\n\nimport type {\n FirewallConfig,\n FirewallPolicy,\n FirewallPolicies,\n FirewallPolicyValue,\n} from \"../firewall-types\";\nimport type { ConnectorType } from \"../connectors\";\nimport { CONNECTOR_TYPES } from \"../connectors\";\nimport {\n gmailDefaultAllowed,\n gmailCategories,\n gmailCategoryOrder,\n gmailFirewall,\n} from \"./gmail.generated\";\nimport {\n slackDefaultAllowed,\n slackCategories,\n slackCategoryOrder,\n slackFirewall,\n} from \"./slack.generated\";\nimport {\n vercelCategories,\n vercelCategoryOrder,\n vercelFirewall,\n} from \"./vercel.generated\";\nimport { getConnectorEnvironmentMapping } from \"../connector-utils\";\nimport { agentmailFirewall } from \"./agentmail.generated\";\nimport { amplitudeFirewall } from \"./amplitude.generated\";\nimport { anthropicManagedAgentsFirewall } from \"./anthropic-managed-agents.generated\";\nimport { ahrefsFirewall } from \"./ahrefs.generated\";\nimport { airtableFirewall } from \"./airtable.generated\";\nimport { apolloFirewall } from \"./apollo.generated\";\nimport { apifyFirewall } from \"./apify.generated\";\nimport { pikaFirewall } from \"./pika.generated\";\nimport { dopplerFirewall } from \"./doppler.generated\";\nimport { infisicalFirewall } from \"./infisical.generated\";\nimport { asanaFirewall } from \"./asana.generated\";\nimport { attioFirewall } from \"./attio.generated\";\nimport { atlassianFirewall } from \"./atlassian.generated\";\nimport { axiomFirewall } from \"./axiom.generated\";\nimport { bitrixFirewall } from \"./bitrix.generated\";\nimport { braveSearchFirewall } from \"./brave-search.generated\";\nimport { brevoFirewall } from \"./brevo.generated\";\nimport { brightDataFirewall } from \"./bright-data.generated\";\nimport { browserbaseFirewall } from \"./browserbase.generated\";\nimport { browserUseFirewall } from \"./browser-use.generated\";\nimport { browserlessFirewall } from \"./browserless.generated\";\nimport { bufferFirewall } from \"./buffer.generated\";\nimport { calComFirewall } from \"./cal-com.generated\";\nimport { calendlyFirewall } from \"./calendly.generated\";\nimport { canvaFirewall } from \"./canva.generated\";\nimport { chatwootFirewall } from \"./chatwoot.generated\";\nimport { clickupFirewall } from \"./clickup.generated\";\nimport { closeFirewall } from \"./close.generated\";\nimport { cloudflareFirewall } from \"./cloudflare.generated\";\nimport { codaFirewall } from \"./coda.generated\";\nimport { cronlyticFirewall } from \"./cronlytic.generated\";\nimport { customerIoFirewall } from \"./customer-io.generated\";\nimport { deepseekFirewall } from \"./deepseek.generated\";\nimport { deelFirewall } from \"./deel.generated\";\nimport { devtoFirewall } from \"./devto.generated\";\nimport { difyFirewall } from \"./dify.generated\";\nimport { discordFirewall } from \"./discord.generated\";\nimport { discordWebhookFirewall } from \"./discord-webhook.generated\";\nimport { docusignFirewall } from \"./docusign.generated\";\nimport { db9Firewall } from \"./db9.generated\";\nimport { drive9Firewall } from \"./drive9.generated\";\nimport { dropboxFirewall } from \"./dropbox.generated\";\nimport { dropboxSignFirewall } from \"./dropbox-sign.generated\";\nimport { duffelFirewall } from \"./duffel.generated\";\nimport { e2bFirewall } from \"./e2b.generated\";\nimport { elevenlabsFirewall } from \"./elevenlabs.generated\";\nimport { etsyFirewall } from \"./etsy.generated\";\nimport { exaFirewall } from \"./exa.generated\";\nimport { exploriumFirewall } from \"./explorium.generated\";\nimport { falFirewall } from \"./fal.generated\";\nimport { figmaFirewall } from \"./figma.generated\";\nimport { firecrawlFirewall } from \"./firecrawl.generated\";\nimport { firefliesFirewall } from \"./fireflies.generated\";\nimport { freshdeskFirewall } from \"./freshdesk.generated\";\nimport { gammaFirewall } from \"./gamma.generated\";\nimport { garminConnectFirewall } from \"./garmin-connect.generated\";\nimport { githubFirewall } from \"./github.generated\";\nimport { gitlabFirewall } from \"./gitlab.generated\";\nimport { googleCalendarFirewall } from \"./google-calendar.generated\";\nimport { googleDocsFirewall } from \"./google-docs.generated\";\nimport { googleDriveFirewall } from \"./google-drive.generated\";\nimport { googleMeetFirewall } from \"./google-meet.generated\";\nimport { googleSheetsFirewall } from \"./google-sheets.generated\";\nimport { granolaFirewall } from \"./granola.generated\";\nimport { greenhouseFirewall } from \"./greenhouse.generated\";\nimport { groqFirewall } from \"./groq.generated\";\nimport { heygenFirewall } from \"./heygen.generated\";\nimport { heliconeFirewall } from \"./helicone.generated\";\nimport { htmlcsstoimageFirewall } from \"./htmlcsstoimage.generated\";\nimport { hubspotFirewall } from \"./hubspot.generated\";\nimport { huggingFaceFirewall } from \"./hugging-face.generated\";\nimport { humeFirewall } from \"./hume.generated\";\nimport { imgurFirewall } from \"./imgur.generated\";\nimport { instagramFirewall } from \"./instagram.generated\";\nimport { instantlyFirewall } from \"./instantly.generated\";\nimport { intercomFirewall } from \"./intercom.generated\";\nimport { intervalsIcuFirewall } from \"./intervals-icu.generated\";\nimport { jamFirewall } from \"./jam.generated\";\nimport { jiraFirewall } from \"./jira.generated\";\nimport { jotformFirewall } from \"./jotform.generated\";\nimport { klaviyoFirewall } from \"./klaviyo.generated\";\nimport { kommoFirewall } from \"./kommo.generated\";\nimport { larkFirewall } from \"./lark.generated\";\nimport { langfuseFirewall } from \"./langfuse.generated\";\nimport { langsmithFirewall } from \"./langsmith.generated\";\nimport { lineFirewall } from \"./line.generated\";\nimport { linearFirewall } from \"./linear.generated\";\nimport { loopsFirewall } from \"./loops.generated\";\nimport { lumaFirewall } from \"./luma.generated\";\nimport { mailchimpFirewall } from \"./mailchimp.generated\";\nimport { makeFirewall } from \"./make.generated\";\nimport { mailsacFirewall } from \"./mailsac.generated\";\nimport { manusFirewall } from \"./manus.generated\";\nimport { mem0Firewall } from \"./mem0.generated\";\nimport { mercuryFirewall } from \"./mercury.generated\";\nimport { metabaseFirewall } from \"./metabase.generated\";\nimport { metaAdsFirewall } from \"./meta-ads.generated\";\nimport { minimaxFirewall } from \"./minimax.generated\";\nimport { miroFirewall } from \"./miro.generated\";\nimport { mixpanelFirewall } from \"./mixpanel.generated\";\nimport { mondayFirewall } from \"./monday.generated\";\nimport { msg9Firewall } from \"./msg9.generated\";\nimport { n8nFirewall } from \"./n8n.generated\";\nimport { neonFirewall } from \"./neon.generated\";\nimport { notionFirewall } from \"./notion.generated\";\nimport { onyxFirewall } from \"./onyx.generated\";\nimport { openaiFirewall } from \"./openai.generated\";\nimport { outlookCalendarFirewall } from \"./outlook-calendar.generated\";\nimport { outlookMailFirewall } from \"./outlook-mail.generated\";\nimport { pandadocFirewall } from \"./pandadoc.generated\";\nimport { pdf4meFirewall } from \"./pdf4me.generated\";\nimport { pdfcoFirewall } from \"./pdfco.generated\";\nimport { pineconeFirewall } from \"./pinecone.generated\";\nimport { pdforgeFirewall } from \"./pdforge.generated\";\nimport { perplexityFirewall } from \"./perplexity.generated\";\nimport { pipedriveFirewall } from \"./pipedrive.generated\";\nimport { plainFirewall } from \"./plain.generated\";\nimport { plausibleFirewall } from \"./plausible.generated\";\nimport { podchaserFirewall } from \"./podchaser.generated\";\nimport { posthogFirewall } from \"./posthog.generated\";\nimport { productlaneFirewall } from \"./productlane.generated\";\nimport { prismaPostgresFirewall } from \"./prisma-postgres.generated\";\nimport { pushinatorFirewall } from \"./pushinator.generated\";\nimport { qdrantFirewall } from \"./qdrant.generated\";\nimport { qiitaFirewall } from \"./qiita.generated\";\nimport { redditFirewall } from \"./reddit.generated\";\nimport { reporteiFirewall } from \"./reportei.generated\";\nimport { replicateFirewall } from \"./replicate.generated\";\nimport { resendFirewall } from \"./resend.generated\";\nimport { revenuecatFirewall } from \"./revenuecat.generated\";\nimport { runwayFirewall } from \"./runway.generated\";\nimport { salesforceFirewall } from \"./salesforce.generated\";\nimport { scrapeninjaFirewall } from \"./scrapeninja.generated\";\nimport { sentryFirewall } from \"./sentry.generated\";\nimport { serpapiFirewall } from \"./serpapi.generated\";\nimport { shopifyFirewall } from \"./shopify.generated\";\nimport { shortioFirewall } from \"./shortio.generated\";\nimport { stabilityAiFirewall } from \"./stability-ai.generated\";\nimport { similarwebFirewall } from \"./similarweb.generated\";\nimport { slackWebhookFirewall } from \"./slack-webhook.generated\";\nimport { spotifyFirewall } from \"./spotify.generated\";\nimport { stravaFirewall } from \"./strava.generated\";\nimport { strapiFirewall } from \"./strapi.generated\";\nimport { streakFirewall } from \"./streak.generated\";\nimport { stripeFirewall } from \"./stripe.generated\";\nimport { supabaseFirewall } from \"./supabase.generated\";\nimport { supadataFirewall } from \"./supadata.generated\";\nimport { tavilyFirewall } from \"./tavily.generated\";\nimport { testOauthFirewall } from \"./test-oauth.generated\";\nimport { tldvFirewall } from \"./tldv.generated\";\nimport { todoistFirewall } from \"./todoist.generated\";\nimport { togetherFirewall } from \"./together.generated\";\nimport { twentyFirewall } from \"./twenty.generated\";\nimport { typeformFirewall } from \"./typeform.generated\";\nimport { v0Firewall } from \"./v0.generated\";\nimport { wandbFirewall } from \"./wandb.generated\";\nimport { webflowFirewall } from \"./webflow.generated\";\nimport { wixFirewall } from \"./wix.generated\";\nimport { workosFirewall } from \"./workos.generated\";\nimport { wrikeFirewall } from \"./wrike.generated\";\nimport { xFirewall } from \"./x.generated\";\nimport { xeroFirewall } from \"./xero.generated\";\nimport { youtubeFirewall } from \"./youtube.generated\";\nimport { zapierFirewall } from \"./zapier.generated\";\nimport { zapsignFirewall } from \"./zapsign.generated\";\nimport { zendeskFirewall } from \"./zendesk.generated\";\nimport { zepFirewall } from \"./zep.generated\";\nimport { zeptomailFirewall } from \"./zeptomail.generated\";\nimport { zoomFirewall } from \"./zoom.generated\";\n\nexport * from \"../firewall-types\";\n\n// ── Permission categories ───────────────────────────────────────────────\n\nexport interface ConnectorCategories {\n /** Map of permission name to category label */\n categories: Record<string, string>;\n /** Display order of categories (first = top of list) */\n displayOrder: readonly string[];\n}\n\nexport interface PermissionGroup<T extends { name: string }> {\n category: string;\n permissions: T[];\n}\n\nconst CONNECTOR_FIREWALLS = {\n agentmail: agentmailFirewall,\n amplitude: amplitudeFirewall,\n \"anthropic-managed-agents\": anthropicManagedAgentsFirewall,\n ahrefs: ahrefsFirewall,\n airtable: airtableFirewall,\n apollo: apolloFirewall,\n pika: pikaFirewall,\n apify: apifyFirewall,\n asana: asanaFirewall,\n attio: attioFirewall,\n atlassian: atlassianFirewall,\n axiom: axiomFirewall,\n bitrix: bitrixFirewall,\n \"brave-search\": braveSearchFirewall,\n brevo: brevoFirewall,\n \"bright-data\": brightDataFirewall,\n browserbase: browserbaseFirewall,\n \"browser-use\": browserUseFirewall,\n browserless: browserlessFirewall,\n buffer: bufferFirewall,\n \"cal-com\": calComFirewall,\n calendly: calendlyFirewall,\n canva: canvaFirewall,\n chatwoot: chatwootFirewall,\n clickup: clickupFirewall,\n close: closeFirewall,\n cloudflare: cloudflareFirewall,\n coda: codaFirewall,\n cronlytic: cronlyticFirewall,\n \"customer-io\": customerIoFirewall,\n deel: deelFirewall,\n deepseek: deepseekFirewall,\n devto: devtoFirewall,\n dify: difyFirewall,\n doppler: dopplerFirewall,\n infisical: infisicalFirewall,\n discord: discordFirewall,\n \"discord-webhook\": discordWebhookFirewall,\n docusign: docusignFirewall,\n db9: db9Firewall,\n drive9: drive9Firewall,\n dropbox: dropboxFirewall,\n \"dropbox-sign\": dropboxSignFirewall,\n duffel: duffelFirewall,\n e2b: e2bFirewall,\n elevenlabs: elevenlabsFirewall,\n etsy: etsyFirewall,\n exa: exaFirewall,\n explorium: exploriumFirewall,\n fal: falFirewall,\n figma: figmaFirewall,\n firecrawl: firecrawlFirewall,\n fireflies: firefliesFirewall,\n freshdesk: freshdeskFirewall,\n gamma: gammaFirewall,\n \"garmin-connect\": garminConnectFirewall,\n github: githubFirewall,\n gitlab: gitlabFirewall,\n gmail: gmailFirewall,\n \"google-calendar\": googleCalendarFirewall,\n \"google-docs\": googleDocsFirewall,\n \"google-drive\": googleDriveFirewall,\n \"google-meet\": googleMeetFirewall,\n \"google-sheets\": googleSheetsFirewall,\n granola: granolaFirewall,\n greenhouse: greenhouseFirewall,\n groq: groqFirewall,\n heygen: heygenFirewall,\n helicone: heliconeFirewall,\n htmlcsstoimage: htmlcsstoimageFirewall,\n hubspot: hubspotFirewall,\n \"hugging-face\": huggingFaceFirewall,\n hume: humeFirewall,\n imgur: imgurFirewall,\n instagram: instagramFirewall,\n instantly: instantlyFirewall,\n intercom: intercomFirewall,\n \"intervals-icu\": intervalsIcuFirewall,\n jam: jamFirewall,\n jira: jiraFirewall,\n jotform: jotformFirewall,\n klaviyo: klaviyoFirewall,\n kommo: kommoFirewall,\n lark: larkFirewall,\n langfuse: langfuseFirewall,\n langsmith: langsmithFirewall,\n line: lineFirewall,\n linear: linearFirewall,\n loops: loopsFirewall,\n luma: lumaFirewall,\n mailchimp: mailchimpFirewall,\n make: makeFirewall,\n mailsac: mailsacFirewall,\n manus: manusFirewall,\n mem0: mem0Firewall,\n mercury: mercuryFirewall,\n metabase: metabaseFirewall,\n \"meta-ads\": metaAdsFirewall,\n minimax: minimaxFirewall,\n miro: miroFirewall,\n mixpanel: mixpanelFirewall,\n monday: mondayFirewall,\n msg9: msg9Firewall,\n n8n: n8nFirewall,\n neon: neonFirewall,\n notion: notionFirewall,\n onyx: onyxFirewall,\n openai: openaiFirewall,\n \"outlook-calendar\": outlookCalendarFirewall,\n \"outlook-mail\": outlookMailFirewall,\n pandadoc: pandadocFirewall,\n pdf4me: pdf4meFirewall,\n pdfco: pdfcoFirewall,\n pinecone: pineconeFirewall,\n pdforge: pdforgeFirewall,\n perplexity: perplexityFirewall,\n pipedrive: pipedriveFirewall,\n plain: plainFirewall,\n plausible: plausibleFirewall,\n podchaser: podchaserFirewall,\n posthog: posthogFirewall,\n \"prisma-postgres\": prismaPostgresFirewall,\n productlane: productlaneFirewall,\n pushinator: pushinatorFirewall,\n qdrant: qdrantFirewall,\n qiita: qiitaFirewall,\n reddit: redditFirewall,\n reportei: reporteiFirewall,\n replicate: replicateFirewall,\n resend: resendFirewall,\n revenuecat: revenuecatFirewall,\n runway: runwayFirewall,\n salesforce: salesforceFirewall,\n scrapeninja: scrapeninjaFirewall,\n sentry: sentryFirewall,\n serpapi: serpapiFirewall,\n shopify: shopifyFirewall,\n shortio: shortioFirewall,\n \"stability-ai\": stabilityAiFirewall,\n similarweb: similarwebFirewall,\n slack: slackFirewall,\n \"slack-webhook\": slackWebhookFirewall,\n spotify: spotifyFirewall,\n strava: stravaFirewall,\n strapi: strapiFirewall,\n streak: streakFirewall,\n stripe: stripeFirewall,\n supabase: supabaseFirewall,\n supadata: supadataFirewall,\n tavily: tavilyFirewall,\n \"test-oauth\": testOauthFirewall,\n tldv: tldvFirewall,\n todoist: todoistFirewall,\n together: togetherFirewall,\n twenty: twentyFirewall,\n typeform: typeformFirewall,\n v0: v0Firewall,\n vercel: vercelFirewall,\n wandb: wandbFirewall,\n webflow: webflowFirewall,\n wix: wixFirewall,\n workos: workosFirewall,\n wrike: wrikeFirewall,\n x: xFirewall,\n xero: xeroFirewall,\n youtube: youtubeFirewall,\n zapier: zapierFirewall,\n zapsign: zapsignFirewall,\n zendesk: zendeskFirewall,\n zep: zepFirewall,\n zeptomail: zeptomailFirewall,\n zoom: zoomFirewall,\n} as const satisfies Partial<Record<ConnectorType, FirewallConfig>>;\n\n/**\n * Expand firewall placeholders to cover all secret names related to the\n * connector. For each existing placeholder key, find related names via\n * environmentMapping (raw OAuth secret names and sibling aliases) and assign\n * the same placeholder value.\n */\nfunction expandPlaceholders(\n firewall: FirewallConfig,\n connectorType: ConnectorType,\n): FirewallConfig {\n if (!firewall.placeholders) return firewall;\n\n const mapping = getConnectorEnvironmentMapping(connectorType);\n if (Object.keys(mapping).length === 0) return firewall;\n\n const expanded: Record<string, string> = { ...firewall.placeholders };\n\n for (const [key, placeholderValue] of Object.entries(firewall.placeholders)) {\n // key is a mapped env var (e.g. GITHUB_TOKEN)\n // → add the raw secret name and any sibling aliases\n const valueRef = mapping[key];\n if (valueRef?.startsWith(\"$secrets.\")) {\n const rawName = valueRef.slice(\"$secrets.\".length);\n if (!expanded[rawName]) {\n expanded[rawName] = placeholderValue;\n }\n for (const [envVar, ref] of Object.entries(mapping)) {\n if (ref === valueRef && !expanded[envVar]) {\n expanded[envVar] = placeholderValue;\n }\n }\n }\n\n // key is a raw secret name → add all env vars that reference it\n const rawRef = `$secrets.${key}`;\n for (const [envVar, ref] of Object.entries(mapping)) {\n if (ref === rawRef && !expanded[envVar]) {\n expanded[envVar] = placeholderValue;\n }\n }\n }\n\n return { ...firewall, placeholders: expanded };\n}\n\n// Pre-compute expanded placeholders at module load time.\nconst EXPANDED_CONNECTOR_FIREWALLS = Object.fromEntries(\n Object.entries(CONNECTOR_FIREWALLS).map(([type, firewall]) => {\n return [type, expandPlaceholders(firewall, type as ConnectorType)];\n }),\n) as typeof CONNECTOR_FIREWALLS;\n\n/** Connector types that have a firewall config (subset of ConnectorType). */\nexport type FirewallConnectorType = keyof typeof CONNECTOR_FIREWALLS;\n\n/**\n * Connector firewalls that are platform-billable.\n *\n * Attaching one of these to a run adds its firewall name to the\n * billableFirewalls whitelist in the execution context, which surfaces as\n * flow.metadata[\"firewall_billable\"] in mitm-addon. That flag gates\n * log_connector_usage (per-call billing) and the full-body response\n * buffering needed to extract the billing payload.\n *\n * The `satisfies ReadonlyArray<FirewallConnectorType>` constraint catches\n * typos at compile time: any literal here must be a valid firewall\n * connector type (key of `CONNECTOR_FIREWALLS`).\n */\nexport const BILLABLE_CONNECTORS = [\n \"x\",\n] as const satisfies ReadonlyArray<FirewallConnectorType>;\n\nexport type BillableConnector = (typeof BILLABLE_CONNECTORS)[number];\n\n/**\n * Extract the union of permission names from a firewall config object.\n * Requires the config to be declared with `as const satisfies FirewallConfig`\n * so that permission name strings are preserved as literal types.\n */\nexport type PermissionNamesOf<T extends FirewallConfig> =\n T[\"apis\"][number] extends { permissions?: infer P }\n ? P extends ReadonlyArray<{ name: infer N }>\n ? N extends string\n ? N\n : never\n : never\n : never;\n\nconst CONNECTOR_CATEGORIES: Partial<\n Record<FirewallConnectorType, ConnectorCategories>\n> = {\n gmail: { categories: gmailCategories, displayOrder: gmailCategoryOrder },\n slack: { categories: slackCategories, displayOrder: slackCategoryOrder },\n vercel: { categories: vercelCategories, displayOrder: vercelCategoryOrder },\n};\n\n/** Get the category data for a connector type (null if uncategorized). */\nexport function getPermissionCategories(\n type: string,\n): ConnectorCategories | null {\n return CONNECTOR_CATEGORIES[type as FirewallConnectorType] ?? null;\n}\n\n/**\n * Group permissions by their category for a given connector type.\n * Returns null when the connector has no category data (caller should\n * fall back to a flat list).\n */\nexport function groupPermissionsByCategory<T extends { name: string }>(\n permissions: T[],\n connectorType: string,\n): PermissionGroup<T>[] | null {\n const categoryData = getPermissionCategories(connectorType);\n if (!categoryData) {\n return null;\n }\n\n const grouped = new Map<string, T[]>();\n for (const category of categoryData.displayOrder) {\n grouped.set(category, []);\n }\n\n for (const perm of permissions) {\n const category = categoryData.categories[perm.name];\n if (category) {\n const list = grouped.get(category);\n if (list) {\n list.push(perm);\n }\n }\n }\n\n return [...grouped.entries()]\n .filter(([, perms]) => {\n return perms.length > 0;\n })\n .map(([category, perms]) => {\n return { category, permissions: perms };\n });\n}\n\n/**\n * Connector types that do not have a firewall config.\n *\n * When adding a new ConnectorType, place it in either CONNECTOR_FIREWALLS\n * or this union. The compile-time assertions below will fail if a\n * ConnectorType is missing from both, or if a type is listed here\n * that already has a firewall config.\n */\nexport type NonFirewallConnectorType =\n // Signature-based auth — requires computing signatures, not simple header injection\n | \"cloudinary\" // SHA signature in form body + api_key param\n | \"minio\" // AWS Signature V4\n // Other\n | \"computer\"; // not an API connector\n\n/**\n * Compile-time exhaustiveness checks.\n *\n * ValidateNonFirewall: ensures NonFirewallConnectorType only contains\n * connectors that are NOT in FirewallConnectorType.\n *\n * ValidateExhaustive: ensures every ConnectorType is in either\n * FirewallConnectorType or NonFirewallConnectorType.\n */\ntype ValidateNonFirewall<\n T extends Exclude<ConnectorType, FirewallConnectorType> =\n NonFirewallConnectorType,\n> = T;\ntype ValidateExhaustive<\n T extends never = Exclude<\n ConnectorType,\n FirewallConnectorType | NonFirewallConnectorType\n >,\n> = T;\nexport type ConnectorTypeCoverage = ValidateNonFirewall & ValidateExhaustive;\n\n/** Check if a connector type has a firewall config. */\nexport function isFirewallConnectorType(\n type: string,\n): type is FirewallConnectorType {\n return type in CONNECTOR_FIREWALLS;\n}\n\n/** Get the firewall config for a connector type (placeholders pre-expanded). */\nexport function getConnectorFirewall(\n type: FirewallConnectorType,\n): FirewallConfig {\n return EXPANDED_CONNECTOR_FIREWALLS[type];\n}\n\n/**\n * Per-connector default-allowed permission lists.\n *\n * Each entry is a readonly array of permission names that are allowed by\n * default. Permissions NOT in the array are denied. Connectors without\n * an entry here have no defaults (all permissions allowed).\n *\n * These arrays are generated alongside the firewall configs — see each\n * connector's generator (e.g. slack.ts) for the source of truth.\n */\nconst DEFAULT_ALLOWED: Partial<\n Record<FirewallConnectorType, ReadonlyArray<string>>\n> = {\n gmail: gmailDefaultAllowed,\n slack: slackDefaultAllowed,\n};\n\n/**\n * Get the default firewall policies for a connector type.\n *\n * Returns a ConnectorPolicy with all permissions mapped. Connectors with a\n * default-allowed list get \"allow\"/\"deny\" selectively; others get all-allow.\n * `unknownPolicy` defaults to \"allow\".\n */\nexport function getDefaultFirewallPolicies(\n type: FirewallConnectorType,\n): FirewallPolicy {\n const allowed = DEFAULT_ALLOWED[type];\n const allowSet = allowed ? new Set<string>(allowed) : null;\n const config = getConnectorFirewall(type);\n const policies: Record<string, FirewallPolicyValue> = {};\n for (const api of config.apis) {\n if (api.permissions) {\n for (const p of api.permissions) {\n policies[p.name] = !allowSet || allowSet.has(p.name) ? \"allow\" : \"deny\";\n }\n }\n }\n return { policies, unknownPolicy: \"allow\" };\n}\n\n/**\n * Merge stored firewall policies with per-connector defaults.\n *\n * For each connector, builds a full default policy (all-allow for connectors\n * without a default-allowed list, selective for those with one), then layers\n * stored overrides on top. Merges both `policies` and `unknownPolicy`.\n */\nexport function resolveFirewallPolicies(\n stored: FirewallPolicies | null,\n connectors: string[],\n): FirewallPolicies | null {\n let resolved: FirewallPolicies | null = stored;\n for (const connector of connectors) {\n if (!isFirewallConnectorType(connector)) continue;\n const defaults = getDefaultFirewallPolicies(connector);\n const existing = resolved?.[connector];\n resolved = {\n ...resolved,\n [connector]: {\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\n/**\n * Map every built-in connector's `api.base` host to its connector type.\n *\n * Used to reject org custom connectors whose prefix host collides with a\n * built-in. The returned map lets callers produce a user-facing error that\n * names the conflicting built-in.\n *\n * Bases that embed runtime template variables (e.g. `${{ vars.JIRA_DOMAIN }}`)\n * or otherwise fail URL parsing are skipped — there's no fixed host to\n * compare against, and the conflict check is best-effort anyway (mitm-level\n * matching remains the final line of defense).\n */\nexport function getAllBuiltinConnectorHosts(): Map<\n string,\n FirewallConnectorType\n> {\n const hosts = new Map<string, FirewallConnectorType>();\n for (const [type, firewall] of Object.entries(CONNECTOR_FIREWALLS) as [\n FirewallConnectorType,\n FirewallConfig,\n ][]) {\n for (const api of firewall.apis) {\n if (api.base.includes(\"${{\")) continue;\n let host: string;\n try {\n host = new URL(api.base).host;\n } catch {\n continue;\n }\n if (!hosts.has(host)) {\n hosts.set(host, type);\n }\n }\n }\n return hosts;\n}\n\n/**\n * Human-readable display name for a built-in connector type\n * (e.g. \"GitHub\", \"Google Drive\"). Falls back to the type slug if\n * `CONNECTOR_TYPES` has no entry.\n */\nexport function getBuiltinConnectorDisplayName(\n type: FirewallConnectorType,\n): string {\n return CONNECTOR_TYPES[type]?.label ?? type;\n}\n","// Auto-generated from Google's Discovery API.\n// Source: https://gmail.googleapis.com/$discovery/rest?version=v1\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:gmail\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\nimport type { PermissionNamesOf } from \"./index\";\n\nexport const gmailFirewall = {\n name: \"gmail\",\n description: \"Gmail API\",\n placeholders: {\n GMAIL_TOKEN: \"ya29.A0CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSa\",\n },\n apis: [\n {\n base: \"https://gmail.googleapis.com/gmail\",\n auth: {\n headers: {\n \"Authorization\": \"Bearer ${{ secrets.GMAIL_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"gmail\",\n description: \"Read, compose, send, and permanently delete all your email from Gmail\",\n rules: [\n \"GET /v1/users/{userId}/drafts\",\n \"POST /v1/users/{userId}/drafts\",\n \"POST /v1/users/{userId}/drafts/send\",\n \"GET /v1/users/{userId}/drafts/{id}\",\n \"PUT /v1/users/{userId}/drafts/{id}\",\n \"DELETE /v1/users/{userId}/drafts/{id}\",\n \"GET /v1/users/{userId}/history\",\n \"GET /v1/users/{userId}/labels\",\n \"POST /v1/users/{userId}/labels\",\n \"GET /v1/users/{userId}/labels/{id}\",\n \"PUT /v1/users/{userId}/labels/{id}\",\n \"PATCH /v1/users/{userId}/labels/{id}\",\n \"DELETE /v1/users/{userId}/labels/{id}\",\n \"GET /v1/users/{userId}/messages\",\n \"POST /v1/users/{userId}/messages\",\n \"POST /v1/users/{userId}/messages/batchDelete\",\n \"POST /v1/users/{userId}/messages/batchModify\",\n \"POST /v1/users/{userId}/messages/import\",\n \"POST /v1/users/{userId}/messages/send\",\n \"GET /v1/users/{userId}/messages/{id}\",\n \"DELETE /v1/users/{userId}/messages/{id}\",\n \"POST /v1/users/{userId}/messages/{id}/modify\",\n \"POST /v1/users/{userId}/messages/{id}/trash\",\n \"POST /v1/users/{userId}/messages/{id}/untrash\",\n \"GET /v1/users/{userId}/messages/{messageId}/attachments/{id}\",\n \"GET /v1/users/{userId}/profile\",\n \"GET /v1/users/{userId}/settings/autoForwarding\",\n \"GET /v1/users/{userId}/settings/cse/identities\",\n \"GET /v1/users/{userId}/settings/cse/identities/{cseEmailAddress}\",\n \"GET /v1/users/{userId}/settings/cse/keypairs\",\n \"GET /v1/users/{userId}/settings/cse/keypairs/{keyPairId}\",\n \"GET /v1/users/{userId}/settings/delegates\",\n \"GET /v1/users/{userId}/settings/delegates/{delegateEmail}\",\n \"GET /v1/users/{userId}/settings/filters\",\n \"GET /v1/users/{userId}/settings/filters/{id}\",\n \"GET /v1/users/{userId}/settings/forwardingAddresses\",\n \"GET /v1/users/{userId}/settings/forwardingAddresses/{forwardingEmail}\",\n \"GET /v1/users/{userId}/settings/imap\",\n \"GET /v1/users/{userId}/settings/language\",\n \"GET /v1/users/{userId}/settings/pop\",\n \"GET /v1/users/{userId}/settings/sendAs\",\n \"GET /v1/users/{userId}/settings/sendAs/{sendAsEmail}\",\n \"GET /v1/users/{userId}/settings/sendAs/{sendAsEmail}/smimeInfo\",\n \"GET /v1/users/{userId}/settings/sendAs/{sendAsEmail}/smimeInfo/{id}\",\n \"GET /v1/users/{userId}/settings/vacation\",\n \"POST /v1/users/{userId}/stop\",\n \"GET /v1/users/{userId}/threads\",\n \"GET /v1/users/{userId}/threads/{id}\",\n \"DELETE /v1/users/{userId}/threads/{id}\",\n \"POST /v1/users/{userId}/threads/{id}/modify\",\n \"POST /v1/users/{userId}/threads/{id}/trash\",\n \"POST /v1/users/{userId}/threads/{id}/untrash\",\n \"POST /v1/users/{userId}/watch\",\n ],\n },\n {\n name: \"gmail.addons.current.action.compose\",\n description: \"Manage drafts and send emails when you interact with the add-on\",\n rules: [\n \"POST /v1/users/{userId}/drafts\",\n \"POST /v1/users/{userId}/drafts/send\",\n \"PUT /v1/users/{userId}/drafts/{id}\",\n \"DELETE /v1/users/{userId}/drafts/{id}\",\n \"POST /v1/users/{userId}/messages/send\",\n ],\n },\n {\n name: \"gmail.addons.current.message.action\",\n description: \"View your email messages when you interact with the add-on\",\n rules: [\n \"GET /v1/users/{userId}/messages/{id}\",\n \"GET /v1/users/{userId}/messages/{messageId}/attachments/{id}\",\n \"GET /v1/users/{userId}/threads/{id}\",\n ],\n },\n {\n name: \"gmail.addons.current.message.metadata\",\n description: \"View your email message metadata when the add-on is running\",\n rules: [\n \"GET /v1/users/{userId}/messages/{id}\",\n \"GET /v1/users/{userId}/threads/{id}\",\n ],\n },\n {\n name: \"gmail.addons.current.message.readonly\",\n description: \"View your email messages when the add-on is running\",\n rules: [\n \"GET /v1/users/{userId}/messages/{id}\",\n \"GET /v1/users/{userId}/messages/{messageId}/attachments/{id}\",\n \"GET /v1/users/{userId}/threads/{id}\",\n ],\n },\n {\n name: \"gmail.compose\",\n description: \"Manage drafts\",\n rules: [\n \"GET /v1/users/{userId}/drafts\",\n \"POST /v1/users/{userId}/drafts\",\n \"GET /v1/users/{userId}/drafts/{id}\",\n \"PUT /v1/users/{userId}/drafts/{id}\",\n \"DELETE /v1/users/{userId}/drafts/{id}\",\n \"GET /v1/users/{userId}/profile\",\n ],\n },\n {\n name: \"gmail.insert\",\n description: \"Add emails into your Gmail mailbox\",\n rules: [\n \"POST /v1/users/{userId}/messages\",\n \"POST /v1/users/{userId}/messages/import\",\n ],\n },\n {\n name: \"gmail.labels\",\n description: \"See and edit your email labels\",\n rules: [\n \"GET /v1/users/{userId}/labels\",\n \"POST /v1/users/{userId}/labels\",\n \"GET /v1/users/{userId}/labels/{id}\",\n \"PUT /v1/users/{userId}/labels/{id}\",\n \"PATCH /v1/users/{userId}/labels/{id}\",\n \"DELETE /v1/users/{userId}/labels/{id}\",\n ],\n },\n {\n name: \"gmail.metadata\",\n description: \"View your email message metadata such as labels and headers, but not the email body\",\n rules: [\n \"GET /v1/users/{userId}/history\",\n \"GET /v1/users/{userId}/labels\",\n \"GET /v1/users/{userId}/labels/{id}\",\n \"GET /v1/users/{userId}/messages\",\n \"GET /v1/users/{userId}/messages/{id}\",\n \"GET /v1/users/{userId}/profile\",\n \"POST /v1/users/{userId}/stop\",\n \"GET /v1/users/{userId}/threads\",\n \"GET /v1/users/{userId}/threads/{id}\",\n \"POST /v1/users/{userId}/watch\",\n ],\n },\n {\n name: \"gmail.modify\",\n description: \"Read, compose, and send emails from your Gmail account\",\n rules: [\n \"GET /v1/users/{userId}/drafts\",\n \"POST /v1/users/{userId}/drafts\",\n \"POST /v1/users/{userId}/drafts/send\",\n \"GET /v1/users/{userId}/drafts/{id}\",\n \"PUT /v1/users/{userId}/drafts/{id}\",\n \"DELETE /v1/users/{userId}/drafts/{id}\",\n \"GET /v1/users/{userId}/history\",\n \"GET /v1/users/{userId}/labels\",\n \"POST /v1/users/{userId}/labels\",\n \"GET /v1/users/{userId}/labels/{id}\",\n \"PUT /v1/users/{userId}/labels/{id}\",\n \"PATCH /v1/users/{userId}/labels/{id}\",\n \"DELETE /v1/users/{userId}/labels/{id}\",\n \"GET /v1/users/{userId}/messages\",\n \"POST /v1/users/{userId}/messages\",\n \"POST /v1/users/{userId}/messages/batchModify\",\n \"POST /v1/users/{userId}/messages/import\",\n \"POST /v1/users/{userId}/messages/send\",\n \"GET /v1/users/{userId}/messages/{id}\",\n \"POST /v1/users/{userId}/messages/{id}/modify\",\n \"POST /v1/users/{userId}/messages/{id}/trash\",\n \"POST /v1/users/{userId}/messages/{id}/untrash\",\n \"GET /v1/users/{userId}/messages/{messageId}/attachments/{id}\",\n \"GET /v1/users/{userId}/profile\",\n \"GET /v1/users/{userId}/settings/autoForwarding\",\n \"GET /v1/users/{userId}/settings/cse/identities\",\n \"GET /v1/users/{userId}/settings/cse/identities/{cseEmailAddress}\",\n \"GET /v1/users/{userId}/settings/cse/keypairs\",\n \"GET /v1/users/{userId}/settings/cse/keypairs/{keyPairId}\",\n \"GET /v1/users/{userId}/settings/delegates\",\n \"GET /v1/users/{userId}/settings/delegates/{delegateEmail}\",\n \"GET /v1/users/{userId}/settings/filters\",\n \"GET /v1/users/{userId}/settings/filters/{id}\",\n \"GET /v1/users/{userId}/settings/forwardingAddresses\",\n \"GET /v1/users/{userId}/settings/forwardingAddresses/{forwardingEmail}\",\n \"GET /v1/users/{userId}/settings/imap\",\n \"GET /v1/users/{userId}/settings/language\",\n \"GET /v1/users/{userId}/settings/pop\",\n \"GET /v1/users/{userId}/settings/sendAs\",\n \"GET /v1/users/{userId}/settings/sendAs/{sendAsEmail}\",\n \"GET /v1/users/{userId}/settings/sendAs/{sendAsEmail}/smimeInfo\",\n \"GET /v1/users/{userId}/settings/sendAs/{sendAsEmail}/smimeInfo/{id}\",\n \"GET /v1/users/{userId}/settings/vacation\",\n \"POST /v1/users/{userId}/stop\",\n \"GET /v1/users/{userId}/threads\",\n \"GET /v1/users/{userId}/threads/{id}\",\n \"POST /v1/users/{userId}/threads/{id}/modify\",\n \"POST /v1/users/{userId}/threads/{id}/trash\",\n \"POST /v1/users/{userId}/threads/{id}/untrash\",\n \"POST /v1/users/{userId}/watch\",\n ],\n },\n {\n name: \"gmail.readonly\",\n description: \"View your email messages and settings\",\n rules: [\n \"GET /v1/users/{userId}/drafts\",\n \"GET /v1/users/{userId}/drafts/{id}\",\n \"GET /v1/users/{userId}/history\",\n \"GET /v1/users/{userId}/labels\",\n \"GET /v1/users/{userId}/labels/{id}\",\n \"GET /v1/users/{userId}/messages\",\n \"GET /v1/users/{userId}/messages/{id}\",\n \"GET /v1/users/{userId}/messages/{messageId}/attachments/{id}\",\n \"GET /v1/users/{userId}/profile\",\n \"GET /v1/users/{userId}/settings/autoForwarding\",\n \"GET /v1/users/{userId}/settings/cse/identities\",\n \"GET /v1/users/{userId}/settings/cse/identities/{cseEmailAddress}\",\n \"GET /v1/users/{userId}/settings/cse/keypairs\",\n \"GET /v1/users/{userId}/settings/cse/keypairs/{keyPairId}\",\n \"GET /v1/users/{userId}/settings/delegates\",\n \"GET /v1/users/{userId}/settings/delegates/{delegateEmail}\",\n \"GET /v1/users/{userId}/settings/filters\",\n \"GET /v1/users/{userId}/settings/filters/{id}\",\n \"GET /v1/users/{userId}/settings/forwardingAddresses\",\n \"GET /v1/users/{userId}/settings/forwardingAddresses/{forwardingEmail}\",\n \"GET /v1/users/{userId}/settings/imap\",\n \"GET /v1/users/{userId}/settings/language\",\n \"GET /v1/users/{userId}/settings/pop\",\n \"GET /v1/users/{userId}/settings/sendAs\",\n \"GET /v1/users/{userId}/settings/sendAs/{sendAsEmail}\",\n \"GET /v1/users/{userId}/settings/sendAs/{sendAsEmail}/smimeInfo\",\n \"GET /v1/users/{userId}/settings/sendAs/{sendAsEmail}/smimeInfo/{id}\",\n \"GET /v1/users/{userId}/settings/vacation\",\n \"POST /v1/users/{userId}/stop\",\n \"GET /v1/users/{userId}/threads\",\n \"GET /v1/users/{userId}/threads/{id}\",\n \"POST /v1/users/{userId}/watch\",\n ],\n },\n {\n name: \"gmail.send\",\n description: \"Send email on your behalf\",\n rules: [\n \"POST /v1/users/{userId}/drafts/send\",\n \"POST /v1/users/{userId}/messages/send\",\n ],\n },\n {\n name: \"gmail.settings.basic\",\n description: \"See, edit, create, or change your email settings and filters in Gmail\",\n rules: [\n \"GET /v1/users/{userId}/settings/autoForwarding\",\n \"GET /v1/users/{userId}/settings/cse/identities\",\n \"POST /v1/users/{userId}/settings/cse/identities\",\n \"GET /v1/users/{userId}/settings/cse/identities/{cseEmailAddress}\",\n \"DELETE /v1/users/{userId}/settings/cse/identities/{cseEmailAddress}\",\n \"PATCH /v1/users/{userId}/settings/cse/identities/{emailAddress}\",\n \"GET /v1/users/{userId}/settings/cse/keypairs\",\n \"POST /v1/users/{userId}/settings/cse/keypairs\",\n \"GET /v1/users/{userId}/settings/cse/keypairs/{keyPairId}\",\n \"POST /v1/users/{userId}/settings/cse/keypairs/{keyPairId}:disable\",\n \"POST /v1/users/{userId}/settings/cse/keypairs/{keyPairId}:enable\",\n \"POST /v1/users/{userId}/settings/cse/keypairs/{keyPairId}:obliterate\",\n \"GET /v1/users/{userId}/settings/delegates\",\n \"GET /v1/users/{userId}/settings/delegates/{delegateEmail}\",\n \"GET /v1/users/{userId}/settings/filters\",\n \"POST /v1/users/{userId}/settings/filters\",\n \"GET /v1/users/{userId}/settings/filters/{id}\",\n \"DELETE /v1/users/{userId}/settings/filters/{id}\",\n \"GET /v1/users/{userId}/settings/forwardingAddresses\",\n \"GET /v1/users/{userId}/settings/forwardingAddresses/{forwardingEmail}\",\n \"GET /v1/users/{userId}/settings/imap\",\n \"PUT /v1/users/{userId}/settings/imap\",\n \"GET /v1/users/{userId}/settings/language\",\n \"PUT /v1/users/{userId}/settings/language\",\n \"GET /v1/users/{userId}/settings/pop\",\n \"PUT /v1/users/{userId}/settings/pop\",\n \"GET /v1/users/{userId}/settings/sendAs\",\n \"GET /v1/users/{userId}/settings/sendAs/{sendAsEmail}\",\n \"PUT /v1/users/{userId}/settings/sendAs/{sendAsEmail}\",\n \"PATCH /v1/users/{userId}/settings/sendAs/{sendAsEmail}\",\n \"GET /v1/users/{userId}/settings/sendAs/{sendAsEmail}/smimeInfo\",\n \"POST /v1/users/{userId}/settings/sendAs/{sendAsEmail}/smimeInfo\",\n \"GET /v1/users/{userId}/settings/sendAs/{sendAsEmail}/smimeInfo/{id}\",\n \"DELETE /v1/users/{userId}/settings/sendAs/{sendAsEmail}/smimeInfo/{id}\",\n \"POST /v1/users/{userId}/settings/sendAs/{sendAsEmail}/smimeInfo/{id}/setDefault\",\n \"GET /v1/users/{userId}/settings/vacation\",\n \"PUT /v1/users/{userId}/settings/vacation\",\n ],\n },\n {\n name: \"gmail.settings.sharing\",\n description: \"Manage your sensitive mail settings, including who can manage your mail\",\n rules: [\n \"PUT /v1/users/{userId}/settings/autoForwarding\",\n \"GET /v1/users/{userId}/settings/cse/identities\",\n \"POST /v1/users/{userId}/settings/cse/identities\",\n \"GET /v1/users/{userId}/settings/cse/identities/{cseEmailAddress}\",\n \"DELETE /v1/users/{userId}/settings/cse/identities/{cseEmailAddress}\",\n \"PATCH /v1/users/{userId}/settings/cse/identities/{emailAddress}\",\n \"GET /v1/users/{userId}/settings/cse/keypairs\",\n \"POST /v1/users/{userId}/settings/cse/keypairs\",\n \"GET /v1/users/{userId}/settings/cse/keypairs/{keyPairId}\",\n \"POST /v1/users/{userId}/settings/cse/keypairs/{keyPairId}:disable\",\n \"POST /v1/users/{userId}/settings/cse/keypairs/{keyPairId}:enable\",\n \"POST /v1/users/{userId}/settings/cse/keypairs/{keyPairId}:obliterate\",\n \"POST /v1/users/{userId}/settings/delegates\",\n \"DELETE /v1/users/{userId}/settings/delegates/{delegateEmail}\",\n \"POST /v1/users/{userId}/settings/forwardingAddresses\",\n \"DELETE /v1/users/{userId}/settings/forwardingAddresses/{forwardingEmail}\",\n \"POST /v1/users/{userId}/settings/sendAs\",\n \"PUT /v1/users/{userId}/settings/sendAs/{sendAsEmail}\",\n \"PATCH /v1/users/{userId}/settings/sendAs/{sendAsEmail}\",\n \"DELETE /v1/users/{userId}/settings/sendAs/{sendAsEmail}\",\n \"GET /v1/users/{userId}/settings/sendAs/{sendAsEmail}/smimeInfo\",\n \"POST /v1/users/{userId}/settings/sendAs/{sendAsEmail}/smimeInfo\",\n \"GET /v1/users/{userId}/settings/sendAs/{sendAsEmail}/smimeInfo/{id}\",\n \"DELETE /v1/users/{userId}/settings/sendAs/{sendAsEmail}/smimeInfo/{id}\",\n \"POST /v1/users/{userId}/settings/sendAs/{sendAsEmail}/smimeInfo/{id}/setDefault\",\n \"POST /v1/users/{userId}/settings/sendAs/{sendAsEmail}/verify\",\n ],\n },\n ],\n },\n {\n base: \"https://gmail.googleapis.com/upload/gmail\",\n auth: {\n headers: {\n \"Authorization\": \"Bearer ${{ secrets.GMAIL_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"gmail\",\n description: \"Read, compose, send, and permanently delete all your email from Gmail\",\n rules: [\n \"POST /v1/users/{userId}/drafts\",\n \"POST /v1/users/{userId}/drafts/send\",\n \"PUT /v1/users/{userId}/drafts/{id}\",\n \"POST /v1/users/{userId}/messages\",\n \"POST /v1/users/{userId}/messages/import\",\n \"POST /v1/users/{userId}/messages/send\",\n ],\n },\n {\n name: \"gmail.addons.current.action.compose\",\n description: \"Manage drafts and send emails when you interact with the add-on\",\n rules: [\n \"POST /v1/users/{userId}/drafts\",\n \"POST /v1/users/{userId}/drafts/send\",\n \"PUT /v1/users/{userId}/drafts/{id}\",\n \"POST /v1/users/{userId}/messages/send\",\n ],\n },\n {\n name: \"gmail.compose\",\n description: \"Manage drafts\",\n rules: [\n \"POST /v1/users/{userId}/drafts\",\n \"PUT /v1/users/{userId}/drafts/{id}\",\n ],\n },\n {\n name: \"gmail.insert\",\n description: \"Add emails into your Gmail mailbox\",\n rules: [\n \"POST /v1/users/{userId}/messages\",\n \"POST /v1/users/{userId}/messages/import\",\n ],\n },\n {\n name: \"gmail.modify\",\n description: \"Read, compose, and send emails from your Gmail account\",\n rules: [\n \"POST /v1/users/{userId}/drafts\",\n \"POST /v1/users/{userId}/drafts/send\",\n \"PUT /v1/users/{userId}/drafts/{id}\",\n \"POST /v1/users/{userId}/messages\",\n \"POST /v1/users/{userId}/messages/import\",\n \"POST /v1/users/{userId}/messages/send\",\n ],\n },\n {\n name: \"gmail.send\",\n description: \"Send email on your behalf\",\n rules: [\n \"POST /v1/users/{userId}/drafts/send\",\n \"POST /v1/users/{userId}/messages/send\",\n ],\n },\n ],\n },\n {\n base: \"https://gmail.googleapis.com/resumable/upload/gmail\",\n auth: {\n headers: {\n \"Authorization\": \"Bearer ${{ secrets.GMAIL_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"gmail\",\n description: \"Read, compose, send, and permanently delete all your email from Gmail\",\n rules: [\n \"POST /v1/users/{userId}/drafts\",\n \"POST /v1/users/{userId}/drafts/send\",\n \"PUT /v1/users/{userId}/drafts/{id}\",\n \"POST /v1/users/{userId}/messages\",\n \"POST /v1/users/{userId}/messages/import\",\n \"POST /v1/users/{userId}/messages/send\",\n ],\n },\n {\n name: \"gmail.addons.current.action.compose\",\n description: \"Manage drafts and send emails when you interact with the add-on\",\n rules: [\n \"POST /v1/users/{userId}/drafts\",\n \"POST /v1/users/{userId}/drafts/send\",\n \"PUT /v1/users/{userId}/drafts/{id}\",\n \"POST /v1/users/{userId}/messages/send\",\n ],\n },\n {\n name: \"gmail.compose\",\n description: \"Manage drafts\",\n rules: [\n \"POST /v1/users/{userId}/drafts\",\n \"PUT /v1/users/{userId}/drafts/{id}\",\n ],\n },\n {\n name: \"gmail.insert\",\n description: \"Add emails into your Gmail mailbox\",\n rules: [\n \"POST /v1/users/{userId}/messages\",\n \"POST /v1/users/{userId}/messages/import\",\n ],\n },\n {\n name: \"gmail.modify\",\n description: \"Read, compose, and send emails from your Gmail account\",\n rules: [\n \"POST /v1/users/{userId}/drafts\",\n \"POST /v1/users/{userId}/drafts/send\",\n \"PUT /v1/users/{userId}/drafts/{id}\",\n \"POST /v1/users/{userId}/messages\",\n \"POST /v1/users/{userId}/messages/import\",\n \"POST /v1/users/{userId}/messages/send\",\n ],\n },\n {\n name: \"gmail.send\",\n description: \"Send email on your behalf\",\n rules: [\n \"POST /v1/users/{userId}/drafts/send\",\n \"POST /v1/users/{userId}/messages/send\",\n ],\n },\n ],\n },\n ],\n} as const satisfies FirewallConfig;\n\nexport const gmailDefaultAllowed: ReadonlyArray<\n PermissionNamesOf<typeof gmailFirewall>\n> = [\n \"gmail.readonly\",\n \"gmail.metadata\",\n \"gmail.addons.current.message.readonly\",\n \"gmail.addons.current.message.metadata\",\n \"gmail.addons.current.message.action\",\n \"gmail.compose\",\n \"gmail.labels\",\n];\n\n\nexport const gmailCategories: Record<\n PermissionNamesOf<typeof gmailFirewall>,\n string\n> = {\n // — Read (5) —\n \"gmail.readonly\": \"Read\",\n \"gmail.metadata\": \"Read\",\n \"gmail.addons.current.message.readonly\": \"Read\",\n \"gmail.addons.current.message.metadata\": \"Read\",\n \"gmail.addons.current.message.action\": \"Read\",\n // — Compose (6) —\n \"gmail\": \"Compose\",\n \"gmail.modify\": \"Compose\",\n \"gmail.compose\": \"Compose\",\n \"gmail.send\": \"Compose\",\n \"gmail.insert\": \"Compose\",\n \"gmail.addons.current.action.compose\": \"Compose\",\n // — Admin (3) —\n \"gmail.settings.basic\": \"Admin\",\n \"gmail.settings.sharing\": \"Admin\",\n \"gmail.labels\": \"Admin\",\n};\n\nexport const gmailCategoryOrder = [\"Read\", \"Compose\", \"Admin\"] as const;\n","// Auto-generated from Slack API method-to-scope mappings.\n// Source: slack-ruby/slack-api-ref (auto-synced daily from docs.slack.dev)\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:slack\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\nimport type { PermissionNamesOf } from \"./index\";\n\nexport const slackFirewall = {\n name: \"slack\",\n description: \"Slack API\",\n placeholders: {\n SLACK_TOKEN: \"xoxb-100100100100-1001001001001-CoffeeSafeLocalCoffeeSaf\",\n },\n apis: [\n {\n base: \"https://slack.com/api\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.SLACK_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"admin\",\n description: \"Administer a workspace (access audit logs, SCIM API, and billing info)\",\n rules: [\n \"POST /admin.audit.anomaly.allow.getItem\",\n \"POST /admin.audit.anomaly.allow.updateItem\",\n \"GET /team.accessLogs\",\n \"GET /team.billableInfo\",\n \"GET /team.integrationLogs\",\n ],\n },\n {\n name: \"admin.analytics:read\",\n description: \"Access workspace analytics data\",\n rules: [\n \"GET /admin.analytics.getFile\",\n \"GET /admin.analytics.messages.activity\",\n \"GET /admin.analytics.messages.metadata\",\n ],\n },\n {\n name: \"admin.app_activities:read\",\n description: \"View app activities within an Enterprise organization\",\n rules: [\n \"POST /admin.apps.activities.list\",\n ],\n },\n {\n name: \"admin.apps:read\",\n description: \"View apps and app requests in an Enterprise organization\",\n rules: [\n \"GET /admin.apps.approved.list\",\n \"POST /admin.apps.config.lookup\",\n \"GET /admin.apps.requests.list\",\n \"GET /admin.apps.restricted.list\",\n ],\n },\n {\n name: \"admin.apps:write\",\n description: \"Manage apps and app requests in an Enterprise organization\",\n rules: [\n \"POST /admin.apps.approve\",\n \"POST /admin.apps.clearResolution\",\n \"POST /admin.apps.config.set\",\n \"POST /admin.apps.requests.cancel\",\n \"POST /admin.apps.restrict\",\n \"POST /admin.apps.uninstall\",\n ],\n },\n {\n name: \"admin.barriers:read\",\n description: \"Read information barriers in an Enterprise organization\",\n rules: [\n \"GET /admin.barriers.list\",\n ],\n },\n {\n name: \"admin.barriers:write\",\n description: \"Manage information barriers in an Enterprise organization\",\n rules: [\n \"POST /admin.barriers.create\",\n \"POST /admin.barriers.delete\",\n \"POST /admin.barriers.update\",\n ],\n },\n {\n name: \"admin.conversations:manage_objects\",\n description: \"Manage channel objects in an Enterprise organization\",\n rules: [\n \"POST /admin.conversations.createForObjects\",\n \"POST /admin.conversations.linkObjects\",\n \"POST /admin.conversations.unlinkObjects\",\n ],\n },\n {\n name: \"admin.conversations:read\",\n description: \"View channels and their settings in an Enterprise organization\",\n rules: [\n \"POST /admin.conversations.ekm.listOriginalConnectedChannelInfo\",\n \"POST /admin.conversations.getConversationPrefs\",\n \"POST /admin.conversations.getCustomRetention\",\n \"POST /admin.conversations.getTeams\",\n \"POST /admin.conversations.lookup\",\n \"GET /admin.conversations.restrictAccess.listGroups\",\n \"POST /admin.conversations.search\",\n ],\n },\n {\n name: \"admin.conversations:write\",\n description: \"Set channel settings in an Enterprise organization\",\n rules: [\n \"POST /admin.conversations.archive\",\n \"POST /admin.conversations.bulkArchive\",\n \"POST /admin.conversations.bulkDelete\",\n \"POST /admin.conversations.bulkMove\",\n \"GET /admin.conversations.bulkSetExcludeFromSlackAi\",\n \"POST /admin.conversations.convertToPrivate\",\n \"POST /admin.conversations.convertToPublic\",\n \"POST /admin.conversations.create\",\n \"POST /admin.conversations.delete\",\n \"POST /admin.conversations.disconnectShared\",\n \"POST /admin.conversations.invite\",\n \"POST /admin.conversations.removeCustomRetention\",\n \"POST /admin.conversations.rename\",\n \"GET /admin.conversations.restrictAccess.addGroup\",\n \"GET /admin.conversations.restrictAccess.removeGroup\",\n \"POST /admin.conversations.setConversationPrefs\",\n \"POST /admin.conversations.setCustomRetention\",\n \"POST /admin.conversations.setTeams\",\n \"POST /admin.conversations.unarchive\",\n ],\n },\n {\n name: \"admin.invites:read\",\n description: \"View workspace invite requests in an Enterprise organization\",\n rules: [\n \"POST /admin.inviteRequests.approved.list\",\n \"POST /admin.inviteRequests.denied.list\",\n \"POST /admin.inviteRequests.list\",\n ],\n },\n {\n name: \"admin.invites:write\",\n description: \"Manage workspace invite requests in an Enterprise organization\",\n rules: [\n \"POST /admin.inviteRequests.approve\",\n \"POST /admin.inviteRequests.deny\",\n ],\n },\n {\n name: \"admin.roles:read\",\n description: \"View role assignments in an Enterprise organization\",\n rules: [\n \"GET /admin.roles.listAssignments\",\n ],\n },\n {\n name: \"admin.roles:write\",\n description: \"Manage role assignments in an Enterprise organization\",\n rules: [\n \"POST /admin.roles.addAssignments\",\n \"POST /admin.roles.removeAssignments\",\n ],\n },\n {\n name: \"admin.teams:read\",\n description: \"View workspace settings in an Enterprise organization\",\n rules: [\n \"GET /admin.emoji.list\",\n \"GET /admin.teams.admins.list\",\n \"POST /admin.teams.list\",\n \"GET /admin.teams.owners.list\",\n \"POST /admin.teams.settings.info\",\n ],\n },\n {\n name: \"admin.teams:write\",\n description: \"Manage workspace settings in an Enterprise organization\",\n rules: [\n \"GET /admin.emoji.add\",\n \"GET /admin.emoji.addAlias\",\n \"GET /admin.emoji.remove\",\n \"GET /admin.emoji.rename\",\n \"POST /admin.teams.create\",\n \"GET /admin.teams.settings.setDefaultChannels\",\n \"POST /admin.teams.settings.setDescription\",\n \"POST /admin.teams.settings.setDiscoverability\",\n \"GET /admin.teams.settings.setIcon\",\n \"POST /admin.teams.settings.setName\",\n \"POST /admin.usergroups.addTeams\",\n ],\n },\n {\n name: \"admin.usergroups:read\",\n description: \"View user groups in an Enterprise organization\",\n rules: [\n \"POST /admin.usergroups.listChannels\",\n ],\n },\n {\n name: \"admin.usergroups:write\",\n description: \"Manage user groups in an Enterprise organization\",\n rules: [\n \"POST /admin.usergroups.addChannels\",\n \"POST /admin.usergroups.removeChannels\",\n ],\n },\n {\n name: \"admin.users:read\",\n description: \"View users in an Enterprise organization\",\n rules: [\n \"POST /admin.auth.policy.getEntities\",\n \"GET /admin.users.getExpiration\",\n \"POST /admin.users.list\",\n \"POST /admin.users.session.getSettings\",\n \"POST /admin.users.session.list\",\n \"POST /admin.users.unsupportedVersions.export\",\n ],\n },\n {\n name: \"admin.users:write\",\n description: \"Manage users in an Enterprise organization\",\n rules: [\n \"POST /admin.auth.policy.assignEntities\",\n \"POST /admin.auth.policy.removeEntities\",\n \"POST /admin.users.assign\",\n \"POST /admin.users.invite\",\n \"POST /admin.users.remove\",\n \"POST /admin.users.session.clearSettings\",\n \"POST /admin.users.session.invalidate\",\n \"POST /admin.users.session.reset\",\n \"POST /admin.users.session.resetBulk\",\n \"POST /admin.users.session.setSettings\",\n \"POST /admin.users.setAdmin\",\n \"POST /admin.users.setExpiration\",\n \"POST /admin.users.setOwner\",\n \"POST /admin.users.setRegular\",\n ],\n },\n {\n name: \"admin.workflows:read\",\n description: \"View workflow builder workflows in an Enterprise organization\",\n rules: [\n \"POST /admin.functions.list\",\n \"POST /admin.functions.permissions.lookup\",\n \"POST /admin.functions.permissions.set\",\n \"POST /admin.workflows.permissions.lookup\",\n \"POST /admin.workflows.search\",\n ],\n },\n {\n name: \"admin.workflows:write\",\n description: \"Manage workflow builder workflows in an Enterprise organization\",\n rules: [\n \"POST /admin.workflows.collaborators.add\",\n \"POST /admin.workflows.collaborators.remove\",\n \"POST /admin.workflows.unpublish\",\n ],\n },\n {\n name: \"assistant:write\",\n description: \"Act as an AI Assistant app\",\n rules: [\n \"POST /assistant.threads.setSuggestedPrompts\",\n \"POST /assistant.threads.setTitle\",\n ],\n },\n {\n name: \"bookmarks:read\",\n description: \"List bookmarks in channels\",\n rules: [\n \"POST /bookmarks.list\",\n \"POST /workflows.featured.list\",\n ],\n },\n {\n name: \"bookmarks:write\",\n description: \"Create, edit, and remove bookmarks\",\n rules: [\n \"POST /bookmarks.add\",\n \"POST /bookmarks.edit\",\n \"POST /bookmarks.remove\",\n \"POST /workflows.featured.add\",\n \"POST /workflows.featured.remove\",\n \"POST /workflows.featured.set\",\n ],\n },\n {\n name: \"calls:read\",\n description: \"View information about ongoing and past calls\",\n rules: [\n \"POST /calls.info\",\n ],\n },\n {\n name: \"calls:write\",\n description: \"Start and manage calls in a workspace\",\n rules: [\n \"POST /calls.add\",\n \"POST /calls.end\",\n \"POST /calls.participants.add\",\n \"POST /calls.participants.remove\",\n \"POST /calls.update\",\n ],\n },\n {\n name: \"canvases:read\",\n description: \"Access contents of canvases created inside Slack\",\n rules: [\n \"POST /canvases.sections.lookup\",\n ],\n },\n {\n name: \"canvases:write\",\n description: \"Create and edit canvases\",\n rules: [\n \"POST /canvases.access.delete\",\n \"POST /canvases.access.set\",\n \"POST /canvases.create\",\n \"POST /canvases.delete\",\n \"POST /canvases.edit\",\n \"POST /conversations.canvases.create\",\n ],\n },\n {\n name: \"channels:history\",\n description: \"View messages and other content in public channels that the app has been added to\",\n rules: [\n \"GET /conversations.history\",\n \"GET /conversations.replies\",\n ],\n },\n {\n name: \"channels:join\",\n description: \"Join public channels in a workspace\",\n rules: [\n \"POST /conversations.join\",\n ],\n },\n {\n name: \"channels:manage\",\n description: \"Manage public channels that the app has been added to and create new ones\",\n rules: [\n \"POST /conversations.archive\",\n \"POST /conversations.close\",\n \"POST /conversations.create\",\n \"POST /conversations.invite\",\n \"POST /conversations.kick\",\n \"POST /conversations.leave\",\n \"POST /conversations.mark\",\n \"POST /conversations.open\",\n \"POST /conversations.rename\",\n \"POST /conversations.setPurpose\",\n \"POST /conversations.setTopic\",\n \"POST /conversations.unarchive\",\n ],\n },\n {\n name: \"channels:read\",\n description: \"View basic information about public channels in a workspace\",\n rules: [\n \"GET /conversations.info\",\n \"GET /conversations.list\",\n \"GET /conversations.members\",\n \"GET /users.conversations\",\n ],\n },\n {\n name: \"channels:write\",\n description: \"Manage a user's public channels and create new ones on a user's behalf\",\n rules: [\n \"POST /conversations.archive\",\n \"POST /conversations.close\",\n \"POST /conversations.create\",\n \"POST /conversations.invite\",\n \"POST /conversations.join\",\n \"POST /conversations.kick\",\n \"POST /conversations.leave\",\n \"POST /conversations.mark\",\n \"POST /conversations.open\",\n \"POST /conversations.rename\",\n \"POST /conversations.setPurpose\",\n \"POST /conversations.setTopic\",\n \"POST /conversations.unarchive\",\n ],\n },\n {\n name: \"channels:write.invites\",\n description: \"Invite members to public channels\",\n rules: [\n \"POST /conversations.invite\",\n ],\n },\n {\n name: \"channels:write.topic\",\n description: \"Set the topic and purpose of public channels\",\n rules: [\n \"POST /conversations.setPurpose\",\n \"POST /conversations.setTopic\",\n ],\n },\n {\n name: \"chat:write\",\n description: \"Send messages as the app\",\n rules: [\n \"POST /assistant.threads.setStatus\",\n \"POST /chat.appendStream\",\n \"POST /chat.delete\",\n \"POST /chat.deleteScheduledMessage\",\n \"POST /chat.meMessage\",\n \"POST /chat.postEphemeral\",\n \"POST /chat.postMessage\",\n \"POST /chat.scheduleMessage\",\n \"POST /chat.startStream\",\n \"POST /chat.stopStream\",\n \"POST /chat.update\",\n ],\n },\n {\n name: \"client\",\n description: \"Full access to all client features (legacy, deprecated)\",\n rules: [\n \"POST /admin.workflows.triggers.types.permissions.lookup\",\n \"POST /admin.workflows.triggers.types.permissions.set\",\n ],\n },\n {\n name: \"conversations.connect:manage\",\n description: \"Manage Slack Connect channels (approve or decline invitations)\",\n rules: [\n \"POST /conversations.approveSharedInvite\",\n \"GET /conversations.declineSharedInvite\",\n \"POST /conversations.externalInvitePermissions.set\",\n \"POST /conversations.listConnectInvites\",\n \"POST /conversations.requestSharedInvite.approve\",\n \"POST /conversations.requestSharedInvite.deny\",\n \"POST /conversations.requestSharedInvite.list\",\n \"POST /team.externalTeams.disconnect\",\n \"GET /team.externalTeams.list\",\n \"POST /users.discoverableContacts.lookup\",\n ],\n },\n {\n name: \"conversations.connect:write\",\n description: \"Create Slack Connect invitations and accept invitations\",\n rules: [\n \"POST /conversations.acceptSharedInvite\",\n \"GET /conversations.inviteShared\",\n ],\n },\n {\n name: \"datastore:read\",\n description: \"Read data from Slack's hosted datastore\",\n rules: [\n \"POST /apps.datastore.bulkGet\",\n \"POST /apps.datastore.count\",\n \"POST /apps.datastore.get\",\n \"POST /apps.datastore.query\",\n ],\n },\n {\n name: \"datastore:write\",\n description: \"Write data to Slack's hosted datastore\",\n rules: [\n \"POST /apps.datastore.bulkDelete\",\n \"POST /apps.datastore.bulkPut\",\n \"POST /apps.datastore.delete\",\n \"POST /apps.datastore.put\",\n \"POST /apps.datastore.update\",\n ],\n },\n {\n name: \"dnd:read\",\n description: \"View Do Not Disturb settings for people in a workspace\",\n rules: [\n \"GET /dnd.info\",\n \"GET /dnd.teamInfo\",\n ],\n },\n {\n name: \"dnd:write\",\n description: \"Edit a user's Do Not Disturb settings\",\n rules: [\n \"POST /dnd.endDnd\",\n \"POST /dnd.endSnooze\",\n \"GET /dnd.setSnooze\",\n ],\n },\n {\n name: \"emoji:read\",\n description: \"View custom emoji in a workspace\",\n rules: [\n \"GET /emoji.list\",\n ],\n },\n {\n name: \"files:read\",\n description: \"View files shared in channels and conversations that the app has been added to\",\n rules: [\n \"GET /files.info\",\n \"GET /files.list\",\n ],\n },\n {\n name: \"files:write\",\n description: \"Upload, edit, and delete files as the app\",\n rules: [\n \"POST /files.comments.delete\",\n \"POST /files.completeUploadExternal\",\n \"POST /files.delete\",\n \"POST /files.getUploadURLExternal\",\n \"POST /files.revokePublicURL\",\n \"POST /files.sharedPublicURL\",\n \"POST /files.upload\",\n ],\n },\n {\n name: \"groups:history\",\n description: \"View messages and other content in private channels that the app has been added to\",\n rules: [\n \"GET /conversations.history\",\n \"GET /conversations.replies\",\n ],\n },\n {\n name: \"groups:read\",\n description: \"View basic information about private channels that the app has been added to\",\n rules: [\n \"GET /conversations.info\",\n \"GET /conversations.list\",\n \"GET /conversations.members\",\n \"GET /users.conversations\",\n ],\n },\n {\n name: \"groups:write\",\n description: \"Manage private channels that the user is a member of and create new ones\",\n rules: [\n \"POST /conversations.archive\",\n \"POST /conversations.close\",\n \"POST /conversations.create\",\n \"POST /conversations.invite\",\n \"POST /conversations.kick\",\n \"POST /conversations.leave\",\n \"POST /conversations.mark\",\n \"POST /conversations.open\",\n \"POST /conversations.rename\",\n \"POST /conversations.setPurpose\",\n \"POST /conversations.setTopic\",\n \"POST /conversations.unarchive\",\n ],\n },\n {\n name: \"groups:write.invites\",\n description: \"Invite members to private channels\",\n rules: [\n \"POST /conversations.invite\",\n ],\n },\n {\n name: \"groups:write.topic\",\n description: \"Set the topic and purpose of private channels\",\n rules: [\n \"POST /conversations.setPurpose\",\n \"POST /conversations.setTopic\",\n ],\n },\n {\n name: \"hosting:read\",\n description: \"Read hosting environment information\",\n rules: [\n \"POST /apps.activities.list\",\n ],\n },\n {\n name: \"identity:read\",\n description: \"View a user's Slack identity (Sign in with Slack)\",\n rules: [\n \"GET /users.identity\",\n ],\n },\n {\n name: \"im:history\",\n description: \"View messages and other content in direct messages that the app has been added to\",\n rules: [\n \"GET /conversations.history\",\n \"GET /conversations.replies\",\n ],\n },\n {\n name: \"im:read\",\n description: \"View basic information about direct messages that the app has access to\",\n rules: [\n \"GET /conversations.info\",\n \"GET /conversations.list\",\n \"GET /conversations.members\",\n \"GET /users.conversations\",\n ],\n },\n {\n name: \"im:write\",\n description: \"Start direct messages with people\",\n rules: [\n \"POST /conversations.archive\",\n \"POST /conversations.close\",\n \"POST /conversations.create\",\n \"POST /conversations.invite\",\n \"POST /conversations.kick\",\n \"POST /conversations.leave\",\n \"POST /conversations.mark\",\n \"POST /conversations.open\",\n \"POST /conversations.rename\",\n \"POST /conversations.setPurpose\",\n \"POST /conversations.setTopic\",\n \"POST /conversations.unarchive\",\n ],\n },\n {\n name: \"im:write.topic\",\n description: \"Set the topic of direct messages\",\n rules: [\n \"POST /conversations.setPurpose\",\n \"POST /conversations.setTopic\",\n ],\n },\n {\n name: \"links:write\",\n description: \"Show previews of URLs in messages\",\n rules: [\n \"POST /chat.unfurl\",\n ],\n },\n {\n name: \"lists:read\",\n description: \"View lists in a workspace\",\n rules: [\n \"POST /slackLists.download.get\",\n \"POST /slackLists.download.start\",\n \"POST /slackLists.items.info\",\n \"POST /slackLists.items.list\",\n ],\n },\n {\n name: \"lists:write\",\n description: \"Create and manage lists in a workspace\",\n rules: [\n \"POST /slackLists.access.delete\",\n \"POST /slackLists.access.set\",\n \"POST /slackLists.create\",\n \"POST /slackLists.items.create\",\n \"POST /slackLists.items.delete\",\n \"POST /slackLists.items.deleteMultiple\",\n \"POST /slackLists.items.update\",\n \"POST /slackLists.update\",\n ],\n },\n {\n name: \"mpim:history\",\n description: \"View messages and other content in group direct messages that the app has been added to\",\n rules: [\n \"GET /conversations.history\",\n \"GET /conversations.replies\",\n ],\n },\n {\n name: \"mpim:read\",\n description: \"View basic information about group direct messages that the app has been added to\",\n rules: [\n \"GET /conversations.info\",\n \"GET /conversations.list\",\n \"GET /conversations.members\",\n \"GET /users.conversations\",\n ],\n },\n {\n name: \"mpim:write\",\n description: \"Start group direct messages with people\",\n rules: [\n \"POST /conversations.archive\",\n \"POST /conversations.close\",\n \"POST /conversations.create\",\n \"POST /conversations.invite\",\n \"POST /conversations.kick\",\n \"POST /conversations.leave\",\n \"POST /conversations.mark\",\n \"POST /conversations.open\",\n \"POST /conversations.rename\",\n \"POST /conversations.setPurpose\",\n \"POST /conversations.setTopic\",\n \"POST /conversations.unarchive\",\n ],\n },\n {\n name: \"mpim:write.topic\",\n description: \"Set the topic and purpose of group direct messages\",\n rules: [\n \"POST /conversations.setPurpose\",\n \"POST /conversations.setTopic\",\n ],\n },\n {\n name: \"openid\",\n description: \"View information about a user's identity (Sign in with Slack)\",\n rules: [\n \"POST /openid.connect.userInfo\",\n ],\n },\n {\n name: \"pins:read\",\n description: \"View pinned content in channels and conversations that the app has been added to\",\n rules: [\n \"GET /pins.list\",\n ],\n },\n {\n name: \"pins:write\",\n description: \"Add and remove pinned messages and files\",\n rules: [\n \"POST /pins.add\",\n \"POST /pins.remove\",\n ],\n },\n {\n name: \"reactions:read\",\n description: \"View emoji reactions and their associated content in channels and conversations\",\n rules: [\n \"GET /reactions.get\",\n \"GET /reactions.list\",\n ],\n },\n {\n name: \"reactions:write\",\n description: \"Add and edit emoji reactions\",\n rules: [\n \"POST /reactions.add\",\n \"POST /reactions.remove\",\n ],\n },\n {\n name: \"reminders:read\",\n description: \"View reminders created by the app\",\n rules: [\n \"GET /reminders.info\",\n \"GET /reminders.list\",\n ],\n },\n {\n name: \"reminders:write\",\n description: \"Add, remove, or complete reminders\",\n rules: [\n \"POST /reminders.add\",\n \"POST /reminders.complete\",\n \"POST /reminders.delete\",\n ],\n },\n {\n name: \"remote_files:read\",\n description: \"View remote files added by the app in a workspace\",\n rules: [\n \"GET /files.remote.info\",\n \"GET /files.remote.list\",\n ],\n },\n {\n name: \"remote_files:share\",\n description: \"Share remote files on a user's behalf\",\n rules: [\n \"GET /files.remote.share\",\n ],\n },\n {\n name: \"remote_files:write\",\n description: \"Add, edit, and delete remote files on a user's behalf\",\n rules: [\n \"POST /files.remote.add\",\n \"POST /files.remote.remove\",\n \"POST /files.remote.update\",\n ],\n },\n {\n name: \"search:read\",\n description: \"Search a workspace's content\",\n rules: [\n \"POST /assistant.search.info\",\n \"GET /search.all\",\n \"GET /search.files\",\n \"GET /search.messages\",\n ],\n },\n {\n name: \"search:read.files\",\n description: \"Search for files in a workspace\",\n rules: [\n \"POST /assistant.search.context\",\n ],\n },\n {\n name: \"search:read.im\",\n description: \"Search direct messages\",\n rules: [\n \"POST /assistant.search.context\",\n ],\n },\n {\n name: \"search:read.mpim\",\n description: \"Search group direct messages\",\n rules: [\n \"POST /assistant.search.context\",\n ],\n },\n {\n name: \"search:read.private\",\n description: \"Search private channels\",\n rules: [\n \"POST /assistant.search.context\",\n ],\n },\n {\n name: \"search:read.public\",\n description: \"Search public channels\",\n rules: [\n \"POST /assistant.search.context\",\n \"POST /assistant.search.info\",\n ],\n },\n {\n name: \"search:read.users\",\n description: \"Search for users in a workspace\",\n rules: [\n \"POST /assistant.search.context\",\n ],\n },\n {\n name: \"stars:read\",\n description: \"View starred messages and files\",\n rules: [\n \"GET /stars.list\",\n ],\n },\n {\n name: \"stars:write\",\n description: \"Add or remove stars (saved items)\",\n rules: [\n \"POST /stars.add\",\n \"POST /stars.remove\",\n ],\n },\n {\n name: \"team.billing:read\",\n description: \"View billing information for a workspace\",\n rules: [\n \"POST /team.billing.info\",\n ],\n },\n {\n name: \"team.preferences:read\",\n description: \"View team preferences\",\n rules: [\n \"POST /team.preferences.list\",\n ],\n },\n {\n name: \"team:read\",\n description: \"View the name, email domain, and icon for workspaces the app is connected to\",\n rules: [\n \"GET /team.externalTeams.list\",\n \"GET /team.info\",\n \"POST /users.discoverableContacts.lookup\",\n ],\n },\n {\n name: \"tokens.basic\",\n description: \"Execute methods with no required scope\",\n rules: [\n \"GET /migration.exchange\",\n ],\n },\n {\n name: \"triggers:read\",\n description: \"View triggers in a workspace\",\n rules: [\n \"POST /workflows.triggers.permissions.list\",\n ],\n },\n {\n name: \"triggers:write\",\n description: \"Create and manage triggers in a workspace\",\n rules: [\n \"POST /workflows.triggers.permissions.add\",\n \"POST /workflows.triggers.permissions.remove\",\n \"POST /workflows.triggers.permissions.set\",\n ],\n },\n {\n name: \"usergroups:read\",\n description: \"View user groups in a workspace\",\n rules: [\n \"GET /usergroups.list\",\n \"GET /usergroups.users.list\",\n ],\n },\n {\n name: \"usergroups:write\",\n description: \"Create and manage user groups\",\n rules: [\n \"POST /usergroups.create\",\n \"POST /usergroups.disable\",\n \"POST /usergroups.enable\",\n \"POST /usergroups.update\",\n \"POST /usergroups.users.update\",\n ],\n },\n {\n name: \"users.profile:read\",\n description: \"View profile details of people in a workspace\",\n rules: [\n \"GET /team.profile.get\",\n \"GET /users.profile.get\",\n ],\n },\n {\n name: \"users.profile:write\",\n description: \"Edit a user's profile information and status\",\n rules: [\n \"GET /users.deletePhoto\",\n \"POST /users.profile.set\",\n \"POST /users.setPhoto\",\n ],\n },\n {\n name: \"users:read\",\n description: \"View people in a workspace\",\n rules: [\n \"GET /bots.info\",\n \"GET /users.getPresence\",\n \"GET /users.info\",\n \"GET /users.list\",\n ],\n },\n {\n name: \"users:read.email\",\n description: \"View email addresses of people in a workspace\",\n rules: [\n \"GET /users.lookupByEmail\",\n ],\n },\n {\n name: \"users:write\",\n description: \"Set a user's presence status\",\n rules: [\n \"POST /apps.user.connection.update\",\n \"POST /users.setActive\",\n \"POST /users.setPresence\",\n ],\n },\n {\n name: \"no_scopes_required\",\n description: \"Methods that require a valid token but no specific scope\",\n rules: [\n \"POST /api.test\",\n \"POST /apps.auth.external.delete\",\n \"POST /apps.auth.external.get\",\n \"POST /apps.connections.open\",\n \"POST /apps.event.authorizations.list\",\n \"POST /apps.manifest.create\",\n \"POST /apps.manifest.delete\",\n \"POST /apps.manifest.export\",\n \"POST /apps.manifest.update\",\n \"POST /apps.manifest.validate\",\n \"POST /apps.uninstall\",\n \"GET /auth.revoke\",\n \"POST /auth.teams.list\",\n \"POST /auth.test\",\n \"GET /chat.getPermalink\",\n \"POST /chat.scheduledMessages.list\",\n \"POST /dialog.open\",\n \"POST /functions.completeError\",\n \"POST /functions.completeSuccess\",\n \"POST /functions.distributions.permissions.add\",\n \"POST /functions.distributions.permissions.list\",\n \"POST /functions.distributions.permissions.remove\",\n \"POST /functions.distributions.permissions.set\",\n \"POST /functions.workflows.steps.list\",\n \"POST /functions.workflows.steps.responses.export\",\n \"POST /oauth.access\",\n \"POST /oauth.v2.access\",\n \"POST /oauth.v2.exchange\",\n \"POST /oauth.v2.user.access\",\n \"POST /openid.connect.token\",\n \"GET /rtm.connect\",\n \"GET /rtm.start\",\n \"POST /tooling.tokens.rotate\",\n \"POST /views.open\",\n \"POST /views.publish\",\n \"POST /views.push\",\n \"POST /views.update\",\n ],\n },\n ],\n },\n {\n base: \"https://files.slack.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.SLACK_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"files:read\",\n description: \"Download files from Slack\",\n rules: [\n \"GET /{path+}\",\n ],\n },\n ],\n },\n ],\n} as const satisfies FirewallConfig;\n\nexport const slackDefaultAllowed: ReadonlyArray<\n PermissionNamesOf<typeof slackFirewall>\n> = [\n \"bookmarks:read\",\n \"channels:history\",\n \"channels:read\",\n \"emoji:read\",\n \"pins:read\",\n \"reactions:read\",\n \"search:read\",\n \"team:read\",\n \"usergroups:read\",\n \"users.profile:read\",\n \"users:read\",\n];\n\n\nexport const slackCategories: Record<\n PermissionNamesOf<typeof slackFirewall>,\n string\n> = {\n // — Read (37) —\n \"bookmarks:read\": \"Read\",\n \"calls:read\": \"Read\",\n \"canvases:read\": \"Read\",\n \"channels:history\": \"Read\",\n \"channels:read\": \"Read\",\n \"datastore:read\": \"Read\",\n \"dnd:read\": \"Read\",\n \"emoji:read\": \"Read\",\n \"files:read\": \"Read\",\n \"groups:history\": \"Read\",\n \"groups:read\": \"Read\",\n \"hosting:read\": \"Read\",\n \"identity:read\": \"Read\",\n \"im:history\": \"Read\",\n \"im:read\": \"Read\",\n \"lists:read\": \"Read\",\n \"mpim:history\": \"Read\",\n \"mpim:read\": \"Read\",\n \"pins:read\": \"Read\",\n \"reactions:read\": \"Read\",\n \"reminders:read\": \"Read\",\n \"remote_files:read\": \"Read\",\n \"search:read\": \"Read\",\n \"search:read.files\": \"Read\",\n \"search:read.im\": \"Read\",\n \"search:read.mpim\": \"Read\",\n \"search:read.private\": \"Read\",\n \"search:read.public\": \"Read\",\n \"search:read.users\": \"Read\",\n \"stars:read\": \"Read\",\n \"team.preferences:read\": \"Read\",\n \"team:read\": \"Read\",\n \"triggers:read\": \"Read\",\n \"usergroups:read\": \"Read\",\n \"users.profile:read\": \"Read\",\n \"users:read\": \"Read\",\n \"users:read.email\": \"Read\",\n // — Write (23) —\n \"bookmarks:write\": \"Write\",\n \"calls:write\": \"Write\",\n \"canvases:write\": \"Write\",\n \"channels:write\": \"Write\",\n \"channels:write.invites\": \"Write\",\n \"channels:write.topic\": \"Write\",\n \"datastore:write\": \"Write\",\n \"dnd:write\": \"Write\",\n \"groups:write\": \"Write\",\n \"groups:write.invites\": \"Write\",\n \"groups:write.topic\": \"Write\",\n \"im:write.topic\": \"Write\",\n \"links:write\": \"Write\",\n \"lists:write\": \"Write\",\n \"pins:write\": \"Write\",\n \"reactions:write\": \"Write\",\n \"reminders:write\": \"Write\",\n \"remote_files:write\": \"Write\",\n \"stars:write\": \"Write\",\n \"triggers:write\": \"Write\",\n \"usergroups:write\": \"Write\",\n \"users.profile:write\": \"Write\",\n \"users:write\": \"Write\",\n // — Send (8) —\n \"assistant:write\": \"Send\",\n \"chat:write\": \"Send\",\n \"conversations.connect:write\": \"Send\",\n \"files:write\": \"Send\",\n \"im:write\": \"Send\",\n \"mpim:write\": \"Send\",\n \"mpim:write.topic\": \"Send\",\n \"remote_files:share\": \"Send\",\n // — Admin (25) —\n \"admin\": \"Admin\",\n \"admin.analytics:read\": \"Admin\",\n \"admin.app_activities:read\": \"Admin\",\n \"admin.apps:read\": \"Admin\",\n \"admin.apps:write\": \"Admin\",\n \"admin.barriers:read\": \"Admin\",\n \"admin.barriers:write\": \"Admin\",\n \"admin.conversations:manage_objects\": \"Admin\",\n \"admin.conversations:read\": \"Admin\",\n \"admin.conversations:write\": \"Admin\",\n \"admin.invites:read\": \"Admin\",\n \"admin.invites:write\": \"Admin\",\n \"admin.roles:read\": \"Admin\",\n \"admin.roles:write\": \"Admin\",\n \"admin.teams:read\": \"Admin\",\n \"admin.teams:write\": \"Admin\",\n \"admin.usergroups:read\": \"Admin\",\n \"admin.usergroups:write\": \"Admin\",\n \"admin.users:read\": \"Admin\",\n \"admin.users:write\": \"Admin\",\n \"admin.workflows:read\": \"Admin\",\n \"admin.workflows:write\": \"Admin\",\n \"channels:manage\": \"Admin\",\n \"conversations.connect:manage\": \"Admin\",\n \"team.billing:read\": \"Admin\",\n // — Misc (5) —\n \"channels:join\": \"Misc\",\n \"client\": \"Misc\",\n \"openid\": \"Misc\",\n \"tokens.basic\": \"Misc\",\n \"no_scopes_required\": \"Misc\",\n};\n\nexport const slackCategoryOrder = [\"Read\", \"Write\", \"Send\", \"Admin\", \"Misc\"] as const;\n","// Auto-generated from Vercel's official OpenAPI spec.\n// Source: https://openapi.vercel.sh/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:vercel\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\nimport type { PermissionNamesOf } from \"./index\";\n\nexport const vercelFirewall = {\n name: \"vercel\",\n description: \"Vercel API\",\n placeholders: {\n VERCEL_TOKEN: \"vcp_CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeL\",\n },\n apis: [\n {\n base: \"https://api.vercel.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.VERCEL_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"access-groups:read\",\n rules: [\n \"GET /v1/access-groups\",\n \"GET /v1/access-groups/{accessGroupIdOrName}/projects/{projectId}\",\n \"GET /v1/access-groups/{idOrName}\",\n \"GET /v1/access-groups/{idOrName}/members\",\n \"GET /v1/access-groups/{idOrName}/projects\",\n ],\n },\n {\n name: \"access-groups:write\",\n rules: [\n \"POST /v1/access-groups\",\n \"POST /v1/access-groups/{accessGroupIdOrName}/projects\",\n \"PATCH /v1/access-groups/{accessGroupIdOrName}/projects/{projectId}\",\n \"DELETE /v1/access-groups/{accessGroupIdOrName}/projects/{projectId}\",\n \"POST /v1/access-groups/{idOrName}\",\n \"DELETE /v1/access-groups/{idOrName}\",\n ],\n },\n {\n name: \"aliases:read\",\n rules: [\n \"GET /v2/deployments/{id}/aliases\",\n \"GET /v4/aliases\",\n \"GET /v4/aliases/{idOrAlias}\",\n ],\n },\n {\n name: \"aliases:write\",\n rules: [\n \"PATCH /aliases/{id}/protection-bypass\",\n \"DELETE /v2/aliases/{aliasId}\",\n \"POST /v2/deployments/{id}/aliases\",\n ],\n },\n {\n name: \"api-observability:read\",\n rules: [\n \"GET /v1/observability/manage/configuration/projects\",\n ],\n },\n {\n name: \"api-observability:write\",\n rules: [\n \"PUT /v1/observability/manage/configuration/projects/{projectIdOrName}\",\n ],\n },\n {\n name: \"artifacts:read\",\n rules: [\n \"GET /v8/artifacts/status\",\n \"GET /v8/artifacts/{hash}\",\n \"HEAD /v8/artifacts/{hash}\",\n ],\n },\n {\n name: \"artifacts:write\",\n rules: [\n \"POST /v8/artifacts\",\n \"POST /v8/artifacts/events\",\n \"PUT /v8/artifacts/{hash}\",\n ],\n },\n {\n name: \"authentication:read\",\n rules: [\n \"GET /v5/user/tokens/{tokenId}\",\n \"GET /v6/user/tokens\",\n ],\n },\n {\n name: \"authentication:write\",\n rules: [\n \"POST /v3/user/tokens\",\n \"DELETE /v3/user/tokens/{tokenId}\",\n ],\n },\n {\n name: \"billing:read\",\n rules: [\n \"GET /v1/billing/charges\",\n \"GET /v1/billing/contract-commitments\",\n ],\n },\n {\n name: \"billing:write\",\n rules: [\n \"POST /v1/billing/buy\",\n ],\n },\n {\n name: \"bulk-redirects:read\",\n rules: [\n \"GET /v1/bulk-redirects\",\n \"GET /v1/bulk-redirects/versions\",\n ],\n },\n {\n name: \"bulk-redirects:write\",\n rules: [\n \"PUT /v1/bulk-redirects\",\n \"PATCH /v1/bulk-redirects\",\n \"DELETE /v1/bulk-redirects\",\n \"POST /v1/bulk-redirects/restore\",\n \"POST /v1/bulk-redirects/versions\",\n ],\n },\n {\n name: \"certs:read\",\n rules: [\n \"GET /v8/certs/{id}\",\n ],\n },\n {\n name: \"certs:write\",\n rules: [\n \"POST /v8/certs\",\n \"PUT /v8/certs\",\n \"DELETE /v8/certs/{id}\",\n ],\n },\n {\n name: \"checks-v2:read\",\n rules: [\n \"GET /v2/deployments/{deploymentId}/check-runs\",\n \"GET /v2/deployments/{deploymentId}/check-runs/{checkRunId}\",\n \"GET /v2/projects/{projectIdOrName}/checks\",\n \"GET /v2/projects/{projectIdOrName}/checks/{checkId}\",\n \"GET /v2/projects/{projectIdOrName}/checks/{checkId}/runs\",\n ],\n },\n {\n name: \"checks-v2:write\",\n rules: [\n \"POST /v2/deployments/{deploymentId}/check-runs\",\n \"PATCH /v2/deployments/{deploymentId}/check-runs/{checkRunId}\",\n \"POST /v2/projects/{projectIdOrName}/checks\",\n \"PATCH /v2/projects/{projectIdOrName}/checks/{checkId}\",\n \"DELETE /v2/projects/{projectIdOrName}/checks/{checkId}\",\n ],\n },\n {\n name: \"checks:read\",\n rules: [\n \"GET /v1/deployments/{deploymentId}/checks\",\n \"GET /v1/deployments/{deploymentId}/checks/{checkId}\",\n ],\n },\n {\n name: \"checks:write\",\n rules: [\n \"POST /v1/deployments/{deploymentId}/checks\",\n \"PATCH /v1/deployments/{deploymentId}/checks/{checkId}\",\n \"POST /v1/deployments/{deploymentId}/checks/{checkId}/rerequest\",\n ],\n },\n {\n name: \"connect:read\",\n rules: [\n \"GET /v1/connect/networks\",\n \"GET /v1/connect/networks/{networkId}\",\n ],\n },\n {\n name: \"connect:write\",\n rules: [\n \"POST /v1/connect/networks\",\n \"PATCH /v1/connect/networks/{networkId}\",\n \"DELETE /v1/connect/networks/{networkId}\",\n \"PATCH /v1/projects/{idOrName}/shared-connect-links\",\n ],\n },\n {\n name: \"deployments:read\",\n rules: [\n \"GET /v13/deployments/{idOrUrl}\",\n \"GET /v3/deployments/{idOrUrl}/events\",\n \"GET /v6/deployments\",\n \"GET /v6/deployments/{id}/files\",\n \"GET /v8/deployments/{id}/files/{fileId}\",\n ],\n },\n {\n name: \"deployments:write\",\n rules: [\n \"PATCH /v1/deployments/{deploymentId}/integrations/{integrationConfigurationId}/resources/{resourceId}/actions/{action}\",\n \"PATCH /v12/deployments/{id}/cancel\",\n \"POST /v13/deployments\",\n \"DELETE /v13/deployments/{id}\",\n \"POST /v2/files\",\n ],\n },\n {\n name: \"dns:read\",\n rules: [\n \"GET /v5/domains/{domain}/records\",\n ],\n },\n {\n name: \"dns:write\",\n rules: [\n \"PATCH /v1/domains/records/{recordId}\",\n \"POST /v2/domains/{domain}/records\",\n \"DELETE /v2/domains/{domain}/records/{recordId}\",\n ],\n },\n {\n name: \"domains-registrar:read\",\n rules: [\n \"GET /v1/registrar/domains/{domain}/auth-code\",\n \"GET /v1/registrar/domains/{domain}/availability\",\n \"GET /v1/registrar/domains/{domain}/contact-info/schema\",\n \"GET /v1/registrar/domains/{domain}/price\",\n \"GET /v1/registrar/domains/{domain}/transfer\",\n \"GET /v1/registrar/orders/{orderId}\",\n \"GET /v1/registrar/tlds/supported\",\n \"GET /v1/registrar/tlds/{tld}\",\n \"GET /v1/registrar/tlds/{tld}/price\",\n ],\n },\n {\n name: \"domains-registrar:write\",\n rules: [\n \"POST /v1/registrar/domains/availability\",\n \"POST /v1/registrar/domains/buy\",\n \"PATCH /v1/registrar/domains/{domain}/auto-renew\",\n \"POST /v1/registrar/domains/{domain}/buy\",\n \"PATCH /v1/registrar/domains/{domain}/nameservers\",\n \"POST /v1/registrar/domains/{domain}/renew\",\n \"POST /v1/registrar/domains/{domain}/transfer\",\n ],\n },\n {\n name: \"domains:read\",\n rules: [\n \"GET /v5/domains\",\n \"GET /v5/domains/{domain}\",\n \"GET /v6/domains/{domain}/config\",\n ],\n },\n {\n name: \"domains:write\",\n rules: [\n \"PATCH /v3/domains/{domain}\",\n \"DELETE /v6/domains/{domain}\",\n \"POST /v7/domains\",\n ],\n },\n {\n name: \"drains:read\",\n rules: [\n \"GET /v1/drains\",\n \"GET /v1/drains/{id}\",\n ],\n },\n {\n name: \"drains:write\",\n rules: [\n \"POST /v1/drains\",\n \"POST /v1/drains/test\",\n \"PATCH /v1/drains/{id}\",\n \"DELETE /v1/drains/{id}\",\n ],\n },\n {\n name: \"edge-cache:write\",\n rules: [\n \"POST /v1/edge-cache/dangerously-delete-by-src-images\",\n \"POST /v1/edge-cache/dangerously-delete-by-tags\",\n \"POST /v1/edge-cache/invalidate-by-src-images\",\n \"POST /v1/edge-cache/invalidate-by-tags\",\n ],\n },\n {\n name: \"edge-config:read\",\n rules: [\n \"GET /v1/edge-config\",\n \"GET /v1/edge-config/{edgeConfigId}\",\n \"GET /v1/edge-config/{edgeConfigId}/backups\",\n \"GET /v1/edge-config/{edgeConfigId}/backups/{edgeConfigBackupVersionId}\",\n \"GET /v1/edge-config/{edgeConfigId}/item/{edgeConfigItemKey}\",\n \"GET /v1/edge-config/{edgeConfigId}/items\",\n \"GET /v1/edge-config/{edgeConfigId}/schema\",\n \"GET /v1/edge-config/{edgeConfigId}/token/{token}\",\n \"GET /v1/edge-config/{edgeConfigId}/tokens\",\n ],\n },\n {\n name: \"edge-config:write\",\n rules: [\n \"POST /v1/edge-config\",\n \"PUT /v1/edge-config/{edgeConfigId}\",\n \"DELETE /v1/edge-config/{edgeConfigId}\",\n \"PATCH /v1/edge-config/{edgeConfigId}/items\",\n \"POST /v1/edge-config/{edgeConfigId}/schema\",\n \"DELETE /v1/edge-config/{edgeConfigId}/schema\",\n \"POST /v1/edge-config/{edgeConfigId}/token\",\n \"DELETE /v1/edge-config/{edgeConfigId}/tokens\",\n ],\n },\n {\n name: \"environment:read\",\n rules: [\n \"GET /v1/env\",\n \"GET /v1/env/{id}\",\n \"GET /v9/projects/{idOrName}/custom-environments\",\n \"GET /v9/projects/{idOrName}/custom-environments/{environmentSlugOrId}\",\n ],\n },\n {\n name: \"environment:write\",\n rules: [\n \"POST /v1/env\",\n \"PATCH /v1/env\",\n \"DELETE /v1/env\",\n \"PATCH /v1/env/{id}/unlink/{projectId}\",\n \"POST /v9/projects/{idOrName}/custom-environments\",\n \"PATCH /v9/projects/{idOrName}/custom-environments/{environmentSlugOrId}\",\n \"DELETE /v9/projects/{idOrName}/custom-environments/{environmentSlugOrId}\",\n ],\n },\n {\n name: \"feature-flags:read\",\n rules: [\n \"GET /v1/deployments/{deploymentId}/feature-flags\",\n \"GET /v1/projects/{projectIdOrName}/feature-flags/flags\",\n \"GET /v1/projects/{projectIdOrName}/feature-flags/flags/{flagIdOrSlug}\",\n \"GET /v1/projects/{projectIdOrName}/feature-flags/flags/{flagIdOrSlug}/versions\",\n \"GET /v1/projects/{projectIdOrName}/feature-flags/sdk-keys\",\n \"GET /v1/projects/{projectIdOrName}/feature-flags/segments\",\n \"GET /v1/projects/{projectIdOrName}/feature-flags/segments/{segmentIdOrSlug}\",\n \"GET /v1/projects/{projectIdOrName}/feature-flags/settings\",\n \"GET /v1/teams/{teamId}/feature-flags/flags\",\n \"GET /v1/teams/{teamId}/feature-flags/settings\",\n ],\n },\n {\n name: \"feature-flags:write\",\n rules: [\n \"PUT /v1/projects/{projectIdOrName}/feature-flags/flags\",\n \"PATCH /v1/projects/{projectIdOrName}/feature-flags/flags/{flagIdOrSlug}\",\n \"DELETE /v1/projects/{projectIdOrName}/feature-flags/flags/{flagIdOrSlug}\",\n \"PUT /v1/projects/{projectIdOrName}/feature-flags/sdk-keys\",\n \"DELETE /v1/projects/{projectIdOrName}/feature-flags/sdk-keys/{hashKey}\",\n \"PUT /v1/projects/{projectIdOrName}/feature-flags/segments\",\n \"PATCH /v1/projects/{projectIdOrName}/feature-flags/segments/{segmentIdOrSlug}\",\n \"DELETE /v1/projects/{projectIdOrName}/feature-flags/segments/{segmentIdOrSlug}\",\n \"PATCH /v1/projects/{projectIdOrName}/feature-flags/settings\",\n ],\n },\n {\n name: \"integrations:read\",\n rules: [\n \"GET /v1/integrations/configuration/{id}\",\n \"GET /v1/integrations/configuration/{id}/products\",\n \"GET /v1/integrations/configurations\",\n \"GET /v1/integrations/git-namespaces\",\n \"GET /v1/integrations/integration/{integrationIdOrSlug}/products/{productIdOrSlug}/plans\",\n \"GET /v1/integrations/search-repo\",\n ],\n },\n {\n name: \"integrations:write\",\n rules: [\n \"PATCH /v1/deployments/{deploymentId}/integrations/{integrationConfigurationId}/resources/{resourceId}/actions/{action}\",\n \"DELETE /v1/integrations/configuration/{id}\",\n \"POST /v1/integrations/installations/{integrationConfigurationId}/resources/{resourceId}/connections\",\n \"POST /v1/storage/stores/integration/direct\",\n ],\n },\n {\n name: \"logDrains:read\",\n rules: [\n \"GET /v1/log-drains\",\n \"GET /v1/log-drains/{id}\",\n \"GET /v2/integrations/log-drains\",\n ],\n },\n {\n name: \"logDrains:write\",\n rules: [\n \"DELETE /v1/integrations/log-drains/{id}\",\n \"POST /v1/log-drains\",\n \"DELETE /v1/log-drains/{id}\",\n \"POST /v2/integrations/log-drains\",\n ],\n },\n {\n name: \"logs:read\",\n rules: [\n \"GET /v1/projects/{projectId}/deployments/{deploymentId}/runtime-logs\",\n ],\n },\n {\n name: \"marketplace:read\",\n rules: [\n \"GET /v1/installations/{integrationConfigurationId}/account\",\n \"GET /v1/installations/{integrationConfigurationId}/billing/invoices/{invoiceId}\",\n \"GET /v1/installations/{integrationConfigurationId}/member/{memberId}\",\n \"GET /v1/installations/{integrationConfigurationId}/resources\",\n \"GET /v1/installations/{integrationConfigurationId}/resources/{resourceId}\",\n \"GET /v1/installations/{integrationConfigurationId}/resources/{resourceId}/experimentation/edge-config\",\n \"HEAD /v1/installations/{integrationConfigurationId}/resources/{resourceId}/experimentation/edge-config\",\n ],\n },\n {\n name: \"marketplace:write\",\n rules: [\n \"PATCH /v1/installations/{integrationConfigurationId}\",\n \"POST /v1/installations/{integrationConfigurationId}/billing\",\n \"POST /v1/installations/{integrationConfigurationId}/billing/balance\",\n \"POST /v1/installations/{integrationConfigurationId}/billing/finalize\",\n \"POST /v1/installations/{integrationConfigurationId}/billing/invoices\",\n \"POST /v1/installations/{integrationConfigurationId}/billing/invoices/{invoiceId}/actions\",\n \"POST /v1/installations/{integrationConfigurationId}/events\",\n \"PUT /v1/installations/{integrationConfigurationId}/products/{integrationProductIdOrSlug}/resources/{resourceId}/secrets\",\n \"PUT /v1/installations/{integrationConfigurationId}/resources/{resourceId}\",\n \"PATCH /v1/installations/{integrationConfigurationId}/resources/{resourceId}\",\n \"DELETE /v1/installations/{integrationConfigurationId}/resources/{resourceId}\",\n \"PUT /v1/installations/{integrationConfigurationId}/resources/{resourceId}/experimentation/edge-config\",\n \"POST /v1/installations/{integrationConfigurationId}/resources/{resourceId}/experimentation/items\",\n \"PATCH /v1/installations/{integrationConfigurationId}/resources/{resourceId}/experimentation/items/{itemId}\",\n \"DELETE /v1/installations/{integrationConfigurationId}/resources/{resourceId}/experimentation/items/{itemId}\",\n \"PUT /v1/installations/{integrationConfigurationId}/resources/{resourceId}/secrets\",\n ],\n },\n {\n name: \"microfrontends:read\",\n rules: [\n \"GET /v1/microfrontends/groups\",\n \"GET /v1/microfrontends/groups/{groupId}/projects\",\n \"GET /v1/microfrontends/projects/{projectIdOrName}/production-mfe-config\",\n \"GET /v1/microfrontends/{deploymentId}/config\",\n ],\n },\n {\n name: \"microfrontends:write\",\n rules: [\n \"POST /v1/microfrontends/group\",\n ],\n },\n {\n name: \"project-routes:read\",\n rules: [\n \"GET /v1/projects/{projectId}/routes\",\n \"GET /v1/projects/{projectId}/routes/versions\",\n ],\n },\n {\n name: \"project-routes:write\",\n rules: [\n \"POST /v1/projects/{projectId}/routes\",\n \"PUT /v1/projects/{projectId}/routes\",\n \"DELETE /v1/projects/{projectId}/routes\",\n \"POST /v1/projects/{projectId}/routes/generate\",\n \"POST /v1/projects/{projectId}/routes/versions\",\n \"PATCH /v1/projects/{projectId}/routes/{routeId}\",\n ],\n },\n {\n name: \"projectMembers:read\",\n rules: [\n \"GET /v1/projects/{idOrName}/members\",\n ],\n },\n {\n name: \"projectMembers:write\",\n rules: [\n \"POST /v1/projects/{idOrName}/members\",\n \"DELETE /v1/projects/{idOrName}/members/{uid}\",\n ],\n },\n {\n name: \"projects:read\",\n rules: [\n \"GET /v1/projects/{idOrName}/env/{id}\",\n \"GET /v1/projects/{projectId}/promote/aliases\",\n \"GET /v10/projects\",\n \"GET /v10/projects/{idOrName}/env\",\n \"GET /v9/projects/{idOrName}\",\n \"GET /v9/projects/{idOrName}/domains\",\n \"GET /v9/projects/{idOrName}/domains/{domain}\",\n ],\n },\n {\n name: \"projects:write\",\n rules: [\n \"PUT /projects/transfer-request/{code}\",\n \"POST /projects/{idOrName}/transfer-request\",\n \"POST /v1/projects/{idOrName}/domains/{domain}/move\",\n \"DELETE /v1/projects/{idOrName}/env\",\n \"PATCH /v1/projects/{idOrName}/protection-bypass\",\n \"PATCH /v1/projects/{projectId}/microfrontends\",\n \"POST /v1/projects/{projectId}/pause\",\n \"POST /v1/projects/{projectId}/rollback/{deploymentId}\",\n \"POST /v1/projects/{projectId}/unpause\",\n \"POST /v10/projects/{idOrName}/domains\",\n \"POST /v10/projects/{idOrName}/env\",\n \"POST /v10/projects/{projectId}/promote/{deploymentId}\",\n \"POST /v11/projects\",\n \"PATCH /v9/projects/{idOrName}\",\n \"DELETE /v9/projects/{idOrName}\",\n \"PATCH /v9/projects/{idOrName}/domains/{domain}\",\n \"DELETE /v9/projects/{idOrName}/domains/{domain}\",\n \"POST /v9/projects/{idOrName}/domains/{domain}/verify\",\n \"PATCH /v9/projects/{idOrName}/env/{id}\",\n \"DELETE /v9/projects/{idOrName}/env/{id}\",\n ],\n },\n {\n name: \"rolling-release:read\",\n rules: [\n \"GET /v1/projects/{idOrName}/rolling-release\",\n \"GET /v1/projects/{idOrName}/rolling-release/billing\",\n \"GET /v1/projects/{idOrName}/rolling-release/config\",\n ],\n },\n {\n name: \"rolling-release:write\",\n rules: [\n \"POST /v1/projects/{idOrName}/rolling-release/approve-stage\",\n \"POST /v1/projects/{idOrName}/rolling-release/complete\",\n \"PATCH /v1/projects/{idOrName}/rolling-release/config\",\n \"DELETE /v1/projects/{idOrName}/rolling-release/config\",\n ],\n },\n {\n name: \"sandboxes-v2-beta:read\",\n rules: [\n \"GET /v2/sandboxes\",\n \"GET /v2/sandboxes/sessions\",\n \"GET /v2/sandboxes/sessions/{sessionId}\",\n \"GET /v2/sandboxes/sessions/{sessionId}/cmd\",\n \"GET /v2/sandboxes/sessions/{sessionId}/cmd/{cmdId}\",\n \"GET /v2/sandboxes/sessions/{sessionId}/cmd/{cmdId}/logs\",\n \"GET /v2/sandboxes/snapshots\",\n \"GET /v2/sandboxes/snapshots/{snapshotId}\",\n \"GET /v2/sandboxes/{name}\",\n ],\n },\n {\n name: \"sandboxes-v2-beta:write\",\n rules: [\n \"POST /v2/sandboxes\",\n \"POST /v2/sandboxes/sessions/{sessionId}/cmd\",\n \"POST /v2/sandboxes/sessions/{sessionId}/cmd/{cmdId}/kill\",\n \"POST /v2/sandboxes/sessions/{sessionId}/extend-timeout\",\n \"POST /v2/sandboxes/sessions/{sessionId}/fs/mkdir\",\n \"POST /v2/sandboxes/sessions/{sessionId}/fs/read\",\n \"POST /v2/sandboxes/sessions/{sessionId}/fs/write\",\n \"POST /v2/sandboxes/sessions/{sessionId}/network-policy\",\n \"POST /v2/sandboxes/sessions/{sessionId}/snapshot\",\n \"POST /v2/sandboxes/sessions/{sessionId}/stop\",\n \"DELETE /v2/sandboxes/snapshots/{snapshotId}\",\n \"PATCH /v2/sandboxes/{name}\",\n \"DELETE /v2/sandboxes/{name}\",\n ],\n },\n {\n name: \"sandboxes:read\",\n rules: [\n \"GET /v1/sandboxes\",\n \"GET /v1/sandboxes/snapshots\",\n \"GET /v1/sandboxes/snapshots/{snapshotId}\",\n \"GET /v1/sandboxes/{sandboxId}\",\n \"GET /v1/sandboxes/{sandboxId}/cmd\",\n \"GET /v1/sandboxes/{sandboxId}/cmd/{cmdId}\",\n \"GET /v1/sandboxes/{sandboxId}/cmd/{cmdId}/logs\",\n ],\n },\n {\n name: \"sandboxes:write\",\n rules: [\n \"POST /v1/sandboxes\",\n \"DELETE /v1/sandboxes/snapshots/{snapshotId}\",\n \"POST /v1/sandboxes/{sandboxId}/cmd\",\n \"POST /v1/sandboxes/{sandboxId}/extend-timeout\",\n \"POST /v1/sandboxes/{sandboxId}/fs/mkdir\",\n \"POST /v1/sandboxes/{sandboxId}/fs/read\",\n \"POST /v1/sandboxes/{sandboxId}/fs/write\",\n \"POST /v1/sandboxes/{sandboxId}/network-policy\",\n \"POST /v1/sandboxes/{sandboxId}/snapshot\",\n \"POST /v1/sandboxes/{sandboxId}/stop\",\n \"POST /v1/sandboxes/{sandboxId}/{cmdId}/kill\",\n ],\n },\n {\n name: \"security:read\",\n rules: [\n \"GET /v1/security/firewall/attack-status\",\n \"GET /v1/security/firewall/bypass\",\n \"GET /v1/security/firewall/config/{configVersion}\",\n ],\n },\n {\n name: \"security:write\",\n rules: [\n \"POST /v1/security/attack-mode\",\n \"POST /v1/security/firewall/bypass\",\n \"DELETE /v1/security/firewall/bypass\",\n \"PUT /v1/security/firewall/config\",\n \"PATCH /v1/security/firewall/config\",\n ],\n },\n {\n name: \"static-ips:write\",\n rules: [\n \"PATCH /v1/projects/{idOrName}/shared-connect-links\",\n ],\n },\n {\n name: \"teams:read\",\n rules: [\n \"GET /v1/teams/{teamId}/request/{userId}\",\n \"GET /v2/teams\",\n \"GET /v2/teams/{teamId}\",\n \"GET /v3/teams/{teamId}/members\",\n ],\n },\n {\n name: \"teams:write\",\n rules: [\n \"POST /v1/teams\",\n \"DELETE /v1/teams/{teamId}\",\n \"POST /v1/teams/{teamId}/dsync-roles\",\n \"DELETE /v1/teams/{teamId}/invites/{inviteId}\",\n \"POST /v1/teams/{teamId}/members/teams/join\",\n \"PATCH /v1/teams/{teamId}/members/{uid}\",\n \"DELETE /v1/teams/{teamId}/members/{uid}\",\n \"PATCH /v1/teams/{teamId}/microfrontends/{groupId}\",\n \"DELETE /v1/teams/{teamId}/microfrontends/{groupId}\",\n \"POST /v1/teams/{teamId}/request\",\n \"PATCH /v2/teams/{teamId}\",\n \"POST /v2/teams/{teamId}/members\",\n ],\n },\n {\n name: \"user:read\",\n rules: [\n \"GET /v1/events/types\",\n \"GET /v2/user\",\n \"GET /v3/events\",\n ],\n },\n {\n name: \"user:write\",\n rules: [\n \"DELETE /v1/user\",\n ],\n },\n {\n name: \"webhooks:read\",\n rules: [\n \"GET /v1/webhooks\",\n \"GET /v1/webhooks/{id}\",\n ],\n },\n {\n name: \"webhooks:write\",\n rules: [\n \"POST /v1/webhooks\",\n \"DELETE /v1/webhooks/{id}\",\n ],\n },\n ],\n },\n ],\n} as const satisfies FirewallConfig;\n\n\nexport const vercelCategories: Record<\n PermissionNamesOf<typeof vercelFirewall>,\n string\n> = {\n // — Read (27) —\n \"aliases:read\": \"Read\",\n \"api-observability:read\": \"Read\",\n \"artifacts:read\": \"Read\",\n \"bulk-redirects:read\": \"Read\",\n \"certs:read\": \"Read\",\n \"checks-v2:read\": \"Read\",\n \"checks:read\": \"Read\",\n \"connect:read\": \"Read\",\n \"deployments:read\": \"Read\",\n \"dns:read\": \"Read\",\n \"domains-registrar:read\": \"Read\",\n \"domains:read\": \"Read\",\n \"drains:read\": \"Read\",\n \"edge-config:read\": \"Read\",\n \"environment:read\": \"Read\",\n \"feature-flags:read\": \"Read\",\n \"integrations:read\": \"Read\",\n \"logDrains:read\": \"Read\",\n \"logs:read\": \"Read\",\n \"microfrontends:read\": \"Read\",\n \"project-routes:read\": \"Read\",\n \"projects:read\": \"Read\",\n \"rolling-release:read\": \"Read\",\n \"sandboxes-v2-beta:read\": \"Read\",\n \"sandboxes:read\": \"Read\",\n \"user:read\": \"Read\",\n \"webhooks:read\": \"Read\",\n // — Deploy (4) —\n \"checks-v2:write\": \"Deploy\",\n \"checks:write\": \"Deploy\",\n \"deployments:write\": \"Deploy\",\n \"rolling-release:write\": \"Deploy\",\n // — Write (23) —\n \"aliases:write\": \"Write\",\n \"api-observability:write\": \"Write\",\n \"artifacts:write\": \"Write\",\n \"bulk-redirects:write\": \"Write\",\n \"certs:write\": \"Write\",\n \"connect:write\": \"Write\",\n \"dns:write\": \"Write\",\n \"domains-registrar:write\": \"Write\",\n \"domains:write\": \"Write\",\n \"drains:write\": \"Write\",\n \"edge-cache:write\": \"Write\",\n \"edge-config:write\": \"Write\",\n \"environment:write\": \"Write\",\n \"feature-flags:write\": \"Write\",\n \"integrations:write\": \"Write\",\n \"logDrains:write\": \"Write\",\n \"microfrontends:write\": \"Write\",\n \"project-routes:write\": \"Write\",\n \"projects:write\": \"Write\",\n \"sandboxes-v2-beta:write\": \"Write\",\n \"sandboxes:write\": \"Write\",\n \"static-ips:write\": \"Write\",\n \"webhooks:write\": \"Write\",\n // — Admin (15) —\n \"access-groups:read\": \"Admin\",\n \"access-groups:write\": \"Admin\",\n \"authentication:read\": \"Admin\",\n \"authentication:write\": \"Admin\",\n \"billing:read\": \"Admin\",\n \"billing:write\": \"Admin\",\n \"marketplace:read\": \"Admin\",\n \"marketplace:write\": \"Admin\",\n \"projectMembers:read\": \"Admin\",\n \"projectMembers:write\": \"Admin\",\n \"security:read\": \"Admin\",\n \"security:write\": \"Admin\",\n \"teams:read\": \"Admin\",\n \"teams:write\": \"Admin\",\n \"user:write\": \"Admin\",\n};\n\nexport const vercelCategoryOrder = [\"Read\", \"Deploy\", \"Write\", \"Admin\"] as const;\n","import {\n CONNECTOR_TYPES,\n connectorTypeSchema,\n type ConnectorAuthMethodConfig,\n type ConnectorAuthMethodType,\n type ConnectorConfig,\n type ConnectorOAuthConfig,\n type ConnectorSecretConfig,\n type ConnectorType,\n} from \"./connectors\";\n\n/**\n * Get auth methods for a connector type\n */\nexport function getConnectorAuthMethods(\n type: ConnectorType,\n): Partial<Record<ConnectorAuthMethodType, ConnectorAuthMethodConfig>> {\n return CONNECTOR_TYPES[type].authMethods;\n}\n\n/**\n * Get default auth method for a connector type\n */\nexport function getConnectorDefaultAuthMethod(\n type: ConnectorType,\n): ConnectorAuthMethodType | undefined {\n return CONNECTOR_TYPES[type].defaultAuthMethod;\n}\n\n/**\n * Get secrets config for a specific auth method\n */\nexport function getConnectorSecretsForAuthMethod(\n type: ConnectorType,\n authMethod: ConnectorAuthMethodType,\n): Record<string, ConnectorSecretConfig> | undefined {\n const authMethods = getConnectorAuthMethods(type);\n return authMethods[authMethod]?.secrets;\n}\n\n/**\n * Get secret names for a specific auth method\n */\nexport function getConnectorSecretNames(\n type: ConnectorType,\n authMethod: ConnectorAuthMethodType,\n): string[] {\n const secrets = getConnectorSecretsForAuthMethod(type, authMethod);\n return secrets ? Object.keys(secrets) : [];\n}\n\n/**\n * Get environment mapping for a connector type.\n */\nexport function getConnectorEnvironmentMapping(\n type: ConnectorType,\n): Record<string, string> {\n return CONNECTOR_TYPES[type].environmentMapping;\n}\n\n/**\n * Connector types eligible for agent compose: GA (no feature flag) or\n * feature-flagged with an api-token auth method. Feature flags gate OAuth\n * and platform auth methods; api-token is always available.\n *\n * Flag-gated platform-only connectors are intentionally excluded until their\n * runtime wiring (pool key resolver, billing extractor) lands.\n */\nexport function getEligibleConnectorTypes(): string[] {\n return Object.entries(CONNECTOR_TYPES)\n .filter(([, config]) => {\n return !config.featureFlag || \"api-token\" in config.authMethods;\n })\n .map(([type]) => {\n return type;\n });\n}\n\n/**\n * Get connector label and derived env var names for a connector secret.\n * Performs a reverse lookup from secret name to the connector type and\n * environment mapping that references it.\n *\n * Example: getConnectorDerivedNames(\"GITHUB_ACCESS_TOKEN\")\n * → { connectorLabel: \"GitHub\", envVarNames: [\"GH_TOKEN\", \"GITHUB_TOKEN\"] }\n */\nexport function getConnectorDerivedNames(\n secretName: string,\n): { connectorLabel: string; envVarNames: string[] } | null {\n const allTypes = Object.keys(CONNECTOR_TYPES) as ConnectorType[];\n\n for (const type of allTypes) {\n const config = CONNECTOR_TYPES[type];\n\n // Check if this secret belongs to any auth method of this connector\n const authMethods = config.authMethods as Record<\n string,\n ConnectorAuthMethodConfig\n >;\n let found = false;\n for (const method of Object.values(authMethods)) {\n if (method.secrets && secretName in method.secrets) {\n found = true;\n break;\n }\n }\n\n if (!found) {\n continue;\n }\n\n // Find all env var names that reference this secret\n const mapping = getConnectorEnvironmentMapping(type);\n const envVarNames = Object.entries(mapping)\n .filter(([, valueRef]) => {\n return valueRef === `$secrets.${secretName}`;\n })\n .map(([envVar]) => {\n return envVar;\n });\n\n if (envVarNames.length > 0) {\n return { connectorLabel: config.label, envVarNames };\n }\n }\n\n return null;\n}\n\n/**\n * Get the set of environment variable names that connected connectors can provide.\n * Used by pre-run checks to exclude connector-provided secrets from \"missing\" lists.\n *\n * Example: getConnectorProvidedSecretNames([\"github\"])\n * → Set { \"GH_TOKEN\", \"GITHUB_TOKEN\" }\n */\nexport function getConnectorProvidedSecretNames(\n connectedTypes: string[],\n): Set<string> {\n const provided = new Set<string>();\n\n for (const rawType of connectedTypes) {\n const parsed = connectorTypeSchema.safeParse(rawType);\n if (!parsed.success) {\n continue;\n }\n const mapping = getConnectorEnvironmentMapping(parsed.data);\n for (const envVar of Object.keys(mapping)) {\n provided.add(envVar);\n }\n }\n\n return provided;\n}\n\n/**\n * Get OAuth configuration for a connector type\n */\nexport function getConnectorOAuthConfig(\n type: ConnectorType,\n): ConnectorOAuthConfig | undefined {\n const config = CONNECTOR_TYPES[type];\n return \"oauth\" in config ? config.oauth : undefined;\n}\n\n/**\n * Check if a connector type uses Google OAuth (accounts.google.com).\n */\nexport function isGoogleOAuthConnector(type: ConnectorType): boolean {\n const oauthConfig = getConnectorOAuthConfig(type);\n if (!oauthConfig?.authorizationUrl) return false;\n try {\n return (\n new URL(oauthConfig.authorizationUrl).hostname === \"accounts.google.com\"\n );\n } catch {\n return false;\n }\n}\n\n/**\n * Check if stored OAuth scopes cover all required scopes for a connector type.\n * Returns true if no OAuth config exists (non-OAuth connector) or all required scopes are present.\n * Returns false if storedScopes is null (legacy connector) or missing any required scope.\n */\nexport function hasRequiredScopes(\n connectorType: ConnectorType,\n storedScopes: string[] | null,\n): boolean {\n const oauthConfig = getConnectorOAuthConfig(connectorType);\n if (!oauthConfig) return true;\n if (oauthConfig.scopes.length === 0) return true;\n if (!storedScopes) return false;\n const storedSet = new Set(storedScopes);\n return oauthConfig.scopes.every((s) => {\n return storedSet.has(s);\n });\n}\n\n/**\n * Compute the diff between currently required scopes and stored scopes for a connector.\n */\nexport interface ScopeDiff {\n addedScopes: string[];\n removedScopes: string[];\n currentScopes: string[];\n storedScopes: string[];\n}\n\nexport function getScopeDiff(\n connectorType: ConnectorType,\n storedScopes: string[] | null,\n): ScopeDiff {\n const oauthConfig = getConnectorOAuthConfig(connectorType);\n const currentScopes = oauthConfig?.scopes ?? [];\n const stored = storedScopes ?? [];\n const storedSet = new Set(stored);\n const currentSet = new Set(currentScopes);\n\n return {\n addedScopes: currentScopes.filter((s) => {\n return !storedSet.has(s);\n }),\n removedScopes: stored.filter((s) => {\n return !currentSet.has(s);\n }),\n currentScopes,\n storedScopes: stored,\n };\n}\n\n/**\n * Get all secret/variable names managed by connectors across ALL auth methods.\n * Unlike `getConnectorProvidedSecretNames` (which only reads environmentMapping),\n * this function also includes api-token auth method secrets.\n *\n * Used to hide connector-managed secrets from the secrets & variables list.\n */\nexport function getConnectorManagedSecretNames(\n types: ConnectorType[],\n): Set<string> {\n const managed = new Set<string>();\n for (const type of types) {\n const config = CONNECTOR_TYPES[type];\n for (const method of Object.values(config.authMethods)) {\n for (const name of Object.keys(method.secrets)) {\n managed.add(name);\n }\n }\n // Also include environmentMapping keys (OAuth-derived env vars like GH_TOKEN)\n const mapping = getConnectorEnvironmentMapping(type);\n for (const envVar of Object.keys(mapping)) {\n managed.add(envVar);\n }\n }\n return managed;\n}\n\n/**\n * Reverse lookup: given a secret/env-var name, find which connector type manages it.\n * Checks both authMethods.secrets keys and environmentMapping keys.\n * Returns null if no connector manages this name.\n */\nexport function getConnectorTypeForSecretName(\n name: string,\n): ConnectorType | null {\n const allTypes = Object.keys(CONNECTOR_TYPES) as ConnectorType[];\n for (const type of allTypes) {\n const config = CONNECTOR_TYPES[type];\n // Check authMethods secrets\n for (const method of Object.values(config.authMethods)) {\n if (name in method.secrets) {\n return type;\n }\n }\n // Check environmentMapping keys\n const mapping = getConnectorEnvironmentMapping(type);\n if (name in mapping) {\n return type;\n }\n }\n return null;\n}\n\n/**\n * Get required secret names for a connector's api-token auth method.\n * Returns null if the connector type does not support api-token auth.\n * Note: Returns ALL required field names regardless of storage type (secret or variable).\n */\nexport function getApiTokenRequiredSecretNames(\n type: ConnectorType,\n): string[] | null {\n const config = CONNECTOR_TYPES[type];\n const apiTokenConfig = config.authMethods[\"api-token\"] as\n | ConnectorAuthMethodConfig\n | undefined;\n if (!apiTokenConfig) return null;\n\n return Object.entries(apiTokenConfig.secrets)\n .filter(([, cfg]) => {\n return cfg.required;\n })\n .map(([name]) => {\n return name;\n });\n}\n\n/**\n * Get required field names grouped by storage type for a connector's api-token auth method.\n * Returns null if the connector type does not support api-token auth.\n */\nexport function getApiTokenFieldsByType(\n type: ConnectorType,\n): { secrets: string[]; variables: string[] } | null {\n const config = CONNECTOR_TYPES[type];\n const apiTokenConfig = config.authMethods[\"api-token\"] as\n | ConnectorAuthMethodConfig\n | undefined;\n if (!apiTokenConfig) return null;\n\n const secretNames: string[] = [];\n const variableNames: string[] = [];\n for (const [name, cfg] of Object.entries(apiTokenConfig.secrets)) {\n if (!cfg.required) continue;\n if (cfg.type === \"variable\") {\n variableNames.push(name);\n } else {\n secretNames.push(name);\n }\n }\n return { secrets: secretNames, variables: variableNames };\n}\n\n/**\n * Derive which connector types are \"connected\" via api-token based on present user secret and variable names.\n * A connector type is considered connected if all its required api-token fields exist\n * (secrets checked against userSecretNames, variables checked against userVariableNames).\n */\nexport function deriveApiTokenConnectedTypes(\n userSecretNames: Set<string>,\n userVariableNames?: Set<string>,\n): ConnectorType[] {\n const allTypes = Object.keys(CONNECTOR_TYPES) as ConnectorType[];\n const connected: ConnectorType[] = [];\n const varNames = userVariableNames ?? new Set<string>();\n\n for (const type of allTypes) {\n const fields = getApiTokenFieldsByType(type);\n if (!fields) continue;\n if (fields.secrets.length === 0 && fields.variables.length === 0) continue;\n const secretsOk = fields.secrets.every((name) => {\n return userSecretNames.has(name);\n });\n const variablesOk = fields.variables.every((name) => {\n return varNames.has(name);\n });\n if (secretsOk && variablesOk) {\n connected.push(type);\n }\n }\n\n return connected;\n}\n\n/**\n * Result of a connector search hit, one per matched connector type.\n */\nexport interface ConnectorSearchResult {\n readonly type: ConnectorType;\n readonly score: number;\n /** Short label describing the matched field (e.g. \"type\", \"env:GH_TOKEN\", \"tag:vcs\", \"token:gh\"). */\n readonly matchedField: string;\n}\n\nexport interface ConnectorSearchOutput {\n /** Results sorted by score desc then type asc, already capped at `limit`. */\n readonly results: readonly ConnectorSearchResult[];\n /** Total candidates above the minimum threshold, before applying `limit`. */\n readonly total: number;\n}\n\nconst TOKEN_BOUNDARY = /[_\\-\\s]+/;\nconst CASE_BOUNDARY = /(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])/;\nconst MIN_SCORE = 10;\n\n/**\n * Split a string into lowercase tokens on `_`, `-`, whitespace, and\n * camel/Pascal case boundaries. Digits stay attached to the preceding letters\n * (e.g. `v2`). Empty tokens are dropped and duplicates deduped.\n */\nfunction tokenize(input: string): Set<string> {\n const tokens = new Set<string>();\n for (const chunk of input.split(TOKEN_BOUNDARY)) {\n if (!chunk) continue;\n for (const sub of chunk.split(CASE_BOUNDARY)) {\n const lower = sub.toLowerCase();\n if (lower) tokens.add(lower);\n }\n }\n return tokens;\n}\n\nfunction listSecretNames(config: ConnectorConfig): string[] {\n const names: string[] = [];\n for (const method of Object.values(config.authMethods)) {\n for (const name of Object.keys(method.secrets)) {\n names.push(name);\n }\n }\n return names;\n}\n\ntype ScoreHit = { score: number; matchedField: string };\n\nfunction findExactMatch(\n keywordLower: string,\n type: ConnectorType,\n config: ConnectorConfig,\n): ScoreHit | null {\n if (type.toLowerCase() === keywordLower) {\n return { score: 100, matchedField: \"type\" };\n }\n for (const envVar of Object.keys(config.environmentMapping)) {\n if (envVar.toLowerCase() === keywordLower) {\n return { score: 90, matchedField: `env:${envVar}` };\n }\n }\n if (config.label.toLowerCase() === keywordLower) {\n return { score: 80, matchedField: \"label\" };\n }\n const tags = config.tags ?? [];\n for (const tag of tags) {\n if (tag === keywordLower) {\n return { score: 70, matchedField: `tag:${tag}` };\n }\n }\n return null;\n}\n\nfunction findSubstringMatch(\n keywordLower: string,\n type: ConnectorType,\n config: ConnectorConfig,\n): ScoreHit | null {\n if (type.toLowerCase().includes(keywordLower)) {\n return { score: 50, matchedField: \"type\" };\n }\n if (config.label.toLowerCase().includes(keywordLower)) {\n return { score: 50, matchedField: \"label\" };\n }\n for (const envVar of Object.keys(config.environmentMapping)) {\n if (envVar.toLowerCase().includes(keywordLower)) {\n return { score: 40, matchedField: `env:${envVar}` };\n }\n }\n for (const name of listSecretNames(config)) {\n if (name.toLowerCase().includes(keywordLower)) {\n return { score: 30, matchedField: `secret:${name}` };\n }\n }\n const tags = config.tags ?? [];\n for (const tag of tags) {\n if (tag.includes(keywordLower)) {\n return { score: 25, matchedField: `tag:${tag}` };\n }\n }\n return null;\n}\n\nfunction collectCandidateTokens(\n type: ConnectorType,\n config: ConnectorConfig,\n): Set<string> {\n const tokens = new Set<string>();\n const sources = [\n type,\n config.label,\n ...Object.keys(config.environmentMapping),\n ...listSecretNames(config),\n ...(config.tags ?? []),\n ];\n for (const source of sources) {\n for (const token of tokenize(source)) {\n tokens.add(token);\n }\n }\n return tokens;\n}\n\nfunction findTokenIntersection(\n keywordTokens: Set<string>,\n type: ConnectorType,\n config: ConnectorConfig,\n): ScoreHit | null {\n const candidateTokens = collectCandidateTokens(type, config);\n let intersection = 0;\n let firstCommon = \"\";\n for (const token of keywordTokens) {\n if (candidateTokens.has(token)) {\n intersection++;\n if (!firstCommon) firstCommon = token;\n }\n }\n if (intersection === 0) return null;\n return { score: 10 * intersection, matchedField: `token:${firstCommon}` };\n}\n\nfunction scoreConnector(\n keywordLower: string,\n keywordTokens: Set<string>,\n type: ConnectorType,\n config: ConnectorConfig,\n): ScoreHit | null {\n const exact = findExactMatch(keywordLower, type, config);\n if (exact) return exact;\n\n const candidates: ScoreHit[] = [];\n const substring = findSubstringMatch(keywordLower, type, config);\n if (substring) candidates.push(substring);\n const token = findTokenIntersection(keywordTokens, type, config);\n if (token) candidates.push(token);\n\n if (candidates.length === 0) return null;\n const best = candidates.reduce((a, b) => {\n return a.score >= b.score ? a : b;\n });\n if (best.score < MIN_SCORE) return null;\n return best;\n}\n\n/**\n * Search the connector catalog by weighted multi-field ranking.\n *\n * Matches the keyword against type keys, labels, env var names, secret names,\n * and `tags`. Score is the max over matched rules (never a sum). Results with\n * score below the minimum threshold are dropped. Sort order: score desc, then\n * type asc.\n */\nexport function searchConnectors(\n keyword: string,\n limit: number,\n filter?: (type: ConnectorType) => boolean,\n): ConnectorSearchOutput {\n const trimmed = keyword.trim();\n if (!trimmed) return { results: [], total: 0 };\n\n const keywordLower = trimmed.toLowerCase();\n const keywordTokens = tokenize(trimmed);\n\n const hits: ConnectorSearchResult[] = [];\n for (const type of Object.keys(CONNECTOR_TYPES) as ConnectorType[]) {\n if (filter && !filter(type)) continue;\n const config = CONNECTOR_TYPES[type];\n const hit = scoreConnector(keywordLower, keywordTokens, type, config);\n if (!hit) continue;\n hits.push({ type, score: hit.score, matchedField: hit.matchedField });\n }\n\n hits.sort((a, b) => {\n if (b.score !== a.score) return b.score - a.score;\n return a.type.localeCompare(b.type);\n });\n\n const capped = limit > 0 ? hits.slice(0, limit) : hits;\n return { results: capped, total: hits.length };\n}\n","// Auto-generated from AgentMail API docs.\n// Source: https://docs.agentmail.to/api-reference\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:agentmail\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const agentmailFirewall = {\n name: \"agentmail\",\n description: \"AgentMail API\",\n placeholders: {\n AGENTMAIL_TOKEN: \"am_c0ffee5afe10ca1c0ffee5afe10ca1c0\",\n },\n apis: [\n {\n base: \"https://api.agentmail.to\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.AGENTMAIL_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Amplitude API docs.\n// Source: https://amplitude.com/docs/apis/authentication\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:amplitude\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const amplitudeFirewall = {\n name: \"amplitude\",\n description: \"Amplitude product analytics API\",\n placeholders: {\n AMPLITUDE_API_KEY: \"c0ffee5afe10ca1c0ffee5afe10ca1c0\",\n AMPLITUDE_SECRET_KEY: \"5afe10ca1c0ffee5afe10ca1c0ffee5a\",\n },\n apis: [\n {\n base: \"https://amplitude.com\",\n auth: {\n headers: {\n Authorization:\n \"${{ basic(secrets.AMPLITUDE_API_KEY, secrets.AMPLITUDE_SECRET_KEY) }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://analytics.eu.amplitude.com\",\n auth: {\n headers: {\n Authorization:\n \"${{ basic(secrets.AMPLITUDE_API_KEY, secrets.AMPLITUDE_SECRET_KEY) }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://api2.amplitude.com\",\n auth: {},\n permissions: [],\n },\n {\n base: \"https://api.eu.amplitude.com\",\n auth: {},\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Anthropic Managed Agents API docs.\n// Source: https://docs.anthropic.com/en/api/beta\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:anthropic-managed-agents\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const anthropicManagedAgentsFirewall = {\n name: \"anthropic-managed-agents\",\n description: \"Anthropic Managed Agents API\",\n placeholders: {\n ANTHROPIC_MANAGED_AGENTS_TOKEN: \"sk-ant-api03-CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCof\",\n },\n apis: [\n {\n base: \"https://api.anthropic.com\",\n auth: {\n headers: {\n \"x-api-key\": \"${{ secrets.ANTHROPIC_MANAGED_AGENTS_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"agents:read\",\n description: \"List and retrieve agent definitions\",\n rules: [\"GET /v1/agents\", \"GET /v1/agents/*\"],\n },\n {\n name: \"agents:write\",\n description: \"Create, update, and delete agent definitions\",\n rules: [\"POST /v1/agents\", \"PUT /v1/agents/*\", \"DELETE /v1/agents/*\"],\n },\n {\n name: \"environments:read\",\n description: \"List and retrieve execution environments\",\n rules: [\"GET /v1/environments\", \"GET /v1/environments/*\"],\n },\n {\n name: \"environments:write\",\n description: \"Create and manage execution environments\",\n rules: [\"POST /v1/environments\", \"PUT /v1/environments/*\", \"DELETE /v1/environments/*\"],\n },\n {\n name: \"sessions:read\",\n description: \"List and retrieve agent sessions and events\",\n rules: [\"GET /v1/sessions\", \"GET /v1/sessions/*\"],\n },\n {\n name: \"sessions:write\",\n description: \"Create sessions and send events\",\n rules: [\"POST /v1/sessions\", \"POST /v1/sessions/*/events\"],\n },\n {\n name: \"vaults:read\",\n description: \"List and retrieve credential vaults\",\n rules: [\"GET /v1/vaults\", \"GET /v1/vaults/*\"],\n },\n {\n name: \"vaults:write\",\n description: \"Create and manage credential vaults\",\n rules: [\"POST /v1/vaults\", \"PUT /v1/vaults/*\", \"DELETE /v1/vaults/*\"],\n },\n ],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Ahrefs API docs.\n// Source: https://docs.ahrefs.com/docs/api/reference/introduction\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:ahrefs\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const ahrefsFirewall = {\n name: \"ahrefs\",\n description: \"Ahrefs API\",\n placeholders: {\n AHREFS_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafe00\",\n },\n apis: [\n {\n base: \"https://api.ahrefs.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.AHREFS_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Airtable API docs.\n// Source: https://airtable.com/developers/web/api/authentication\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:airtable\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const airtableFirewall = {\n name: \"airtable\",\n description: \"Airtable API\",\n placeholders: {\n AIRTABLE_TOKEN: \"patCoffeeSafeL0.c0ffee5afe10ca1c0ffee5afe10ca1c0ffee5afe10ca1c0ffee5afe10ca1c0ff\",\n },\n apis: [\n {\n base: \"https://api.airtable.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.AIRTABLE_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Apollo.io API docs.\n// Source: https://docs.apollo.io/docs/api-overview\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:apollo\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const apolloFirewall = {\n name: \"apollo\",\n description: \"Apollo\",\n placeholders: {\n APOLLO_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffee00\",\n },\n apis: [\n {\n base: \"https://api.apollo.io\",\n auth: {\n headers: {\n \"X-Api-Key\": \"${{ secrets.APOLLO_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Apify API docs.\n// Source: https://docs.apify.com/api/v2\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:apify\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const apifyFirewall = {\n name: \"apify\",\n description: \"Apify API\",\n placeholders: {\n APIFY_TOKEN: \"apify_api_CoffeeSafeLocalCoffeeSafeLocalCoffee0\",\n },\n apis: [\n {\n base: \"https://api.apify.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.APIFY_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Pika Developer API docs.\n// Source: https://github.com/Pika-Labs/Pika-Skills\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:pika\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const pikaFirewall = {\n name: \"pika\",\n description: \"Pika\",\n placeholders: {\n PIKA_TOKEN: \"dk_PikaDevKeyPlaceholder0000000000000000\",\n },\n apis: [\n {\n base: \"https://srkibaanghvsriahb.pika.art\",\n auth: {\n headers: {\n Authorization: \"DevKey ${{ secrets.PIKA_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://7i30hpv4bo9ud5mhianq.pika.art\",\n auth: {\n headers: {\n Authorization: \"DevKey ${{ secrets.PIKA_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Doppler API docs.\n// Source: https://docs.doppler.com/reference/api\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:doppler\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const dopplerFirewall = {\n name: \"doppler\",\n description: \"Doppler\",\n placeholders: {\n DOPPLER_TOKEN: \"dp.st.CoffeeSafeLocalCoffeeSafeLocalCoffeeSafe00\",\n },\n apis: [\n {\n base: \"https://api.doppler.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.DOPPLER_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Infisical API docs.\n// Source: https://infisical.com/docs/api-reference/overview/introduction\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:infisical\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const infisicalFirewall = {\n name: \"infisical\",\n description: \"Infisical\",\n placeholders: {\n INFISICAL_CLIENT_ID: \"00000000-0000-0000-0000-000000000000\",\n INFISICAL_CLIENT_SECRET: \"InfisicalSecretInfisicalSecret0000000000000\",\n },\n apis: [\n {\n base: \"https://us.infisical.com\",\n auth: {},\n permissions: [],\n },\n {\n base: \"https://eu.infisical.com\",\n auth: {},\n permissions: [],\n },\n {\n base: \"https://app.infisical.com\",\n auth: {},\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Asana API docs.\n// Source: https://developers.asana.com/docs/authentication\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:asana\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const asanaFirewall = {\n name: \"asana\",\n description: \"Asana API\",\n placeholders: {\n ASANA_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafe00\",\n },\n apis: [\n {\n base: \"https://app.asana.com/api\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.ASANA_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Attio API docs.\n// Source: https://docs.attio.com/rest-api/overview\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:attio\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const attioFirewall = {\n name: \"attio\",\n description: \"Attio\",\n placeholders: {\n ATTIO_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocal\",\n },\n apis: [\n {\n base: \"https://api.attio.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.ATTIO_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Atlassian (Jira + Confluence) official OpenAPI specs.\n// Sources:\n// - https://developer.atlassian.com/cloud/jira/platform/swagger-v3.v3.json\n// - https://developer.atlassian.com/cloud/confluence/swagger.v3.json\n// - https://developer.atlassian.com/cloud/confluence/openapi-v2.v3.json\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:atlassian\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const atlassianFirewall = {\n name: \"atlassian\",\n description: \"Atlassian (Jira + Confluence) API\",\n placeholders: {\n ATLASSIAN_TOKEN: \"ATATT3xCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocal00Cof\",\n },\n apis: [\n {\n base: \"https://api.atlassian.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.ATLASSIAN_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Axiom's official OpenAPI specs.\n// Source: https://axiom.co/docs/restapi/versions/v2.json\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:axiom\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const axiomFirewall = {\n name: \"axiom\",\n description: \"Axiom API\",\n placeholders: {\n AXIOM_TOKEN: \"xaat-c0ffee5a-fe10-ca1c-0ffe-e5afe10ca1c0\",\n },\n apis: [\n {\n base: \"https://api.axiom.co\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.AXIOM_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"annotations|create\",\n rules: [\n \"POST /v2/annotations\",\n ],\n },\n {\n name: \"annotations|delete\",\n rules: [\n \"DELETE /v2/annotations/{id}\",\n ],\n },\n {\n name: \"annotations|read\",\n rules: [\n \"GET /v2/annotations\",\n \"GET /v2/annotations/{id}\",\n ],\n },\n {\n name: \"annotations|update\",\n rules: [\n \"PUT /v2/annotations/{id}\",\n ],\n },\n {\n name: \"apiTokens|create\",\n rules: [\n \"POST /v2/tokens\",\n ],\n },\n {\n name: \"apiTokens|delete\",\n rules: [\n \"DELETE /v2/tokens/{id}\",\n ],\n },\n {\n name: \"apiTokens|read\",\n rules: [\n \"GET /v2/tokens\",\n \"GET /v2/tokens/{id}\",\n ],\n },\n {\n name: \"apiTokens|update\",\n rules: [\n \"POST /v2/tokens/{id}/regenerate\",\n ],\n },\n {\n name: \"dashboards|create\",\n rules: [\n \"POST /v2/dashboards\",\n ],\n },\n {\n name: \"dashboards|delete\",\n rules: [\n \"DELETE /v2/dashboards/uid/{uid}\",\n ],\n },\n {\n name: \"dashboards|read\",\n rules: [\n \"GET /v2/dashboards\",\n \"GET /v2/dashboards/uid/{uid}\",\n ],\n },\n {\n name: \"dashboards|update\",\n rules: [\n \"PUT /v2/dashboards/uid/{uid}\",\n ],\n },\n {\n name: \"datasets|create\",\n rules: [\n \"POST /v2/datasets\",\n ],\n },\n {\n name: \"datasets|delete\",\n rules: [\n \"DELETE /v2/datasets/{dataset_id}\",\n ],\n },\n {\n name: \"datasets|read\",\n rules: [\n \"GET /v1/datasets\",\n \"GET /v1/datasets/{dataset_name}\",\n \"GET /v2/datasets\",\n \"GET /v2/datasets/{dataset_id}\",\n \"GET /v2/datasets/{dataset_id}/fields\",\n \"GET /v2/datasets/{dataset_id}/fields/{field_id}\",\n \"GET /v2/datasets/{dataset_id}/mapfields\",\n ],\n },\n {\n name: \"datasets|update\",\n rules: [\n \"POST /v1/datasets\",\n \"PUT /v1/datasets/{dataset_name}\",\n \"DELETE /v1/datasets/{dataset_name}\",\n \"POST /v1/datasets/{dataset_name}/trim\",\n \"PUT /v2/datasets/{dataset_id}\",\n \"PUT /v2/datasets/{dataset_id}/fields/{field_id}\",\n \"POST /v2/datasets/{dataset_id}/mapfields\",\n \"PUT /v2/datasets/{dataset_id}/mapfields\",\n \"DELETE /v2/datasets/{dataset_id}/mapfields/{map_field_name}\",\n ],\n },\n {\n name: \"ingest|create\",\n rules: [\n \"POST /v1/datasets/{dataset_name}/ingest\",\n \"POST /v1/ingest/{dataset-id}\",\n ],\n },\n {\n name: \"monitors|create\",\n rules: [\n \"POST /v2/monitors\",\n ],\n },\n {\n name: \"monitors|delete\",\n rules: [\n \"DELETE /v2/monitors/{id}\",\n ],\n },\n {\n name: \"monitors|read\",\n rules: [\n \"GET /v2/monitors\",\n \"GET /v2/monitors/{id}\",\n \"GET /v2/monitors/{id}/history\",\n ],\n },\n {\n name: \"monitors|update\",\n rules: [\n \"PUT /v2/monitors/{id}\",\n ],\n },\n {\n name: \"notifiers|create\",\n rules: [\n \"POST /v2/notifiers\",\n ],\n },\n {\n name: \"notifiers|delete\",\n rules: [\n \"DELETE /v2/notifiers/{id}\",\n ],\n },\n {\n name: \"notifiers|read\",\n rules: [\n \"GET /v2/notifiers\",\n \"GET /v2/notifiers/{id}\",\n ],\n },\n {\n name: \"notifiers|update\",\n rules: [\n \"PUT /v2/notifiers/{id}\",\n ],\n },\n {\n name: \"orgs|create\",\n rules: [\n \"POST /v2/orgs\",\n ],\n },\n {\n name: \"orgs|read\",\n rules: [\n \"GET /v2/orgs\",\n \"GET /v2/orgs/{id}\",\n ],\n },\n {\n name: \"orgs|update\",\n rules: [\n \"PUT /v2/orgs/{id}\",\n ],\n },\n {\n name: \"query|read\",\n rules: [\n \"POST /v1/datasets/_apl\",\n \"POST /v1/datasets/{dataset_name}/query\",\n \"POST /v1/query/_apl\",\n \"POST /v1/query/_mpl\",\n \"POST /v1/query/batch\",\n \"GET /v1/query/metrics/info/datasets/{dataset}/metrics\",\n \"POST /v1/query/metrics/info/datasets/{dataset}/metrics\",\n \"GET /v1/query/metrics/info/datasets/{dataset}/metrics/{metric}/tags\",\n \"GET /v1/query/metrics/info/datasets/{dataset}/metrics/{metric}/tags/{tag}/values\",\n \"GET /v1/query/metrics/info/datasets/{dataset}/tags\",\n \"GET /v1/query/metrics/info/datasets/{dataset}/tags/{tag}/values\",\n ],\n },\n {\n name: \"rbac|create\",\n rules: [\n \"POST /v2/rbac/groups\",\n \"PUT /v2/rbac/groups/{id}\",\n \"DELETE /v2/rbac/groups/{id}\",\n \"POST /v2/rbac/roles\",\n \"PUT /v2/rbac/roles/{id}\",\n \"DELETE /v2/rbac/roles/{id}\",\n ],\n },\n {\n name: \"rbac|read\",\n rules: [\n \"GET /v2/rbac/groups\",\n \"GET /v2/rbac/groups/{id}\",\n \"GET /v2/rbac/roles\",\n \"GET /v2/rbac/roles/{id}\",\n ],\n },\n {\n name: \"starredQueries|create\",\n rules: [\n \"POST /v2/apl-starred-queries\",\n ],\n },\n {\n name: \"starredQueries|delete\",\n rules: [\n \"DELETE /v2/apl-starred-queries/{id}\",\n ],\n },\n {\n name: \"starredQueries|read\",\n rules: [\n \"GET /v2/apl-starred-queries\",\n \"GET /v2/apl-starred-queries/{id}\",\n ],\n },\n {\n name: \"starredQueries|update\",\n rules: [\n \"PUT /v2/apl-starred-queries/{id}\",\n ],\n },\n {\n name: \"trim|update\",\n rules: [\n \"POST /v2/datasets/{dataset_id}/trim\",\n ],\n },\n {\n name: \"users|create\",\n rules: [\n \"POST /v2/users\",\n ],\n },\n {\n name: \"users|delete\",\n rules: [\n \"DELETE /v2/users/{id}\",\n ],\n },\n {\n name: \"users|read\",\n rules: [\n \"GET /v1/user\",\n \"GET /v2/user\",\n \"GET /v2/users\",\n \"GET /v2/users/{id}\",\n ],\n },\n {\n name: \"users|update\",\n rules: [\n \"PUT /v2/user\",\n \"PUT /v2/users/{id}/role\",\n ],\n },\n {\n name: \"vacuum|update\",\n rules: [\n \"POST /v2/datasets/{dataset_id}/vacuum\",\n ],\n },\n {\n name: \"views|create\",\n rules: [\n \"POST /v2/views\",\n ],\n },\n {\n name: \"views|delete\",\n rules: [\n \"DELETE /v2/views/{id}\",\n ],\n },\n {\n name: \"views|read\",\n rules: [\n \"GET /v2/views\",\n \"GET /v2/views/{id}\",\n ],\n },\n {\n name: \"views|update\",\n rules: [\n \"PUT /v2/views/{id}\",\n ],\n },\n {\n name: \"virtualFields|create\",\n rules: [\n \"POST /v2/vfields\",\n ],\n },\n {\n name: \"virtualFields|delete\",\n rules: [\n \"DELETE /v2/vfields/{id}\",\n ],\n },\n {\n name: \"virtualFields|read\",\n rules: [\n \"GET /v2/vfields\",\n \"GET /v2/vfields/{id}\",\n ],\n },\n {\n name: \"virtualFields|update\",\n rules: [\n \"PUT /v2/vfields/{id}\",\n ],\n },\n ],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated firewall config for Bitrix24.\n// Webhook URL contains credentials in the path — uses auth.base for URL rewriting.\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:bitrix\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const bitrixFirewall = {\n name: \"bitrix\",\n description: \"Bitrix24\",\n placeholders: {\n BITRIX_WEBHOOK_URL: \"https://firewall-placeholder.vm3.ai/bitrix/hook\",\n },\n apis: [\n {\n base: \"https://firewall-placeholder.vm3.ai/bitrix/hook\",\n auth: {\n base: \"${{ secrets.BITRIX_WEBHOOK_URL }}\",\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Brave Search API docs.\n// Source: https://api-dashboard.search.brave.com/documentation/guides/authentication\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:brave-search\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const braveSearchFirewall = {\n name: \"brave-search\",\n description: \"Brave Search API\",\n placeholders: {\n BRAVE_API_KEY: \"BSACoffeeSafeLocalCoffeeSafe000\",\n },\n apis: [\n {\n base: \"https://api.search.brave.com\",\n auth: {\n headers: {\n \"X-Subscription-Token\": \"${{ secrets.BRAVE_API_KEY }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Brevo API docs.\n// Source: https://developers.brevo.com/docs/authentication-schemes\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:brevo\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const brevoFirewall = {\n name: \"brevo\",\n description: \"Brevo API\",\n placeholders: {\n BREVO_TOKEN: \"xkeysib-c0ffee5afe10ca1c0ffee5afe10ca1c0ffee5afe10ca1c0ffee5afe10ca1a\",\n },\n apis: [\n {\n base: \"https://api.brevo.com\",\n auth: {\n headers: {\n \"api-key\": \"${{ secrets.BREVO_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Bright Data API docs.\n// Source: https://docs.brightdata.com/api-reference\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:bright-data\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const brightDataFirewall = {\n name: \"bright-data\",\n description: \"Bright Data API\",\n placeholders: {\n BRIGHTDATA_TOKEN: \"c0ffee5afe10ca1c0ffee5afe10ca1c0ffee5afe10ca1c0ffee5afe10ca1c0ff\",\n },\n apis: [\n {\n base: \"https://api.brightdata.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.BRIGHTDATA_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Browserbase API docs.\n// Source: https://docs.browserbase.com/reference/api/overview\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:browserbase\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const browserbaseFirewall = {\n name: \"browserbase\",\n description: \"Browserbase API\",\n placeholders: {\n BROWSERBASE_TOKEN: \"bb_CoffeeSafeLocal_CoffeeSafeLocalCoffeeSafeLocal\",\n },\n apis: [\n {\n base: \"https://api.browserbase.com\",\n auth: {\n headers: {\n \"X-BB-API-Key\": \"${{ secrets.BROWSERBASE_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Browser Use Cloud API docs.\n// Source: https://docs.browser-use.com/cloud/api-reference\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:browser-use\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const browserUseFirewall = {\n name: \"browser-use\",\n description: \"Browser Use\",\n placeholders: {\n BROWSER_USE_TOKEN: \"bu_CoffeeSafeLocalCoffeeSafeLocalCoffee\",\n },\n apis: [\n {\n base: \"https://api.browser-use.com\",\n auth: {\n headers: {\n \"X-Browser-Use-API-Key\": \"${{ secrets.BROWSER_USE_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Browserless API docs.\n// Source: https://docs.browserless.io/rest-apis/intro\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:browserless\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const browserlessFirewall = {\n name: \"browserless\",\n description: \"Browserless API\",\n placeholders: {\n BROWSERLESS_TOKEN: \"c0ffee5a-fe10-ca1c-0ffe-e5afe10ca1c0\",\n },\n apis: [\n {\n base: \"https://production-sfo.browserless.io\",\n auth: {\n query: {\n token: \"${{ secrets.BROWSERLESS_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://production-lon.browserless.io\",\n auth: {\n query: {\n token: \"${{ secrets.BROWSERLESS_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://production-ams.browserless.io\",\n auth: {\n query: {\n token: \"${{ secrets.BROWSERLESS_TOKEN }}\",\n },\n },\n permissions: [],\n }\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Buffer API docs.\n// Source: https://developers.buffer.com\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:buffer\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const bufferFirewall = {\n name: \"buffer\",\n description: \"Buffer\",\n placeholders: {\n BUFFER_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocal000\",\n },\n apis: [\n {\n base: \"https://api.buffer.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.BUFFER_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://api.bufferapp.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.BUFFER_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Cal.com API docs.\n// Source: https://cal.com/docs/api-reference/v2/introduction\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:cal-com\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const calComFirewall = {\n name: \"cal-com\",\n description: \"Cal.com API\",\n placeholders: {\n CALCOM_TOKEN: \"cal_live_CoffeeSafeLocalCoffeeSafeLocalCof00a\",\n },\n apis: [\n {\n base: \"https://api.cal.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.CALCOM_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Calendly API docs.\n// Source: https://developer.calendly.com/getting-started\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:calendly\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const calendlyFirewall = {\n name: \"calendly\",\n description: \"Calendly API\",\n placeholders: {\n CALENDLY_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafe00\",\n },\n apis: [\n {\n base: \"https://api.calendly.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.CALENDLY_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Canva Connect API docs.\n// Source: https://www.canva.dev/docs/connect/authentication/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:canva\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const canvaFirewall = {\n name: \"canva\",\n description: \"Canva Connect API\",\n placeholders: {\n CANVA_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSa0\",\n },\n apis: [\n {\n base: \"https://api.canva.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.CANVA_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Chatwoot API docs.\n// Source: https://www.chatwoot.com/developers/api/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:chatwoot\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const chatwootFirewall = {\n name: \"chatwoot\",\n description: \"Chatwoot API\",\n placeholders: {\n CHATWOOT_TOKEN: \"CoffeeSafeLocalCoffeeSaf\",\n },\n apis: [\n {\n base: \"https://app.chatwoot.com\",\n auth: {\n headers: {\n api_access_token: \"${{ secrets.CHATWOOT_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from ClickUp API docs.\n// Source: https://developer.clickup.com/docs/authentication\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:clickup\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const clickupFirewall = {\n name: \"clickup\",\n description: \"ClickUp API\",\n placeholders: {\n CLICKUP_TOKEN: \"pk_1001001_COFFEESAFELOCALCOFFEESAFELOCALCOFF\",\n },\n apis: [\n {\n base: \"https://api.clickup.com/api\",\n auth: {\n headers: {\n Authorization: \"${{ secrets.CLICKUP_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Close CRM API docs.\n// Source: https://developer.close.com/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:close\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const closeFirewall = {\n name: \"close\",\n description: \"Close CRM API\",\n placeholders: {\n CLOSE_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalC\",\n },\n apis: [\n {\n base: \"https://api.close.com/api\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.CLOSE_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Cloudflare API docs.\n// Source: https://developers.cloudflare.com/fundamentals/api/how-to/make-api-calls/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:cloudflare\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const cloudflareFirewall = {\n name: \"cloudflare\",\n description: \"Cloudflare API\",\n placeholders: {\n CLOUDFLARE_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafe\",\n },\n apis: [\n {\n base: \"https://api.cloudflare.com/client\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.CLOUDFLARE_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Coda API docs.\n// Source: https://coda.io/developers/apis/v1\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:coda\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const codaFirewall = {\n name: \"coda\",\n description: \"Coda\",\n placeholders: {\n CODA_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafe\",\n },\n apis: [\n {\n base: \"https://coda.io\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.CODA_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Cronlytic API docs.\n// Source: https://www.cronlytic.com/api-documentation\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:cronlytic\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const cronlyticFirewall = {\n name: \"cronlytic\",\n description: \"Cronlytic API\",\n placeholders: {\n CRONLYTIC_API_KEY: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafe\",\n CRONLYTIC_USER_ID: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSaf0\",\n },\n apis: [\n {\n base: \"https://api.cronlytic.com\",\n auth: {\n headers: {\n \"x-api-key\": \"${{ secrets.CRONLYTIC_API_KEY }}\",\n \"x-user-id\": \"${{ secrets.CRONLYTIC_USER_ID }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Customer.io API docs.\n// Source: https://docs.customer.io/integrations/api/app/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:customer-io\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const customerIoFirewall = {\n name: \"customer-io\",\n description: \"Customer.io API\",\n placeholders: {\n CUSTOMERIO_APP_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeL\",\n },\n apis: [\n {\n base: \"https://api.customer.io\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.CUSTOMERIO_APP_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from DeepSeek API docs.\n// Source: https://api-docs.deepseek.com/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:deepseek\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const deepseekFirewall = {\n name: \"deepseek\",\n description: \"DeepSeek API\",\n placeholders: {\n DEEPSEEK_TOKEN: \"sk-c0ffee5afe10ca1c0ffee5afe10ca1c0\",\n },\n apis: [\n {\n base: \"https://api.deepseek.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.DEEPSEEK_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Deel's official OpenAPI specs.\n// Source: https://developer.deel.com/openapi.json\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:deel\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const deelFirewall = {\n name: \"deel\",\n description: \"Deel API\",\n placeholders: {\n DEEL_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafe\",\n },\n apis: [\n {\n base: \"https://api.letsdeel.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.DEEL_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"accounting:read\",\n rules: [\n \"GET /rest/v2/invoices\",\n \"GET /rest/v2/invoices/deel\",\n \"GET /rest/v2/invoices/{id}/download\",\n \"GET /rest/v2/invoices/{invoice_id}\",\n \"GET /rest/v2/legal-entities\",\n \"GET /rest/v2/payments\",\n \"GET /rest/v2/payments/{payment_id}/breakdown\",\n ],\n },\n {\n name: \"adjustments:read\",\n rules: [\n \"GET /rest/v2/adjustments/categories\",\n \"GET /rest/v2/adjustments/{id}\",\n \"GET /rest/v2/contracts/{contract_id}/adjustments\",\n ],\n },\n {\n name: \"adjustments:write\",\n rules: [\n \"POST /rest/v2/adjustments\",\n \"PATCH /rest/v2/adjustments/{id}\",\n \"DELETE /rest/v2/adjustments/{id}\",\n ],\n },\n {\n name: \"admin:worker\",\n rules: [\n \"POST /rest/v2/workers/session\",\n \"DELETE /rest/v2/workers/{worker_id}/session\",\n ],\n },\n {\n name: \"ats:read\",\n rules: [\n \"GET /rest/v2/ats/application-sources\",\n \"GET /rest/v2/ats/applications\",\n \"GET /rest/v2/ats/applications/{application_id}\",\n \"GET /rest/v2/ats/attachments/{attachable_type_slug}/{attachable_id}/{attachment_type_slug}\",\n \"GET /rest/v2/ats/candidates\",\n \"GET /rest/v2/ats/departments\",\n \"GET /rest/v2/ats/email-templates\",\n \"GET /rest/v2/ats/employment-types\",\n \"GET /rest/v2/ats/hiring-members\",\n \"GET /rest/v2/ats/job-boards/{job_board_id}/job-postings\",\n \"GET /rest/v2/ats/job-postings/{job_posting_id}\",\n \"GET /rest/v2/ats/jobs\",\n \"GET /rest/v2/ats/locations\",\n \"GET /rest/v2/ats/offers\",\n \"GET /rest/v2/ats/reasons\",\n \"GET /rest/v2/ats/tags\",\n ],\n },\n {\n name: \"ats:write\",\n rules: [\n \"POST /rest/v2/ats/applications\",\n \"POST /rest/v2/ats/applications/{application_id}/interview-plan-stages\",\n \"POST /rest/v2/ats/applications/{application_id}/notes\",\n \"POST /rest/v2/ats/candidates\",\n \"POST /rest/v2/ats/candidates/{candidate_id}/tags\",\n \"POST /rest/v2/ats/jobs\",\n ],\n },\n {\n name: \"auth:write\",\n rules: [\n \"POST /rest/v2/managers/magic-links\",\n ],\n },\n {\n name: \"benefits:read\",\n rules: [\n \"GET /rest/v2/benefits/legal-entities/{id}/401k/plans\",\n \"GET /rest/v2/benefits/legal-entities/{legal_entity_id}/contracts/{contract_id}/plans/{plan_id}\",\n \"GET /rest/v2/benefits/legal-entities/{legal_entity_id}/paystubs\",\n \"GET /rest/v2/eor/benefits\",\n \"GET /rest/v2/eor/worker/benefits\",\n \"POST /rest/v2/workers/amendments/{amendment_id}/sign\",\n ],\n },\n {\n name: \"benefits:write\",\n rules: [\n \"POST /rest/v2/benefits/legal-entities/{id}/401k/plans/clean-up\",\n \"POST /rest/v2/benefits/legal-entities/{id}/benefits/401k/activate\",\n \"POST /rest/v2/benefits/legal-entities/{legal_entity_id}/401k/plans\",\n \"PUT /rest/v2/benefits/legal-entities/{legal_entity_id}/401k/plans/{plan_id}\",\n \"POST /rest/v2/benefits/legal-entities/{legal_entity_id}/contracts/{contract_id}/plans/{plan_id}\",\n ],\n },\n {\n name: \"candidates:write\",\n rules: [\n \"POST /rest/v2/candidates\",\n ],\n },\n {\n name: \"contracts:read\",\n rules: [\n \"GET /rest/v2/contract-templates\",\n \"GET /rest/v2/contracts\",\n \"GET /rest/v2/contracts/custom_fields\",\n \"GET /rest/v2/contracts/custom_fields/{id}\",\n \"GET /rest/v2/contracts/{contract_id}\",\n \"GET /rest/v2/contracts/{contract_id}/amendments\",\n \"GET /rest/v2/contracts/{contract_id}/equity_withholding_estimate\",\n \"GET /rest/v2/contracts/{contract_id}/invite\",\n \"GET /rest/v2/contracts/{contract_id}/payment_cycles\",\n \"GET /rest/v2/contracts/{contract_id}/preview\",\n \"GET /rest/v2/contracts/{contract_id}/tasks\",\n \"GET /rest/v2/employee-info/contract-types/{type}/countries/{country}\",\n \"GET /rest/v2/eor/additional-costs/{country}\",\n \"GET /rest/v2/eor/contracts/{contract_id}/amendments\",\n \"GET /rest/v2/eor/contracts/{contract_id}/amendments/validation/settings\",\n \"GET /rest/v2/eor/contracts/{contract_id}/amendments/{amendment_id}\",\n \"GET /rest/v2/eor/contracts/{contract_id}/amendments/{amendment_id}/effective-date-limitations\",\n \"GET /rest/v2/eor/contracts/{contract_id}/amendments/{amendment_id}/pdf\",\n \"GET /rest/v2/eor/contracts/{contract_id}/details\",\n \"GET /rest/v2/eor/contracts/{contract_id}/documents/{type}\",\n \"GET /rest/v2/eor/contracts/{contract_id}/hrx-documents\",\n \"GET /rest/v2/eor/contracts/{contract_id}/hrx-documents/{document_id}\",\n \"GET /rest/v2/eor/contracts/{contract_id}/offboarding\",\n \"GET /rest/v2/eor/contracts/{contract_id}/offboarding/attachments/{attachment_id}\",\n \"GET /rest/v2/eor/contracts/{contract_id}/offboarding/required-information\",\n \"GET /rest/v2/eor/contracts/{contract_id}/offboarding/restricted-dates\",\n \"GET /rest/v2/eor/contracts/{contract_id}/offboarding/time-offs\",\n \"GET /rest/v2/eor/contracts/{contract_id}/project-assignment\",\n \"GET /rest/v2/eor/contracts/{contract_id}/project-assignment/checkin\",\n \"POST /rest/v2/eor/contracts/{contract_id}/project-assignment/checkin\",\n \"GET /rest/v2/eor/start-date\",\n \"GET /rest/v2/eor/validations/{country_code}\",\n \"GET /rest/v2/eor/{contract_id}/benefits\",\n \"POST /rest/v2/eor/{oid}/terminations/regular\",\n \"POST /rest/v2/eor/{oid}/terminations/resignation\",\n \"GET /rest/v2/eor/{oid}/terminations/{terminationId}\",\n \"GET /rest/v2/offboarding/tracker\",\n \"GET /rest/v2/offboarding/tracker/hris_profile/{oid}\",\n \"GET /rest/v2/offboarding/tracker/{id}\",\n \"GET /rest/v2/onboarding/tracker\",\n \"GET /rest/v2/onboarding/tracker/hris_profile/{hris_profile_id}\",\n \"GET /rest/v2/onboarding/tracker/{tracker_id}\",\n ],\n },\n {\n name: \"contracts:write\",\n rules: [\n \"POST /rest/v2/contracts\",\n \"POST /rest/v2/contracts/gp\",\n \"PATCH /rest/v2/contracts/{contract_id}\",\n \"GET /rest/v2/contracts/{contract_id}/amendments\",\n \"POST /rest/v2/contracts/{contract_id}/amendments\",\n \"PUT /rest/v2/contracts/{contract_id}/custom_fields\",\n \"DELETE /rest/v2/contracts/{contract_id}/custom_fields/{id}\",\n \"POST /rest/v2/contracts/{contract_id}/documents\",\n \"POST /rest/v2/contracts/{contract_id}/invitations\",\n \"DELETE /rest/v2/contracts/{contract_id}/invitations\",\n \"POST /rest/v2/contracts/{contract_id}/signatures\",\n \"POST /rest/v2/contracts/{contract_id}/tasks\",\n \"POST /rest/v2/contracts/{contract_id}/tasks/many/reviews\",\n \"DELETE /rest/v2/contracts/{contract_id}/tasks/{task_id}\",\n \"POST /rest/v2/contracts/{contract_id}/tasks/{task_id}/reviews\",\n \"POST /rest/v2/contracts/{contract_id}/terminations\",\n \"DELETE /rest/v2/contracts/{contract_id}/terminations\",\n \"POST /rest/v2/eor\",\n \"PATCH /rest/v2/eor/contract/{contract_id}\",\n \"POST /rest/v2/eor/contract/{oid}/cancel\",\n \"PATCH /rest/v2/eor/contract/{oid}/delay-onboarding\",\n \"POST /rest/v2/eor/contracts/{contract_id}/amendments\",\n \"POST /rest/v2/eor/contracts/{contract_id}/amendments/validate\",\n \"PATCH /rest/v2/eor/contracts/{contract_id}/amendments/{amendment_id}\",\n \"DELETE /rest/v2/eor/contracts/{contract_id}/amendments/{amendment_id}\",\n \"POST /rest/v2/eor/contracts/{contract_id}/amendments/{amendment_id}/accept\",\n \"POST /rest/v2/eor/contracts/{contract_id}/amendments/{amendment_id}/confirm\",\n \"POST /rest/v2/eor/contracts/{contract_id}/amendments/{amendment_id}/sign\",\n \"POST /rest/v2/eor/contracts/{contract_id}/documents/{type}/sign\",\n \"PATCH /rest/v2/eor/contracts/{contract_id}/employee-information\",\n \"POST /rest/v2/eor/contracts/{contract_id}/offboarding/resignation\",\n \"POST /rest/v2/eor/contracts/{contract_id}/offboarding/resignations/review-pto\",\n \"POST /rest/v2/eor/contracts/{contract_id}/offboarding/review-client-sign-offs\",\n \"POST /rest/v2/eor/contracts/{contract_id}/offboarding/termination\",\n \"POST /rest/v2/eor/contracts/{contract_id}/project-assignment/accept\",\n \"POST /rest/v2/eor/contracts/{contract_id}/project-assignment/checkin\",\n \"POST /rest/v2/eor/job-scopes/validate\",\n \"POST /rest/v2/eor/{oid}/terminations/regular\",\n \"POST /rest/v2/eor/{oid}/terminations/resignation\",\n \"POST /rest/v2/equity/exercise\",\n \"PATCH /rest/v2/equity/exercise/{public_id}\",\n ],\n },\n {\n name: \"equities:write\",\n rules: [\n \"POST /rest/v2/equities-tokens/tax-events\",\n ],\n },\n {\n name: \"forms:read\",\n rules: [\n \"POST /rest/v2/forms/eor/create-contract/definitions\",\n \"GET /rest/v2/forms/eor/create-contract/{country_code}\",\n \"GET /rest/v2/forms/eor/worker-additional-fields/{country_code}\",\n \"GET /rest/v2/forms/gp/worker-additional-fields/{country_code}\",\n ],\n },\n {\n name: \"global-payroll:read\",\n rules: [\n \"GET /rest/v2/contracts/{contract_id}/equity_withholding_estimate\",\n \"GET /rest/v2/gp/legal-entities/{legal_entity_id}/reports\",\n \"GET /rest/v2/gp/reports/{id}/gross_to_net\",\n \"GET /rest/v2/gp/reports/{id}/gross_to_net/csv\",\n ],\n },\n {\n name: \"global-payroll:write\",\n rules: [\n \"POST /rest/v2/gp/workers/{worker_id}/terminations\",\n ],\n },\n {\n name: \"groups:read\",\n rules: [\n \"GET /rest/v2/groups\",\n \"POST /rest/v2/groups\",\n \"PATCH /rest/v2/groups/{id}\",\n ],\n },\n {\n name: \"groups:write\",\n rules: [\n \"POST /rest/v2/groups\",\n \"PATCH /rest/v2/groups/{id}\",\n \"DELETE /rest/v2/groups/{id}\",\n \"POST /rest/v2/groups/{id}/clone\",\n ],\n },\n {\n name: \"immigration:read\",\n rules: [\n \"GET /rest/v2/immigration/client/cases\",\n \"GET /rest/v2/immigration/client/cases/{id}\",\n \"GET /rest/v2/immigration/documents/{id}\",\n \"GET /rest/v2/immigration/visa-requirement/business\",\n \"GET /rest/v2/immigration/visa-types/{country_code}\",\n ],\n },\n {\n name: \"immigration:write\",\n rules: [\n \"POST /rest/v2/immigration/client/cases\",\n ],\n },\n {\n name: \"invoice-adjustments:read\",\n rules: [\n \"GET /rest/v2/contracts/{contract_id}/ic-invoicing-taxes\",\n \"GET /rest/v2/contracts/{contract_id}/invoice-adjustments\",\n \"GET /rest/v2/invoice-adjustments\",\n \"GET /rest/v2/invoice-adjustments/{id}\",\n ],\n },\n {\n name: \"invoice-adjustments:write\",\n rules: [\n \"POST /rest/v2/contracts/{contract_id}/ic-invoicing-taxes\",\n \"PATCH /rest/v2/contracts/{contract_id}/ic-invoicing-taxes\",\n \"DELETE /rest/v2/contracts/{contract_id}/ic-invoicing-taxes/{tax_type}\",\n \"POST /rest/v2/invoice-adjustments\",\n \"PATCH /rest/v2/invoice-adjustments/{id}\",\n \"DELETE /rest/v2/invoice-adjustments/{id}\",\n \"POST /rest/v2/invoice-adjustments/{id}/reviews\",\n ],\n },\n {\n name: \"it-assets:read\",\n rules: [\n \"GET /rest/v2/it/assets\",\n \"GET /rest/v2/it/assets/{asset_id}\",\n ],\n },\n {\n name: \"it-orders:read\",\n rules: [\n \"GET /rest/v2/it/orders\",\n \"GET /rest/v2/it/orders/{order_id}\",\n ],\n },\n {\n name: \"it-policies:read\",\n rules: [\n \"GET /rest/v2/it/policies\",\n ],\n },\n {\n name: \"knowledge-hub:read\",\n rules: [\n \"GET /rest/v2/knowledge-hub/country-guide/{country_code}\",\n ],\n },\n {\n name: \"legal-entity:read\",\n rules: [\n \"GET /rest/v2/industries\",\n \"POST /rest/v2/legal-entities\",\n \"PATCH /rest/v2/legal-entities/{id}\",\n \"DELETE /rest/v2/legal-entities/{id}\",\n \"GET /rest/v2/legal-entities/{legal_entity_id}/cost-centers\",\n \"GET /rest/v2/legal-entities/{legal_entity_id}/payroll-events\",\n \"GET /rest/v2/lookups\",\n ],\n },\n {\n name: \"legal-entity:write\",\n rules: [\n \"POST /rest/v2/legal-entities\",\n \"PATCH /rest/v2/legal-entities/{id}\",\n \"DELETE /rest/v2/legal-entities/{id}\",\n ],\n },\n {\n name: \"lookups:read\",\n rules: [\n \"GET /rest/v2/lookups/countries\",\n \"GET /rest/v2/lookups/currencies\",\n \"GET /rest/v2/lookups/job-titles\",\n \"GET /rest/v2/lookups/seniorities\",\n \"GET /rest/v2/lookups/time-off-types\",\n ],\n },\n {\n name: \"milestones:read\",\n rules: [\n \"GET /rest/v2/contracts/{contract_id}/milestones\",\n \"GET /rest/v2/contracts/{contract_id}/milestones/{milestone_id}\",\n ],\n },\n {\n name: \"milestones:write\",\n rules: [\n \"POST /rest/v2/contracts/{contract_id}/milestones\",\n \"DELETE /rest/v2/contracts/{contract_id}/milestones/{milestone_id}\",\n ],\n },\n {\n name: \"off-cycle-payments:read\",\n rules: [\n \"GET /rest/v2/contracts/{contract_id}/off-cycle-payments\",\n \"GET /rest/v2/contracts/{contract_id}/off-cycle-payments/{id}\",\n ],\n },\n {\n name: \"off-cycle-payments:write\",\n rules: [\n \"POST /rest/v2/contracts/{contract_id}/off-cycle-payments\",\n ],\n },\n {\n name: \"organizations:read\",\n rules: [\n \"GET /rest/v2/benefits/legal-entities/{id}\",\n \"GET /rest/v2/benefits/legal-entities/{id}/pay-stub\",\n \"GET /rest/v2/benefits/legal-entities/{id}/year-to-date-pay\",\n \"GET /rest/v2/departments\",\n \"GET /rest/v2/eor/job-scopes\",\n \"GET /rest/v2/hris/organization-structures/teams/{team_id}/custom-fields\",\n \"PATCH /rest/v2/hris/organization-structures/teams/{team_id}/custom-fields\",\n \"GET /rest/v2/hris/organization_structures\",\n \"GET /rest/v2/hris/organization_structures/external/{external_id}\",\n \"GET /rest/v2/hris/organization_structures/{hrisOrgStr_id}\",\n \"GET /rest/v2/hris/worker_relations/types\",\n \"GET /rest/v2/legal-entities\",\n \"GET /rest/v2/managers\",\n \"GET /rest/v2/organizations\",\n \"GET /rest/v2/roles\",\n \"GET /rest/v2/teams\",\n \"GET /rest/v2/working-locations\",\n ],\n },\n {\n name: \"organizations:write\",\n rules: [\n \"POST /rest/v2/hris/organization_structures\",\n \"PATCH /rest/v2/hris/organization_structures/external/{external_id}\",\n \"DELETE /rest/v2/hris/organization_structures/external/{external_id}\",\n \"PATCH /rest/v2/hris/organization_structures/{hrisOrgStr_id}\",\n \"DELETE /rest/v2/hris/organization_structures/{hrisOrgStr_id}\",\n \"POST /rest/v2/hris/worker_relations/types\",\n \"PATCH /rest/v2/hris/worker_relations/types/external/{externalId}\",\n \"DELETE /rest/v2/hris/worker_relations/types/external/{externalId}\",\n \"PATCH /rest/v2/hris/worker_relations/types/{typeId}\",\n \"DELETE /rest/v2/hris/worker_relations/types/{typeId}\",\n \"POST /rest/v2/managers\",\n \"POST /rest/v2/organizations/children\",\n \"POST /rest/v2/roles\",\n \"PATCH /rest/v2/roles/{roleId}\",\n ],\n },\n {\n name: \"payslips:read\",\n rules: [\n \"GET /rest/v2/eor/workers/{worker_id}/payslips\",\n \"GET /rest/v2/eor/workers/{worker_id}/payslips/{payslip_id}/download\",\n \"GET /rest/v2/gp/workers/{id}/payslips\",\n \"GET /rest/v2/reports/payroll/cycles/{cycle_id}/gross-to-net\",\n ],\n },\n {\n name: \"people:read\",\n rules: [\n \"GET /rest/v2/benefits/legal-entities/{id}/employees/{employee_id}\",\n \"GET /rest/v2/gp/workers/{worker_id}/banks\",\n \"GET /rest/v2/gp/workers/{worker_id}/banks/guide\",\n \"GET /rest/v2/offboarding/tracker\",\n \"GET /rest/v2/offboarding/tracker/hris_profile/{oid}\",\n \"GET /rest/v2/offboarding/tracker/{id}\",\n \"GET /rest/v2/onboarding/tracker\",\n \"GET /rest/v2/onboarding/tracker/hris_profile/{hris_profile_id}\",\n \"GET /rest/v2/onboarding/tracker/{tracker_id}\",\n \"GET /rest/v2/people\",\n \"GET /rest/v2/people/custom_fields\",\n \"GET /rest/v2/people/custom_fields/{id}\",\n \"GET /rest/v2/people/external/{worker_id}/personal\",\n \"GET /rest/v2/people/me\",\n \"GET /rest/v2/people/{hris_profile_id}\",\n \"GET /rest/v2/people/{worker_id}/custom_fields\",\n \"GET /rest/v2/people/{worker_id}/personal\",\n ],\n },\n {\n name: \"people:write\",\n rules: [\n \"POST /rest/v2/eor/worker\",\n \"POST /rest/v2/gp/workers/contracts/{contract_id}/additional-information\",\n \"PATCH /rest/v2/gp/workers/contracts/{contract_id}/additional-information\",\n \"PATCH /rest/v2/gp/workers/{worker_id}/address\",\n \"POST /rest/v2/gp/workers/{worker_id}/banks\",\n \"PATCH /rest/v2/gp/workers/{worker_id}/banks/{bank_id}\",\n \"PATCH /rest/v2/gp/workers/{worker_id}/compensation\",\n \"PATCH /rest/v2/gp/workers/{worker_id}/employee-information\",\n \"PATCH /rest/v2/gp/workers/{worker_id}/pto-policy\",\n \"POST /rest/v2/people\",\n \"PATCH /rest/v2/people/external/{worker_id}/personal\",\n \"PUT /rest/v2/people/{id}/department\",\n \"PUT /rest/v2/people/{id}/working-location\",\n \"PUT /rest/v2/people/{worker_id}/custom_fields\",\n \"DELETE /rest/v2/people/{worker_id}/custom_fields/{id}\",\n \"PATCH /rest/v2/people/{worker_id}/personal\",\n \"POST /rest/v2/pwac\",\n ],\n },\n {\n name: \"profile:read\",\n rules: [\n \"GET /rest/v2/hris/positions/profile/{hrisProfileId}\",\n \"GET /rest/v2/hris/worker_relations/profile/external/{profileId}\",\n \"GET /rest/v2/hris/worker_relations/profile/{hrisProfileOid}\",\n \"PATCH /rest/v2/profiles\",\n ],\n },\n {\n name: \"profile:write\",\n rules: [\n \"POST /rest/v2/hris/positions/apply_changes\",\n \"POST /rest/v2/hris/worker_relations/profile\",\n \"POST /rest/v2/hris/worker_relations/profile/external\",\n \"DELETE /rest/v2/hris/worker_relations/profile/external/{profileId}\",\n \"PUT /rest/v2/hris/worker_relations/profile/external/{profileId}/child\",\n \"PUT /rest/v2/hris/worker_relations/profile/external/{profileId}/parent\",\n \"DELETE /rest/v2/hris/worker_relations/profile/{hrisProfileOid}\",\n \"PUT /rest/v2/hris/worker_relations/profile/{hrisProfileOid}/child\",\n \"PUT /rest/v2/hris/worker_relations/profile/{hrisProfileOid}/parent\",\n \"PATCH /rest/v2/profiles\",\n ],\n },\n {\n name: \"screenings:read\",\n rules: [\n \"GET /rest/v2/screenings/aml/{entity_type}/{entity_id}\",\n \"GET /rest/v2/screenings/kyc/details\",\n \"GET /rest/v2/screenings/verification-method\",\n ],\n },\n {\n name: \"screenings:write\",\n rules: [\n \"POST /rest/v2/veriff/session\",\n ],\n },\n {\n name: \"tasks:read\",\n rules: [\n \"GET /rest/v2/organizations/tasks\",\n ],\n },\n {\n name: \"tasks:write\",\n rules: [\n \"PATCH /rest/v2/tasks/{task_id}\",\n ],\n },\n {\n name: \"time-off:read\",\n rules: [\n \"GET /rest/v2/time_offs\",\n \"GET /rest/v2/time_offs/dailies\",\n \"GET /rest/v2/time_offs/policy-validation-templates\",\n \"GET /rest/v2/time_offs/profile/{hris_profile_id}\",\n \"GET /rest/v2/time_offs/profile/{hris_profile_id}/entitlements\",\n \"GET /rest/v2/time_offs/profile/{hris_profile_id}/policies\",\n \"GET /rest/v2/time_offs/time-off-events\",\n \"POST /rest/v2/time_offs/validate\",\n ],\n },\n {\n name: \"time-off:write\",\n rules: [\n \"POST /rest/v2/time_offs\",\n \"POST /rest/v2/time_offs/global-payroll/sync\",\n \"POST /rest/v2/time_offs/review\",\n \"PATCH /rest/v2/time_offs/{time_off_id}\",\n \"DELETE /rest/v2/time_offs/{time_off_id}\",\n ],\n },\n {\n name: \"time-tracking:read\",\n rules: [\n \"GET /rest/v2/time-tracking/timesheets/{timesheet_id}\",\n \"GET /rest/v2/time_tracking/shift_rates\",\n \"GET /rest/v2/time_tracking/shift_rates/{external_id}\",\n \"GET /rest/v2/time_tracking/shifts\",\n \"GET /rest/v2/time_tracking/shifts/{external_id}\",\n ],\n },\n {\n name: \"time-tracking:write\",\n rules: [\n \"POST /rest/v2/time-tracking/timesheets/upload-url\",\n \"POST /rest/v2/time-tracking/timesheets/{timesheet_id}/review\",\n \"POST /rest/v2/time_tracking/shift_rates\",\n \"PATCH /rest/v2/time_tracking/shift_rates/{external_id}\",\n \"DELETE /rest/v2/time_tracking/shift_rates/{external_id}\",\n \"POST /rest/v2/time_tracking/shifts\",\n \"POST /rest/v2/time_tracking/shifts/bulk-delete\",\n \"POST /rest/v2/time_tracking/shifts/raw\",\n \"PATCH /rest/v2/time_tracking/shifts/{external_id}\",\n \"DELETE /rest/v2/time_tracking/shifts/{external_id}\",\n ],\n },\n {\n name: \"timesheets:read\",\n rules: [\n \"GET /rest/v2/contracts/{contract_id}/timesheets\",\n \"GET /rest/v2/contracts/{contract_id}/timesheets/presets\",\n \"GET /rest/v2/timesheets\",\n \"GET /rest/v2/timesheets/presets/{id}\",\n \"GET /rest/v2/timesheets/root-presets\",\n \"GET /rest/v2/timesheets/root-presets/{id}\",\n \"GET /rest/v2/timesheets/{id}\",\n ],\n },\n {\n name: \"timesheets:write\",\n rules: [\n \"POST /rest/v2/timesheets\",\n \"POST /rest/v2/timesheets/presets\",\n \"PATCH /rest/v2/timesheets/presets/{id}\",\n \"DELETE /rest/v2/timesheets/presets/{id}\",\n \"POST /rest/v2/timesheets/root-presets\",\n \"PATCH /rest/v2/timesheets/{id}\",\n \"DELETE /rest/v2/timesheets/{id}\",\n \"POST /rest/v2/timesheets/{id}/reviews\",\n ],\n },\n {\n name: \"treasury-vendorbill:write\",\n rules: [\n \"POST /rest/v2/accounts-payable/vendor-bills\",\n \"POST /rest/v2/accounts-payable/vendor-bills/{vendor_bill_id}/attachments\",\n ],\n },\n {\n name: \"webhooks:read\",\n rules: [\n \"GET /rest/v2/webhooks\",\n \"GET /rest/v2/webhooks/events/types\",\n \"GET /rest/v2/webhooks/{id}\",\n ],\n },\n {\n name: \"webhooks:write\",\n rules: [\n \"POST /rest/v2/webhooks\",\n \"PATCH /rest/v2/webhooks/{id}\",\n \"DELETE /rest/v2/webhooks/{id}\",\n ],\n },\n {\n name: \"worker:read\",\n rules: [\n \"GET /rest/v2/contracts/{contract_id}/preview\",\n \"GET /rest/v2/daas/payslips\",\n \"GET /rest/v2/engage/learning/actionable-journeys\",\n \"GET /rest/v2/eor/contracts/{contract_id}/hrx-documents\",\n \"GET /rest/v2/eor/contracts/{contract_id}/hrx-documents/{document_id}\",\n \"GET /rest/v2/eor/contracts/{contract_id}/offboarding\",\n \"GET /rest/v2/eor/workers/banks-guide/country/{country}/currency/{currency}\",\n \"GET /rest/v2/eor/workers/banks/guide\",\n \"GET /rest/v2/eor/workers/compliance-documents\",\n \"GET /rest/v2/eor/workers/compliance-documents/{document_id}/download\",\n \"GET /rest/v2/eor/workers/compliance-documents/{document_id}/templates/download\",\n \"GET /rest/v2/eor/workers/contracts/{contract_id}/employee-agreement/download\",\n \"GET /rest/v2/eor/workers/contracts/{contract_id}/hr-documents\",\n \"GET /rest/v2/eor/workers/contracts/{contract_id}/offboarding/resignation-letter\",\n \"GET /rest/v2/eor/workers/contracts/{contract_id}/offer-letter\",\n \"GET /rest/v2/eor/workers/resignations\",\n \"GET /rest/v2/eor/workers/tax-documents\",\n \"GET /rest/v2/escalations/workers/me/hrx\",\n \"GET /rest/v2/immigration/workers/{worker_id}/cases/{case_id}/required-document\",\n \"GET /rest/v2/immigration/workers/{worker_id}/onboarding-case\",\n \"GET /rest/v2/invoice-adjustments/{id}\",\n \"POST /rest/v2/magic-link\",\n \"GET /rest/v2/payouts/auto-withdrawal-setting\",\n \"GET /rest/v2/payouts/balances\",\n \"GET /rest/v2/payouts/contractors/methods\",\n \"POST /rest/v2/payouts/contractors/methods\",\n \"GET /rest/v2/payouts/contractors/methods/bank_transfers/requirements\",\n \"GET /rest/v2/payouts/contractors/methods/bank_transfers/supported_routes\",\n \"PUT /rest/v2/payouts/contractors/methods/{id}\",\n \"POST /rest/v2/payouts/contractors/settings/auto_withdraw\",\n \"GET /rest/v2/payouts/employees/methods\",\n \"POST /rest/v2/payouts/employees/methods\",\n \"POST /rest/v2/payouts/employees/methods/bank_transfers/requirements\",\n \"DELETE /rest/v2/payouts/employees/methods/{id}\",\n \"GET /rest/v2/people/me\",\n \"GET /rest/v2/screenings/verification-method\",\n \"POST /rest/v2/workers/amendments/{amendment_id}/sign\",\n \"GET /rest/v2/workers/contracts/{contract_id}/pdf\",\n ],\n },\n {\n name: \"worker:write\",\n rules: [\n \"PATCH /rest/v2/daas/banks/{bank_id}\",\n \"POST /rest/v2/eor/contracts/{contract_id}/offboarding/review-employee-sign-offs\",\n \"POST /rest/v2/eor/mailboxes/change-password\",\n \"POST /rest/v2/eor/workers/banks\",\n \"POST /rest/v2/eor/workers/compliance-documents/{document_id}\",\n \"POST /rest/v2/eor/workers/compliance-documents/{document_id}/acknowledgement\",\n \"POST /rest/v2/eor/workers/contracts/{contract_id}/additional-information\",\n \"PATCH /rest/v2/eor/workers/contracts/{contract_id}/additional-information\",\n \"POST /rest/v2/eor/workers/contracts/{contract_id}/offboarding\",\n \"POST /rest/v2/eor/workers/contracts/{contract_id}/offboarding/resignation-letter/sign\",\n \"POST /rest/v2/eor/workers/contracts/{contract_id}/signatures\",\n \"POST /rest/v2/immigration/workers/{worker_id}/cases/{case_id}/required-document/{document_request_id}\",\n \"POST /rest/v2/invoice-adjustments\",\n \"PATCH /rest/v2/invoice-adjustments/{id}\",\n \"PATCH /rest/v2/payouts/auto-withdrawal-setting\",\n \"GET /rest/v2/payouts/contractors/methods\",\n \"POST /rest/v2/payouts/contractors/methods\",\n \"GET /rest/v2/payouts/contractors/methods/bank_transfers/requirements\",\n \"GET /rest/v2/payouts/contractors/methods/bank_transfers/supported_routes\",\n \"PUT /rest/v2/payouts/contractors/methods/{id}\",\n \"POST /rest/v2/payouts/contractors/settings/auto_withdraw\",\n \"GET /rest/v2/payouts/employees/methods\",\n \"POST /rest/v2/payouts/employees/methods\",\n \"POST /rest/v2/payouts/employees/methods/bank_transfers/requirements\",\n \"DELETE /rest/v2/payouts/employees/methods/{id}\",\n \"POST /rest/v2/payouts/withdrawals\",\n \"POST /rest/v2/screenings/kyc/external\",\n \"POST /rest/v2/screenings/manual-verification\",\n \"POST /rest/v2/time_offs\",\n \"PATCH /rest/v2/time_offs/{time_off_id}\",\n \"POST /rest/v2/veriff/session\",\n \"POST /rest/v2/workers/amendments/{amendment_id}/sign\",\n \"POST /rest/v2/workers/contracts/{contract_id}/reject\",\n \"POST /rest/v2/workers/contracts/{contract_id}/signatures\",\n ],\n },\n ],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from DEV.to (Forem) API docs.\n// Source: https://developers.forem.com/api/v0\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:devto\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const devtoFirewall = {\n name: \"devto\",\n description: \"DEV.to API\",\n placeholders: {\n DEVTO_TOKEN: \"CoffeeSafeLocalCoffeeSaf\",\n },\n apis: [\n {\n base: \"https://dev.to/api\",\n auth: {\n headers: {\n \"api-key\": \"${{ secrets.DEVTO_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Dify API docs.\n// Source: https://docs.dify.ai/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:dify\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const difyFirewall = {\n name: \"dify\",\n description: \"Dify API\",\n placeholders: {\n DIFY_TOKEN: \"app-CoffeeSafeLocalCoffeeSa\",\n },\n apis: [\n {\n base: \"https://api.dify.ai\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.DIFY_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Discord API docs.\n// Source: https://discord.com/developers/docs/reference#authentication\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:discord\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const discordFirewall = {\n name: \"discord\",\n description: \"Discord API\",\n placeholders: {\n DISCORD_BOT_TOKEN: \"CoffeeSafeLocalCoffeeSaf.Coffee.CoffeeSafeLocalCoffeeSafeLo\",\n },\n apis: [\n {\n base: \"https://discord.com/api\",\n auth: {\n headers: {\n Authorization: \"Bot ${{ secrets.DISCORD_BOT_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated firewall config for Discord Webhook.\n// Webhook URL contains credentials in the path — uses auth.base for URL rewriting.\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:discord-webhook\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const discordWebhookFirewall = {\n name: \"discord-webhook\",\n description: \"Discord Webhook\",\n placeholders: {\n DISCORD_WEBHOOK_URL: \"https://firewall-placeholder.vm3.ai/discord-webhook/hook\",\n },\n apis: [\n {\n base: \"https://firewall-placeholder.vm3.ai/discord-webhook/hook\",\n auth: {\n base: \"${{ secrets.DISCORD_WEBHOOK_URL }}\",\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from DocuSign API docs.\n// Source: https://developers.docusign.com/platform/api-endpoint-base-paths/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:docusign\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const docusignFirewall = {\n name: \"docusign\",\n description: \"DocuSign eSignature REST API\",\n placeholders: {\n DOCUSIGN_TOKEN: \"eyJ0eXAiOiJNVCIsImFsZyI6IlJTMjU2In0.CoffeeSafeLocalCoffeeSafeLocal.CoffeeSaf\",\n },\n apis: [\n {\n base: \"https://www.docusign.net\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.DOCUSIGN_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://na2.docusign.net\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.DOCUSIGN_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://na3.docusign.net\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.DOCUSIGN_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://na4.docusign.net\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.DOCUSIGN_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://eu.docusign.net\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.DOCUSIGN_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://au.docusign.net\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.DOCUSIGN_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://ca.docusign.net\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.DOCUSIGN_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://demo.docusign.net\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.DOCUSIGN_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://account.docusign.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.DOCUSIGN_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://account-d.docusign.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.DOCUSIGN_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from db9.ai API docs.\n// Source: https://db9.ai/docs/quickstart\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:db9\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const db9Firewall = {\n name: \"db9\",\n description: \"db9 API\",\n placeholders: {\n DB9_API_KEY: \"c0ffee5afe10ca1c0ffee5afe10ca1c0ffee5afe10ca1c0ffee5afe10ca1c0ffee5afe10ca1c0ffee5afe10ca1c0ffee5afe10ca1c0ffee5afe10ca1c0ffee5a\",\n },\n apis: [\n {\n base: \"https://api.db9.ai\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.DB9_API_KEY }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from drive9 API docs.\n// Source: https://drive9.ai/SKILL.md\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:drive9\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const drive9Firewall = {\n name: \"drive9\",\n description: \"drive9 API\",\n placeholders: {\n DRIVE9_TOKEN: \"drive9_sk_CoffeeSafeLocalCoffeeSafeLocalCoffeeSa\",\n },\n apis: [\n {\n base: \"https://api.drive9.ai\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.DRIVE9_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Dropbox's official Stone API spec.\n// Source: https://github.com/dropbox/dropbox-api-spec\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:dropbox\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const dropboxFirewall = {\n name: \"dropbox\",\n description: \"Dropbox API\",\n placeholders: {\n DROPBOX_TOKEN: \"sl.CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafe\",\n },\n apis: [\n {\n base: \"https://api.dropboxapi.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.DROPBOX_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"account_info.read\",\n rules: [\n \"POST /2/check/user\",\n \"POST /2/users/features/get_values\",\n \"POST /2/users/get_current_account\",\n \"POST /2/users/get_space_usage\",\n ],\n },\n {\n name: \"account_info.write\",\n rules: [\n \"POST /2/account/set_profile_photo\",\n ],\n },\n {\n name: \"contacts.write\",\n rules: [\n \"POST /2/contacts/delete_manual_contacts\",\n \"POST /2/contacts/delete_manual_contacts_batch\",\n ],\n },\n {\n name: \"events.read\",\n rules: [\n \"POST /2/team_log/get_events\",\n \"POST /2/team_log/get_events/continue\",\n ],\n },\n {\n name: \"file_requests.read\",\n rules: [\n \"POST /2/file_requests/count\",\n \"POST /2/file_requests/get\",\n \"POST /2/file_requests/list\",\n \"POST /2/file_requests/list/continue\",\n \"POST /2/file_requests/list:2\",\n ],\n },\n {\n name: \"file_requests.write\",\n rules: [\n \"POST /2/file_requests/create\",\n \"POST /2/file_requests/delete\",\n \"POST /2/file_requests/delete_all_closed\",\n \"POST /2/file_requests/update\",\n ],\n },\n {\n name: \"files.content.read\",\n rules: [\n \"POST /2/files/get_file_lock_batch\",\n \"POST /2/files/get_temporary_link\",\n \"POST /2/paper/docs/download\",\n ],\n },\n {\n name: \"files.content.write\",\n rules: [\n \"POST /2/files/copy\",\n \"POST /2/files/copy:2\",\n \"POST /2/files/copy_batch\",\n \"POST /2/files/copy_batch/check\",\n \"POST /2/files/copy_batch/check:2\",\n \"POST /2/files/copy_batch:2\",\n \"POST /2/files/copy_reference/get\",\n \"POST /2/files/copy_reference/save\",\n \"POST /2/files/create_folder\",\n \"POST /2/files/create_folder:2\",\n \"POST /2/files/create_folder_batch\",\n \"POST /2/files/create_folder_batch/check\",\n \"POST /2/files/delete\",\n \"POST /2/files/delete:2\",\n \"POST /2/files/delete_batch\",\n \"POST /2/files/delete_batch/check\",\n \"POST /2/files/get_temporary_upload_link\",\n \"POST /2/files/lock_file_batch\",\n \"POST /2/files/move\",\n \"POST /2/files/move:2\",\n \"POST /2/files/move_batch\",\n \"POST /2/files/move_batch/check\",\n \"POST /2/files/move_batch/check:2\",\n \"POST /2/files/move_batch:2\",\n \"POST /2/files/paper/create\",\n \"POST /2/files/paper/update\",\n \"POST /2/files/restore\",\n \"POST /2/files/save_url\",\n \"POST /2/files/save_url/check_job_status\",\n \"POST /2/files/unlock_file_batch\",\n \"POST /2/files/upload_session/finish_batch\",\n \"POST /2/files/upload_session/finish_batch/check\",\n \"POST /2/files/upload_session/finish_batch:2\",\n \"POST /2/files/upload_session/start_batch\",\n \"POST /2/paper/docs/archive\",\n \"POST /2/paper/docs/create\",\n \"POST /2/paper/docs/update\",\n \"POST /2/paper/folders/create\",\n ],\n },\n {\n name: \"files.metadata.read\",\n rules: [\n \"POST /2/file_properties/properties/search\",\n \"POST /2/file_properties/properties/search/continue\",\n \"POST /2/file_properties/templates/get_for_user\",\n \"POST /2/file_properties/templates/list_for_user\",\n \"POST /2/files/alpha/get_metadata\",\n \"POST /2/files/get_metadata\",\n \"POST /2/files/list_folder\",\n \"POST /2/files/list_folder/continue\",\n \"POST /2/files/list_folder/get_latest_cursor\",\n \"POST /2/files/list_revisions\",\n \"POST /2/files/properties/template/get\",\n \"POST /2/files/properties/template/list\",\n \"POST /2/files/search\",\n \"POST /2/files/search/continue:2\",\n \"POST /2/files/search:2\",\n \"POST /2/files/tags/get\",\n \"POST /2/paper/docs/list\",\n \"POST /2/paper/docs/list/continue\",\n ],\n },\n {\n name: \"files.metadata.write\",\n rules: [\n \"POST /2/file_properties/properties/add\",\n \"POST /2/file_properties/properties/overwrite\",\n \"POST /2/file_properties/properties/remove\",\n \"POST /2/file_properties/properties/update\",\n \"POST /2/file_properties/templates/add_for_user\",\n \"POST /2/file_properties/templates/remove_for_user\",\n \"POST /2/file_properties/templates/update_for_user\",\n \"POST /2/files/properties/add\",\n \"POST /2/files/properties/overwrite\",\n \"POST /2/files/properties/remove\",\n \"POST /2/files/properties/update\",\n \"POST /2/files/tags/add\",\n \"POST /2/files/tags/remove\",\n ],\n },\n {\n name: \"files.permanent_delete\",\n rules: [\n \"POST /2/files/permanently_delete\",\n \"POST /2/paper/docs/permanently_delete\",\n ],\n },\n {\n name: \"files.team_metadata.write\",\n rules: [\n \"POST /2/file_properties/templates/add_for_team\",\n \"POST /2/file_properties/templates/get_for_team\",\n \"POST /2/file_properties/templates/list_for_team\",\n \"POST /2/file_properties/templates/remove_for_team\",\n \"POST /2/file_properties/templates/update_for_team\",\n \"POST /2/team/properties/template/add\",\n \"POST /2/team/properties/template/get\",\n \"POST /2/team/properties/template/list\",\n \"POST /2/team/properties/template/update\",\n ],\n },\n {\n name: \"groups.read\",\n rules: [\n \"POST /2/team/groups/get_info\",\n \"POST /2/team/groups/list\",\n \"POST /2/team/groups/list/continue\",\n \"POST /2/team/groups/members/list\",\n \"POST /2/team/groups/members/list/continue\",\n ],\n },\n {\n name: \"groups.write\",\n rules: [\n \"POST /2/team/groups/create\",\n \"POST /2/team/groups/delete\",\n \"POST /2/team/groups/job_status/get\",\n \"POST /2/team/groups/members/add\",\n \"POST /2/team/groups/members/remove\",\n \"POST /2/team/groups/members/set_access_type\",\n \"POST /2/team/groups/update\",\n ],\n },\n {\n name: \"members.delete\",\n rules: [\n \"POST /2/team/members/recover\",\n \"POST /2/team/members/remove\",\n \"POST /2/team/members/remove/job_status/get\",\n ],\n },\n {\n name: \"members.read\",\n rules: [\n \"POST /2/team/member_space_limits/excluded_users/list\",\n \"POST /2/team/member_space_limits/excluded_users/list/continue\",\n \"POST /2/team/member_space_limits/get_custom_quota\",\n \"POST /2/team/member_space_limits/set_custom_quota\",\n \"POST /2/team/members/get_available_team_member_roles\",\n \"POST /2/team/members/get_info\",\n \"POST /2/team/members/get_info:2\",\n \"POST /2/team/members/list\",\n \"POST /2/team/members/list/continue\",\n \"POST /2/team/members/list/continue:2\",\n \"POST /2/team/members/list:2\",\n ],\n },\n {\n name: \"members.write\",\n rules: [\n \"POST /2/team/member_space_limits/excluded_users/add\",\n \"POST /2/team/member_space_limits/excluded_users/remove\",\n \"POST /2/team/member_space_limits/remove_custom_quota\",\n \"POST /2/team/members/add\",\n \"POST /2/team/members/add/job_status/get\",\n \"POST /2/team/members/add/job_status/get:2\",\n \"POST /2/team/members/add:2\",\n \"POST /2/team/members/delete_profile_photo\",\n \"POST /2/team/members/delete_profile_photo:2\",\n \"POST /2/team/members/move_former_member_files\",\n \"POST /2/team/members/move_former_member_files/job_status/check\",\n \"POST /2/team/members/secondary_emails/add\",\n \"POST /2/team/members/secondary_emails/delete\",\n \"POST /2/team/members/secondary_emails/resend_verification_emails\",\n \"POST /2/team/members/send_welcome_email\",\n \"POST /2/team/members/set_admin_permissions\",\n \"POST /2/team/members/set_admin_permissions:2\",\n \"POST /2/team/members/set_profile\",\n \"POST /2/team/members/set_profile:2\",\n \"POST /2/team/members/set_profile_photo\",\n \"POST /2/team/members/set_profile_photo:2\",\n \"POST /2/team/members/suspend\",\n \"POST /2/team/members/unsuspend\",\n ],\n },\n {\n name: \"openid\",\n rules: [\n \"POST /2/openid/userinfo\",\n ],\n },\n {\n name: \"sessions.list\",\n rules: [\n \"POST /2/team/devices/list_member_devices\",\n \"POST /2/team/devices/list_members_devices\",\n \"POST /2/team/devices/list_team_devices\",\n \"POST /2/team/linked_apps/list_member_linked_apps\",\n \"POST /2/team/linked_apps/list_members_linked_apps\",\n \"POST /2/team/linked_apps/list_team_linked_apps\",\n ],\n },\n {\n name: \"sessions.modify\",\n rules: [\n \"POST /2/team/devices/revoke_device_session\",\n \"POST /2/team/devices/revoke_device_session_batch\",\n \"POST /2/team/linked_apps/revoke_linked_app\",\n \"POST /2/team/linked_apps/revoke_linked_app_batch\",\n ],\n },\n {\n name: \"sharing.read\",\n rules: [\n \"POST /2/paper/docs/folder_users/list\",\n \"POST /2/paper/docs/folder_users/list/continue\",\n \"POST /2/paper/docs/get_folder_info\",\n \"POST /2/paper/docs/sharing_policy/get\",\n \"POST /2/paper/docs/users/list\",\n \"POST /2/paper/docs/users/list/continue\",\n \"POST /2/sharing/get_file_metadata\",\n \"POST /2/sharing/get_file_metadata/batch\",\n \"POST /2/sharing/get_folder_metadata\",\n \"POST /2/sharing/get_shared_link_metadata\",\n \"POST /2/sharing/get_shared_links\",\n \"POST /2/sharing/list_file_members\",\n \"POST /2/sharing/list_file_members/batch\",\n \"POST /2/sharing/list_file_members/continue\",\n \"POST /2/sharing/list_folder_members\",\n \"POST /2/sharing/list_folder_members/continue\",\n \"POST /2/sharing/list_folders\",\n \"POST /2/sharing/list_folders/continue\",\n \"POST /2/sharing/list_mountable_folders\",\n \"POST /2/sharing/list_mountable_folders/continue\",\n \"POST /2/sharing/list_received_files\",\n \"POST /2/sharing/list_received_files/continue\",\n \"POST /2/sharing/list_shared_links\",\n \"POST /2/users/get_account\",\n \"POST /2/users/get_account_batch\",\n ],\n },\n {\n name: \"sharing.write\",\n rules: [\n \"POST /2/paper/docs/sharing_policy/set\",\n \"POST /2/paper/docs/users/add\",\n \"POST /2/paper/docs/users/remove\",\n \"POST /2/sharing/add_file_member\",\n \"POST /2/sharing/add_folder_member\",\n \"POST /2/sharing/check_job_status\",\n \"POST /2/sharing/check_remove_member_job_status\",\n \"POST /2/sharing/check_share_job_status\",\n \"POST /2/sharing/create_shared_link\",\n \"POST /2/sharing/create_shared_link_with_settings\",\n \"POST /2/sharing/modify_shared_link_settings\",\n \"POST /2/sharing/mount_folder\",\n \"POST /2/sharing/relinquish_file_membership\",\n \"POST /2/sharing/relinquish_folder_membership\",\n \"POST /2/sharing/remove_file_member\",\n \"POST /2/sharing/remove_file_member_2\",\n \"POST /2/sharing/remove_folder_member\",\n \"POST /2/sharing/revoke_shared_link\",\n \"POST /2/sharing/set_access_inheritance\",\n \"POST /2/sharing/share_folder\",\n \"POST /2/sharing/transfer_folder\",\n \"POST /2/sharing/unmount_folder\",\n \"POST /2/sharing/unshare_file\",\n \"POST /2/sharing/unshare_folder\",\n \"POST /2/sharing/update_file_member\",\n \"POST /2/sharing/update_folder_member\",\n \"POST /2/sharing/update_folder_policy\",\n ],\n },\n {\n name: \"team_data.content.read\",\n rules: [\n \"POST /2/team/team_folder/get_info\",\n \"POST /2/team/team_folder/list\",\n \"POST /2/team/team_folder/list/continue\",\n ],\n },\n {\n name: \"team_data.content.write\",\n rules: [\n \"POST /2/team/team_folder/activate\",\n \"POST /2/team/team_folder/archive\",\n \"POST /2/team/team_folder/archive/check\",\n \"POST /2/team/team_folder/create\",\n \"POST /2/team/team_folder/permanently_delete\",\n \"POST /2/team/team_folder/rename\",\n \"POST /2/team/team_folder/update_sync_settings\",\n ],\n },\n {\n name: \"team_data.governance.write\",\n rules: [\n \"POST /2/team/legal_holds/create_policy\",\n \"POST /2/team/legal_holds/get_policy\",\n \"POST /2/team/legal_holds/list_held_revisions\",\n \"POST /2/team/legal_holds/list_held_revisions_continue\",\n \"POST /2/team/legal_holds/list_policies\",\n \"POST /2/team/legal_holds/release_policy\",\n \"POST /2/team/legal_holds/update_policy\",\n ],\n },\n {\n name: \"team_data.member\",\n rules: [\n \"POST /2/team/namespaces/list\",\n \"POST /2/team/namespaces/list/continue\",\n ],\n },\n {\n name: \"team_info.read\",\n rules: [\n \"POST /2/team/features/get_values\",\n \"POST /2/team/get_info\",\n \"POST /2/team/reports/get_activity\",\n \"POST /2/team/reports/get_devices\",\n \"POST /2/team/reports/get_membership\",\n \"POST /2/team/reports/get_storage\",\n \"POST /2/team/sharing_allowlist/list\",\n \"POST /2/team/sharing_allowlist/list/continue\",\n \"POST /2/team/token/get_authenticated_admin\",\n ],\n },\n {\n name: \"team_info.write\",\n rules: [\n \"POST /2/team/sharing_allowlist/add\",\n \"POST /2/team/sharing_allowlist/remove\",\n ],\n },\n ],\n },\n {\n base: \"https://content.dropboxapi.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.DROPBOX_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"files.content.read\",\n rules: [\n \"POST /2/files/download\",\n \"POST /2/files/download_zip\",\n \"POST /2/files/export\",\n \"POST /2/files/get_preview\",\n \"POST /2/files/get_thumbnail\",\n \"POST /2/files/get_thumbnail:2\",\n \"POST /2/files/get_thumbnail_batch\",\n ],\n },\n {\n name: \"files.content.write\",\n rules: [\n \"POST /2/files/alpha/upload\",\n \"POST /2/files/upload\",\n \"POST /2/files/upload_session/append\",\n \"POST /2/files/upload_session/append:2\",\n \"POST /2/files/upload_session/finish\",\n \"POST /2/files/upload_session/start\",\n ],\n },\n {\n name: \"sharing.read\",\n rules: [\n \"POST /2/sharing/get_shared_link_file\",\n ],\n },\n ],\n },\n {\n base: \"https://notify.dropboxapi.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.DROPBOX_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"files.metadata.read\",\n rules: [\n \"POST /2/files/list_folder/longpoll\",\n ],\n },\n ],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Dropbox Sign (HelloSign) API docs.\n// Source: https://developer.hellosign.com/api/api-reference-authentication\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:dropbox-sign\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const dropboxSignFirewall = {\n name: \"dropbox-sign\",\n description: \"Dropbox Sign (HelloSign) e-signature API\",\n placeholders: {\n DROPBOX_SIGN_TOKEN: \"c0ffee5afe10ca1c0ffee5afe10ca1c0ffee5afe\",\n },\n apis: [\n {\n base: \"https://api.hellosign.com\",\n auth: {\n headers: {\n Authorization: \"${{ basic(secrets.DROPBOX_SIGN_TOKEN, ) }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Duffel API docs.\n// Source: https://duffel.com/docs/api\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:duffel\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const duffelFirewall = {\n name: \"duffel\",\n description: \"Duffel\",\n placeholders: {\n DUFFEL_TOKEN: \"duffel_test_CoffeeSafeLocalCoffeeSafeLocalCoffeeSa\",\n },\n apis: [\n {\n base: \"https://api.duffel.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.DUFFEL_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from E2B API docs.\n// Source: https://e2b.dev/docs/api-reference\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:e2b\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const e2bFirewall = {\n name: \"e2b\",\n description: \"E2B\",\n placeholders: {\n E2B_TOKEN: \"e2b_CoffeeSafeLocalCoffeeSafeLocalCoffee\",\n },\n apis: [\n {\n base: \"https://api.e2b.app\",\n auth: {\n headers: {\n \"X-API-Key\": \"${{ secrets.E2B_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from ElevenLabs API docs.\n// Source: https://elevenlabs.io/docs/api-reference/authentication\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:elevenlabs\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const elevenlabsFirewall = {\n name: \"elevenlabs\",\n description: \"ElevenLabs API\",\n placeholders: {\n ELEVENLABS_TOKEN: \"c0ffee5afe10ca1c0ffee5afe10ca1c0\",\n },\n apis: [\n {\n base: \"https://api.elevenlabs.io\",\n auth: {\n headers: {\n \"xi-api-key\": \"${{ secrets.ELEVENLABS_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Etsy Open API v3 docs.\n// Source: https://developers.etsy.com/documentation/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:etsy\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const etsyFirewall = {\n name: \"etsy\",\n description: \"Etsy\",\n placeholders: {\n ETSY_TOKEN: \"c0ffee5afe10ca1c0ffee5af:e10ca15afe\",\n },\n apis: [\n {\n base: \"https://openapi.etsy.com\",\n auth: {\n headers: {\n \"x-api-key\": \"${{ secrets.ETSY_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Exa API docs.\n// Source: https://exa.ai/docs/reference/search-api-guide\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:exa\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const exaFirewall = {\n name: \"exa\",\n description: \"Exa\",\n placeholders: {\n EXA_TOKEN: \"exa_CoffeeSafeLocalCoffeeSafeLocalCof\",\n },\n apis: [\n {\n base: \"https://api.exa.ai\",\n auth: {\n headers: {\n \"x-api-key\": \"${{ secrets.EXA_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Explorium API docs.\n// Source: https://developers.explorium.ai/reference/introduction\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:explorium\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const exploriumFirewall = {\n name: \"explorium\",\n description: \"Explorium API\",\n placeholders: {\n EXPLORIUM_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafe\",\n },\n apis: [\n {\n base: \"https://api.explorium.ai\",\n auth: {\n headers: {\n api_key: \"${{ secrets.EXPLORIUM_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from fal.ai API docs.\n// Source: https://fal.ai/docs/reference/platform-apis/authentication\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:fal\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const falFirewall = {\n name: \"fal\",\n description: \"fal.ai API\",\n placeholders: {\n FAL_TOKEN: \"CoffeeSafeLocalC:sk_live_CoffeeSafeLocalCoffeeSafeLo\",\n },\n apis: [\n {\n base: \"https://fal.run\",\n auth: {\n headers: {\n Authorization: \"Key ${{ secrets.FAL_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://queue.fal.run\",\n auth: {\n headers: {\n Authorization: \"Key ${{ secrets.FAL_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://api.fal.ai\",\n auth: {\n headers: {\n Authorization: \"Key ${{ secrets.FAL_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Figma's official OpenAPI spec.\n// Source: https://github.com/figma/rest-api-spec\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:figma\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const figmaFirewall = {\n name: \"figma\",\n description: \"Figma API\",\n placeholders: {\n FIGMA_TOKEN: \"figd_CoffeeSafeLocalCoffeeSafeLocalCoffeeSafe\",\n },\n apis: [\n {\n base: \"https://api.figma.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.FIGMA_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"current_user:read\",\n description: \"Read your name, email, and profile image.\",\n rules: [\n \"GET /v1/me\",\n ],\n },\n {\n name: \"file_comments:read\",\n description: \"Read the comments for files.\",\n rules: [\n \"GET /v1/files/{file_key}/comments\",\n \"GET /v1/files/{file_key}/comments/{comment_id}/reactions\",\n ],\n },\n {\n name: \"file_comments:write\",\n description: \"Post and delete comments and comment reactions in files.\",\n rules: [\n \"POST /v1/files/{file_key}/comments\",\n \"DELETE /v1/files/{file_key}/comments/{comment_id}\",\n \"POST /v1/files/{file_key}/comments/{comment_id}/reactions\",\n \"DELETE /v1/files/{file_key}/comments/{comment_id}/reactions\",\n ],\n },\n {\n name: \"file_content:read\",\n description: \"Read the contents of files, such as nodes and the editor type.\",\n rules: [\n \"GET /v1/files/{file_key}\",\n \"GET /v1/files/{file_key}/images\",\n \"GET /v1/files/{file_key}/nodes\",\n \"GET /v1/images/{file_key}\",\n ],\n },\n {\n name: \"file_dev_resources:read\",\n description: \"Read dev resources in files.\",\n rules: [\n \"GET /v1/files/{file_key}/dev_resources\",\n ],\n },\n {\n name: \"file_dev_resources:write\",\n description: \"Write to dev resources in files.\",\n rules: [\n \"POST /v1/dev_resources\",\n \"PUT /v1/dev_resources\",\n \"DELETE /v1/files/{file_key}/dev_resources/{dev_resource_id}\",\n ],\n },\n {\n name: \"file_metadata:read\",\n description: \"Read metadata of files.\",\n rules: [\n \"GET /v1/files/{file_key}/meta\",\n \"GET /v1/oembed\",\n ],\n },\n {\n name: \"file_variables:read\",\n description: \"Read variables in Figma file. Note: this is only available to members in Enterprise organizations.\",\n rules: [\n \"GET /v1/files/{file_key}/variables/local\",\n \"GET /v1/files/{file_key}/variables/published\",\n ],\n },\n {\n name: \"file_variables:write\",\n description: \"Write to variables in Figma file. Note: this is only available to members in Enterprise organizations.\",\n rules: [\n \"POST /v1/files/{file_key}/variables\",\n ],\n },\n {\n name: \"file_versions:read\",\n description: \"Read the version history for files you can access.\",\n rules: [\n \"GET /v1/files/{file_key}/versions\",\n ],\n },\n {\n name: \"files:read\",\n description: \"Deprecated. Read files, projects, users, versions, comments, components & styles, and webhooks.\",\n rules: [\n \"GET /v1/component_sets/{key}\",\n \"GET /v1/components/{key}\",\n \"GET /v1/files/{file_key}\",\n \"GET /v1/files/{file_key}/comments\",\n \"GET /v1/files/{file_key}/comments/{comment_id}/reactions\",\n \"GET /v1/files/{file_key}/component_sets\",\n \"GET /v1/files/{file_key}/components\",\n \"GET /v1/files/{file_key}/images\",\n \"GET /v1/files/{file_key}/meta\",\n \"GET /v1/files/{file_key}/nodes\",\n \"GET /v1/files/{file_key}/styles\",\n \"GET /v1/files/{file_key}/versions\",\n \"GET /v1/images/{file_key}\",\n \"GET /v1/me\",\n \"GET /v1/projects/{project_id}/files\",\n \"GET /v1/styles/{key}\",\n \"GET /v1/teams/{team_id}/component_sets\",\n \"GET /v1/teams/{team_id}/components\",\n \"GET /v1/teams/{team_id}/projects\",\n \"GET /v1/teams/{team_id}/styles\",\n \"GET /v2/teams/{team_id}/webhooks\",\n \"GET /v2/webhooks/{webhook_id}\",\n \"GET /v2/webhooks/{webhook_id}/requests\",\n ],\n },\n {\n name: \"library_analytics:read\",\n description: \"Read library analytics data.\",\n rules: [\n \"GET /v1/analytics/libraries/{file_key}/component/actions\",\n \"GET /v1/analytics/libraries/{file_key}/component/usages\",\n \"GET /v1/analytics/libraries/{file_key}/style/actions\",\n \"GET /v1/analytics/libraries/{file_key}/style/usages\",\n \"GET /v1/analytics/libraries/{file_key}/variable/actions\",\n \"GET /v1/analytics/libraries/{file_key}/variable/usages\",\n ],\n },\n {\n name: \"library_assets:read\",\n description: \"Read data of individual published components and styles.\",\n rules: [\n \"GET /v1/component_sets/{key}\",\n \"GET /v1/components/{key}\",\n \"GET /v1/styles/{key}\",\n ],\n },\n {\n name: \"library_content:read\",\n description: \"Read published components and styles of files.\",\n rules: [\n \"GET /v1/files/{file_key}/component_sets\",\n \"GET /v1/files/{file_key}/components\",\n \"GET /v1/files/{file_key}/styles\",\n ],\n },\n {\n name: \"org:activity_log_read\",\n description: \"Read activity logs in the organization.\",\n rules: [\n \"GET /v1/activity_logs\",\n ],\n },\n {\n name: \"projects:read\",\n description: \"List projects and files in projects.\",\n rules: [\n \"GET /v1/projects/{project_id}/files\",\n \"GET /v1/teams/{team_id}/projects\",\n ],\n },\n {\n name: \"team_library_content:read\",\n description: \"Read published components and styles of teams.\",\n rules: [\n \"GET /v1/teams/{team_id}/component_sets\",\n \"GET /v1/teams/{team_id}/components\",\n \"GET /v1/teams/{team_id}/styles\",\n ],\n },\n {\n name: \"webhooks:read\",\n description: \"Read metadata of webhooks.\",\n rules: [\n \"GET /v2/teams/{team_id}/webhooks\",\n \"GET /v2/webhooks\",\n \"GET /v2/webhooks/{webhook_id}\",\n \"GET /v2/webhooks/{webhook_id}/requests\",\n ],\n },\n {\n name: \"webhooks:write\",\n description: \"Create and manage webhooks.\",\n rules: [\n \"POST /v2/webhooks\",\n \"PUT /v2/webhooks/{webhook_id}\",\n \"DELETE /v2/webhooks/{webhook_id}\",\n ],\n },\n ],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Firecrawl API docs.\n// Source: https://docs.firecrawl.dev/api-reference/introduction\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:firecrawl\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const firecrawlFirewall = {\n name: \"firecrawl\",\n description: \"Firecrawl API\",\n placeholders: {\n FIRECRAWL_TOKEN: \"fc-c0ffee5afe10ca1c0ffee5afe10ca1c0\",\n },\n apis: [\n {\n base: \"https://api.firecrawl.dev\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.FIRECRAWL_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Fireflies.ai API docs.\n// Source: https://docs.fireflies.ai/fundamentals/authorization\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:fireflies\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const firefliesFirewall = {\n name: \"fireflies\",\n description: \"Fireflies.ai API\",\n placeholders: {\n FIREFLIES_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalC\",\n },\n apis: [\n {\n base: \"https://api.fireflies.ai/graphql\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.FIREFLIES_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Freshdesk API docs.\n// Source: https://developers.freshdesk.com/api/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:freshdesk\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const freshdeskFirewall = {\n name: \"freshdesk\",\n description: \"Freshdesk helpdesk and customer support API\",\n placeholders: {\n FRESHDESK_TOKEN: \"CoffeeSafeLocalCoffe\",\n },\n apis: [\n {\n base: \"https://${{ vars.FRESHDESK_DOMAIN }}.freshdesk.com\",\n auth: {\n headers: {\n Authorization: \"${{ basic(secrets.FRESHDESK_TOKEN, ) }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Gamma API docs.\n// Source: https://developers.gamma.app\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:gamma\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const gammaFirewall = {\n name: \"gamma\",\n description: \"Gamma API\",\n placeholders: {\n GAMMA_TOKEN: \"sk-gamma-CoffeeSafeLocalCoffeeSafeLo\",\n },\n apis: [\n {\n base: \"https://public-api.gamma.app\",\n auth: {\n headers: {\n \"X-API-KEY\": \"${{ secrets.GAMMA_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Garmin Connect API docs.\n// Source: https://developer.garmin.com/gc-developer-program/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:garmin-connect\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const garminConnectFirewall = {\n name: \"garmin-connect\",\n description: \"Garmin Connect API\",\n placeholders: {\n GARMIN_CONNECT_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafe\",\n },\n apis: [\n {\n base: \"https://apis.garmin.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.GARMIN_CONNECT_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated — GitHub firewall config.\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:github\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const githubFirewall = {\n name: \"github\",\n description: \"GitHub\",\n placeholders: {\n GITHUB_TOKEN: \"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\",\n GH_TOKEN: \"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\",\n },\n apis: [\n {\n // REST + GraphQL API.\n base: \"https://api.github.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.GITHUB_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n // Release asset uploads.\n base: \"https://uploads.github.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.GITHUB_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n // Git smart-HTTP (clone/push/pull, includes LFS under /info/lfs).\n base: \"https://github.com/{owner}/{repo}.git\",\n auth: {\n headers: {\n Authorization:\n '${{ basic(\"x-access-token\", secrets.GITHUB_TOKEN) }}',\n },\n },\n permissions: [],\n },\n {\n // Gist git protocol — canonical form returned by the API's\n // git_pull_url / git_push_url fields (no username segment).\n base: \"https://gist.github.com/{gist_id}.git\",\n auth: {\n headers: {\n Authorization:\n '${{ basic(\"x-access-token\", secrets.GITHUB_TOKEN) }}',\n },\n },\n permissions: [],\n },\n {\n // Gist git protocol — browser-URL form with username segment,\n // also served by GitHub's gist git server. Users often copy\n // this URL out of the gist page and append \".git\".\n base: \"https://gist.github.com/{user}/{gist_id}.git\",\n auth: {\n headers: {\n Authorization:\n '${{ basic(\"x-access-token\", secrets.GITHUB_TOKEN) }}',\n },\n },\n permissions: [],\n },\n {\n // Raw file content — used by curl/wget/requests for private repos.\n base: \"https://raw.githubusercontent.com/{owner}/{repo}\",\n auth: {\n headers: {\n Authorization:\n '${{ basic(\"x-access-token\", secrets.GITHUB_TOKEN) }}',\n },\n },\n permissions: [],\n },\n {\n // Archive downloads — used by go get / pip install git+ / npm github:.\n base: \"https://codeload.github.com/{owner}/{repo}\",\n auth: {\n headers: {\n Authorization:\n '${{ basic(\"x-access-token\", secrets.GITHUB_TOKEN) }}',\n },\n },\n permissions: [],\n },\n {\n // GitHub Packages — npm registry (npm install @scope/pkg).\n base: \"https://npm.pkg.github.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.GITHUB_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from GitLab API docs.\n// Source: https://docs.gitlab.com/api/rest/authentication/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:gitlab\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const gitlabFirewall = {\n name: \"gitlab\",\n description: \"GitLab API\",\n placeholders: {\n GITLAB_TOKEN: \"glpat-CoffeeSafeLocalCoffe\",\n },\n apis: [\n {\n base: \"https://gitlab.com/api\",\n auth: {\n headers: {\n \"PRIVATE-TOKEN\": \"${{ secrets.GITLAB_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Google's Discovery API.\n// Source: https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:google-calendar\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const googleCalendarFirewall = {\n name: \"google-calendar\",\n description: \"Google Calendar API\",\n placeholders: {\n GOOGLE_CALENDAR_TOKEN: \"ya29.A0CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSa\",\n },\n apis: [\n {\n base: \"https://www.googleapis.com/calendar\",\n auth: {\n headers: {\n \"Authorization\": \"Bearer ${{ secrets.GOOGLE_CALENDAR_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"calendar\",\n description: \"See, edit, share, and permanently delete all the calendars you can access using Google Calendar\",\n rules: [\n \"POST /v3/calendars\",\n \"GET /v3/calendars/{calendarId}\",\n \"PUT /v3/calendars/{calendarId}\",\n \"PATCH /v3/calendars/{calendarId}\",\n \"DELETE /v3/calendars/{calendarId}\",\n \"GET /v3/calendars/{calendarId}/acl\",\n \"POST /v3/calendars/{calendarId}/acl\",\n \"POST /v3/calendars/{calendarId}/acl/watch\",\n \"GET /v3/calendars/{calendarId}/acl/{ruleId}\",\n \"PUT /v3/calendars/{calendarId}/acl/{ruleId}\",\n \"PATCH /v3/calendars/{calendarId}/acl/{ruleId}\",\n \"DELETE /v3/calendars/{calendarId}/acl/{ruleId}\",\n \"POST /v3/calendars/{calendarId}/clear\",\n \"GET /v3/calendars/{calendarId}/events\",\n \"POST /v3/calendars/{calendarId}/events\",\n \"POST /v3/calendars/{calendarId}/events/import\",\n \"POST /v3/calendars/{calendarId}/events/quickAdd\",\n \"POST /v3/calendars/{calendarId}/events/watch\",\n \"GET /v3/calendars/{calendarId}/events/{eventId}\",\n \"PUT /v3/calendars/{calendarId}/events/{eventId}\",\n \"PATCH /v3/calendars/{calendarId}/events/{eventId}\",\n \"DELETE /v3/calendars/{calendarId}/events/{eventId}\",\n \"GET /v3/calendars/{calendarId}/events/{eventId}/instances\",\n \"POST /v3/calendars/{calendarId}/events/{eventId}/move\",\n \"POST /v3/channels/stop\",\n \"GET /v3/colors\",\n \"POST /v3/freeBusy\",\n \"GET /v3/users/me/calendarList\",\n \"POST /v3/users/me/calendarList\",\n \"POST /v3/users/me/calendarList/watch\",\n \"GET /v3/users/me/calendarList/{calendarId}\",\n \"PUT /v3/users/me/calendarList/{calendarId}\",\n \"PATCH /v3/users/me/calendarList/{calendarId}\",\n \"DELETE /v3/users/me/calendarList/{calendarId}\",\n \"GET /v3/users/me/settings\",\n \"POST /v3/users/me/settings/watch\",\n \"GET /v3/users/me/settings/{setting}\",\n ],\n },\n {\n name: \"calendar.acls\",\n description: \"See and change the sharing permissions of Google calendars you own\",\n rules: [\n \"GET /v3/calendars/{calendarId}/acl\",\n \"POST /v3/calendars/{calendarId}/acl\",\n \"POST /v3/calendars/{calendarId}/acl/watch\",\n \"GET /v3/calendars/{calendarId}/acl/{ruleId}\",\n \"PUT /v3/calendars/{calendarId}/acl/{ruleId}\",\n \"PATCH /v3/calendars/{calendarId}/acl/{ruleId}\",\n \"DELETE /v3/calendars/{calendarId}/acl/{ruleId}\",\n \"POST /v3/channels/stop\",\n ],\n },\n {\n name: \"calendar.acls.readonly\",\n description: \"See the sharing permissions of Google calendars you own\",\n rules: [\n \"GET /v3/calendars/{calendarId}/acl\",\n \"POST /v3/calendars/{calendarId}/acl/watch\",\n \"GET /v3/calendars/{calendarId}/acl/{ruleId}\",\n \"POST /v3/channels/stop\",\n ],\n },\n {\n name: \"calendar.app.created\",\n description: \"Make secondary Google calendars, and see, create, change, and delete events on them\",\n rules: [\n \"POST /v3/calendars\",\n \"GET /v3/calendars/{calendarId}\",\n \"PUT /v3/calendars/{calendarId}\",\n \"PATCH /v3/calendars/{calendarId}\",\n \"DELETE /v3/calendars/{calendarId}\",\n \"GET /v3/calendars/{calendarId}/events\",\n \"POST /v3/calendars/{calendarId}/events\",\n \"POST /v3/calendars/{calendarId}/events/import\",\n \"POST /v3/calendars/{calendarId}/events/quickAdd\",\n \"POST /v3/calendars/{calendarId}/events/watch\",\n \"GET /v3/calendars/{calendarId}/events/{eventId}\",\n \"PUT /v3/calendars/{calendarId}/events/{eventId}\",\n \"PATCH /v3/calendars/{calendarId}/events/{eventId}\",\n \"DELETE /v3/calendars/{calendarId}/events/{eventId}\",\n \"GET /v3/calendars/{calendarId}/events/{eventId}/instances\",\n \"POST /v3/channels/stop\",\n \"GET /v3/colors\",\n \"GET /v3/users/me/calendarList/{calendarId}\",\n \"PUT /v3/users/me/calendarList/{calendarId}\",\n \"PATCH /v3/users/me/calendarList/{calendarId}\",\n \"DELETE /v3/users/me/calendarList/{calendarId}\",\n ],\n },\n {\n name: \"calendar.calendarlist\",\n description: \"See, add, and remove Google calendars you’re subscribed to\",\n rules: [\n \"POST /v3/channels/stop\",\n \"GET /v3/colors\",\n \"GET /v3/users/me/calendarList\",\n \"POST /v3/users/me/calendarList\",\n \"POST /v3/users/me/calendarList/watch\",\n \"GET /v3/users/me/calendarList/{calendarId}\",\n \"PUT /v3/users/me/calendarList/{calendarId}\",\n \"PATCH /v3/users/me/calendarList/{calendarId}\",\n \"DELETE /v3/users/me/calendarList/{calendarId}\",\n ],\n },\n {\n name: \"calendar.calendarlist.readonly\",\n description: \"See the list of Google calendars you’re subscribed to\",\n rules: [\n \"POST /v3/channels/stop\",\n \"GET /v3/colors\",\n \"GET /v3/users/me/calendarList\",\n \"POST /v3/users/me/calendarList/watch\",\n \"GET /v3/users/me/calendarList/{calendarId}\",\n ],\n },\n {\n name: \"calendar.calendars\",\n description: \"See and change the properties of Google calendars you have access to, and create secondary calendars\",\n rules: [\n \"POST /v3/calendars\",\n \"GET /v3/calendars/{calendarId}\",\n \"PUT /v3/calendars/{calendarId}\",\n \"PATCH /v3/calendars/{calendarId}\",\n \"DELETE /v3/calendars/{calendarId}\",\n \"POST /v3/calendars/{calendarId}/clear\",\n ],\n },\n {\n name: \"calendar.calendars.readonly\",\n description: \"See the title, description, default time zone, and other properties of Google calendars you have access to\",\n rules: [\n \"GET /v3/calendars/{calendarId}\",\n ],\n },\n {\n name: \"calendar.events\",\n description: \"View and edit events on all your calendars\",\n rules: [\n \"GET /v3/calendars/{calendarId}/events\",\n \"POST /v3/calendars/{calendarId}/events\",\n \"POST /v3/calendars/{calendarId}/events/import\",\n \"POST /v3/calendars/{calendarId}/events/quickAdd\",\n \"POST /v3/calendars/{calendarId}/events/watch\",\n \"GET /v3/calendars/{calendarId}/events/{eventId}\",\n \"PUT /v3/calendars/{calendarId}/events/{eventId}\",\n \"PATCH /v3/calendars/{calendarId}/events/{eventId}\",\n \"DELETE /v3/calendars/{calendarId}/events/{eventId}\",\n \"GET /v3/calendars/{calendarId}/events/{eventId}/instances\",\n \"POST /v3/calendars/{calendarId}/events/{eventId}/move\",\n \"POST /v3/channels/stop\",\n ],\n },\n {\n name: \"calendar.events.freebusy\",\n description: \"See the availability on Google calendars you have access to\",\n rules: [\n \"GET /v3/calendars/{calendarId}/events\",\n \"POST /v3/calendars/{calendarId}/events/watch\",\n \"GET /v3/calendars/{calendarId}/events/{eventId}\",\n \"GET /v3/calendars/{calendarId}/events/{eventId}/instances\",\n \"POST /v3/channels/stop\",\n \"GET /v3/colors\",\n \"POST /v3/freeBusy\",\n ],\n },\n {\n name: \"calendar.events.owned\",\n description: \"See, create, change, and delete events on Google calendars you own\",\n rules: [\n \"GET /v3/calendars/{calendarId}/events\",\n \"POST /v3/calendars/{calendarId}/events\",\n \"POST /v3/calendars/{calendarId}/events/import\",\n \"POST /v3/calendars/{calendarId}/events/quickAdd\",\n \"POST /v3/calendars/{calendarId}/events/watch\",\n \"GET /v3/calendars/{calendarId}/events/{eventId}\",\n \"PUT /v3/calendars/{calendarId}/events/{eventId}\",\n \"PATCH /v3/calendars/{calendarId}/events/{eventId}\",\n \"DELETE /v3/calendars/{calendarId}/events/{eventId}\",\n \"GET /v3/calendars/{calendarId}/events/{eventId}/instances\",\n \"POST /v3/calendars/{calendarId}/events/{eventId}/move\",\n \"POST /v3/channels/stop\",\n \"GET /v3/colors\",\n ],\n },\n {\n name: \"calendar.events.owned.readonly\",\n description: \"See the events on Google calendars you own\",\n rules: [\n \"GET /v3/calendars/{calendarId}/events\",\n \"POST /v3/calendars/{calendarId}/events/watch\",\n \"GET /v3/calendars/{calendarId}/events/{eventId}\",\n \"GET /v3/calendars/{calendarId}/events/{eventId}/instances\",\n \"POST /v3/channels/stop\",\n \"GET /v3/colors\",\n ],\n },\n {\n name: \"calendar.events.public.readonly\",\n description: \"See the events on public calendars\",\n rules: [\n \"GET /v3/calendars/{calendarId}/events\",\n \"POST /v3/calendars/{calendarId}/events/watch\",\n \"GET /v3/calendars/{calendarId}/events/{eventId}\",\n \"GET /v3/calendars/{calendarId}/events/{eventId}/instances\",\n \"POST /v3/channels/stop\",\n \"GET /v3/colors\",\n ],\n },\n {\n name: \"calendar.events.readonly\",\n description: \"View events on all your calendars\",\n rules: [\n \"GET /v3/calendars/{calendarId}/events\",\n \"POST /v3/calendars/{calendarId}/events/watch\",\n \"GET /v3/calendars/{calendarId}/events/{eventId}\",\n \"GET /v3/calendars/{calendarId}/events/{eventId}/instances\",\n \"POST /v3/channels/stop\",\n ],\n },\n {\n name: \"calendar.freebusy\",\n description: \"View your availability in your calendars\",\n rules: [\n \"POST /v3/freeBusy\",\n ],\n },\n {\n name: \"calendar.readonly\",\n description: \"See and download any calendar you can access using your Google Calendar\",\n rules: [\n \"GET /v3/calendars/{calendarId}\",\n \"GET /v3/calendars/{calendarId}/acl/{ruleId}\",\n \"GET /v3/calendars/{calendarId}/events\",\n \"POST /v3/calendars/{calendarId}/events/watch\",\n \"GET /v3/calendars/{calendarId}/events/{eventId}\",\n \"GET /v3/calendars/{calendarId}/events/{eventId}/instances\",\n \"POST /v3/channels/stop\",\n \"GET /v3/colors\",\n \"POST /v3/freeBusy\",\n \"GET /v3/users/me/calendarList\",\n \"POST /v3/users/me/calendarList/watch\",\n \"GET /v3/users/me/calendarList/{calendarId}\",\n \"GET /v3/users/me/settings\",\n \"POST /v3/users/me/settings/watch\",\n \"GET /v3/users/me/settings/{setting}\",\n ],\n },\n {\n name: \"calendar.settings.readonly\",\n description: \"View your Calendar settings\",\n rules: [\n \"POST /v3/channels/stop\",\n \"GET /v3/users/me/settings\",\n \"POST /v3/users/me/settings/watch\",\n \"GET /v3/users/me/settings/{setting}\",\n ],\n },\n ],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Google's Discovery API.\n// Source: https://docs.googleapis.com/$discovery/rest?version=v1\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:google-docs\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const googleDocsFirewall = {\n name: \"google-docs\",\n description: \"Google Docs API\",\n placeholders: {\n GOOGLE_DOCS_TOKEN: \"ya29.A0CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSa\",\n },\n apis: [\n {\n base: \"https://docs.googleapis.com\",\n auth: {\n headers: {\n \"Authorization\": \"Bearer ${{ secrets.GOOGLE_DOCS_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"documents\",\n description: \"See, edit, create, and delete all your Google Docs documents\",\n rules: [\n \"POST /v1/documents\",\n \"GET /v1/documents/{documentId}\",\n \"POST /v1/documents/{documentId}:batchUpdate\",\n ],\n },\n {\n name: \"documents.readonly\",\n description: \"See all your Google Docs documents\",\n rules: [\n \"GET /v1/documents/{documentId}\",\n ],\n },\n {\n name: \"drive\",\n description: \"See, edit, create, and delete all of your Google Drive files\",\n rules: [\n \"POST /v1/documents\",\n \"GET /v1/documents/{documentId}\",\n \"POST /v1/documents/{documentId}:batchUpdate\",\n ],\n },\n {\n name: \"drive.file\",\n description: \"See, edit, create, and delete only the specific Google Drive files you use with this app\",\n rules: [\n \"POST /v1/documents\",\n \"GET /v1/documents/{documentId}\",\n \"POST /v1/documents/{documentId}:batchUpdate\",\n ],\n },\n {\n name: \"drive.readonly\",\n description: \"See and download all your Google Drive files\",\n rules: [\n \"GET /v1/documents/{documentId}\",\n ],\n },\n ],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Google's Discovery API.\n// Source: https://www.googleapis.com/discovery/v1/apis/drive/v2/rest\n// Source: https://www.googleapis.com/discovery/v1/apis/drive/v3/rest\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:google-drive\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const googleDriveFirewall = {\n name: \"google-drive\",\n description: \"Google Drive API\",\n placeholders: {\n GOOGLE_DRIVE_TOKEN: \"ya29.A0CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSa\",\n },\n apis: [\n {\n base: \"https://www.googleapis.com/drive\",\n auth: {\n headers: {\n \"Authorization\": \"Bearer ${{ secrets.GOOGLE_DRIVE_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"drive\",\n description: \"See, edit, create, and delete all of your Google Drive files\",\n rules: [\n \"GET /v2/about\",\n \"GET /v2/apps/{appId}\",\n \"GET /v2/changes\",\n \"GET /v2/changes/startPageToken\",\n \"POST /v2/changes/watch\",\n \"GET /v2/changes/{changeId}\",\n \"POST /v2/channels/stop\",\n \"GET /v2/drives\",\n \"POST /v2/drives\",\n \"GET /v2/drives/{driveId}\",\n \"PUT /v2/drives/{driveId}\",\n \"DELETE /v2/drives/{driveId}\",\n \"POST /v2/drives/{driveId}/hide\",\n \"POST /v2/drives/{driveId}/unhide\",\n \"GET /v2/files\",\n \"POST /v2/files\",\n \"GET /v2/files/generateCseToken\",\n \"GET /v2/files/generateIds\",\n \"DELETE /v2/files/trash\",\n \"GET /v2/files/{fileId}\",\n \"PUT /v2/files/{fileId}\",\n \"PATCH /v2/files/{fileId}\",\n \"DELETE /v2/files/{fileId}\",\n \"GET /v2/files/{fileId}/comments\",\n \"POST /v2/files/{fileId}/comments\",\n \"GET /v2/files/{fileId}/comments/{commentId}\",\n \"PUT /v2/files/{fileId}/comments/{commentId}\",\n \"PATCH /v2/files/{fileId}/comments/{commentId}\",\n \"DELETE /v2/files/{fileId}/comments/{commentId}\",\n \"GET /v2/files/{fileId}/comments/{commentId}/replies\",\n \"POST /v2/files/{fileId}/comments/{commentId}/replies\",\n \"GET /v2/files/{fileId}/comments/{commentId}/replies/{replyId}\",\n \"PUT /v2/files/{fileId}/comments/{commentId}/replies/{replyId}\",\n \"PATCH /v2/files/{fileId}/comments/{commentId}/replies/{replyId}\",\n \"DELETE /v2/files/{fileId}/comments/{commentId}/replies/{replyId}\",\n \"POST /v2/files/{fileId}/copy\",\n \"GET /v2/files/{fileId}/export\",\n \"GET /v2/files/{fileId}/listLabels\",\n \"POST /v2/files/{fileId}/modifyLabels\",\n \"GET /v2/files/{fileId}/parents\",\n \"POST /v2/files/{fileId}/parents\",\n \"GET /v2/files/{fileId}/parents/{parentId}\",\n \"DELETE /v2/files/{fileId}/parents/{parentId}\",\n \"GET /v2/files/{fileId}/permissions\",\n \"POST /v2/files/{fileId}/permissions\",\n \"GET /v2/files/{fileId}/permissions/{permissionId}\",\n \"PUT /v2/files/{fileId}/permissions/{permissionId}\",\n \"PATCH /v2/files/{fileId}/permissions/{permissionId}\",\n \"DELETE /v2/files/{fileId}/permissions/{permissionId}\",\n \"GET /v2/files/{fileId}/properties\",\n \"POST /v2/files/{fileId}/properties\",\n \"GET /v2/files/{fileId}/properties/{propertyKey}\",\n \"PUT /v2/files/{fileId}/properties/{propertyKey}\",\n \"PATCH /v2/files/{fileId}/properties/{propertyKey}\",\n \"DELETE /v2/files/{fileId}/properties/{propertyKey}\",\n \"GET /v2/files/{fileId}/revisions\",\n \"GET /v2/files/{fileId}/revisions/{revisionId}\",\n \"PUT /v2/files/{fileId}/revisions/{revisionId}\",\n \"PATCH /v2/files/{fileId}/revisions/{revisionId}\",\n \"DELETE /v2/files/{fileId}/revisions/{revisionId}\",\n \"POST /v2/files/{fileId}/touch\",\n \"POST /v2/files/{fileId}/trash\",\n \"POST /v2/files/{fileId}/untrash\",\n \"POST /v2/files/{fileId}/watch\",\n \"GET /v2/files/{folderId}/children\",\n \"POST /v2/files/{folderId}/children\",\n \"GET /v2/files/{folderId}/children/{childId}\",\n \"DELETE /v2/files/{folderId}/children/{childId}\",\n \"GET /v2/permissionIds/{email}\",\n \"GET /v2/teamdrives\",\n \"POST /v2/teamdrives\",\n \"GET /v2/teamdrives/{teamDriveId}\",\n \"PUT /v2/teamdrives/{teamDriveId}\",\n \"DELETE /v2/teamdrives/{teamDriveId}\",\n \"GET /v3/about\",\n \"GET /v3/apps/{appId}\",\n \"GET /v3/changes\",\n \"GET /v3/changes/startPageToken\",\n \"POST /v3/changes/watch\",\n \"POST /v3/channels/stop\",\n \"GET /v3/drives\",\n \"POST /v3/drives\",\n \"GET /v3/drives/{driveId}\",\n \"PATCH /v3/drives/{driveId}\",\n \"DELETE /v3/drives/{driveId}\",\n \"POST /v3/drives/{driveId}/hide\",\n \"POST /v3/drives/{driveId}/unhide\",\n \"GET /v3/files\",\n \"POST /v3/files\",\n \"GET /v3/files/generateCseToken\",\n \"GET /v3/files/generateIds\",\n \"DELETE /v3/files/trash\",\n \"GET /v3/files/{fileId}\",\n \"PATCH /v3/files/{fileId}\",\n \"DELETE /v3/files/{fileId}\",\n \"GET /v3/files/{fileId}/accessproposals\",\n \"GET /v3/files/{fileId}/accessproposals/{proposalId}\",\n \"POST /v3/files/{fileId}/accessproposals/{proposalId}:resolve\",\n \"GET /v3/files/{fileId}/approvals\",\n \"GET /v3/files/{fileId}/approvals/{approvalId}\",\n \"GET /v3/files/{fileId}/comments\",\n \"POST /v3/files/{fileId}/comments\",\n \"GET /v3/files/{fileId}/comments/{commentId}\",\n \"PATCH /v3/files/{fileId}/comments/{commentId}\",\n \"DELETE /v3/files/{fileId}/comments/{commentId}\",\n \"GET /v3/files/{fileId}/comments/{commentId}/replies\",\n \"POST /v3/files/{fileId}/comments/{commentId}/replies\",\n \"GET /v3/files/{fileId}/comments/{commentId}/replies/{replyId}\",\n \"PATCH /v3/files/{fileId}/comments/{commentId}/replies/{replyId}\",\n \"DELETE /v3/files/{fileId}/comments/{commentId}/replies/{replyId}\",\n \"POST /v3/files/{fileId}/copy\",\n \"POST /v3/files/{fileId}/download\",\n \"GET /v3/files/{fileId}/export\",\n \"GET /v3/files/{fileId}/listLabels\",\n \"POST /v3/files/{fileId}/modifyLabels\",\n \"GET /v3/files/{fileId}/permissions\",\n \"POST /v3/files/{fileId}/permissions\",\n \"GET /v3/files/{fileId}/permissions/{permissionId}\",\n \"PATCH /v3/files/{fileId}/permissions/{permissionId}\",\n \"DELETE /v3/files/{fileId}/permissions/{permissionId}\",\n \"GET /v3/files/{fileId}/revisions\",\n \"GET /v3/files/{fileId}/revisions/{revisionId}\",\n \"PATCH /v3/files/{fileId}/revisions/{revisionId}\",\n \"DELETE /v3/files/{fileId}/revisions/{revisionId}\",\n \"POST /v3/files/{fileId}/watch\",\n \"GET /v3/operations/{name}\",\n \"GET /v3/teamdrives\",\n \"POST /v3/teamdrives\",\n \"GET /v3/teamdrives/{teamDriveId}\",\n \"PATCH /v3/teamdrives/{teamDriveId}\",\n \"DELETE /v3/teamdrives/{teamDriveId}\",\n ],\n },\n {\n name: \"drive.appdata\",\n description: \"See, create, and delete its own configuration data in your Google Drive\",\n rules: [\n \"GET /v2/about\",\n \"GET /v2/apps/{appId}\",\n \"GET /v2/changes\",\n \"GET /v2/changes/startPageToken\",\n \"POST /v2/changes/watch\",\n \"GET /v2/changes/{changeId}\",\n \"POST /v2/channels/stop\",\n \"GET /v2/files\",\n \"POST /v2/files\",\n \"GET /v2/files/generateIds\",\n \"GET /v2/files/{fileId}\",\n \"PUT /v2/files/{fileId}\",\n \"PATCH /v2/files/{fileId}\",\n \"DELETE /v2/files/{fileId}\",\n \"POST /v2/files/{fileId}/copy\",\n \"GET /v2/files/{fileId}/parents\",\n \"POST /v2/files/{fileId}/parents\",\n \"GET /v2/files/{fileId}/parents/{parentId}\",\n \"GET /v2/files/{fileId}/properties\",\n \"POST /v2/files/{fileId}/properties\",\n \"GET /v2/files/{fileId}/properties/{propertyKey}\",\n \"PUT /v2/files/{fileId}/properties/{propertyKey}\",\n \"PATCH /v2/files/{fileId}/properties/{propertyKey}\",\n \"DELETE /v2/files/{fileId}/properties/{propertyKey}\",\n \"GET /v2/files/{fileId}/revisions\",\n \"GET /v2/files/{fileId}/revisions/{revisionId}\",\n \"PUT /v2/files/{fileId}/revisions/{revisionId}\",\n \"PATCH /v2/files/{fileId}/revisions/{revisionId}\",\n \"DELETE /v2/files/{fileId}/revisions/{revisionId}\",\n \"POST /v2/files/{fileId}/touch\",\n \"POST /v2/files/{fileId}/trash\",\n \"POST /v2/files/{fileId}/untrash\",\n \"POST /v2/files/{fileId}/watch\",\n \"GET /v2/files/{folderId}/children\",\n \"POST /v2/files/{folderId}/children\",\n \"GET /v2/files/{folderId}/children/{childId}\",\n \"GET /v2/permissionIds/{email}\",\n \"GET /v3/about\",\n \"GET /v3/apps/{appId}\",\n \"GET /v3/changes\",\n \"GET /v3/changes/startPageToken\",\n \"POST /v3/changes/watch\",\n \"POST /v3/channels/stop\",\n \"GET /v3/files\",\n \"POST /v3/files\",\n \"GET /v3/files/generateIds\",\n \"GET /v3/files/{fileId}\",\n \"PATCH /v3/files/{fileId}\",\n \"DELETE /v3/files/{fileId}\",\n \"GET /v3/files/{fileId}/approvals\",\n \"GET /v3/files/{fileId}/approvals/{approvalId}\",\n \"POST /v3/files/{fileId}/copy\",\n \"GET /v3/files/{fileId}/revisions\",\n \"GET /v3/files/{fileId}/revisions/{revisionId}\",\n \"PATCH /v3/files/{fileId}/revisions/{revisionId}\",\n \"DELETE /v3/files/{fileId}/revisions/{revisionId}\",\n \"POST /v3/files/{fileId}/watch\",\n ],\n },\n {\n name: \"drive.apps.readonly\",\n description: \"View your Google Drive apps\",\n rules: [\n \"GET /v2/apps\",\n \"GET /v2/apps/{appId}\",\n \"GET /v2/changes\",\n \"GET /v2/changes/startPageToken\",\n \"POST /v2/changes/watch\",\n \"GET /v2/changes/{changeId}\",\n \"POST /v2/channels/stop\",\n \"GET /v2/files\",\n \"POST /v2/files\",\n \"PUT /v2/files/{fileId}\",\n \"PATCH /v2/files/{fileId}\",\n \"POST /v2/files/{fileId}/copy\",\n \"POST /v2/files/{fileId}/touch\",\n \"POST /v2/files/{fileId}/trash\",\n \"POST /v2/files/{fileId}/untrash\",\n \"GET /v2/permissionIds/{email}\",\n \"GET /v3/apps\",\n \"GET /v3/apps/{appId}\",\n ],\n },\n {\n name: \"drive.file\",\n description: \"See, edit, create, and delete only the specific Google Drive files you use with this app\",\n rules: [\n \"GET /v2/about\",\n \"GET /v2/apps/{appId}\",\n \"GET /v2/changes\",\n \"GET /v2/changes/startPageToken\",\n \"POST /v2/changes/watch\",\n \"GET /v2/changes/{changeId}\",\n \"POST /v2/channels/stop\",\n \"GET /v2/files\",\n \"POST /v2/files\",\n \"GET /v2/files/generateIds\",\n \"GET /v2/files/{fileId}\",\n \"PUT /v2/files/{fileId}\",\n \"PATCH /v2/files/{fileId}\",\n \"DELETE /v2/files/{fileId}\",\n \"GET /v2/files/{fileId}/comments\",\n \"POST /v2/files/{fileId}/comments\",\n \"GET /v2/files/{fileId}/comments/{commentId}\",\n \"PUT /v2/files/{fileId}/comments/{commentId}\",\n \"PATCH /v2/files/{fileId}/comments/{commentId}\",\n \"DELETE /v2/files/{fileId}/comments/{commentId}\",\n \"GET /v2/files/{fileId}/comments/{commentId}/replies\",\n \"POST /v2/files/{fileId}/comments/{commentId}/replies\",\n \"GET /v2/files/{fileId}/comments/{commentId}/replies/{replyId}\",\n \"PUT /v2/files/{fileId}/comments/{commentId}/replies/{replyId}\",\n \"PATCH /v2/files/{fileId}/comments/{commentId}/replies/{replyId}\",\n \"DELETE /v2/files/{fileId}/comments/{commentId}/replies/{replyId}\",\n \"POST /v2/files/{fileId}/copy\",\n \"GET /v2/files/{fileId}/export\",\n \"GET /v2/files/{fileId}/listLabels\",\n \"POST /v2/files/{fileId}/modifyLabels\",\n \"GET /v2/files/{fileId}/parents\",\n \"POST /v2/files/{fileId}/parents\",\n \"GET /v2/files/{fileId}/parents/{parentId}\",\n \"DELETE /v2/files/{fileId}/parents/{parentId}\",\n \"GET /v2/files/{fileId}/permissions\",\n \"POST /v2/files/{fileId}/permissions\",\n \"GET /v2/files/{fileId}/permissions/{permissionId}\",\n \"PUT /v2/files/{fileId}/permissions/{permissionId}\",\n \"PATCH /v2/files/{fileId}/permissions/{permissionId}\",\n \"DELETE /v2/files/{fileId}/permissions/{permissionId}\",\n \"GET /v2/files/{fileId}/properties\",\n \"POST /v2/files/{fileId}/properties\",\n \"GET /v2/files/{fileId}/properties/{propertyKey}\",\n \"PUT /v2/files/{fileId}/properties/{propertyKey}\",\n \"PATCH /v2/files/{fileId}/properties/{propertyKey}\",\n \"DELETE /v2/files/{fileId}/properties/{propertyKey}\",\n \"GET /v2/files/{fileId}/revisions\",\n \"GET /v2/files/{fileId}/revisions/{revisionId}\",\n \"PUT /v2/files/{fileId}/revisions/{revisionId}\",\n \"PATCH /v2/files/{fileId}/revisions/{revisionId}\",\n \"DELETE /v2/files/{fileId}/revisions/{revisionId}\",\n \"POST /v2/files/{fileId}/touch\",\n \"POST /v2/files/{fileId}/trash\",\n \"POST /v2/files/{fileId}/untrash\",\n \"POST /v2/files/{fileId}/watch\",\n \"GET /v2/files/{folderId}/children\",\n \"POST /v2/files/{folderId}/children\",\n \"GET /v2/files/{folderId}/children/{childId}\",\n \"DELETE /v2/files/{folderId}/children/{childId}\",\n \"GET /v2/permissionIds/{email}\",\n \"GET /v3/about\",\n \"GET /v3/apps/{appId}\",\n \"GET /v3/changes\",\n \"GET /v3/changes/startPageToken\",\n \"POST /v3/changes/watch\",\n \"POST /v3/channels/stop\",\n \"GET /v3/files\",\n \"POST /v3/files\",\n \"GET /v3/files/generateIds\",\n \"GET /v3/files/{fileId}\",\n \"PATCH /v3/files/{fileId}\",\n \"DELETE /v3/files/{fileId}\",\n \"GET /v3/files/{fileId}/accessproposals\",\n \"GET /v3/files/{fileId}/accessproposals/{proposalId}\",\n \"POST /v3/files/{fileId}/accessproposals/{proposalId}:resolve\",\n \"GET /v3/files/{fileId}/approvals\",\n \"GET /v3/files/{fileId}/approvals/{approvalId}\",\n \"GET /v3/files/{fileId}/comments\",\n \"POST /v3/files/{fileId}/comments\",\n \"GET /v3/files/{fileId}/comments/{commentId}\",\n \"PATCH /v3/files/{fileId}/comments/{commentId}\",\n \"DELETE /v3/files/{fileId}/comments/{commentId}\",\n \"GET /v3/files/{fileId}/comments/{commentId}/replies\",\n \"POST /v3/files/{fileId}/comments/{commentId}/replies\",\n \"GET /v3/files/{fileId}/comments/{commentId}/replies/{replyId}\",\n \"PATCH /v3/files/{fileId}/comments/{commentId}/replies/{replyId}\",\n \"DELETE /v3/files/{fileId}/comments/{commentId}/replies/{replyId}\",\n \"POST /v3/files/{fileId}/copy\",\n \"POST /v3/files/{fileId}/download\",\n \"GET /v3/files/{fileId}/export\",\n \"GET /v3/files/{fileId}/listLabels\",\n \"POST /v3/files/{fileId}/modifyLabels\",\n \"GET /v3/files/{fileId}/permissions\",\n \"POST /v3/files/{fileId}/permissions\",\n \"GET /v3/files/{fileId}/permissions/{permissionId}\",\n \"PATCH /v3/files/{fileId}/permissions/{permissionId}\",\n \"DELETE /v3/files/{fileId}/permissions/{permissionId}\",\n \"GET /v3/files/{fileId}/revisions\",\n \"GET /v3/files/{fileId}/revisions/{revisionId}\",\n \"PATCH /v3/files/{fileId}/revisions/{revisionId}\",\n \"DELETE /v3/files/{fileId}/revisions/{revisionId}\",\n \"POST /v3/files/{fileId}/watch\",\n \"GET /v3/operations/{name}\",\n ],\n },\n {\n name: \"drive.meet.readonly\",\n description: \"See and download your Google Drive files that were created or edited by Google Meet.\",\n rules: [\n \"GET /v2/changes\",\n \"GET /v2/changes/startPageToken\",\n \"POST /v2/changes/watch\",\n \"GET /v2/changes/{changeId}\",\n \"POST /v2/channels/stop\",\n \"GET /v2/files\",\n \"GET /v2/files/{fileId}\",\n \"GET /v2/files/{fileId}/comments\",\n \"GET /v2/files/{fileId}/comments/{commentId}\",\n \"GET /v2/files/{fileId}/comments/{commentId}/replies\",\n \"GET /v2/files/{fileId}/comments/{commentId}/replies/{replyId}\",\n \"GET /v2/files/{fileId}/export\",\n \"GET /v2/files/{fileId}/listLabels\",\n \"GET /v2/files/{fileId}/parents\",\n \"GET /v2/files/{fileId}/parents/{parentId}\",\n \"GET /v2/files/{fileId}/permissions\",\n \"GET /v2/files/{fileId}/permissions/{permissionId}\",\n \"GET /v2/files/{fileId}/properties\",\n \"GET /v2/files/{fileId}/properties/{propertyKey}\",\n \"GET /v2/files/{fileId}/revisions\",\n \"GET /v2/files/{fileId}/revisions/{revisionId}\",\n \"POST /v2/files/{fileId}/watch\",\n \"GET /v2/files/{folderId}/children\",\n \"GET /v2/files/{folderId}/children/{childId}\",\n \"GET /v3/changes\",\n \"GET /v3/changes/startPageToken\",\n \"POST /v3/changes/watch\",\n \"POST /v3/channels/stop\",\n \"GET /v3/files\",\n \"GET /v3/files/{fileId}\",\n \"GET /v3/files/{fileId}/comments\",\n \"GET /v3/files/{fileId}/comments/{commentId}\",\n \"GET /v3/files/{fileId}/comments/{commentId}/replies\",\n \"GET /v3/files/{fileId}/comments/{commentId}/replies/{replyId}\",\n \"GET /v3/files/{fileId}/export\",\n \"GET /v3/files/{fileId}/listLabels\",\n \"GET /v3/files/{fileId}/permissions\",\n \"GET /v3/files/{fileId}/permissions/{permissionId}\",\n \"GET /v3/files/{fileId}/revisions\",\n \"GET /v3/files/{fileId}/revisions/{revisionId}\",\n \"POST /v3/files/{fileId}/watch\",\n \"GET /v3/operations/{name}\",\n ],\n },\n {\n name: \"drive.metadata\",\n description: \"View and manage metadata of files in your Google Drive\",\n rules: [\n \"GET /v2/about\",\n \"GET /v2/apps/{appId}\",\n \"GET /v2/changes\",\n \"GET /v2/changes/startPageToken\",\n \"POST /v2/changes/watch\",\n \"GET /v2/changes/{changeId}\",\n \"POST /v2/channels/stop\",\n \"GET /v2/files\",\n \"GET /v2/files/{fileId}\",\n \"PUT /v2/files/{fileId}\",\n \"PATCH /v2/files/{fileId}\",\n \"GET /v2/files/{fileId}/listLabels\",\n \"POST /v2/files/{fileId}/modifyLabels\",\n \"GET /v2/files/{fileId}/parents\",\n \"GET /v2/files/{fileId}/parents/{parentId}\",\n \"GET /v2/files/{fileId}/permissions\",\n \"GET /v2/files/{fileId}/permissions/{permissionId}\",\n \"GET /v2/files/{fileId}/properties\",\n \"POST /v2/files/{fileId}/properties\",\n \"GET /v2/files/{fileId}/properties/{propertyKey}\",\n \"PUT /v2/files/{fileId}/properties/{propertyKey}\",\n \"PATCH /v2/files/{fileId}/properties/{propertyKey}\",\n \"DELETE /v2/files/{fileId}/properties/{propertyKey}\",\n \"GET /v2/files/{fileId}/revisions\",\n \"GET /v2/files/{fileId}/revisions/{revisionId}\",\n \"POST /v2/files/{fileId}/touch\",\n \"POST /v2/files/{fileId}/watch\",\n \"GET /v2/files/{folderId}/children\",\n \"GET /v2/files/{folderId}/children/{childId}\",\n \"GET /v2/permissionIds/{email}\",\n \"GET /v3/about\",\n \"GET /v3/apps/{appId}\",\n \"GET /v3/changes\",\n \"GET /v3/changes/startPageToken\",\n \"POST /v3/changes/watch\",\n \"POST /v3/channels/stop\",\n \"GET /v3/files\",\n \"GET /v3/files/{fileId}\",\n \"PATCH /v3/files/{fileId}\",\n \"GET /v3/files/{fileId}/accessproposals\",\n \"GET /v3/files/{fileId}/accessproposals/{proposalId}\",\n \"GET /v3/files/{fileId}/approvals\",\n \"GET /v3/files/{fileId}/approvals/{approvalId}\",\n \"GET /v3/files/{fileId}/listLabels\",\n \"POST /v3/files/{fileId}/modifyLabels\",\n \"GET /v3/files/{fileId}/permissions\",\n \"GET /v3/files/{fileId}/permissions/{permissionId}\",\n \"GET /v3/files/{fileId}/revisions\",\n \"GET /v3/files/{fileId}/revisions/{revisionId}\",\n \"POST /v3/files/{fileId}/watch\",\n ],\n },\n {\n name: \"drive.metadata.readonly\",\n description: \"See information about your Google Drive files\",\n rules: [\n \"GET /v2/about\",\n \"GET /v2/apps/{appId}\",\n \"GET /v2/changes\",\n \"GET /v2/changes/startPageToken\",\n \"POST /v2/changes/watch\",\n \"GET /v2/changes/{changeId}\",\n \"POST /v2/channels/stop\",\n \"GET /v2/files\",\n \"GET /v2/files/{fileId}\",\n \"GET /v2/files/{fileId}/listLabels\",\n \"GET /v2/files/{fileId}/parents\",\n \"GET /v2/files/{fileId}/parents/{parentId}\",\n \"GET /v2/files/{fileId}/permissions\",\n \"GET /v2/files/{fileId}/permissions/{permissionId}\",\n \"GET /v2/files/{fileId}/properties\",\n \"GET /v2/files/{fileId}/properties/{propertyKey}\",\n \"GET /v2/files/{fileId}/revisions\",\n \"GET /v2/files/{fileId}/revisions/{revisionId}\",\n \"POST /v2/files/{fileId}/watch\",\n \"GET /v2/files/{folderId}/children\",\n \"GET /v2/files/{folderId}/children/{childId}\",\n \"GET /v2/permissionIds/{email}\",\n \"GET /v3/about\",\n \"GET /v3/apps/{appId}\",\n \"GET /v3/changes\",\n \"GET /v3/changes/startPageToken\",\n \"POST /v3/changes/watch\",\n \"POST /v3/channels/stop\",\n \"GET /v3/files\",\n \"GET /v3/files/{fileId}\",\n \"GET /v3/files/{fileId}/accessproposals\",\n \"GET /v3/files/{fileId}/accessproposals/{proposalId}\",\n \"GET /v3/files/{fileId}/approvals\",\n \"GET /v3/files/{fileId}/approvals/{approvalId}\",\n \"GET /v3/files/{fileId}/listLabels\",\n \"GET /v3/files/{fileId}/permissions\",\n \"GET /v3/files/{fileId}/permissions/{permissionId}\",\n \"GET /v3/files/{fileId}/revisions\",\n \"GET /v3/files/{fileId}/revisions/{revisionId}\",\n \"POST /v3/files/{fileId}/watch\",\n ],\n },\n {\n name: \"drive.photos.readonly\",\n description: \"View the photos, videos and albums in your Google Photos\",\n rules: [\n \"GET /v2/about\",\n \"GET /v2/changes\",\n \"GET /v2/changes/startPageToken\",\n \"POST /v2/changes/watch\",\n \"GET /v2/changes/{changeId}\",\n \"POST /v2/channels/stop\",\n \"GET /v2/files\",\n \"GET /v2/files/{fileId}\",\n \"POST /v2/files/{fileId}/copy\",\n \"GET /v2/files/{fileId}/parents\",\n \"GET /v2/files/{fileId}/parents/{parentId}\",\n \"GET /v2/files/{fileId}/permissions\",\n \"GET /v2/files/{fileId}/permissions/{permissionId}\",\n \"GET /v2/files/{fileId}/properties\",\n \"GET /v2/files/{fileId}/properties/{propertyKey}\",\n \"GET /v2/files/{fileId}/revisions\",\n \"GET /v2/files/{fileId}/revisions/{revisionId}\",\n \"POST /v2/files/{fileId}/watch\",\n \"GET /v2/files/{folderId}/children\",\n \"GET /v2/files/{folderId}/children/{childId}\",\n \"GET /v2/permissionIds/{email}\",\n \"GET /v3/about\",\n \"GET /v3/changes\",\n \"GET /v3/changes/startPageToken\",\n \"POST /v3/changes/watch\",\n \"POST /v3/channels/stop\",\n \"GET /v3/files\",\n \"GET /v3/files/{fileId}\",\n \"POST /v3/files/{fileId}/copy\",\n \"GET /v3/files/{fileId}/permissions\",\n \"GET /v3/files/{fileId}/permissions/{permissionId}\",\n \"GET /v3/files/{fileId}/revisions\",\n \"GET /v3/files/{fileId}/revisions/{revisionId}\",\n \"POST /v3/files/{fileId}/watch\",\n ],\n },\n {\n name: \"drive.readonly\",\n description: \"See and download all your Google Drive files\",\n rules: [\n \"GET /v2/about\",\n \"GET /v2/apps/{appId}\",\n \"GET /v2/changes\",\n \"GET /v2/changes/startPageToken\",\n \"POST /v2/changes/watch\",\n \"GET /v2/changes/{changeId}\",\n \"POST /v2/channels/stop\",\n \"GET /v2/drives\",\n \"GET /v2/drives/{driveId}\",\n \"GET /v2/files\",\n \"GET /v2/files/{fileId}\",\n \"GET /v2/files/{fileId}/comments\",\n \"GET /v2/files/{fileId}/comments/{commentId}\",\n \"GET /v2/files/{fileId}/comments/{commentId}/replies\",\n \"GET /v2/files/{fileId}/comments/{commentId}/replies/{replyId}\",\n \"GET /v2/files/{fileId}/export\",\n \"GET /v2/files/{fileId}/listLabels\",\n \"GET /v2/files/{fileId}/parents\",\n \"GET /v2/files/{fileId}/parents/{parentId}\",\n \"GET /v2/files/{fileId}/permissions\",\n \"GET /v2/files/{fileId}/permissions/{permissionId}\",\n \"GET /v2/files/{fileId}/properties\",\n \"GET /v2/files/{fileId}/properties/{propertyKey}\",\n \"GET /v2/files/{fileId}/revisions\",\n \"GET /v2/files/{fileId}/revisions/{revisionId}\",\n \"POST /v2/files/{fileId}/watch\",\n \"GET /v2/files/{folderId}/children\",\n \"GET /v2/files/{folderId}/children/{childId}\",\n \"GET /v2/permissionIds/{email}\",\n \"GET /v2/teamdrives\",\n \"GET /v2/teamdrives/{teamDriveId}\",\n \"GET /v3/about\",\n \"GET /v3/apps/{appId}\",\n \"GET /v3/changes\",\n \"GET /v3/changes/startPageToken\",\n \"POST /v3/changes/watch\",\n \"POST /v3/channels/stop\",\n \"GET /v3/drives\",\n \"GET /v3/drives/{driveId}\",\n \"GET /v3/files\",\n \"GET /v3/files/{fileId}\",\n \"GET /v3/files/{fileId}/accessproposals\",\n \"GET /v3/files/{fileId}/accessproposals/{proposalId}\",\n \"GET /v3/files/{fileId}/approvals\",\n \"GET /v3/files/{fileId}/approvals/{approvalId}\",\n \"GET /v3/files/{fileId}/comments\",\n \"GET /v3/files/{fileId}/comments/{commentId}\",\n \"GET /v3/files/{fileId}/comments/{commentId}/replies\",\n \"GET /v3/files/{fileId}/comments/{commentId}/replies/{replyId}\",\n \"POST /v3/files/{fileId}/download\",\n \"GET /v3/files/{fileId}/export\",\n \"GET /v3/files/{fileId}/listLabels\",\n \"GET /v3/files/{fileId}/permissions\",\n \"GET /v3/files/{fileId}/permissions/{permissionId}\",\n \"GET /v3/files/{fileId}/revisions\",\n \"GET /v3/files/{fileId}/revisions/{revisionId}\",\n \"POST /v3/files/{fileId}/watch\",\n \"GET /v3/operations/{name}\",\n \"GET /v3/teamdrives\",\n \"GET /v3/teamdrives/{teamDriveId}\",\n ],\n },\n {\n name: \"drive.scripts\",\n description: \"Modify your Google Apps Script scripts' behavior\",\n rules: [\n \"PUT /v2/files/{fileId}\",\n \"PATCH /v2/files/{fileId}\",\n \"PATCH /v3/files/{fileId}\",\n ],\n },\n ],\n },\n {\n base: \"https://www.googleapis.com/upload/drive\",\n auth: {\n headers: {\n \"Authorization\": \"Bearer ${{ secrets.GOOGLE_DRIVE_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"drive\",\n description: \"See, edit, create, and delete all of your Google Drive files\",\n rules: [\n \"POST /v2/files\",\n \"PUT /v2/files/{fileId}\",\n \"POST /v3/files\",\n \"PATCH /v3/files/{fileId}\",\n ],\n },\n {\n name: \"drive.appdata\",\n description: \"See, create, and delete its own configuration data in your Google Drive\",\n rules: [\n \"POST /v2/files\",\n \"PUT /v2/files/{fileId}\",\n \"POST /v3/files\",\n \"PATCH /v3/files/{fileId}\",\n ],\n },\n {\n name: \"drive.apps.readonly\",\n description: \"View your Google Drive apps\",\n rules: [\n \"POST /v2/files\",\n \"PUT /v2/files/{fileId}\",\n ],\n },\n {\n name: \"drive.file\",\n description: \"See, edit, create, and delete only the specific Google Drive files you use with this app\",\n rules: [\n \"POST /v2/files\",\n \"PUT /v2/files/{fileId}\",\n \"POST /v3/files\",\n \"PATCH /v3/files/{fileId}\",\n ],\n },\n {\n name: \"drive.metadata\",\n description: \"View and manage metadata of files in your Google Drive\",\n rules: [\n \"PUT /v2/files/{fileId}\",\n \"PATCH /v3/files/{fileId}\",\n ],\n },\n {\n name: \"drive.scripts\",\n description: \"Modify your Google Apps Script scripts' behavior\",\n rules: [\n \"PUT /v2/files/{fileId}\",\n \"PATCH /v3/files/{fileId}\",\n ],\n },\n ],\n },\n {\n base: \"https://www.googleapis.com/resumable/upload/drive\",\n auth: {\n headers: {\n \"Authorization\": \"Bearer ${{ secrets.GOOGLE_DRIVE_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"drive\",\n description: \"See, edit, create, and delete all of your Google Drive files\",\n rules: [\n \"POST /v2/files\",\n \"PUT /v2/files/{fileId}\",\n \"POST /v3/files\",\n \"PATCH /v3/files/{fileId}\",\n ],\n },\n {\n name: \"drive.appdata\",\n description: \"See, create, and delete its own configuration data in your Google Drive\",\n rules: [\n \"POST /v2/files\",\n \"PUT /v2/files/{fileId}\",\n \"POST /v3/files\",\n \"PATCH /v3/files/{fileId}\",\n ],\n },\n {\n name: \"drive.apps.readonly\",\n description: \"View your Google Drive apps\",\n rules: [\n \"POST /v2/files\",\n \"PUT /v2/files/{fileId}\",\n ],\n },\n {\n name: \"drive.file\",\n description: \"See, edit, create, and delete only the specific Google Drive files you use with this app\",\n rules: [\n \"POST /v2/files\",\n \"PUT /v2/files/{fileId}\",\n \"POST /v3/files\",\n \"PATCH /v3/files/{fileId}\",\n ],\n },\n {\n name: \"drive.metadata\",\n description: \"View and manage metadata of files in your Google Drive\",\n rules: [\n \"PUT /v2/files/{fileId}\",\n \"PATCH /v3/files/{fileId}\",\n ],\n },\n {\n name: \"drive.scripts\",\n description: \"Modify your Google Apps Script scripts' behavior\",\n rules: [\n \"PUT /v2/files/{fileId}\",\n \"PATCH /v3/files/{fileId}\",\n ],\n },\n ],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Google's Discovery API.\n// Source: https://meet.googleapis.com/$discovery/rest?version=v2\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:google-meet\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const googleMeetFirewall = {\n name: \"google-meet\",\n description: \"Google Meet API\",\n placeholders: {\n GOOGLE_MEET_TOKEN: \"ya29.A0CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSa\",\n },\n apis: [\n {\n base: \"https://meet.googleapis.com\",\n auth: {\n headers: {\n \"Authorization\": \"Bearer ${{ secrets.GOOGLE_MEET_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"meetings.space.created\",\n description: \"Create, edit, and see information about your Google Meet conferences created by the app.\",\n rules: [\n \"GET /v2/conferenceRecords\",\n \"GET /v2/conferenceRecords/{conferenceRecordsId}\",\n \"GET /v2/conferenceRecords/{conferenceRecordsId}/participants\",\n \"GET /v2/conferenceRecords/{conferenceRecordsId}/participants/{participantsId}\",\n \"GET /v2/conferenceRecords/{conferenceRecordsId}/participants/{participantsId}/participantSessions\",\n \"GET /v2/conferenceRecords/{conferenceRecordsId}/participants/{participantsId}/participantSessions/{participantSessionsId}\",\n \"GET /v2/conferenceRecords/{conferenceRecordsId}/recordings\",\n \"GET /v2/conferenceRecords/{conferenceRecordsId}/recordings/{recordingsId}\",\n \"GET /v2/conferenceRecords/{conferenceRecordsId}/smartNotes\",\n \"GET /v2/conferenceRecords/{conferenceRecordsId}/smartNotes/{smartNotesId}\",\n \"GET /v2/conferenceRecords/{conferenceRecordsId}/transcripts\",\n \"GET /v2/conferenceRecords/{conferenceRecordsId}/transcripts/{transcriptsId}\",\n \"GET /v2/conferenceRecords/{conferenceRecordsId}/transcripts/{transcriptsId}/entries\",\n \"GET /v2/conferenceRecords/{conferenceRecordsId}/transcripts/{transcriptsId}/entries/{entriesId}\",\n \"POST /v2/spaces\",\n \"GET /v2/spaces/{spacesId}\",\n \"PATCH /v2/spaces/{spacesId}\",\n \"POST /v2/spaces/{spacesId}:endActiveConference\",\n ],\n },\n {\n name: \"meetings.space.readonly\",\n description: \"Read information about any of your Google Meet conferences\",\n rules: [\n \"GET /v2/conferenceRecords\",\n \"GET /v2/conferenceRecords/{conferenceRecordsId}\",\n \"GET /v2/conferenceRecords/{conferenceRecordsId}/participants\",\n \"GET /v2/conferenceRecords/{conferenceRecordsId}/participants/{participantsId}\",\n \"GET /v2/conferenceRecords/{conferenceRecordsId}/participants/{participantsId}/participantSessions\",\n \"GET /v2/conferenceRecords/{conferenceRecordsId}/participants/{participantsId}/participantSessions/{participantSessionsId}\",\n \"GET /v2/conferenceRecords/{conferenceRecordsId}/recordings\",\n \"GET /v2/conferenceRecords/{conferenceRecordsId}/recordings/{recordingsId}\",\n \"GET /v2/conferenceRecords/{conferenceRecordsId}/smartNotes\",\n \"GET /v2/conferenceRecords/{conferenceRecordsId}/smartNotes/{smartNotesId}\",\n \"GET /v2/conferenceRecords/{conferenceRecordsId}/transcripts\",\n \"GET /v2/conferenceRecords/{conferenceRecordsId}/transcripts/{transcriptsId}\",\n \"GET /v2/conferenceRecords/{conferenceRecordsId}/transcripts/{transcriptsId}/entries\",\n \"GET /v2/conferenceRecords/{conferenceRecordsId}/transcripts/{transcriptsId}/entries/{entriesId}\",\n \"GET /v2/spaces/{spacesId}\",\n ],\n },\n {\n name: \"meetings.space.settings\",\n description: \"Edit, and see settings for all of your Google Meet calls.\",\n rules: [\n \"GET /v2/spaces/{spacesId}\",\n \"PATCH /v2/spaces/{spacesId}\",\n ],\n },\n ],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Google's Discovery API.\n// Source: https://sheets.googleapis.com/$discovery/rest?version=v4\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:google-sheets\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const googleSheetsFirewall = {\n name: \"google-sheets\",\n description: \"Google Sheets API\",\n placeholders: {\n GOOGLE_SHEETS_TOKEN: \"ya29.A0CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSa\",\n },\n apis: [\n {\n base: \"https://sheets.googleapis.com\",\n auth: {\n headers: {\n \"Authorization\": \"Bearer ${{ secrets.GOOGLE_SHEETS_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"drive\",\n description: \"See, edit, create, and delete all of your Google Drive files\",\n rules: [\n \"POST /v4/spreadsheets\",\n \"GET /v4/spreadsheets/{spreadsheetId}\",\n \"GET /v4/spreadsheets/{spreadsheetId}/developerMetadata/{metadataId}\",\n \"POST /v4/spreadsheets/{spreadsheetId}/developerMetadata:search\",\n \"POST /v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo\",\n \"GET /v4/spreadsheets/{spreadsheetId}/values/{range}\",\n \"PUT /v4/spreadsheets/{spreadsheetId}/values/{range}\",\n \"POST /v4/spreadsheets/{spreadsheetId}/values/{range}:append\",\n \"POST /v4/spreadsheets/{spreadsheetId}/values/{range}:clear\",\n \"POST /v4/spreadsheets/{spreadsheetId}/values:batchClear\",\n \"POST /v4/spreadsheets/{spreadsheetId}/values:batchClearByDataFilter\",\n \"GET /v4/spreadsheets/{spreadsheetId}/values:batchGet\",\n \"POST /v4/spreadsheets/{spreadsheetId}/values:batchGetByDataFilter\",\n \"POST /v4/spreadsheets/{spreadsheetId}/values:batchUpdate\",\n \"POST /v4/spreadsheets/{spreadsheetId}/values:batchUpdateByDataFilter\",\n \"POST /v4/spreadsheets/{spreadsheetId}:batchUpdate\",\n \"POST /v4/spreadsheets/{spreadsheetId}:getByDataFilter\",\n ],\n },\n {\n name: \"drive.file\",\n description: \"See, edit, create, and delete only the specific Google Drive files you use with this app\",\n rules: [\n \"POST /v4/spreadsheets\",\n \"GET /v4/spreadsheets/{spreadsheetId}\",\n \"GET /v4/spreadsheets/{spreadsheetId}/developerMetadata/{metadataId}\",\n \"POST /v4/spreadsheets/{spreadsheetId}/developerMetadata:search\",\n \"POST /v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo\",\n \"GET /v4/spreadsheets/{spreadsheetId}/values/{range}\",\n \"PUT /v4/spreadsheets/{spreadsheetId}/values/{range}\",\n \"POST /v4/spreadsheets/{spreadsheetId}/values/{range}:append\",\n \"POST /v4/spreadsheets/{spreadsheetId}/values/{range}:clear\",\n \"POST /v4/spreadsheets/{spreadsheetId}/values:batchClear\",\n \"POST /v4/spreadsheets/{spreadsheetId}/values:batchClearByDataFilter\",\n \"GET /v4/spreadsheets/{spreadsheetId}/values:batchGet\",\n \"POST /v4/spreadsheets/{spreadsheetId}/values:batchGetByDataFilter\",\n \"POST /v4/spreadsheets/{spreadsheetId}/values:batchUpdate\",\n \"POST /v4/spreadsheets/{spreadsheetId}/values:batchUpdateByDataFilter\",\n \"POST /v4/spreadsheets/{spreadsheetId}:batchUpdate\",\n \"POST /v4/spreadsheets/{spreadsheetId}:getByDataFilter\",\n ],\n },\n {\n name: \"drive.readonly\",\n description: \"See and download all your Google Drive files\",\n rules: [\n \"GET /v4/spreadsheets/{spreadsheetId}\",\n \"GET /v4/spreadsheets/{spreadsheetId}/values/{range}\",\n \"GET /v4/spreadsheets/{spreadsheetId}/values:batchGet\",\n ],\n },\n {\n name: \"spreadsheets\",\n description: \"See, edit, create, and delete all your Google Sheets spreadsheets\",\n rules: [\n \"POST /v4/spreadsheets\",\n \"GET /v4/spreadsheets/{spreadsheetId}\",\n \"GET /v4/spreadsheets/{spreadsheetId}/developerMetadata/{metadataId}\",\n \"POST /v4/spreadsheets/{spreadsheetId}/developerMetadata:search\",\n \"POST /v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo\",\n \"GET /v4/spreadsheets/{spreadsheetId}/values/{range}\",\n \"PUT /v4/spreadsheets/{spreadsheetId}/values/{range}\",\n \"POST /v4/spreadsheets/{spreadsheetId}/values/{range}:append\",\n \"POST /v4/spreadsheets/{spreadsheetId}/values/{range}:clear\",\n \"POST /v4/spreadsheets/{spreadsheetId}/values:batchClear\",\n \"POST /v4/spreadsheets/{spreadsheetId}/values:batchClearByDataFilter\",\n \"GET /v4/spreadsheets/{spreadsheetId}/values:batchGet\",\n \"POST /v4/spreadsheets/{spreadsheetId}/values:batchGetByDataFilter\",\n \"POST /v4/spreadsheets/{spreadsheetId}/values:batchUpdate\",\n \"POST /v4/spreadsheets/{spreadsheetId}/values:batchUpdateByDataFilter\",\n \"POST /v4/spreadsheets/{spreadsheetId}:batchUpdate\",\n \"POST /v4/spreadsheets/{spreadsheetId}:getByDataFilter\",\n ],\n },\n {\n name: \"spreadsheets.readonly\",\n description: \"See all your Google Sheets spreadsheets\",\n rules: [\n \"GET /v4/spreadsheets/{spreadsheetId}\",\n \"GET /v4/spreadsheets/{spreadsheetId}/values/{range}\",\n \"GET /v4/spreadsheets/{spreadsheetId}/values:batchGet\",\n ],\n },\n ],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Granola API docs.\n// Source: https://docs.granola.ai/introduction\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:granola\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const granolaFirewall = {\n name: \"granola\",\n description: \"Granola API\",\n placeholders: {\n GRANOLA_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeL\",\n },\n apis: [\n {\n base: \"https://public-api.granola.ai\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.GRANOLA_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Greenhouse Harvest API docs.\n// Source: https://developers.greenhouse.io/harvest.html\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:greenhouse\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const greenhouseFirewall = {\n name: \"greenhouse\",\n description: \"Greenhouse Harvest API\",\n placeholders: {\n GREENHOUSE_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSa\",\n },\n apis: [\n {\n base: \"https://harvest.greenhouse.io\",\n auth: {\n headers: {\n Authorization: \"${{ basic(secrets.GREENHOUSE_TOKEN, ) }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Groq API docs.\n// Source: https://console.groq.com/docs/overview\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:groq\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const groqFirewall = {\n name: \"groq\",\n description: \"Groq\",\n placeholders: {\n GROQ_TOKEN: \"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\",\n },\n apis: [\n {\n base: \"https://api.groq.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.GROQ_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from HeyGen API docs.\n// Source: https://docs.heygen.com/reference/authentication\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:heygen\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const heygenFirewall = {\n name: \"heygen\",\n description: \"HeyGen API\",\n placeholders: {\n HEYGEN_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalC\",\n },\n apis: [\n {\n base: \"https://api.heygen.com\",\n auth: {\n headers: {\n \"X-Api-Key\": \"${{ secrets.HEYGEN_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Helicone API docs.\n// Source: https://docs.helicone.ai/rest/request/get-v1requests\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:helicone\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const heliconeFirewall = {\n name: \"helicone\",\n description: \"Helicone\",\n placeholders: {\n HELICONE_TOKEN: \"sk-helicone-c0ffee5a-fe10-ca1c-0ffe-e5afe10ca1c0\",\n },\n apis: [\n {\n base: \"https://api.helicone.ai\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.HELICONE_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from HTML/CSS to Image API docs.\n// Source: https://docs.htmlcsstoimage.com/getting-started/authentication\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:htmlcsstoimage\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const htmlcsstoimageFirewall = {\n name: \"htmlcsstoimage\",\n description: \"HTML/CSS to Image API\",\n placeholders: {\n HCTI_API_KEY: \"c0ffee5a-fe10-ca1c-0ffe-e5afe10ca1c0\",\n },\n apis: [\n {\n base: \"https://hcti.io\",\n auth: {\n headers: {\n Authorization: \"${{ basic(vars.HCTI_USER_ID, secrets.HCTI_API_KEY) }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// HubSpot firewall config.\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:hubspot\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const hubspotFirewall = {\n name: \"hubspot\",\n description: \"HubSpot API\",\n placeholders: {\n HUBSPOT_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCo\",\n },\n apis: [\n {\n base: \"https://api.hubapi.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.HUBSPOT_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Hugging Face API docs.\n// Source: https://huggingface.co/docs/hub/security-tokens\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:hugging-face\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const huggingFaceFirewall = {\n name: \"hugging-face\",\n description: \"Hugging Face API\",\n placeholders: {\n HUGGING_FACE_TOKEN: \"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\",\n },\n apis: [\n {\n base: \"https://huggingface.co/api\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.HUGGING_FACE_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://api-inference.huggingface.co\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.HUGGING_FACE_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://router.huggingface.co\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.HUGGING_FACE_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Hume AI API docs.\n// Source: https://dev.hume.ai/docs/introduction/api-key\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:hume\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const humeFirewall = {\n name: \"hume\",\n description: \"Hume AI API\",\n placeholders: {\n HUME_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeL\",\n },\n apis: [\n {\n base: \"https://api.hume.ai\",\n auth: {\n headers: {\n \"X-Hume-Api-Key\": \"${{ secrets.HUME_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Imgur API docs.\n// Source: https://apidocs.imgur.com/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:imgur\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const imgurFirewall = {\n name: \"imgur\",\n description: \"Imgur API\",\n placeholders: {\n IMGUR_CLIENT_ID: \"CoffeeSafeLocal\",\n },\n apis: [\n {\n base: \"https://api.imgur.com\",\n auth: {\n headers: {\n Authorization: \"Client-ID ${{ secrets.IMGUR_CLIENT_ID }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Instagram Graph API docs.\n// Source: https://developers.facebook.com/docs/instagram-platform/reference/access_token/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:instagram\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const instagramFirewall = {\n name: \"instagram\",\n description: \"Instagram Graph API\",\n placeholders: {\n INSTAGRAM_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeL\",\n },\n apis: [\n {\n base: \"https://graph.instagram.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.INSTAGRAM_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://graph.facebook.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.INSTAGRAM_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Instantly API docs.\n// Source: https://developer.instantly.ai/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:instantly\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const instantlyFirewall = {\n name: \"instantly\",\n description: \"Instantly API\",\n placeholders: {\n INSTANTLY_API_KEY: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSaf\",\n },\n apis: [\n {\n base: \"https://api.instantly.ai\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.INSTANTLY_API_KEY }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Intercom API docs.\n// Source: https://developers.intercom.com/docs/build-an-integration/learn-more/authentication\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:intercom\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const intercomFirewall = {\n name: \"intercom\",\n description: \"Intercom API\",\n placeholders: {\n INTERCOM_TOKEN: \"dG9rOiCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCof\",\n },\n apis: [\n {\n base: \"https://api.intercom.io\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.INTERCOM_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Intervals.icu API docs.\n// Source: https://forum.intervals.icu/t/api-access-to-intervals-icu/609\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:intervals-icu\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const intervalsIcuFirewall = {\n name: \"intervals-icu\",\n description: \"Intervals.icu Training API\",\n placeholders: {\n INTERVALS_ICU_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSaf\",\n },\n apis: [\n {\n base: \"https://intervals.icu\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.INTERVALS_ICU_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Jam API docs.\n// Source: https://jam.dev/docs/debug-a-jam/mcp/personal-access-tokens\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:jam\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const jamFirewall = {\n name: \"jam\",\n description: \"Jam API\",\n placeholders: {\n JAM_TOKEN: \"jam_pat_CoffeeSafeLocalCoffeeSafeLocalCoff\",\n },\n apis: [\n {\n base: \"https://mcp.jam.dev\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.JAM_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Jira REST API v3 docs.\n// Source: https://developer.atlassian.com/cloud/jira/platform/rest/v3/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:jira\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const jiraFirewall = {\n name: \"jira\",\n description: \"Jira REST API (API token auth)\",\n placeholders: {\n JIRA_API_TOKEN: \"Coffee5afe10ca1Coffee5af\",\n },\n apis: [\n {\n base: \"https://${{ vars.JIRA_DOMAIN }}\",\n auth: {\n headers: {\n Authorization: \"${{ basic(vars.JIRA_EMAIL, secrets.JIRA_API_TOKEN) }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Jotform API docs.\n// Source: https://api.jotform.com/docs/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:jotform\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const jotformFirewall = {\n name: \"jotform\",\n description: \"Jotform API\",\n placeholders: {\n JOTFORM_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffe\",\n },\n apis: [\n {\n base: \"https://api.jotform.com\",\n auth: {\n headers: {\n APIKEY: \"${{ secrets.JOTFORM_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://eu-api.jotform.com\",\n auth: {\n headers: {\n APIKEY: \"${{ secrets.JOTFORM_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://hipaa-api.jotform.com\",\n auth: {\n headers: {\n APIKEY: \"${{ secrets.JOTFORM_TOKEN }}\",\n },\n },\n permissions: [],\n }\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Klaviyo API docs.\n// Source: https://developers.klaviyo.com/en/reference/api_overview\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:klaviyo\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const klaviyoFirewall = {\n name: \"klaviyo\",\n description: \"Klaviyo\",\n placeholders: {\n KLAVIYO_TOKEN: \"pk_CoffeeSafeLocalCoffeeSafeLocalCoff\",\n },\n apis: [\n {\n base: \"https://a.klaviyo.com\",\n auth: {\n headers: {\n Authorization: \"Klaviyo-API-Key ${{ secrets.KLAVIYO_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Kommo API docs.\n// Source: https://www.kommo.com/developers/content/api/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:kommo\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const kommoFirewall = {\n name: \"kommo\",\n description: \"Kommo CRM API\",\n placeholders: {\n KOMMO_API_KEY: \"kmApiKey_CoffeeSafeLocalCoffeeSafeLocalCoffee\",\n },\n apis: [\n {\n base: \"https://${{ vars.KOMMO_SUBDOMAIN }}.kommo.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.KOMMO_API_KEY }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Lark Open Platform API docs.\n// Source: https://open.larksuite.com/document/home/introduction-to-scope-and-authorization/access-credentials\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:lark\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const larkFirewall = {\n name: \"lark\",\n description: \"Lark Open Platform API\",\n placeholders: {\n LARK_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSaf\",\n },\n apis: [\n {\n base: \"https://open.larksuite.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.LARK_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://open.feishu.cn\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.LARK_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Langfuse API docs.\n// Source: https://langfuse.com/docs/api\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:langfuse\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const langfuseFirewall = {\n name: \"langfuse\",\n description: \"Langfuse LLM observability and tracing API\",\n placeholders: {\n LANGFUSE_PUBLIC_KEY: \"pk-lf-c0ffee5a-fe10-ca1c-0ffe-e5afe10ca1c0\",\n LANGFUSE_SECRET_KEY: \"sk-lf-5afe10ca-1c0f-feec-0ffe-e5afe10ca1c0\",\n },\n apis: [\n {\n base: \"https://cloud.langfuse.com\",\n auth: {\n headers: {\n Authorization:\n \"${{ basic(secrets.LANGFUSE_PUBLIC_KEY, secrets.LANGFUSE_SECRET_KEY) }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://us.cloud.langfuse.com\",\n auth: {\n headers: {\n Authorization:\n \"${{ basic(secrets.LANGFUSE_PUBLIC_KEY, secrets.LANGFUSE_SECRET_KEY) }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from LangSmith API docs.\n// Source: https://docs.smith.langchain.com/reference/api\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:langsmith\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const langsmithFirewall = {\n name: \"langsmith\",\n description: \"LangSmith\",\n placeholders: {\n LANGSMITH_TOKEN: \"lsv2_pt_c0ffeesafe10ca1c0ffeesafe10ca1c0_ffee5afe\",\n },\n apis: [\n {\n base: \"https://api.smith.langchain.com\",\n auth: {\n headers: {\n \"X-Api-Key\": \"${{ secrets.LANGSMITH_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from LINE Messaging API docs.\n// Source: https://developers.line.biz/en/reference/messaging-api/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:line\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const lineFirewall = {\n name: \"line\",\n description: \"LINE Messaging API\",\n placeholders: {\n LINE_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSaf\",\n },\n apis: [\n {\n base: \"https://api.line.me\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.LINE_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Linear API docs.\n// Source: https://developers.linear.app/docs/graphql/working-with-the-graphql-api\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:linear\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const linearFirewall = {\n name: \"linear\",\n description: \"Linear API\",\n placeholders: {\n LINEAR_TOKEN: \"c0ffee5afe10ca1c0ffee5afe10ca1c0ffee5afe10ca1c0ffee5afe10ca1c0ff\",\n },\n apis: [\n {\n base: \"https://api.linear.app\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.LINEAR_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Loops API docs.\n// Source: https://loops.so/docs/api-reference/intro\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:loops\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const loopsFirewall = {\n name: \"loops\",\n description: \"Loops API\",\n placeholders: {\n LOOPS_TOKEN: \"c0ffee5afe10ca1c0ffee5afe10ca1c0\",\n },\n apis: [\n {\n base: \"https://app.loops.so/api\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.LOOPS_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Luma AI API docs.\n// Source: https://docs.lumalabs.ai/docs/api\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:luma\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const lumaFirewall = {\n name: \"luma\",\n description: \"Luma AI Dream Machine\",\n placeholders: {\n LUMA_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalC\",\n },\n apis: [\n {\n base: \"https://api.lumalabs.ai\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.LUMA_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Mailchimp Marketing API docs.\n// Source: https://mailchimp.com/developer/marketing/api/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:mailchimp\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const mailchimpFirewall = {\n name: \"mailchimp\",\n description: \"Mailchimp Marketing API\",\n placeholders: {\n MAILCHIMP_TOKEN: \"c0ffee5afe10ca1c0ffee5afe10ca1c0-us6\",\n },\n apis: [\n {\n base: \"https://{dc}.api.mailchimp.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.MAILCHIMP_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://login.mailchimp.com\",\n auth: {\n headers: {\n Authorization: \"OAuth ${{ secrets.MAILCHIMP_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Make API docs.\n// Source: https://developers.make.com/api-documentation\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:make\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const makeFirewall = {\n name: \"make\",\n description: \"Make (formerly Integromat) Automation API\",\n placeholders: {\n MAKE_TOKEN: \"mkTkn-CoffeeSafeLoca-lCof-feeS-afeLocalCoff\",\n },\n apis: [\n {\n base: \"https://eu1.make.com\",\n auth: {\n headers: {\n Authorization: \"Token ${{ secrets.MAKE_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://eu2.make.com\",\n auth: {\n headers: {\n Authorization: \"Token ${{ secrets.MAKE_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://us1.make.com\",\n auth: {\n headers: {\n Authorization: \"Token ${{ secrets.MAKE_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://us2.make.com\",\n auth: {\n headers: {\n Authorization: \"Token ${{ secrets.MAKE_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://eu1.make.celonis.com\",\n auth: {\n headers: {\n Authorization: \"Token ${{ secrets.MAKE_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://us1.make.celonis.com\",\n auth: {\n headers: {\n Authorization: \"Token ${{ secrets.MAKE_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Mailsac API docs.\n// Source: https://docs.mailsac.com/en/master/api_examples/getting_started/getting_started.html\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:mailsac\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const mailsacFirewall = {\n name: \"mailsac\",\n description: \"Mailsac Email API\",\n placeholders: {\n MAILSAC_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafe\",\n },\n apis: [\n {\n base: \"https://mailsac.com\",\n auth: {\n headers: {\n \"Mailsac-Key\": \"${{ secrets.MAILSAC_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Manus API docs.\n// Source: https://open.manus.im/docs/api-reference/create-task\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:manus\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const manusFirewall = {\n name: \"manus\",\n description: \"Manus\",\n placeholders: {\n MANUS_TOKEN: \"sk_CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeL\",\n },\n apis: [\n {\n base: \"https://api.manus.ai\",\n auth: {\n headers: {\n \"x-manus-api-key\": \"${{ secrets.MANUS_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Mem0 API docs.\n// Source: https://docs.mem0.ai/api-reference\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:mem0\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const mem0Firewall = {\n name: \"mem0\",\n description: \"Mem0\",\n placeholders: {\n MEM0_TOKEN: \"m0-CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocal\",\n },\n apis: [\n {\n base: \"https://api.mem0.ai\",\n auth: {\n headers: {\n Authorization: \"Token ${{ secrets.MEM0_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Mercury API docs.\n// Source: https://docs.mercury.com/docs/getting-started\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:mercury\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const mercuryFirewall = {\n name: \"mercury\",\n description: \"Mercury API\",\n placeholders: {\n MERCURY_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafe\",\n },\n apis: [\n {\n base: \"https://api.mercury.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.MERCURY_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Metabase API docs.\n// Source: https://www.metabase.com/docs/latest/api-documentation\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:metabase\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const metabaseFirewall = {\n name: \"metabase\",\n description: \"Metabase API\",\n placeholders: {\n METABASE_TOKEN: \"mb_CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLoca\",\n },\n apis: [\n {\n base: \"${{ vars.METABASE_BASE_URL }}\",\n auth: {\n headers: {\n \"x-api-key\": \"${{ secrets.METABASE_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Meta Ads (Facebook Graph) API docs.\n// Source: https://developers.facebook.com/docs/marketing-apis/overview/authentication\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:meta-ads\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const metaAdsFirewall = {\n name: \"meta-ads\",\n description: \"Meta Ads (Facebook Graph) API\",\n placeholders: {\n META_ADS_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafe\",\n },\n apis: [\n {\n base: \"https://graph.facebook.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.META_ADS_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from MiniMax API docs.\n// Source: https://platform.minimax.io/docs/guides/quickstart-preparation\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:minimax\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const minimaxFirewall = {\n name: \"minimax\",\n description: \"MiniMax API\",\n placeholders: {\n MINIMAX_TOKEN: \"eyJhbGciOiJSUzI1NiJ9.CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocal\",\n },\n apis: [\n {\n base: \"https://api.minimax.io\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.MINIMAX_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Miro REST API docs.\n// Source: https://developers.miro.com/reference/overview\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:miro\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const miroFirewall = {\n name: \"miro\",\n description: \"Miro\",\n placeholders: {\n MIRO_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocal\",\n },\n apis: [\n {\n base: \"https://api.miro.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.MIRO_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Mixpanel API docs.\n// Source: https://developer.mixpanel.com/reference/authentication\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:mixpanel\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const mixpanelFirewall = {\n name: \"mixpanel\",\n description: \"Mixpanel product analytics API\",\n placeholders: {\n MIXPANEL_SERVICE_ACCOUNT_USERNAME: \"CoffeeSafeLocalCoffe\",\n MIXPANEL_SERVICE_ACCOUNT_SECRET: \"CoffeeSafeLocalCoffeeSafeLocalCo\",\n },\n apis: [\n {\n base: \"https://mixpanel.com\",\n auth: {\n headers: {\n Authorization:\n \"${{ basic(secrets.MIXPANEL_SERVICE_ACCOUNT_USERNAME, secrets.MIXPANEL_SERVICE_ACCOUNT_SECRET) }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://data.mixpanel.com\",\n auth: {\n headers: {\n Authorization:\n \"${{ basic(secrets.MIXPANEL_SERVICE_ACCOUNT_USERNAME, secrets.MIXPANEL_SERVICE_ACCOUNT_SECRET) }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://api.mixpanel.com\",\n auth: {\n headers: {\n Authorization:\n \"${{ basic(secrets.MIXPANEL_SERVICE_ACCOUNT_USERNAME, secrets.MIXPANEL_SERVICE_ACCOUNT_SECRET) }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Monday.com API docs.\n// Source: https://developer.monday.com/api-reference/docs/authentication\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:monday\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const mondayFirewall = {\n name: \"monday\",\n description: \"Monday.com API\",\n placeholders: {\n MONDAY_TOKEN: \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkNvZmZlZVNhZmVMb2NhbCIsImlhdCI6MTUxNjIzOTAyMn0.CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLoc\",\n },\n apis: [\n {\n base: \"https://api.monday.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.MONDAY_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from msg9 API docs.\n// Source: https://msg9.io/SKILL.md\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:msg9\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const msg9Firewall = {\n name: \"msg9\",\n description: \"msg9 API\",\n placeholders: {\n MSG9_TOKEN: \"msg9_sk_CoffeeSafeLocalCoffeeSafeLocalCoffeeSafe\",\n },\n apis: [\n {\n base: \"https://www.msg9.io\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.MSG9_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from n8n REST API docs.\n// Source: https://docs.n8n.io/api/api-reference/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:n8n\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const n8nFirewall = {\n name: \"n8n\",\n description: \"n8n REST API\",\n placeholders: {\n N8N_TOKEN: \"n8n_api_CoffeeSafeLocalCoffeeSafeLocalCo\",\n },\n apis: [\n {\n base: \"${{ vars.N8N_BASE_URL }}/api/v1\",\n auth: {\n headers: {\n \"X-N8N-API-KEY\": \"${{ secrets.N8N_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Neon API docs.\n// Source: https://api-docs.neon.tech/reference/authentication\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:neon\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const neonFirewall = {\n name: \"neon\",\n description: \"Neon API\",\n placeholders: {\n NEON_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCo\",\n },\n apis: [\n {\n base: \"https://console.neon.tech/api\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.NEON_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Notion's official OpenAPI spec.\n// Source: https://developers.notion.com/openapi.json\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:notion\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const notionFirewall = {\n name: \"notion\",\n description: \"Notion API\",\n placeholders: {\n NOTION_TOKEN: \"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\",\n },\n apis: [\n {\n base: \"https://api.notion.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.NOTION_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"insert_comments\",\n description: \"Create comments\",\n rules: [\n \"POST /v1/comments\",\n ],\n },\n {\n name: \"insert_content\",\n description: \"Create pages, databases, blocks, data sources, and upload files\",\n rules: [\n \"PATCH /v1/blocks/{block_id}/children\",\n \"POST /v1/data_sources\",\n \"POST /v1/databases\",\n \"POST /v1/file_uploads\",\n \"POST /v1/file_uploads/{file_upload_id}/complete\",\n \"POST /v1/file_uploads/{file_upload_id}/send\",\n \"POST /v1/pages\",\n \"POST /v1/views\",\n \"POST /v1/views/{view_id}/queries\",\n ],\n },\n {\n name: \"read_comments\",\n description: \"Read comments\",\n rules: [\n \"GET /v1/comments\",\n \"GET /v1/comments/{comment_id}\",\n ],\n },\n {\n name: \"read_content\",\n description: \"Read pages, databases, blocks, data sources, and files\",\n rules: [\n \"GET /v1/blocks/{block_id}\",\n \"GET /v1/blocks/{block_id}/children\",\n \"GET /v1/custom_emojis\",\n \"GET /v1/data_sources/{data_source_id}\",\n \"POST /v1/data_sources/{data_source_id}/query\",\n \"GET /v1/data_sources/{data_source_id}/templates\",\n \"GET /v1/databases/{database_id}\",\n \"GET /v1/file_uploads\",\n \"GET /v1/file_uploads/{file_upload_id}\",\n \"GET /v1/pages/{page_id}\",\n \"GET /v1/pages/{page_id}/markdown\",\n \"GET /v1/pages/{page_id}/properties/{property_id}\",\n \"POST /v1/search\",\n \"GET /v1/views\",\n \"GET /v1/views/{view_id}\",\n \"GET /v1/views/{view_id}/queries/{query_id}\",\n ],\n },\n {\n name: \"read_users\",\n description: \"Read user information\",\n rules: [\n \"GET /v1/users\",\n \"GET /v1/users/me\",\n \"GET /v1/users/{user_id}\",\n ],\n },\n {\n name: \"update_content\",\n description: \"Update and delete pages, databases, blocks, and data sources\",\n rules: [\n \"PATCH /v1/blocks/{block_id}\",\n \"DELETE /v1/blocks/{block_id}\",\n \"PATCH /v1/data_sources/{data_source_id}\",\n \"PATCH /v1/databases/{database_id}\",\n \"PATCH /v1/pages/{page_id}\",\n \"PATCH /v1/pages/{page_id}/markdown\",\n \"POST /v1/pages/{page_id}/move\",\n \"PATCH /v1/views/{view_id}\",\n \"DELETE /v1/views/{view_id}\",\n \"DELETE /v1/views/{view_id}/queries/{query_id}\",\n ],\n },\n ],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Onyx API docs.\n// Source: https://docs.onyx.app/developers/overview\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:onyx\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const onyxFirewall = {\n name: \"onyx\",\n description: \"Onyx\",\n placeholders: {\n ONYX_TOKEN: \"onyx_pat_CoffeeSafeLocalCoffeeSafeLocal\",\n },\n apis: [\n {\n base: \"https://cloud.onyx.app\",\n auth: {\n headers: {\n \"Authorization\": \"Bearer ${{ secrets.ONYX_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from OpenAI API docs.\n// Source: https://platform.openai.com/docs/api-reference/introduction\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:openai\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const openaiFirewall = {\n name: \"openai\",\n description: \"OpenAI API\",\n placeholders: {\n OPENAI_TOKEN: \"sk-proj-CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocaT3BlbkFJCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLoca\",\n },\n apis: [\n {\n base: \"https://api.openai.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.OPENAI_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Microsoft Graph API docs.\n// Source: https://learn.microsoft.com/en-us/graph/auth/auth-concepts\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:outlook-calendar\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const outlookCalendarFirewall = {\n name: \"outlook-calendar\",\n description: \"Microsoft Graph API (Outlook Calendar)\",\n placeholders: {\n OUTLOOK_CALENDAR_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafe\",\n },\n apis: [\n {\n base: \"https://graph.microsoft.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.OUTLOOK_CALENDAR_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Microsoft Graph API docs.\n// Source: https://learn.microsoft.com/en-us/graph/auth/auth-concepts\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:outlook-mail\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const outlookMailFirewall = {\n name: \"outlook-mail\",\n description: \"Microsoft Graph API (Outlook Mail)\",\n placeholders: {\n OUTLOOK_MAIL_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSa\",\n },\n apis: [\n {\n base: \"https://graph.microsoft.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.OUTLOOK_MAIL_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from PandaDoc API docs.\n// Source: https://developers.pandadoc.com/reference/about\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:pandadoc\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const pandadocFirewall = {\n name: \"pandadoc\",\n description: \"PandaDoc Public API\",\n placeholders: {\n PANDADOC_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoff\",\n },\n apis: [\n {\n base: \"https://api.pandadoc.com\",\n auth: {\n headers: {\n Authorization: \"API-Key ${{ secrets.PANDADOC_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from PDF4me API docs.\n// Source: https://dev.pdf4me.com/apiv2/documentation/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:pdf4me\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const pdf4meFirewall = {\n name: \"pdf4me\",\n description: \"PDF4me Document API\",\n placeholders: {\n PDF4ME_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSa\",\n },\n apis: [\n {\n base: \"https://api.pdf4me.com\",\n auth: {\n headers: {\n Authorization: \"${{ secrets.PDF4ME_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from PDF.co API docs.\n// Source: https://docs.pdf.co/api-reference/introduction\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:pdfco\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const pdfcoFirewall = {\n name: \"pdfco\",\n description: \"PDF.co API\",\n placeholders: {\n PDFCO_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSa\",\n },\n apis: [\n {\n base: \"https://api.pdf.co\",\n auth: {\n headers: {\n \"x-api-key\": \"${{ secrets.PDFCO_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Pinecone API docs.\n// Source: https://docs.pinecone.io/reference/api/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:pinecone\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const pineconeFirewall = {\n name: \"pinecone\",\n description: \"Pinecone\",\n placeholders: {\n PINECONE_TOKEN: \"pcsk_CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSa\",\n },\n apis: [\n {\n base: \"https://api.pinecone.io\",\n auth: {\n headers: {\n \"Api-Key\": \"${{ secrets.PINECONE_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from PDForge API docs.\n// Source: https://docs.pdforge.com/getting-started/authentication\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:pdforge\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const pdforgeFirewall = {\n name: \"pdforge\",\n description: \"PDForge PDF Generation API\",\n placeholders: {\n PDFORGE_API_KEY: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSaf\",\n },\n apis: [\n {\n base: \"https://api.pdforge.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.PDFORGE_API_KEY }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Perplexity API docs.\n// Source: https://docs.perplexity.ai/docs/admin/api-key-management\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:perplexity\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const perplexityFirewall = {\n name: \"perplexity\",\n description: \"Perplexity API\",\n placeholders: {\n PERPLEXITY_TOKEN: \"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\",\n },\n apis: [\n {\n base: \"https://api.perplexity.ai\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.PERPLEXITY_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Pipedrive API docs.\n// Source: https://developers.pipedrive.com/docs/api/v1\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:pipedrive\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const pipedriveFirewall = {\n name: \"pipedrive\",\n description: \"Pipedrive\",\n placeholders: {\n PIPEDRIVE_TOKEN: \"c0ffee5afe10ca1c0ffee5afe10ca1c0ffee5afe\",\n },\n apis: [\n {\n base: \"https://api.pipedrive.com\",\n auth: {\n headers: {\n \"x-api-token\": \"${{ secrets.PIPEDRIVE_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Plain.com GraphQL API docs.\n// Source: https://www.plain.com/docs/graphql/introduction\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:plain\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const plainFirewall = {\n name: \"plain\",\n description: \"Plain\",\n placeholders: {\n PLAIN_TOKEN: \"plainApiKey__CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLo\",\n },\n apis: [\n {\n base: \"https://core-api.uk.plain.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.PLAIN_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Plausible Analytics API docs.\n// Source: https://plausible.io/docs/stats-api\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:plausible\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const plausibleFirewall = {\n name: \"plausible\",\n description: \"Plausible Analytics API\",\n placeholders: {\n PLAUSIBLE_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalC\",\n },\n apis: [\n {\n base: \"https://plausible.io/api\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.PLAUSIBLE_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Podchaser API docs.\n// Source: https://api-docs.podchaser.com/docs/authorization/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:podchaser\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const podchaserFirewall = {\n name: \"podchaser\",\n description: \"Podchaser Podcast API\",\n placeholders: {\n PODCHASER_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafe\",\n },\n apis: [\n {\n base: \"https://api.podchaser.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.PODCHASER_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from PostHog API docs.\n// Source: https://posthog.com/docs/api\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:posthog\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const posthogFirewall = {\n name: \"posthog\",\n description: \"PostHog API\",\n placeholders: {\n POSTHOG_TOKEN: \"phx_CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCo\",\n },\n apis: [\n {\n base: \"https://us.posthog.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.POSTHOG_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://eu.posthog.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.POSTHOG_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Productlane API docs.\n// Source: https://productlane.com/docs/api-reference/authentication\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:productlane\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const productlaneFirewall = {\n name: \"productlane\",\n description: \"Productlane API\",\n placeholders: {\n PRODUCTLANE_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSa\",\n },\n apis: [\n {\n base: \"https://productlane.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.PRODUCTLANE_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Prisma Postgres API docs.\n// Source: https://www.prisma.io/docs/postgres/introduction/management-api\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:prisma-postgres\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const prismaPostgresFirewall = {\n name: \"prisma-postgres\",\n description: \"Prisma Postgres Management API\",\n placeholders: {\n PRISMA_POSTGRES_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSa\",\n },\n apis: [\n {\n base: \"https://api.prisma.io\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.PRISMA_POSTGRES_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Pushinator API docs.\n// Source: https://pushinator.com/api\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:pushinator\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const pushinatorFirewall = {\n name: \"pushinator\",\n description: \"Pushinator API\",\n placeholders: {\n PUSHINATOR_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSaf\",\n },\n apis: [\n {\n base: \"https://api.pushinator.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.PUSHINATOR_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Qdrant API docs.\n// Source: https://qdrant.tech/documentation/interfaces/#api-reference\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:qdrant\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const qdrantFirewall = {\n name: \"qdrant\",\n description: \"Qdrant Vector Database API\",\n placeholders: {\n QDRANT_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLo\",\n },\n apis: [\n {\n base: \"${{ vars.QDRANT_BASE_URL }}\",\n auth: {\n headers: {\n \"api-key\": \"${{ secrets.QDRANT_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Qiita API v2 docs.\n// Source: https://qiita.com/api/v2/docs\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:qiita\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const qiitaFirewall = {\n name: \"qiita\",\n description: \"Qiita API\",\n placeholders: {\n QIITA_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSa\",\n },\n apis: [\n {\n base: \"https://qiita.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.QIITA_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Reddit API docs.\n// Source: https://github.com/reddit-archive/reddit/wiki/OAuth2\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:reddit\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const redditFirewall = {\n name: \"reddit\",\n description: \"Reddit API\",\n placeholders: {\n REDDIT_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffe\",\n },\n apis: [\n {\n base: \"https://oauth.reddit.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.REDDIT_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Reportei API docs.\n// Source: https://developers.reportei.com/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:reportei\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const reporteiFirewall = {\n name: \"reportei\",\n description: \"Reportei API\",\n placeholders: {\n REPORTEI_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSaf\",\n },\n apis: [\n {\n base: \"https://app.reportei.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.REPORTEI_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Replicate API docs.\n// Source: https://replicate.com/docs/reference/http\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:replicate\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const replicateFirewall = {\n name: \"replicate\",\n description: \"Replicate\",\n placeholders: {\n REPLICATE_TOKEN: \"r8_CoffeeSafeLocalCoffeeSafeLocalCoffee\",\n },\n apis: [\n {\n base: \"https://api.replicate.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.REPLICATE_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Resend API docs.\n// Source: https://resend.com/docs/api-reference/api-keys/create-api-key\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:resend\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const resendFirewall = {\n name: \"resend\",\n description: \"Resend API\",\n placeholders: {\n RESEND_TOKEN: \"re_CoffeeSafeLocalCoffeeSafeLocalCof\",\n },\n apis: [\n {\n base: \"https://api.resend.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.RESEND_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from RevenueCat API docs.\n// Source: https://www.revenuecat.com/docs/projects/authentication\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:revenuecat\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const revenuecatFirewall = {\n name: \"revenuecat\",\n description: \"RevenueCat API\",\n placeholders: {\n REVENUECAT_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSaf\",\n },\n apis: [\n {\n base: \"https://api.revenuecat.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.REVENUECAT_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Runway API docs.\n// Source: https://docs.dev.runwayml.com/guides/setup/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:runway\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const runwayFirewall = {\n name: \"runway\",\n description: \"Runway API\",\n placeholders: {\n RUNWAY_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalC\",\n },\n apis: [\n {\n base: \"https://api.dev.runwayml.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.RUNWAY_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Salesforce REST API docs.\n// Source: https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:salesforce\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const salesforceFirewall = {\n name: \"salesforce\",\n description: \"Salesforce REST API\",\n placeholders: {\n SALESFORCE_TOKEN: \"00D0c0ffee5afe1!AQEAQFCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffee\",\n },\n apis: [\n {\n base: \"https://${{ vars.SALESFORCE_INSTANCE }}.my.salesforce.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.SALESFORCE_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from ScrapeNinja API docs.\n// Source: https://scrapeninja.net/docs/getting-started/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:scrapeninja\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const scrapeninjaFirewall = {\n name: \"scrapeninja\",\n description: \"ScrapeNinja Web Scraping API\",\n placeholders: {\n SCRAPENINJA_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSa\",\n },\n apis: [\n {\n base: \"https://scrapeninja.p.rapidapi.com\",\n auth: {\n headers: {\n \"X-RapidAPI-Key\": \"${{ secrets.SCRAPENINJA_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Sentry's official OpenAPI spec.\n// Source: https://raw.githubusercontent.com/getsentry/sentry-api-schema/refs/heads/main/openapi-derefed.json\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:sentry\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const sentryFirewall = {\n name: \"sentry\",\n description: \"Sentry API\",\n placeholders: {\n SENTRY_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCo\",\n },\n apis: [\n {\n base: \"https://sentry.io\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.SENTRY_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"alerts:read\",\n rules: [\n \"GET /api/0/organizations/{organization_id_or_slug}/alert-rules/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/alert-rules/{alert_rule_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/detectors/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/detectors/{detector_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/monitors/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/monitors/{monitor_id_or_slug}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/monitors/{monitor_id_or_slug}/checkins/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/workflows/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/workflows/{workflow_id}/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/monitors/{monitor_id_or_slug}/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/monitors/{monitor_id_or_slug}/checkins/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/rules/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/rules/{rule_id}/\",\n ],\n },\n {\n name: \"alerts:write\",\n rules: [\n \"POST /api/0/organizations/{organization_id_or_slug}/alert-rules/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/alert-rules/{alert_rule_id}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/alert-rules/{alert_rule_id}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/detectors/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/detectors/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/detectors/{detector_id}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/detectors/{detector_id}/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/monitors/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/monitors/{monitor_id_or_slug}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/monitors/{monitor_id_or_slug}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/monitors/{monitor_id_or_slug}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/monitors/{monitor_id_or_slug}/checkins/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/projects/{project_id_or_slug}/detectors/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/workflows/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/workflows/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/workflows/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/workflows/{workflow_id}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/workflows/{workflow_id}/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/monitors/{monitor_id_or_slug}/\",\n \"PUT /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/monitors/{monitor_id_or_slug}/\",\n \"DELETE /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/monitors/{monitor_id_or_slug}/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/monitors/{monitor_id_or_slug}/checkins/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/rules/\",\n \"POST /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/rules/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/rules/{rule_id}/\",\n \"PUT /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/rules/{rule_id}/\",\n \"DELETE /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/rules/{rule_id}/\",\n ],\n },\n {\n name: \"event:admin\",\n rules: [\n \"GET /api/0/organizations/{organization_id_or_slug}/issues/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/issues/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/issues/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/issues/{issue_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/issues/{issue_id}/autofix/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/issues/{issue_id}/autofix/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/issues/{issue_id}/events/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/issues/{issue_id}/events/{event_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/issues/{issue_id}/external-issues/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/issues/{issue_id}/tags/{key}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/issues/{issue_id}/tags/{key}/values/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/shortids/{issue_id}/\",\n \"DELETE /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/issues/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/replays/{replay_id}/viewed-by/\",\n \"DELETE /api/0/sentry-app-installations/{uuid}/external-issues/{external_issue_id}/\",\n \"GET /api/0/sentry-apps/{sentry_app_id_or_slug}/\",\n ],\n },\n {\n name: \"event:read\",\n rules: [\n \"GET /api/0/organizations/{organization_id_or_slug}/issues/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/issues/{issue_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/issues/{issue_id}/autofix/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/issues/{issue_id}/events/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/issues/{issue_id}/events/{event_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/issues/{issue_id}/external-issues/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/issues/{issue_id}/hashes/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/issues/{issue_id}/tags/{key}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/issues/{issue_id}/tags/{key}/values/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/shortids/{issue_id}/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/issues/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/replays/{replay_id}/viewed-by/\",\n \"GET /api/0/sentry-apps/{sentry_app_id_or_slug}/\",\n ],\n },\n {\n name: \"event:write\",\n rules: [\n \"GET /api/0/organizations/{organization_id_or_slug}/issues/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/issues/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/issues/{issue_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/issues/{issue_id}/autofix/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/issues/{issue_id}/autofix/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/issues/{issue_id}/events/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/issues/{issue_id}/events/{event_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/issues/{issue_id}/external-issues/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/issues/{issue_id}/tags/{key}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/issues/{issue_id}/tags/{key}/values/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/shortids/{issue_id}/\",\n \"PUT /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/issues/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/replays/{replay_id}/viewed-by/\",\n \"POST /api/0/sentry-app-installations/{uuid}/external-issues/\",\n \"GET /api/0/sentry-apps/{sentry_app_id_or_slug}/\",\n ],\n },\n {\n name: \"member:admin\",\n rules: [\n \"GET /api/0/organizations/{organization_id_or_slug}/members/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/members/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/members/{member_id}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/members/{member_id}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/members/{member_id}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/members/{member_id}/teams/{team_id_or_slug}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/scim/v2/Users\",\n \"POST /api/0/organizations/{organization_id_or_slug}/scim/v2/Users\",\n \"GET /api/0/organizations/{organization_id_or_slug}/scim/v2/Users/{member_id}\",\n \"PATCH /api/0/organizations/{organization_id_or_slug}/scim/v2/Users/{member_id}\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/scim/v2/Users/{member_id}\",\n ],\n },\n {\n name: \"member:invite\",\n rules: [\n \"POST /api/0/organizations/{organization_id_or_slug}/members/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/members/{member_id}/\",\n ],\n },\n {\n name: \"member:read\",\n rules: [\n \"GET /api/0/organizations/{organization_id_or_slug}/members/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/members/{member_id}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/members/{member_id}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/members/{member_id}/teams/{team_id_or_slug}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/scim/v2/Users\",\n \"GET /api/0/organizations/{organization_id_or_slug}/scim/v2/Users/{member_id}\",\n \"GET /api/0/sentry-apps/{sentry_app_id_or_slug}/\",\n ],\n },\n {\n name: \"member:write\",\n rules: [\n \"GET /api/0/organizations/{organization_id_or_slug}/members/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/members/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/members/{member_id}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/members/{member_id}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/members/{member_id}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/members/{member_id}/teams/{team_id_or_slug}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/scim/v2/Users\",\n \"POST /api/0/organizations/{organization_id_or_slug}/scim/v2/Users\",\n \"GET /api/0/organizations/{organization_id_or_slug}/scim/v2/Users/{member_id}\",\n \"PATCH /api/0/organizations/{organization_id_or_slug}/scim/v2/Users/{member_id}\",\n ],\n },\n {\n name: \"org:admin\",\n rules: [\n \"GET /api/0/organizations/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/alert-rules/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/alert-rules/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/alert-rules/{alert_rule_id}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/alert-rules/{alert_rule_id}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/alert-rules/{alert_rule_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/config/integrations/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/dashboards/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/dashboards/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/dashboards/{dashboard_id}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/dashboards/{dashboard_id}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/dashboards/{dashboard_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/detectors/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/detectors/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/detectors/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/detectors/{detector_id}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/detectors/{detector_id}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/detectors/{detector_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/discover/saved/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/discover/saved/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/discover/saved/{query_id}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/discover/saved/{query_id}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/discover/saved/{query_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/environments/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/eventids/{event_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/events-timeseries/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/events/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/external-users/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/external-users/{external_user_id}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/external-users/{external_user_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/integrations/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/integrations/{integration_id}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/integrations/{integration_id}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/members/{member_id}/teams/{team_id_or_slug}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/members/{member_id}/teams/{team_id_or_slug}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/monitors/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/monitors/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/notifications/actions/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/notifications/actions/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/notifications/actions/{action_id}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/notifications/actions/{action_id}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/notifications/actions/{action_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/preprodartifacts/{artifact_id}/install-details/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/preprodartifacts/{artifact_id}/size-analysis/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/prevent/owner/{owner}/repositories/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/prevent/owner/{owner}/repositories/sync/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/prevent/owner/{owner}/repositories/sync/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/prevent/owner/{owner}/repositories/tokens/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/prevent/owner/{owner}/repository/{repository}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/prevent/owner/{owner}/repository/{repository}/branches/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/prevent/owner/{owner}/repository/{repository}/test-results-aggregates/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/prevent/owner/{owner}/repository/{repository}/test-results/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/prevent/owner/{owner}/repository/{repository}/test-suites/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/prevent/owner/{owner}/repository/{repository}/token/regenerate/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/project-keys/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/projects/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/relay_usage/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/replay-count/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/replay-selectors/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/replays/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/replays/{replay_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/repos/{repo_id}/commits/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/sentry-apps/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/sessions/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/stats-summary/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/stats_v2/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/teams/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/teams/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/user-teams/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/workflows/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/workflows/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/workflows/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/workflows/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/workflows/{workflow_id}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/workflows/{workflow_id}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/workflows/{workflow_id}/\",\n \"PUT /api/0/sentry-apps/{sentry_app_id_or_slug}/\",\n \"DELETE /api/0/sentry-apps/{sentry_app_id_or_slug}/\",\n ],\n },\n {\n name: \"org:ci\",\n rules: [\n \"GET /api/0/organizations/{organization_id_or_slug}/release-threshold-statuses/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/releases/{version}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/releases/{version}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/releases/{version}/deploys/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/releases/{version}/deploys/\",\n ],\n },\n {\n name: \"org:integrations\",\n rules: [\n \"GET /api/0/organizations/{organization_id_or_slug}/integrations/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/integrations/{integration_id}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/integrations/{integration_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/sentry-app-installations/\",\n ],\n },\n {\n name: \"org:read\",\n rules: [\n \"GET /api/0/organizations/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/alert-rules/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/alert-rules/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/alert-rules/{alert_rule_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/config/integrations/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/dashboards/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/dashboards/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/dashboards/{dashboard_id}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/dashboards/{dashboard_id}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/dashboards/{dashboard_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/detectors/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/detectors/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/detectors/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/detectors/{detector_id}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/detectors/{detector_id}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/detectors/{detector_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/discover/saved/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/discover/saved/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/discover/saved/{query_id}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/discover/saved/{query_id}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/discover/saved/{query_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/environments/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/eventids/{event_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/events-timeseries/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/events/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/integrations/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/integrations/{integration_id}/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/members/{member_id}/teams/{team_id_or_slug}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/members/{member_id}/teams/{team_id_or_slug}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/members/{member_id}/teams/{team_id_or_slug}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/monitors/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/monitors/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/notifications/actions/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/notifications/actions/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/notifications/actions/{action_id}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/notifications/actions/{action_id}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/notifications/actions/{action_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/preprodartifacts/{artifact_id}/install-details/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/preprodartifacts/{artifact_id}/size-analysis/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/prevent/owner/{owner}/repositories/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/prevent/owner/{owner}/repositories/sync/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/prevent/owner/{owner}/repositories/sync/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/prevent/owner/{owner}/repositories/tokens/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/prevent/owner/{owner}/repository/{repository}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/prevent/owner/{owner}/repository/{repository}/branches/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/prevent/owner/{owner}/repository/{repository}/test-results-aggregates/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/prevent/owner/{owner}/repository/{repository}/test-results/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/prevent/owner/{owner}/repository/{repository}/test-suites/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/prevent/owner/{owner}/repository/{repository}/token/regenerate/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/project-keys/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/projects/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/relay_usage/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/replay-count/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/replay-selectors/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/replays/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/replays/{replay_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/repos/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/repos/{repo_id}/commits/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/sentry-app-installations/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/sentry-apps/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/sessions/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/stats-summary/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/stats_v2/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/teams/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/user-teams/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/workflows/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/workflows/{workflow_id}/\",\n \"GET /api/0/sentry-apps/{sentry_app_id_or_slug}/\",\n ],\n },\n {\n name: \"org:write\",\n rules: [\n \"GET /api/0/organizations/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/alert-rules/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/alert-rules/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/alert-rules/{alert_rule_id}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/alert-rules/{alert_rule_id}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/alert-rules/{alert_rule_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/config/integrations/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/dashboards/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/dashboards/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/dashboards/{dashboard_id}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/dashboards/{dashboard_id}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/dashboards/{dashboard_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/detectors/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/detectors/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/detectors/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/detectors/{detector_id}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/detectors/{detector_id}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/detectors/{detector_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/discover/saved/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/discover/saved/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/discover/saved/{query_id}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/discover/saved/{query_id}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/discover/saved/{query_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/environments/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/eventids/{event_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/events-timeseries/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/events/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/external-users/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/external-users/{external_user_id}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/external-users/{external_user_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/forwarding/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/forwarding/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/forwarding/{data_forwarder_id}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/forwarding/{data_forwarder_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/integrations/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/integrations/{integration_id}/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/members/{member_id}/teams/{team_id_or_slug}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/members/{member_id}/teams/{team_id_or_slug}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/members/{member_id}/teams/{team_id_or_slug}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/monitors/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/monitors/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/notifications/actions/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/notifications/actions/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/notifications/actions/{action_id}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/notifications/actions/{action_id}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/notifications/actions/{action_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/preprodartifacts/{artifact_id}/install-details/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/preprodartifacts/{artifact_id}/size-analysis/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/prevent/owner/{owner}/repositories/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/prevent/owner/{owner}/repositories/sync/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/prevent/owner/{owner}/repositories/sync/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/prevent/owner/{owner}/repositories/tokens/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/prevent/owner/{owner}/repository/{repository}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/prevent/owner/{owner}/repository/{repository}/branches/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/prevent/owner/{owner}/repository/{repository}/test-results-aggregates/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/prevent/owner/{owner}/repository/{repository}/test-results/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/prevent/owner/{owner}/repository/{repository}/test-suites/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/prevent/owner/{owner}/repository/{repository}/token/regenerate/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/project-keys/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/projects/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/relay_usage/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/replay-count/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/replay-selectors/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/replays/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/replays/{replay_id}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/repos/{repo_id}/commits/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/sentry-apps/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/sessions/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/stats-summary/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/stats_v2/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/teams/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/teams/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/user-teams/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/workflows/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/workflows/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/workflows/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/workflows/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/workflows/{workflow_id}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/workflows/{workflow_id}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/workflows/{workflow_id}/\",\n \"PUT /api/0/sentry-apps/{sentry_app_id_or_slug}/\",\n ],\n },\n {\n name: \"project:admin\",\n rules: [\n \"GET /api/0/organizations/{organization_id_or_slug}/monitors/{monitor_id_or_slug}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/monitors/{monitor_id_or_slug}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/monitors/{monitor_id_or_slug}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/monitors/{monitor_id_or_slug}/checkins/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/projects/{project_id_or_slug}/detectors/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/release-threshold-statuses/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/releases/{version}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/releases/{version}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/releases/{version}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/releases/{version}/deploys/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/releases/{version}/deploys/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/spike-protections/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/spike-protections/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/\",\n \"PUT /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/\",\n \"DELETE /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/environments/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/environments/{environment}/\",\n \"PUT /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/environments/{environment}/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/events/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/events/{event_id}/source-map-debug/\",\n \"DELETE /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/files/dsyms/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/filters/\",\n \"PUT /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/filters/{filter_id}/\",\n \"DELETE /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/hooks/{hook_id}/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/keys/\",\n \"POST /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/keys/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/keys/{key_id}/\",\n \"PUT /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/keys/{key_id}/\",\n \"DELETE /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/keys/{key_id}/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/members/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/monitors/{monitor_id_or_slug}/\",\n \"PUT /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/monitors/{monitor_id_or_slug}/\",\n \"DELETE /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/monitors/{monitor_id_or_slug}/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/monitors/{monitor_id_or_slug}/checkins/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/ownership/\",\n \"PUT /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/ownership/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/preprodartifacts/build-distribution/latest/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/replays/jobs/delete/\",\n \"POST /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/replays/jobs/delete/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/replays/jobs/delete/{job_id}/\",\n \"DELETE /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/replays/{replay_id}/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/replays/{replay_id}/clicks/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/replays/{replay_id}/recording-segments/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/replays/{replay_id}/recording-segments/{segment_id}/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/rules/\",\n \"POST /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/rules/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/rules/{rule_id}/\",\n \"PUT /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/rules/{rule_id}/\",\n \"DELETE /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/rules/{rule_id}/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/symbol-sources/\",\n \"POST /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/symbol-sources/\",\n \"PUT /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/symbol-sources/\",\n \"DELETE /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/symbol-sources/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/teams/\",\n \"POST /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/teams/{team_id_or_slug}/\",\n \"DELETE /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/teams/{team_id_or_slug}/\",\n \"GET /api/0/teams/{organization_id_or_slug}/{team_id_or_slug}/projects/\",\n \"POST /api/0/teams/{organization_id_or_slug}/{team_id_or_slug}/projects/\",\n ],\n },\n {\n name: \"project:distribution\",\n rules: [\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/preprodartifacts/build-distribution/latest/\",\n ],\n },\n {\n name: \"project:read\",\n rules: [\n \"GET /api/0/organizations/{organization_id_or_slug}/monitors/{monitor_id_or_slug}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/monitors/{monitor_id_or_slug}/checkins/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/release-threshold-statuses/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/releases/{version}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/releases/{version}/deploys/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/spike-protections/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/spike-protections/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/\",\n \"PUT /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/environments/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/environments/{environment}/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/events/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/events/{event_id}/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/events/{event_id}/source-map-debug/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/files/dsyms/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/filters/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/hooks/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/hooks/{hook_id}/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/keys/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/keys/{key_id}/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/members/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/monitors/{monitor_id_or_slug}/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/monitors/{monitor_id_or_slug}/checkins/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/ownership/\",\n \"PUT /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/ownership/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/preprodartifacts/build-distribution/latest/\",\n \"DELETE /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/replays/{replay_id}/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/replays/{replay_id}/clicks/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/replays/{replay_id}/recording-segments/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/replays/{replay_id}/recording-segments/{segment_id}/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/rules/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/rules/{rule_id}/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/stats/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/symbol-sources/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/tags/{key}/values/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/teams/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/user-feedback/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/users/\",\n \"GET /api/0/sentry-apps/{sentry_app_id_or_slug}/\",\n \"GET /api/0/teams/{organization_id_or_slug}/{team_id_or_slug}/projects/\",\n ],\n },\n {\n name: \"project:releases\",\n rules: [\n \"GET /api/0/organizations/{organization_id_or_slug}/release-threshold-statuses/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/releases/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/releases/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/releases/{version}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/releases/{version}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/releases/{version}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/releases/{version}/commitfiles/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/releases/{version}/commits/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/releases/{version}/deploys/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/releases/{version}/deploys/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/releases/{version}/files/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/releases/{version}/files/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/releases/{version}/files/{file_id}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/releases/{version}/files/{file_id}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/releases/{version}/files/{file_id}/\",\n \"DELETE /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/files/dsyms/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/releases/{version}/commits/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/releases/{version}/files/\",\n \"POST /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/releases/{version}/files/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/releases/{version}/files/{file_id}/\",\n \"PUT /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/releases/{version}/files/{file_id}/\",\n \"DELETE /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/releases/{version}/files/{file_id}/\",\n \"GET /api/0/sentry-apps/{sentry_app_id_or_slug}/\",\n ],\n },\n {\n name: \"project:write\",\n rules: [\n \"GET /api/0/organizations/{organization_id_or_slug}/monitors/{monitor_id_or_slug}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/monitors/{monitor_id_or_slug}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/monitors/{monitor_id_or_slug}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/monitors/{monitor_id_or_slug}/checkins/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/projects/{project_id_or_slug}/detectors/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/release-threshold-statuses/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/releases/{version}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/releases/{version}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/releases/{version}/deploys/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/releases/{version}/deploys/\",\n \"POST /api/0/organizations/{organization_id_or_slug}/spike-protections/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/spike-protections/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/\",\n \"PUT /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/environments/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/environments/{environment}/\",\n \"PUT /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/environments/{environment}/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/events/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/events/{event_id}/source-map-debug/\",\n \"POST /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/files/dsyms/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/filters/\",\n \"PUT /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/filters/{filter_id}/\",\n \"POST /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/hooks/\",\n \"PUT /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/hooks/{hook_id}/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/keys/\",\n \"POST /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/keys/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/keys/{key_id}/\",\n \"PUT /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/keys/{key_id}/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/members/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/monitors/{monitor_id_or_slug}/\",\n \"PUT /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/monitors/{monitor_id_or_slug}/\",\n \"DELETE /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/monitors/{monitor_id_or_slug}/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/monitors/{monitor_id_or_slug}/checkins/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/ownership/\",\n \"PUT /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/ownership/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/preprodartifacts/build-distribution/latest/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/replays/jobs/delete/\",\n \"POST /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/replays/jobs/delete/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/replays/jobs/delete/{job_id}/\",\n \"DELETE /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/replays/{replay_id}/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/replays/{replay_id}/clicks/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/replays/{replay_id}/recording-segments/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/replays/{replay_id}/recording-segments/{segment_id}/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/rules/\",\n \"POST /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/rules/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/rules/{rule_id}/\",\n \"PUT /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/rules/{rule_id}/\",\n \"DELETE /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/rules/{rule_id}/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/symbol-sources/\",\n \"POST /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/symbol-sources/\",\n \"PUT /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/symbol-sources/\",\n \"GET /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/teams/\",\n \"POST /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/teams/{team_id_or_slug}/\",\n \"DELETE /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/teams/{team_id_or_slug}/\",\n \"POST /api/0/projects/{organization_id_or_slug}/{project_id_or_slug}/user-feedback/\",\n \"GET /api/0/teams/{organization_id_or_slug}/{team_id_or_slug}/projects/\",\n \"POST /api/0/teams/{organization_id_or_slug}/{team_id_or_slug}/projects/\",\n ],\n },\n {\n name: \"team:admin\",\n rules: [\n \"PUT /api/0/organizations/{organization_id_or_slug}/members/{member_id}/teams/{team_id_or_slug}/\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/members/{member_id}/teams/{team_id_or_slug}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/scim/v2/Groups\",\n \"POST /api/0/organizations/{organization_id_or_slug}/scim/v2/Groups\",\n \"GET /api/0/organizations/{organization_id_or_slug}/scim/v2/Groups/{team_id_or_slug}\",\n \"PATCH /api/0/organizations/{organization_id_or_slug}/scim/v2/Groups/{team_id_or_slug}\",\n \"DELETE /api/0/organizations/{organization_id_or_slug}/scim/v2/Groups/{team_id_or_slug}\",\n \"GET /api/0/teams/{organization_id_or_slug}/{team_id_or_slug}/\",\n \"PUT /api/0/teams/{organization_id_or_slug}/{team_id_or_slug}/\",\n \"DELETE /api/0/teams/{organization_id_or_slug}/{team_id_or_slug}/\",\n \"POST /api/0/teams/{organization_id_or_slug}/{team_id_or_slug}/external-teams/\",\n \"PUT /api/0/teams/{organization_id_or_slug}/{team_id_or_slug}/external-teams/{external_team_id}/\",\n \"DELETE /api/0/teams/{organization_id_or_slug}/{team_id_or_slug}/external-teams/{external_team_id}/\",\n \"GET /api/0/teams/{organization_id_or_slug}/{team_id_or_slug}/members/\",\n ],\n },\n {\n name: \"team:read\",\n rules: [\n \"GET /api/0/organizations/{organization_id_or_slug}/scim/v2/Groups\",\n \"GET /api/0/organizations/{organization_id_or_slug}/scim/v2/Groups/{team_id_or_slug}\",\n \"GET /api/0/sentry-apps/{sentry_app_id_or_slug}/\",\n \"GET /api/0/teams/{organization_id_or_slug}/{team_id_or_slug}/\",\n \"GET /api/0/teams/{organization_id_or_slug}/{team_id_or_slug}/members/\",\n ],\n },\n {\n name: \"team:write\",\n rules: [\n \"POST /api/0/organizations/{organization_id_or_slug}/members/{member_id}/teams/{team_id_or_slug}/\",\n \"PUT /api/0/organizations/{organization_id_or_slug}/members/{member_id}/teams/{team_id_or_slug}/\",\n \"GET /api/0/organizations/{organization_id_or_slug}/scim/v2/Groups\",\n \"POST /api/0/organizations/{organization_id_or_slug}/scim/v2/Groups\",\n \"GET /api/0/organizations/{organization_id_or_slug}/scim/v2/Groups/{team_id_or_slug}\",\n \"PATCH /api/0/organizations/{organization_id_or_slug}/scim/v2/Groups/{team_id_or_slug}\",\n \"POST /api/0/organizations/{organization_id_or_slug}/teams/\",\n \"GET /api/0/teams/{organization_id_or_slug}/{team_id_or_slug}/\",\n \"PUT /api/0/teams/{organization_id_or_slug}/{team_id_or_slug}/\",\n \"POST /api/0/teams/{organization_id_or_slug}/{team_id_or_slug}/external-teams/\",\n \"PUT /api/0/teams/{organization_id_or_slug}/{team_id_or_slug}/external-teams/{external_team_id}/\",\n \"GET /api/0/teams/{organization_id_or_slug}/{team_id_or_slug}/members/\",\n ],\n },\n ],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from SerpApi docs.\n// Source: https://serpapi.com/search-api\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:serpapi\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const serpapiFirewall = {\n name: \"serpapi\",\n description: \"SerpApi\",\n placeholders: {\n SERPAPI_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCof\",\n },\n apis: [\n {\n base: \"https://serpapi.com\",\n auth: {\n query: {\n api_key: \"${{ secrets.SERPAPI_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Shopify Admin API docs.\n// Source: https://shopify.dev/docs/api/admin-rest\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:shopify\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const shopifyFirewall = {\n name: \"shopify\",\n description: \"Shopify Admin API\",\n placeholders: {\n SHOPIFY_TOKEN: \"shpat_CoffeeSafeLocalCoffeeSafeLocalCo\",\n },\n apis: [\n {\n base: \"https://${{ vars.SHOPIFY_SHOP }}.myshopify.com\",\n auth: {\n headers: {\n \"X-Shopify-Access-Token\": \"${{ secrets.SHOPIFY_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Short.io API docs.\n// Source: https://developers.short.io/docs/cre\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:shortio\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const shortioFirewall = {\n name: \"shortio\",\n description: \"Short.io API\",\n placeholders: {\n SHORTIO_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalC\",\n },\n apis: [\n {\n base: \"https://api.short.io\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.SHORTIO_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Stability AI API docs.\n// Source: https://platform.stability.ai/docs/api-reference\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:stability-ai\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const stabilityAiFirewall = {\n name: \"stability-ai\",\n description: \"Stability AI\",\n placeholders: {\n STABILITY_TOKEN: \"sk-CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocal\",\n },\n apis: [\n {\n base: \"https://api.stability.ai\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.STABILITY_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from SimilarWeb API docs.\n// Source: https://docs.similarweb.com/api-v5/getting-started/authentication\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:similarweb\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const similarwebFirewall = {\n name: \"similarweb\",\n description: \"SimilarWeb API\",\n placeholders: {\n SIMILARWEB_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSa\",\n },\n apis: [\n {\n base: \"https://api.similarweb.com\",\n auth: {\n headers: {\n \"api-key\": \"${{ secrets.SIMILARWEB_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated firewall config for Slack Webhook.\n// Webhook URL contains credentials in the path — uses auth.base for URL rewriting.\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:slack-webhook\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const slackWebhookFirewall = {\n name: \"slack-webhook\",\n description: \"Slack Webhook\",\n placeholders: {\n SLACK_WEBHOOK_URL: \"https://firewall-placeholder.vm3.ai/slack-webhook/hook\",\n },\n apis: [\n {\n base: \"https://firewall-placeholder.vm3.ai/slack-webhook/hook\",\n auth: {\n base: \"${{ secrets.SLACK_WEBHOOK_URL }}\",\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Spotify Web API docs.\n// Source: https://developer.spotify.com/documentation/web-api\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:spotify\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const spotifyFirewall = {\n name: \"spotify\",\n description: \"Spotify Web API\",\n placeholders: {\n SPOTIFY_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLo\",\n },\n apis: [\n {\n base: \"https://api.spotify.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.SPOTIFY_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Strava's official Swagger spec.\n// Source: https://developers.strava.com/swagger/swagger.json\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:strava\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const stravaFirewall = {\n name: \"strava\",\n description: \"Strava API\",\n placeholders: {\n STRAVA_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffe\",\n },\n apis: [\n {\n base: \"https://www.strava.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.STRAVA_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"activity:read\",\n rules: [\n \"GET /api/v3/activities/{id}\",\n \"GET /api/v3/activities/{id}/comments\",\n \"GET /api/v3/activities/{id}/kudos\",\n \"GET /api/v3/activities/{id}/laps\",\n \"GET /api/v3/activities/{id}/streams\",\n \"GET /api/v3/activities/{id}/zones\",\n \"GET /api/v3/athlete/activities\",\n ],\n },\n {\n name: \"activity:read_all\",\n rules: [\n \"GET /api/v3/activities/{id}\",\n \"GET /api/v3/activities/{id}/comments\",\n \"GET /api/v3/activities/{id}/kudos\",\n \"GET /api/v3/activities/{id}/laps\",\n \"GET /api/v3/activities/{id}/streams\",\n \"GET /api/v3/activities/{id}/zones\",\n \"GET /api/v3/athlete/activities\",\n ],\n },\n {\n name: \"activity:write\",\n rules: [\n \"POST /api/v3/activities\",\n \"PUT /api/v3/activities/{id}\",\n \"POST /api/v3/uploads\",\n \"GET /api/v3/uploads/{uploadId}\",\n ],\n },\n {\n name: \"profile:read_all\",\n rules: [\n \"GET /api/v3/athlete\",\n \"GET /api/v3/athlete/zones\",\n ],\n },\n {\n name: \"profile:write\",\n rules: [\n \"PUT /api/v3/athlete\",\n \"PUT /api/v3/segments/{id}/starred\",\n ],\n },\n {\n name: \"read\",\n rules: [\n \"GET /api/v3/athlete\",\n \"GET /api/v3/athlete/clubs\",\n \"GET /api/v3/athletes/{id}/routes\",\n \"GET /api/v3/athletes/{id}/stats\",\n \"GET /api/v3/clubs/{id}\",\n \"GET /api/v3/clubs/{id}/activities\",\n \"GET /api/v3/clubs/{id}/admins\",\n \"GET /api/v3/clubs/{id}/members\",\n \"GET /api/v3/gear/{id}\",\n \"GET /api/v3/routes/{id}\",\n \"GET /api/v3/routes/{id}/export_gpx\",\n \"GET /api/v3/routes/{id}/export_tcx\",\n \"GET /api/v3/routes/{id}/streams\",\n \"GET /api/v3/segment_efforts\",\n \"GET /api/v3/segment_efforts/{id}\",\n \"GET /api/v3/segments/explore\",\n \"GET /api/v3/segments/starred\",\n \"GET /api/v3/segments/{id}\",\n \"GET /api/v3/segments/{id}/streams\",\n ],\n },\n {\n name: \"read_all\",\n rules: [\n \"GET /api/v3/athletes/{id}/routes\",\n \"GET /api/v3/routes/{id}\",\n \"GET /api/v3/routes/{id}/export_gpx\",\n \"GET /api/v3/routes/{id}/export_tcx\",\n \"GET /api/v3/routes/{id}/streams\",\n \"GET /api/v3/segment_efforts/{id}/streams\",\n \"GET /api/v3/segments/starred\",\n \"GET /api/v3/segments/{id}\",\n \"GET /api/v3/segments/{id}/streams\",\n ],\n },\n ],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Strapi REST API docs.\n// Source: https://docs.strapi.io/cms/api/rest\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:strapi\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const strapiFirewall = {\n name: \"strapi\",\n description: \"Strapi CMS API\",\n placeholders: {\n STRAPI_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLo\",\n },\n apis: [\n {\n base: \"${{ vars.STRAPI_BASE_URL }}\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.STRAPI_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Streak API docs.\n// Source: https://streak.readme.io/docs/authentication\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:streak\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const streakFirewall = {\n name: \"streak\",\n description: \"Streak CRM API\",\n placeholders: {\n STREAK_TOKEN: \"Coffee5afe10ca1Coffee5afe10ca1Coffee5afe10\",\n },\n apis: [\n {\n base: \"https://api.streak.com\",\n auth: {\n headers: {\n Authorization: \"${{ basic(secrets.STREAK_TOKEN, ) }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Stripe API docs.\n// Source: https://docs.stripe.com/api/authentication\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:stripe\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const stripeFirewall = {\n name: \"stripe\",\n description: \"Stripe API\",\n placeholders: {\n STRIPE_TOKEN: \"sk_live_CoffeeSafeLocalCoffeeSafeLocalCoff\",\n },\n apis: [\n {\n base: \"https://api.stripe.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.STRIPE_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Supabase Management API docs.\n// Source: https://supabase.com/docs/reference/api/introduction\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:supabase\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const supabaseFirewall = {\n name: \"supabase\",\n description: \"Supabase Management API\",\n placeholders: {\n SUPABASE_TOKEN: \"sbp_oauth_c0ffee5afe10ca1c0ffee5afe10ca1c0ffee5afe\",\n },\n apis: [\n {\n base: \"https://api.supabase.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.SUPABASE_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Supadata API docs.\n// Source: https://docs.supadata.ai/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:supadata\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const supadataFirewall = {\n name: \"supadata\",\n description: \"Supadata API\",\n placeholders: {\n SUPADATA_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSaf\",\n },\n apis: [\n {\n base: \"https://api.supadata.ai\",\n auth: {\n headers: {\n \"x-api-key\": \"${{ secrets.SUPADATA_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Tavily API docs.\n// Source: https://docs.tavily.com/documentation/api-reference/introduction\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:tavily\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const tavilyFirewall = {\n name: \"tavily\",\n description: \"Tavily API\",\n placeholders: {\n TAVILY_TOKEN: \"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\",\n },\n apis: [\n {\n base: \"https://api.tavily.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.TAVILY_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated — do not edit.\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:test-oauth\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const testOauthFirewall = {\n name: \"test-oauth\",\n description: \"Test OAuth connector (internal synthetic provider)\",\n placeholders: {\n TEST_OAUTH_TOKEN: \"testoauth_placeholder_token\",\n },\n apis: [\n {\n base: \"https://{pr}.vm6.ai/api/test/oauth-provider\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.TEST_OAUTH_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"echo\",\n description: \"Test echo endpoint used to verify token injection\",\n rules: [\"GET /echo\"],\n },\n ],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from tl;dv API docs.\n// Source: https://doc.tldv.io/index.html\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:tldv\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const tldvFirewall = {\n name: \"tldv\",\n description: \"tl;dv API\",\n placeholders: {\n TLDV_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSaf\",\n },\n apis: [\n {\n base: \"https://pasta.tldv.io\",\n auth: {\n headers: {\n \"x-api-key\": \"${{ secrets.TLDV_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Todoist API docs.\n// Source: https://developer.todoist.com/guides/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:todoist\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const todoistFirewall = {\n name: \"todoist\",\n description: \"Todoist API\",\n placeholders: {\n TODOIST_TOKEN: \"c0ffee5afe10ca1c0ffee5afe10ca1c0ffee5af\",\n },\n apis: [\n {\n base: \"https://api.todoist.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.TODOIST_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Together AI API docs.\n// Source: https://docs.together.ai/reference\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:together\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const togetherFirewall = {\n name: \"together\",\n description: \"Together AI\",\n placeholders: {\n TOGETHER_TOKEN: \"c0ffee5afe10ca1c0ffee5afe10ca1c0ffee5afe10ca1c0ffee5afe10ca1c0ff\",\n },\n apis: [\n {\n base: \"https://api.together.ai\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.TOGETHER_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Twenty CRM API docs.\n// Source: https://docs.twenty.com/developers/api-and-webhooks/api\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:twenty\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const twentyFirewall = {\n name: \"twenty\",\n description: \"Twenty CRM API\",\n placeholders: {\n TWENTY_TOKEN:\n \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJDb2ZmZWVTYWZlTG9jYWxDb2ZmZWVTYWZlTG9jYWxDbyIsInR5cGUiOiJBUElfS0VZIiwid29ya3NwYWNlSWQiOiJDb2ZmZWVTYWZlTG9jYWxDb2YifQ.CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLo\",\n },\n apis: [\n {\n base: \"https://api.twenty.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.TWENTY_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Typeform API docs.\n// Source: https://www.typeform.com/developers/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:typeform\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const typeformFirewall = {\n name: \"typeform\",\n description: \"Typeform API\",\n placeholders: {\n TYPEFORM_TOKEN: \"tfp_c0ffee5afe10ca1c0ffee5afe10ca1c0ffee5afe\",\n },\n apis: [\n {\n base: \"https://api.typeform.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.TYPEFORM_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from v0 API docs.\n// Source: https://v0.dev/docs/api/platform/quickstart\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:v0\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const v0Firewall = {\n name: \"v0\",\n description: \"v0 API\",\n placeholders: {\n V0_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSaf\",\n },\n apis: [\n {\n base: \"https://api.v0.dev\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.V0_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Weights & Biases API docs.\n// Source: https://docs.wandb.ai/ref/rest\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:wandb\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const wandbFirewall = {\n name: \"wandb\",\n description: \"Weights & Biases\",\n placeholders: {\n WANDB_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafe\",\n },\n apis: [\n {\n base: \"https://api.wandb.ai\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.WANDB_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Webflow API docs.\n// Source: https://developers.webflow.com/data/reference/authentication\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:webflow\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const webflowFirewall = {\n name: \"webflow\",\n description: \"Webflow API\",\n placeholders: {\n WEBFLOW_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffe\",\n },\n apis: [\n {\n base: \"https://api.webflow.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.WEBFLOW_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Wix REST API docs.\n// Source: https://dev.wix.com/docs/go-headless/develop-your-project/admin-operations/make-rest-api-calls-with-an-api-key\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:wix\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const wixFirewall = {\n name: \"wix\",\n description: \"Wix REST API\",\n placeholders: {\n WIX_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSaf\",\n },\n apis: [\n {\n base: \"https://www.wixapis.com\",\n auth: {\n headers: {\n Authorization: \"${{ secrets.WIX_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from WorkOS API docs.\n// Source: https://workos.com/docs/reference\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:workos\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const workosFirewall = {\n name: \"workos\",\n description: \"WorkOS\",\n placeholders: {\n WORKOS_TOKEN: \"sk_live_CoffeeSafeLocalCoffeeSafeLocalCoffee\",\n },\n apis: [\n {\n base: \"https://api.workos.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.WORKOS_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Wrike API docs.\n// Source: https://developers.wrike.com/overview/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:wrike\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const wrikeFirewall = {\n name: \"wrike\",\n description: \"Wrike Project Management API\",\n placeholders: {\n WRIKE_TOKEN: \"wrkTkn_CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLoca\",\n },\n apis: [\n {\n base: \"https://www.wrike.com\",\n auth: {\n headers: {\n Authorization: \"bearer ${{ secrets.WRIKE_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://app-us2.wrike.com\",\n auth: {\n headers: {\n Authorization: \"bearer ${{ secrets.WRIKE_TOKEN }}\",\n },\n },\n permissions: [],\n },\n {\n base: \"https://app-eu.wrike.com\",\n auth: {\n headers: {\n Authorization: \"bearer ${{ secrets.WRIKE_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from X (Twitter) official OpenAPI spec.\n// Source: https://api.twitter.com/2/openapi.json\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:x\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const xFirewall = {\n name: \"x\",\n description: \"X (Twitter) API\",\n placeholders: {\n X_TOKEN: \"AAAAAAAAAAAAAAAAAAAAAACoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffe\",\n },\n apis: [\n {\n base: \"https://api.x.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.X_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"app-only\",\n description: \"App-only endpoints (no user context required)\",\n rules: [\n \"POST /2/account_activity/replay/webhooks/{webhook_id}/subscriptions/all\",\n \"GET /2/account_activity/subscriptions/count\",\n \"GET /2/account_activity/webhooks/{webhook_id}/subscriptions/all/list\",\n \"DELETE /2/account_activity/webhooks/{webhook_id}/subscriptions/{user_id}/all\",\n \"GET /2/activity/stream\",\n \"GET /2/activity/subscriptions\",\n \"DELETE /2/activity/subscriptions\",\n \"PUT /2/activity/subscriptions/{subscription_id}\",\n \"DELETE /2/activity/subscriptions/{subscription_id}\",\n \"GET /2/compliance/jobs\",\n \"POST /2/compliance/jobs\",\n \"GET /2/compliance/jobs/{id}\",\n \"GET /2/connections\",\n \"DELETE /2/connections\",\n \"DELETE /2/connections/all\",\n \"DELETE /2/connections/{endpoint_id}\",\n \"GET /2/likes/compliance/stream\",\n \"GET /2/likes/firehose/stream\",\n \"GET /2/likes/sample10/stream\",\n \"GET /2/trends/by/woeid/{woeid}\",\n \"GET /2/tweets/compliance/stream\",\n \"GET /2/tweets/counts/all\",\n \"GET /2/tweets/counts/recent\",\n \"GET /2/tweets/firehose/stream\",\n \"GET /2/tweets/firehose/stream/lang/en\",\n \"GET /2/tweets/firehose/stream/lang/ja\",\n \"GET /2/tweets/firehose/stream/lang/ko\",\n \"GET /2/tweets/firehose/stream/lang/pt\",\n \"GET /2/tweets/label/stream\",\n \"GET /2/tweets/sample/stream\",\n \"GET /2/tweets/sample10/stream\",\n \"GET /2/tweets/search/all\",\n \"GET /2/tweets/search/stream\",\n \"GET /2/tweets/search/stream/rules\",\n \"POST /2/tweets/search/stream/rules\",\n \"GET /2/tweets/search/stream/rules/counts\",\n \"GET /2/tweets/search/webhooks\",\n \"POST /2/tweets/search/webhooks/{webhook_id}\",\n \"DELETE /2/tweets/search/webhooks/{webhook_id}\",\n \"GET /2/usage/tweets\",\n \"GET /2/users/compliance/stream\",\n \"GET /2/webhooks\",\n \"POST /2/webhooks\",\n \"POST /2/webhooks/replay\",\n \"PUT /2/webhooks/{webhook_id}\",\n \"DELETE /2/webhooks/{webhook_id}\",\n ],\n },\n {\n name: \"block.read\",\n description: \"View accounts you have blocked.\",\n rules: [\n \"GET /2/users/{id}/blocking\",\n ],\n },\n {\n name: \"bookmark.read\",\n description: \"Read your bookmarked Posts.\",\n rules: [\n \"GET /2/users/{id}/bookmarks\",\n \"GET /2/users/{id}/bookmarks/folders\",\n \"GET /2/users/{id}/bookmarks/folders/{folder_id}\",\n ],\n },\n {\n name: \"bookmark.write\",\n description: \"Create and delete your bookmarks.\",\n rules: [\n \"POST /2/users/{id}/bookmarks\",\n \"DELETE /2/users/{id}/bookmarks/{tweet_id}\",\n ],\n },\n {\n name: \"dm.read\",\n description: \"Read all your Direct Messages.\",\n rules: [\n \"POST /2/activity/subscriptions\",\n \"GET /2/chat/conversations\",\n \"GET /2/chat/conversations/{id}\",\n \"GET /2/dm_conversations/media/{dm_id}/{media_id}/{resource_id}\",\n \"GET /2/dm_conversations/with/{participant_id}/dm_events\",\n \"GET /2/dm_conversations/{id}/dm_events\",\n \"GET /2/dm_events\",\n \"GET /2/dm_events/{event_id}\",\n \"GET /2/users/public_keys\",\n \"GET /2/users/{id}/public_keys\",\n ],\n },\n {\n name: \"dm.write\",\n description: \"Send and manage your Direct Messages.\",\n rules: [\n \"GET /2/account_activity/webhooks/{webhook_id}/subscriptions/all\",\n \"POST /2/account_activity/webhooks/{webhook_id}/subscriptions/all\",\n \"POST /2/chat/conversations/group\",\n \"POST /2/chat/conversations/group/initialize\",\n \"POST /2/chat/conversations/{id}/keys\",\n \"POST /2/chat/conversations/{id}/members\",\n \"POST /2/chat/conversations/{id}/messages\",\n \"POST /2/chat/conversations/{id}/read\",\n \"POST /2/chat/conversations/{id}/typing\",\n \"POST /2/dm_conversations\",\n \"POST /2/dm_conversations/with/{participant_id}/messages\",\n \"POST /2/dm_conversations/{dm_conversation_id}/messages\",\n \"DELETE /2/dm_events/{event_id}\",\n \"POST /2/users/{id}/dm/block\",\n \"POST /2/users/{id}/dm/unblock\",\n \"POST /2/users/{id}/public_keys\",\n ],\n },\n {\n name: \"follows.read\",\n description: \"View accounts you follow and accounts following you.\",\n rules: [\n \"GET /2/users/{id}/followers\",\n \"GET /2/users/{id}/following\",\n ],\n },\n {\n name: \"follows.write\",\n description: \"Follow and unfollow accounts on your behalf.\",\n rules: [\n \"POST /2/users/{id}/following\",\n \"DELETE /2/users/{source_user_id}/following/{target_user_id}\",\n ],\n },\n {\n name: \"like.read\",\n description: \"View Posts you have liked and likes you can see.\",\n rules: [\n \"GET /2/tweets/{id}/liking_users\",\n \"GET /2/users/{id}/liked_tweets\",\n ],\n },\n {\n name: \"like.write\",\n description: \"Like and unlike Posts on your behalf.\",\n rules: [\n \"POST /2/users/{id}/likes\",\n \"DELETE /2/users/{id}/likes/{tweet_id}\",\n ],\n },\n {\n name: \"list.read\",\n description: \"View Lists, members, and followers of Lists you created or are a member of, including private Lists.\",\n rules: [\n \"GET /2/communities/{id}\",\n \"GET /2/lists/{id}\",\n \"GET /2/lists/{id}/followers\",\n \"GET /2/lists/{id}/members\",\n \"GET /2/lists/{id}/tweets\",\n \"GET /2/users/{id}/followed_lists\",\n \"GET /2/users/{id}/list_memberships\",\n \"GET /2/users/{id}/owned_lists\",\n \"GET /2/users/{id}/pinned_lists\",\n ],\n },\n {\n name: \"list.write\",\n description: \"Create and manage Lists on your behalf.\",\n rules: [\n \"POST /2/lists\",\n \"PUT /2/lists/{id}\",\n \"DELETE /2/lists/{id}\",\n \"POST /2/lists/{id}/members\",\n \"DELETE /2/lists/{id}/members/{user_id}\",\n \"POST /2/users/{id}/followed_lists\",\n \"DELETE /2/users/{id}/followed_lists/{list_id}\",\n \"POST /2/users/{id}/pinned_lists\",\n \"DELETE /2/users/{id}/pinned_lists/{list_id}\",\n ],\n },\n {\n name: \"media.write\",\n description: \"Upload media, such as photos and videos, on your behalf.\",\n rules: [\n \"POST /2/chat/media/upload/initialize\",\n \"POST /2/chat/media/upload/{id}/append\",\n \"POST /2/chat/media/upload/{id}/finalize\",\n \"GET /2/chat/media/{id}/{media_hash_key}\",\n \"POST /2/media/metadata\",\n \"POST /2/media/subtitles\",\n \"DELETE /2/media/subtitles\",\n \"GET /2/media/upload\",\n \"POST /2/media/upload\",\n \"POST /2/media/upload/initialize\",\n \"POST /2/media/upload/{id}/append\",\n \"POST /2/media/upload/{id}/finalize\",\n ],\n },\n {\n name: \"mute.read\",\n description: \"View accounts you have muted.\",\n rules: [\n \"GET /2/users/{id}/muting\",\n ],\n },\n {\n name: \"mute.write\",\n description: \"Mute and unmute accounts on your behalf.\",\n rules: [\n \"POST /2/users/{id}/muting\",\n \"DELETE /2/users/{source_user_id}/muting/{target_user_id}\",\n ],\n },\n {\n name: \"space.read\",\n description: \"View all Spaces you have access to.\",\n rules: [\n \"GET /2/spaces\",\n \"GET /2/spaces/by/creator_ids\",\n \"GET /2/spaces/search\",\n \"GET /2/spaces/{id}\",\n \"GET /2/spaces/{id}/buyers\",\n \"GET /2/spaces/{id}/tweets\",\n ],\n },\n {\n name: \"timeline.read\",\n description: \"View all Custom Timelines you can see, including public Custom Timelines from other developers.\",\n rules: [\n \"GET /2/users/reposts_of_me\",\n ],\n },\n {\n name: \"tweet.moderate.write\",\n description: \"Hide and unhide replies to your Posts.\",\n rules: [\n \"PUT /2/tweets/{tweet_id}/hidden\",\n ],\n },\n {\n name: \"tweet.read\",\n description: \"View all Posts you can see, including those from protected accounts.\",\n rules: [\n \"GET /2/insights/28hr\",\n \"GET /2/insights/historical\",\n \"GET /2/media\",\n \"GET /2/media/analytics\",\n \"GET /2/media/{media_key}\",\n \"GET /2/notes/search/notes_written\",\n \"GET /2/notes/search/posts_eligible_for_notes\",\n \"GET /2/tweets\",\n \"GET /2/tweets/analytics\",\n \"GET /2/tweets/search/recent\",\n \"GET /2/tweets/{id}\",\n \"GET /2/tweets/{id}/quote_tweets\",\n \"GET /2/tweets/{id}/retweeted_by\",\n \"GET /2/tweets/{id}/retweets\",\n ],\n },\n {\n name: \"tweet.write\",\n description: \"Post and repost on your behalf.\",\n rules: [\n \"POST /2/evaluate_note\",\n \"POST /2/notes\",\n \"DELETE /2/notes/{id}\",\n \"POST /2/tweets\",\n \"DELETE /2/tweets/{id}\",\n \"POST /2/users/{id}/retweets\",\n \"DELETE /2/users/{id}/retweets/{source_tweet_id}\",\n ],\n },\n {\n name: \"users.read\",\n description: \"View any account you can see, including protected accounts.\",\n rules: [\n \"GET /2/communities/search\",\n \"GET /2/news/search\",\n \"GET /2/news/{id}\",\n \"GET /2/users\",\n \"GET /2/users/by\",\n \"GET /2/users/by/username/{username}\",\n \"GET /2/users/me\",\n \"GET /2/users/personalized_trends\",\n \"GET /2/users/search\",\n \"GET /2/users/{id}\",\n \"GET /2/users/{id}/affiliates\",\n \"GET /2/users/{id}/mentions\",\n \"GET /2/users/{id}/timelines/reverse_chronological\",\n \"GET /2/users/{id}/tweets\",\n ],\n },\n ],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Xero's official OpenAPI specs.\n// Source: https://github.com/XeroAPI/Xero-OpenAPI\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:xero\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const xeroFirewall = {\n name: \"xero\",\n description: \"Xero API\",\n placeholders: {\n XERO_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSaf\",\n },\n apis: [\n {\n base: \"https://api.xero.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.XERO_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"connections\",\n rules: [\n \"GET /Connections\",\n \"DELETE /Connections/{id}\",\n ],\n },\n ],\n },\n {\n base: \"https://api.xero.com/api.xro/2.0\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.XERO_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"accounting.attachments\",\n rules: [\n \"GET /Accounts/{AccountID}/Attachments\",\n \"GET /Accounts/{AccountID}/Attachments/{AttachmentID}\",\n \"GET /Accounts/{AccountID}/Attachments/{FileName}\",\n \"POST /Accounts/{AccountID}/Attachments/{FileName}\",\n \"PUT /Accounts/{AccountID}/Attachments/{FileName}\",\n \"GET /BankTransactions/{BankTransactionID}/Attachments\",\n \"GET /BankTransactions/{BankTransactionID}/Attachments/{AttachmentID}\",\n \"GET /BankTransactions/{BankTransactionID}/Attachments/{FileName}\",\n \"POST /BankTransactions/{BankTransactionID}/Attachments/{FileName}\",\n \"PUT /BankTransactions/{BankTransactionID}/Attachments/{FileName}\",\n \"GET /BankTransfers/{BankTransferID}/Attachments\",\n \"GET /BankTransfers/{BankTransferID}/Attachments/{AttachmentID}\",\n \"GET /BankTransfers/{BankTransferID}/Attachments/{FileName}\",\n \"POST /BankTransfers/{BankTransferID}/Attachments/{FileName}\",\n \"PUT /BankTransfers/{BankTransferID}/Attachments/{FileName}\",\n \"GET /Contacts/{ContactID}/Attachments\",\n \"GET /Contacts/{ContactID}/Attachments/{AttachmentID}\",\n \"GET /Contacts/{ContactID}/Attachments/{FileName}\",\n \"POST /Contacts/{ContactID}/Attachments/{FileName}\",\n \"PUT /Contacts/{ContactID}/Attachments/{FileName}\",\n \"GET /CreditNotes/{CreditNoteID}/Attachments\",\n \"GET /CreditNotes/{CreditNoteID}/Attachments/{AttachmentID}\",\n \"GET /CreditNotes/{CreditNoteID}/Attachments/{FileName}\",\n \"POST /CreditNotes/{CreditNoteID}/Attachments/{FileName}\",\n \"PUT /CreditNotes/{CreditNoteID}/Attachments/{FileName}\",\n \"GET /Invoices/{InvoiceID}/Attachments\",\n \"GET /Invoices/{InvoiceID}/Attachments/{AttachmentID}\",\n \"GET /Invoices/{InvoiceID}/Attachments/{FileName}\",\n \"POST /Invoices/{InvoiceID}/Attachments/{FileName}\",\n \"PUT /Invoices/{InvoiceID}/Attachments/{FileName}\",\n \"GET /ManualJournals/{ManualJournalID}/Attachments\",\n \"GET /ManualJournals/{ManualJournalID}/Attachments/{AttachmentID}\",\n \"GET /ManualJournals/{ManualJournalID}/Attachments/{FileName}\",\n \"POST /ManualJournals/{ManualJournalID}/Attachments/{FileName}\",\n \"PUT /ManualJournals/{ManualJournalID}/Attachments/{FileName}\",\n \"GET /PurchaseOrders/{PurchaseOrderID}/Attachments\",\n \"GET /PurchaseOrders/{PurchaseOrderID}/Attachments/{AttachmentID}\",\n \"GET /PurchaseOrders/{PurchaseOrderID}/Attachments/{FileName}\",\n \"POST /PurchaseOrders/{PurchaseOrderID}/Attachments/{FileName}\",\n \"PUT /PurchaseOrders/{PurchaseOrderID}/Attachments/{FileName}\",\n \"GET /Quotes/{QuoteID}/Attachments\",\n \"GET /Quotes/{QuoteID}/Attachments/{AttachmentID}\",\n \"GET /Quotes/{QuoteID}/Attachments/{FileName}\",\n \"POST /Quotes/{QuoteID}/Attachments/{FileName}\",\n \"PUT /Quotes/{QuoteID}/Attachments/{FileName}\",\n \"GET /Receipts/{ReceiptID}/Attachments\",\n \"GET /Receipts/{ReceiptID}/Attachments/{AttachmentID}\",\n \"GET /Receipts/{ReceiptID}/Attachments/{FileName}\",\n \"POST /Receipts/{ReceiptID}/Attachments/{FileName}\",\n \"PUT /Receipts/{ReceiptID}/Attachments/{FileName}\",\n \"GET /RepeatingInvoices/{RepeatingInvoiceID}/Attachments\",\n \"GET /RepeatingInvoices/{RepeatingInvoiceID}/Attachments/{AttachmentID}\",\n \"GET /RepeatingInvoices/{RepeatingInvoiceID}/Attachments/{FileName}\",\n \"POST /RepeatingInvoices/{RepeatingInvoiceID}/Attachments/{FileName}\",\n \"PUT /RepeatingInvoices/{RepeatingInvoiceID}/Attachments/{FileName}\",\n ],\n },\n {\n name: \"accounting.attachments.read\",\n rules: [\n \"GET /Accounts/{AccountID}/Attachments\",\n \"GET /Accounts/{AccountID}/Attachments/{AttachmentID}\",\n \"GET /Accounts/{AccountID}/Attachments/{FileName}\",\n \"GET /BankTransactions/{BankTransactionID}/Attachments\",\n \"GET /BankTransactions/{BankTransactionID}/Attachments/{AttachmentID}\",\n \"GET /BankTransactions/{BankTransactionID}/Attachments/{FileName}\",\n \"GET /BankTransfers/{BankTransferID}/Attachments\",\n \"GET /BankTransfers/{BankTransferID}/Attachments/{AttachmentID}\",\n \"GET /BankTransfers/{BankTransferID}/Attachments/{FileName}\",\n \"GET /Contacts/{ContactID}/Attachments\",\n \"GET /Contacts/{ContactID}/Attachments/{AttachmentID}\",\n \"GET /Contacts/{ContactID}/Attachments/{FileName}\",\n \"GET /CreditNotes/{CreditNoteID}/Attachments\",\n \"GET /CreditNotes/{CreditNoteID}/Attachments/{AttachmentID}\",\n \"GET /CreditNotes/{CreditNoteID}/Attachments/{FileName}\",\n \"GET /Invoices/{InvoiceID}/Attachments\",\n \"GET /Invoices/{InvoiceID}/Attachments/{AttachmentID}\",\n \"GET /Invoices/{InvoiceID}/Attachments/{FileName}\",\n \"GET /ManualJournals/{ManualJournalID}/Attachments\",\n \"GET /ManualJournals/{ManualJournalID}/Attachments/{AttachmentID}\",\n \"GET /ManualJournals/{ManualJournalID}/Attachments/{FileName}\",\n \"GET /PurchaseOrders/{PurchaseOrderID}/Attachments\",\n \"GET /PurchaseOrders/{PurchaseOrderID}/Attachments/{AttachmentID}\",\n \"GET /PurchaseOrders/{PurchaseOrderID}/Attachments/{FileName}\",\n \"GET /Quotes/{QuoteID}/Attachments\",\n \"GET /Quotes/{QuoteID}/Attachments/{AttachmentID}\",\n \"GET /Quotes/{QuoteID}/Attachments/{FileName}\",\n \"GET /Receipts/{ReceiptID}/Attachments\",\n \"GET /Receipts/{ReceiptID}/Attachments/{AttachmentID}\",\n \"GET /Receipts/{ReceiptID}/Attachments/{FileName}\",\n \"GET /RepeatingInvoices/{RepeatingInvoiceID}/Attachments\",\n \"GET /RepeatingInvoices/{RepeatingInvoiceID}/Attachments/{AttachmentID}\",\n \"GET /RepeatingInvoices/{RepeatingInvoiceID}/Attachments/{FileName}\",\n ],\n },\n {\n name: \"accounting.budgets.read\",\n rules: [\n \"GET /Budgets\",\n \"GET /Budgets/{BudgetID}\",\n ],\n },\n {\n name: \"accounting.contacts\",\n rules: [\n \"GET /ContactGroups\",\n \"PUT /ContactGroups\",\n \"GET /ContactGroups/{ContactGroupID}\",\n \"POST /ContactGroups/{ContactGroupID}\",\n \"PUT /ContactGroups/{ContactGroupID}/Contacts\",\n \"DELETE /ContactGroups/{ContactGroupID}/Contacts\",\n \"DELETE /ContactGroups/{ContactGroupID}/Contacts/{ContactID}\",\n \"GET /Contacts\",\n \"POST /Contacts\",\n \"PUT /Contacts\",\n \"GET /Contacts/{ContactID}\",\n \"POST /Contacts/{ContactID}\",\n \"GET /Contacts/{ContactID}/History\",\n \"PUT /Contacts/{ContactID}/History\",\n \"GET /Contacts/{ContactNumber}\",\n ],\n },\n {\n name: \"accounting.contacts.read\",\n rules: [\n \"GET /ContactGroups\",\n \"GET /ContactGroups/{ContactGroupID}\",\n \"GET /Contacts\",\n \"GET /Contacts/{ContactID}\",\n \"GET /Contacts/{ContactID}/History\",\n \"GET /Contacts/{ContactNumber}\",\n ],\n },\n {\n name: \"accounting.journals.read\",\n rules: [\n \"GET /Journals\",\n \"GET /Journals/{JournalID}\",\n \"GET /Journals/{JournalNumber}\",\n ],\n },\n {\n name: \"accounting.reports.read\",\n rules: [\n \"GET /Reports\",\n \"GET /Reports/AgedPayablesByContact\",\n \"GET /Reports/AgedReceivablesByContact\",\n \"GET /Reports/BalanceSheet\",\n \"GET /Reports/BankSummary\",\n \"GET /Reports/BudgetSummary\",\n \"GET /Reports/ExecutiveSummary\",\n \"GET /Reports/ProfitAndLoss\",\n \"GET /Reports/TenNinetyNine\",\n \"GET /Reports/TrialBalance\",\n \"GET /Reports/{ReportID}\",\n ],\n },\n {\n name: \"accounting.reports.tenninetynine.read\",\n rules: [\n \"GET /Reports/TenNinetyNine\",\n ],\n },\n {\n name: \"accounting.settings\",\n rules: [\n \"GET /Accounts\",\n \"PUT /Accounts\",\n \"GET /Accounts/{AccountID}\",\n \"POST /Accounts/{AccountID}\",\n \"DELETE /Accounts/{AccountID}\",\n \"GET /BrandingThemes\",\n \"GET /BrandingThemes/{BrandingThemeID}\",\n \"GET /Contacts/{ContactID}/CISSettings\",\n \"GET /Currencies\",\n \"PUT /Currencies\",\n \"GET /Employees\",\n \"POST /Employees\",\n \"PUT /Employees\",\n \"GET /Employees/{EmployeeID}\",\n \"GET /InvoiceReminders/Settings\",\n \"GET /Items\",\n \"POST /Items\",\n \"PUT /Items\",\n \"GET /Items/{ItemID}\",\n \"POST /Items/{ItemID}\",\n \"DELETE /Items/{ItemID}\",\n \"GET /Items/{ItemID}/History\",\n \"PUT /Items/{ItemID}/History\",\n \"GET /Organisation\",\n \"GET /Organisation/Actions\",\n \"GET /Organisation/{OrganisationID}/CISSettings\",\n \"POST /Setup\",\n \"GET /TaxRates\",\n \"POST /TaxRates\",\n \"PUT /TaxRates\",\n \"GET /TaxRates/{TaxType}\",\n \"GET /TrackingCategories\",\n \"PUT /TrackingCategories\",\n \"GET /TrackingCategories/{TrackingCategoryID}\",\n \"POST /TrackingCategories/{TrackingCategoryID}\",\n \"DELETE /TrackingCategories/{TrackingCategoryID}\",\n \"PUT /TrackingCategories/{TrackingCategoryID}/Options\",\n \"POST /TrackingCategories/{TrackingCategoryID}/Options/{TrackingOptionID}\",\n \"DELETE /TrackingCategories/{TrackingCategoryID}/Options/{TrackingOptionID}\",\n \"GET /Users\",\n \"GET /Users/{UserID}\",\n ],\n },\n {\n name: \"accounting.settings.read\",\n rules: [\n \"GET /Accounts\",\n \"GET /Accounts/{AccountID}\",\n \"GET /BrandingThemes\",\n \"GET /BrandingThemes/{BrandingThemeID}\",\n \"GET /Contacts/{ContactID}/CISSettings\",\n \"GET /Currencies\",\n \"GET /Employees\",\n \"GET /Employees/{EmployeeID}\",\n \"GET /InvoiceReminders/Settings\",\n \"GET /Items\",\n \"GET /Items/{ItemID}\",\n \"GET /Items/{ItemID}/History\",\n \"GET /Organisation\",\n \"GET /Organisation/Actions\",\n \"GET /Organisation/{OrganisationID}/CISSettings\",\n \"GET /TaxRates\",\n \"GET /TaxRates/{TaxType}\",\n \"GET /TrackingCategories\",\n \"GET /TrackingCategories/{TrackingCategoryID}\",\n \"GET /Users\",\n \"GET /Users/{UserID}\",\n ],\n },\n {\n name: \"accounting.transactions\",\n rules: [\n \"GET /BankTransactions\",\n \"POST /BankTransactions\",\n \"PUT /BankTransactions\",\n \"GET /BankTransactions/{BankTransactionID}\",\n \"POST /BankTransactions/{BankTransactionID}\",\n \"GET /BankTransactions/{BankTransactionID}/History\",\n \"PUT /BankTransactions/{BankTransactionID}/History\",\n \"GET /BankTransfers\",\n \"PUT /BankTransfers\",\n \"GET /BankTransfers/{BankTransferID}\",\n \"GET /BankTransfers/{BankTransferID}/History\",\n \"PUT /BankTransfers/{BankTransferID}/History\",\n \"GET /BatchPayments\",\n \"POST /BatchPayments\",\n \"PUT /BatchPayments\",\n \"GET /BatchPayments/{BatchPaymentID}\",\n \"POST /BatchPayments/{BatchPaymentID}\",\n \"GET /BatchPayments/{BatchPaymentID}/History\",\n \"PUT /BatchPayments/{BatchPaymentID}/History\",\n \"GET /CreditNotes\",\n \"POST /CreditNotes\",\n \"PUT /CreditNotes\",\n \"GET /CreditNotes/{CreditNoteID}\",\n \"POST /CreditNotes/{CreditNoteID}\",\n \"PUT /CreditNotes/{CreditNoteID}/Allocations\",\n \"DELETE /CreditNotes/{CreditNoteID}/Allocations/{AllocationID}\",\n \"GET /CreditNotes/{CreditNoteID}/History\",\n \"PUT /CreditNotes/{CreditNoteID}/History\",\n \"GET /CreditNotes/{CreditNoteID}/pdf\",\n \"GET /ExpenseClaims\",\n \"PUT /ExpenseClaims\",\n \"GET /ExpenseClaims/{ExpenseClaimID}\",\n \"POST /ExpenseClaims/{ExpenseClaimID}\",\n \"GET /ExpenseClaims/{ExpenseClaimID}/History\",\n \"PUT /ExpenseClaims/{ExpenseClaimID}/History\",\n \"GET /Invoices\",\n \"POST /Invoices\",\n \"PUT /Invoices\",\n \"GET /Invoices/{InvoiceID}\",\n \"POST /Invoices/{InvoiceID}\",\n \"POST /Invoices/{InvoiceID}/Email\",\n \"GET /Invoices/{InvoiceID}/History\",\n \"PUT /Invoices/{InvoiceID}/History\",\n \"GET /Invoices/{InvoiceID}/OnlineInvoice\",\n \"GET /Invoices/{InvoiceID}/pdf\",\n \"GET /LinkedTransactions\",\n \"PUT /LinkedTransactions\",\n \"GET /LinkedTransactions/{LinkedTransactionID}\",\n \"POST /LinkedTransactions/{LinkedTransactionID}\",\n \"DELETE /LinkedTransactions/{LinkedTransactionID}\",\n \"GET /ManualJournals\",\n \"POST /ManualJournals\",\n \"PUT /ManualJournals\",\n \"GET /ManualJournals/{ManualJournalID}\",\n \"POST /ManualJournals/{ManualJournalID}\",\n \"GET /ManualJournals/{ManualJournalID}/History\",\n \"PUT /ManualJournals/{ManualJournalID}/History\",\n \"GET /Overpayments\",\n \"GET /Overpayments/{OverpaymentID}\",\n \"PUT /Overpayments/{OverpaymentID}/Allocations\",\n \"DELETE /Overpayments/{OverpaymentID}/Allocations/{AllocationID}\",\n \"GET /Overpayments/{OverpaymentID}/History\",\n \"PUT /Overpayments/{OverpaymentID}/History\",\n \"GET /Payments\",\n \"POST /Payments\",\n \"PUT /Payments\",\n \"GET /Payments/{PaymentID}\",\n \"POST /Payments/{PaymentID}\",\n \"GET /Payments/{PaymentID}/History\",\n \"PUT /Payments/{PaymentID}/History\",\n \"GET /Prepayments\",\n \"GET /Prepayments/{PrepaymentID}\",\n \"PUT /Prepayments/{PrepaymentID}/Allocations\",\n \"DELETE /Prepayments/{PrepaymentID}/Allocations/{AllocationID}\",\n \"GET /Prepayments/{PrepaymentID}/History\",\n \"PUT /Prepayments/{PrepaymentID}/History\",\n \"GET /PurchaseOrders\",\n \"POST /PurchaseOrders\",\n \"PUT /PurchaseOrders\",\n \"GET /PurchaseOrders/{PurchaseOrderID}\",\n \"POST /PurchaseOrders/{PurchaseOrderID}\",\n \"GET /PurchaseOrders/{PurchaseOrderID}/History\",\n \"PUT /PurchaseOrders/{PurchaseOrderID}/History\",\n \"GET /PurchaseOrders/{PurchaseOrderID}/pdf\",\n \"GET /PurchaseOrders/{PurchaseOrderNumber}\",\n \"GET /Quotes\",\n \"POST /Quotes\",\n \"PUT /Quotes\",\n \"GET /Quotes/{QuoteID}\",\n \"POST /Quotes/{QuoteID}\",\n \"GET /Quotes/{QuoteID}/History\",\n \"PUT /Quotes/{QuoteID}/History\",\n \"GET /Quotes/{QuoteID}/pdf\",\n \"GET /Receipts\",\n \"PUT /Receipts\",\n \"GET /Receipts/{ReceiptID}\",\n \"POST /Receipts/{ReceiptID}\",\n \"GET /Receipts/{ReceiptID}/History\",\n \"PUT /Receipts/{ReceiptID}/History\",\n \"GET /RepeatingInvoices\",\n \"POST /RepeatingInvoices\",\n \"PUT /RepeatingInvoices\",\n \"GET /RepeatingInvoices/{RepeatingInvoiceID}\",\n \"POST /RepeatingInvoices/{RepeatingInvoiceID}\",\n \"GET /RepeatingInvoices/{RepeatingInvoiceID}/History\",\n \"PUT /RepeatingInvoices/{RepeatingInvoiceID}/History\",\n ],\n },\n {\n name: \"accounting.transactions.read\",\n rules: [\n \"GET /BankTransactions\",\n \"GET /BankTransactions/{BankTransactionID}\",\n \"GET /BankTransactions/{BankTransactionID}/History\",\n \"GET /BankTransfers\",\n \"GET /BankTransfers/{BankTransferID}\",\n \"GET /BankTransfers/{BankTransferID}/History\",\n \"GET /BatchPayments\",\n \"GET /BatchPayments/{BatchPaymentID}\",\n \"GET /BatchPayments/{BatchPaymentID}/History\",\n \"GET /CreditNotes\",\n \"GET /CreditNotes/{CreditNoteID}\",\n \"GET /CreditNotes/{CreditNoteID}/History\",\n \"GET /CreditNotes/{CreditNoteID}/pdf\",\n \"GET /ExpenseClaims\",\n \"GET /ExpenseClaims/{ExpenseClaimID}\",\n \"GET /ExpenseClaims/{ExpenseClaimID}/History\",\n \"GET /Invoices\",\n \"GET /Invoices/{InvoiceID}\",\n \"GET /Invoices/{InvoiceID}/History\",\n \"GET /Invoices/{InvoiceID}/OnlineInvoice\",\n \"GET /Invoices/{InvoiceID}/pdf\",\n \"GET /LinkedTransactions\",\n \"GET /LinkedTransactions/{LinkedTransactionID}\",\n \"GET /ManualJournals\",\n \"GET /ManualJournals/{ManualJournalID}\",\n \"GET /ManualJournals/{ManualJournalID}/History\",\n \"GET /Overpayments\",\n \"GET /Overpayments/{OverpaymentID}\",\n \"GET /Overpayments/{OverpaymentID}/History\",\n \"GET /Payments\",\n \"GET /Payments/{PaymentID}\",\n \"GET /Payments/{PaymentID}/History\",\n \"GET /Prepayments\",\n \"GET /Prepayments/{PrepaymentID}\",\n \"GET /Prepayments/{PrepaymentID}/History\",\n \"GET /PurchaseOrders\",\n \"GET /PurchaseOrders/{PurchaseOrderID}\",\n \"GET /PurchaseOrders/{PurchaseOrderID}/History\",\n \"GET /PurchaseOrders/{PurchaseOrderID}/pdf\",\n \"GET /PurchaseOrders/{PurchaseOrderNumber}\",\n \"GET /Quotes\",\n \"GET /Quotes/{QuoteID}\",\n \"GET /Quotes/{QuoteID}/History\",\n \"GET /Quotes/{QuoteID}/pdf\",\n \"GET /Receipts\",\n \"GET /Receipts/{ReceiptID}\",\n \"GET /Receipts/{ReceiptID}/History\",\n \"GET /RepeatingInvoices\",\n \"GET /RepeatingInvoices/{RepeatingInvoiceID}\",\n \"GET /RepeatingInvoices/{RepeatingInvoiceID}/History\",\n ],\n },\n {\n name: \"paymentservices\",\n rules: [\n \"GET /BrandingThemes/{BrandingThemeID}/PaymentServices\",\n \"POST /BrandingThemes/{BrandingThemeID}/PaymentServices\",\n \"GET /PaymentServices\",\n \"PUT /PaymentServices\",\n ],\n },\n ],\n },\n {\n base: \"https://api.xero.com/appstore/2.0\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.XERO_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"marketplace.billing\",\n rules: [\n \"GET /subscriptions/{subscriptionId}\",\n \"POST /subscriptions/{subscriptionId}/items/{subscriptionItemId}/usage-records\",\n \"PUT /subscriptions/{subscriptionId}/items/{subscriptionItemId}/usage-records/{usageRecordId}\",\n \"GET /subscriptions/{subscriptionId}/usage-records\",\n ],\n },\n ],\n },\n {\n base: \"https://api.xero.com/assets.xro/1.0\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.XERO_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"assets\",\n rules: [\n \"GET /AssetTypes\",\n \"POST /AssetTypes\",\n \"GET /Assets\",\n \"POST /Assets\",\n \"GET /Assets/{id}\",\n \"GET /Settings\",\n ],\n },\n {\n name: \"assets.read\",\n rules: [\n \"GET /AssetTypes\",\n \"GET /Assets\",\n \"GET /Assets/{id}\",\n \"GET /Settings\",\n ],\n },\n ],\n },\n {\n base: \"https://api.xero.com/bankfeeds.xro/1.0\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.XERO_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"bankfeeds\",\n rules: [\n \"GET /FeedConnections\",\n \"POST /FeedConnections\",\n \"POST /FeedConnections/DeleteRequests\",\n \"GET /FeedConnections/{id}\",\n \"GET /Statements\",\n \"POST /Statements\",\n \"GET /Statements/{statementId}\",\n ],\n },\n ],\n },\n {\n base: \"https://api.xero.com/files.xro/1.0\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.XERO_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"files\",\n rules: [\n \"GET /Associations/Count\",\n \"GET /Associations/{ObjectId}\",\n \"GET /Files\",\n \"POST /Files\",\n \"GET /Files/{FileId}\",\n \"PUT /Files/{FileId}\",\n \"DELETE /Files/{FileId}\",\n \"GET /Files/{FileId}/Associations\",\n \"POST /Files/{FileId}/Associations\",\n \"DELETE /Files/{FileId}/Associations/{ObjectId}\",\n \"GET /Files/{FileId}/Content\",\n \"POST /Files/{FolderId}\",\n \"GET /Folders\",\n \"POST /Folders\",\n \"GET /Folders/{FolderId}\",\n \"PUT /Folders/{FolderId}\",\n \"DELETE /Folders/{FolderId}\",\n \"GET /Inbox\",\n ],\n },\n {\n name: \"files.read\",\n rules: [\n \"GET /Associations/Count\",\n \"GET /Associations/{ObjectId}\",\n \"GET /Files\",\n \"GET /Files/{FileId}\",\n \"GET /Files/{FileId}/Associations\",\n \"GET /Files/{FileId}/Content\",\n \"GET /Folders\",\n \"GET /Folders/{FolderId}\",\n \"GET /Inbox\",\n ],\n },\n ],\n },\n {\n base: \"https://api.xero.com/finance.xro/1.0\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.XERO_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"finance.bankstatementsplus.read\",\n rules: [\n \"GET /BankStatementsPlus/statements\",\n ],\n },\n {\n name: \"finance.cashvalidation.read\",\n rules: [\n \"GET /CashValidation\",\n ],\n },\n {\n name: \"finance.statements.read\",\n rules: [\n \"GET /FinancialStatements/BalanceSheet\",\n \"GET /FinancialStatements/Cashflow\",\n \"GET /FinancialStatements/ProfitAndLoss\",\n \"GET /FinancialStatements/TrialBalance\",\n \"GET /FinancialStatements/contacts/expense\",\n \"GET /FinancialStatements/contacts/revenue\",\n ],\n },\n ],\n },\n {\n base: \"https://api.xero.com/payroll.xro/1.0\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.XERO_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"payroll.employees\",\n rules: [\n \"GET /Employees\",\n \"POST /Employees\",\n \"GET /Employees/{EmployeeID}\",\n \"POST /Employees/{EmployeeID}\",\n \"GET /LeaveApplications\",\n \"POST /LeaveApplications\",\n \"GET /LeaveApplications/v2\",\n \"GET /LeaveApplications/{LeaveApplicationID}\",\n \"POST /LeaveApplications/{LeaveApplicationID}\",\n \"POST /LeaveApplications/{LeaveApplicationID}/approve\",\n \"POST /LeaveApplications/{LeaveApplicationID}/reject\",\n ],\n },\n {\n name: \"payroll.employees.read\",\n rules: [\n \"GET /Employees\",\n \"GET /Employees/{EmployeeID}\",\n \"GET /LeaveApplications\",\n \"GET /LeaveApplications/v2\",\n \"GET /LeaveApplications/{LeaveApplicationID}\",\n ],\n },\n {\n name: \"payroll.payruns\",\n rules: [\n \"GET /PayRuns\",\n \"POST /PayRuns\",\n \"GET /PayRuns/{PayRunID}\",\n \"POST /PayRuns/{PayRunID}\",\n ],\n },\n {\n name: \"payroll.payruns.read\",\n rules: [\n \"GET /PayRuns\",\n \"GET /PayRuns/{PayRunID}\",\n ],\n },\n {\n name: \"payroll.payslip\",\n rules: [\n \"GET /Payslip/{PayslipID}\",\n \"POST /Payslip/{PayslipID}\",\n ],\n },\n {\n name: \"payroll.payslip.read\",\n rules: [\n \"GET /Payslip/{PayslipID}\",\n ],\n },\n {\n name: \"payroll.settings\",\n rules: [\n \"GET /PayItems\",\n \"POST /PayItems\",\n \"GET /PayrollCalendars\",\n \"POST /PayrollCalendars\",\n \"GET /PayrollCalendars/{PayrollCalendarID}\",\n \"GET /Settings\",\n \"GET /SuperfundProducts\",\n \"GET /Superfunds\",\n \"POST /Superfunds\",\n \"GET /Superfunds/{SuperFundID}\",\n \"POST /Superfunds/{SuperFundID}\",\n ],\n },\n {\n name: \"payroll.settings.read\",\n rules: [\n \"GET /PayItems\",\n \"GET /PayrollCalendars\",\n \"GET /PayrollCalendars/{PayrollCalendarID}\",\n \"GET /Settings\",\n \"GET /SuperfundProducts\",\n \"GET /Superfunds\",\n \"GET /Superfunds/{SuperFundID}\",\n ],\n },\n {\n name: \"payroll.timesheets\",\n rules: [\n \"GET /Timesheets\",\n \"POST /Timesheets\",\n \"GET /Timesheets/{TimesheetID}\",\n \"POST /Timesheets/{TimesheetID}\",\n ],\n },\n {\n name: \"payroll.timesheets.read\",\n rules: [\n \"GET /Timesheets\",\n \"GET /Timesheets/{TimesheetID}\",\n ],\n },\n ],\n },\n {\n base: \"https://api.xero.com/payroll.xro/2.0\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.XERO_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"payroll.employees\",\n rules: [\n \"GET /Employees\",\n \"POST /Employees\",\n \"GET /Employees/{EmployeeID}\",\n \"PUT /Employees/{EmployeeID}\",\n \"POST /Employees/{EmployeeID}/Employment\",\n \"GET /Employees/{EmployeeID}/Leave\",\n \"POST /Employees/{EmployeeID}/Leave\",\n \"GET /Employees/{EmployeeID}/Leave/{LeaveID}\",\n \"PUT /Employees/{EmployeeID}/Leave/{LeaveID}\",\n \"DELETE /Employees/{EmployeeID}/Leave/{LeaveID}\",\n \"GET /Employees/{EmployeeID}/LeaveBalances\",\n \"GET /Employees/{EmployeeID}/LeavePeriods\",\n \"POST /Employees/{EmployeeID}/LeaveSetup\",\n \"GET /Employees/{EmployeeID}/LeaveTypes\",\n \"POST /Employees/{EmployeeID}/LeaveTypes\",\n \"GET /Employees/{EmployeeID}/OpeningBalances\",\n \"POST /Employees/{EmployeeID}/OpeningBalances\",\n \"POST /Employees/{EmployeeID}/PayTemplateEarnings\",\n \"GET /Employees/{EmployeeID}/PayTemplates\",\n \"POST /Employees/{EmployeeID}/PayTemplates/Earnings\",\n \"PUT /Employees/{EmployeeID}/PayTemplates/Earnings/{PayTemplateEarningID}\",\n \"DELETE /Employees/{EmployeeID}/PayTemplates/Earnings/{PayTemplateEarningID}\",\n \"POST /Employees/{EmployeeID}/PayTemplates/earnings\",\n \"PUT /Employees/{EmployeeID}/PayTemplates/earnings/{PayTemplateEarningID}\",\n \"DELETE /Employees/{EmployeeID}/PayTemplates/earnings/{PayTemplateEarningID}\",\n \"GET /Employees/{EmployeeID}/PaymentMethods\",\n \"POST /Employees/{EmployeeID}/PaymentMethods\",\n \"GET /Employees/{EmployeeID}/SalaryAndWages\",\n \"POST /Employees/{EmployeeID}/SalaryAndWages\",\n \"GET /Employees/{EmployeeID}/SalaryAndWages/{SalaryAndWagesID}\",\n \"PUT /Employees/{EmployeeID}/SalaryAndWages/{SalaryAndWagesID}\",\n \"DELETE /Employees/{EmployeeID}/SalaryAndWages/{SalaryAndWagesID}\",\n \"GET /Employees/{EmployeeID}/StatutoryLeaveBalance\",\n \"GET /Employees/{EmployeeID}/Tax\",\n \"POST /Employees/{EmployeeID}/Tax\",\n \"GET /Employees/{EmployeeID}/Working-Patterns\",\n \"POST /Employees/{EmployeeID}/Working-Patterns\",\n \"GET /Employees/{EmployeeID}/Working-Patterns/{EmployeeWorkingPatternID}\",\n \"DELETE /Employees/{EmployeeID}/Working-Patterns/{EmployeeWorkingPatternID}\",\n \"POST /Employees/{EmployeeID}/paytemplateearnings\",\n \"GET /Employees/{EmployeeID}/ukopeningbalances\",\n \"POST /Employees/{EmployeeID}/ukopeningbalances\",\n \"PUT /Employees/{EmployeeID}/ukopeningbalances\",\n ],\n },\n {\n name: \"payroll.employees.read\",\n rules: [\n \"GET /Employees\",\n \"GET /Employees/{EmployeeID}\",\n \"GET /Employees/{EmployeeID}/Leave\",\n \"GET /Employees/{EmployeeID}/Leave/{LeaveID}\",\n \"GET /Employees/{EmployeeID}/LeaveBalances\",\n \"GET /Employees/{EmployeeID}/LeavePeriods\",\n \"GET /Employees/{EmployeeID}/LeaveTypes\",\n \"GET /Employees/{EmployeeID}/OpeningBalances\",\n \"GET /Employees/{EmployeeID}/PayTemplates\",\n \"GET /Employees/{EmployeeID}/PaymentMethods\",\n \"GET /Employees/{EmployeeID}/SalaryAndWages\",\n \"GET /Employees/{EmployeeID}/SalaryAndWages/{SalaryAndWagesID}\",\n \"GET /Employees/{EmployeeID}/StatutoryLeaveBalance\",\n \"GET /Employees/{EmployeeID}/Tax\",\n \"GET /Employees/{EmployeeID}/Working-Patterns\",\n \"GET /Employees/{EmployeeID}/Working-Patterns/{EmployeeWorkingPatternID}\",\n \"GET /Employees/{EmployeeID}/ukopeningbalances\",\n ],\n },\n {\n name: \"payroll.payruns\",\n rules: [\n \"GET /PayRuns\",\n \"POST /PayRuns\",\n \"GET /PayRuns/{PayRunID}\",\n ],\n },\n {\n name: \"payroll.payruns.read\",\n rules: [\n \"GET /PayRuns\",\n \"GET /PayRuns/{PayRunID}\",\n ],\n },\n {\n name: \"payroll.payslip\",\n rules: [\n \"GET /PaySlips\",\n \"GET /PaySlips/{PaySlipID}\",\n \"PUT /PaySlips/{PaySlipID}\",\n \"GET /Payslips\",\n \"GET /Payslips/{PayslipID}\",\n ],\n },\n {\n name: \"payroll.payslip.read\",\n rules: [\n \"GET /PaySlips\",\n \"GET /PaySlips/{PaySlipID}\",\n \"GET /Payslips\",\n \"GET /Payslips/{PayslipID}\",\n ],\n },\n {\n name: \"payroll.settings\",\n rules: [\n \"GET /Benefits\",\n \"POST /Benefits\",\n \"GET /Benefits/{id}\",\n \"GET /Deductions\",\n \"POST /Deductions\",\n \"GET /Deductions/{deductionId}\",\n \"GET /EarningsOrders\",\n \"GET /EarningsOrders/{id}\",\n \"GET /EarningsRates\",\n \"POST /EarningsRates\",\n \"GET /EarningsRates/{EarningsRateID}\",\n \"GET /LeaveTypes\",\n \"POST /LeaveTypes\",\n \"GET /LeaveTypes/{LeaveTypeID}\",\n \"GET /PayRunCalendars\",\n \"POST /PayRunCalendars\",\n \"GET /PayRunCalendars/{PayRunCalendarID}\",\n \"GET /PayRunCalendars/{PayrollCalendarID}\",\n \"GET /Reimbursements\",\n \"POST /Reimbursements\",\n \"GET /Reimbursements/{ReimbursementID}\",\n \"GET /Settings\",\n \"GET /Settings/TrackingCategories\",\n \"GET /Settings/trackingCategories\",\n \"GET /StatutoryDeductions\",\n \"GET /StatutoryDeductions/{id}\",\n \"POST /StatutoryLeaves/Sick\",\n \"GET /StatutoryLeaves/Sick/{StatutorySickLeaveID}\",\n \"GET /StatutoryLeaves/Summary/{EmployeeID}\",\n \"GET /Superannuations\",\n \"POST /Superannuations\",\n \"GET /Superannuations/{SuperannuationID}\",\n ],\n },\n {\n name: \"payroll.settings.read\",\n rules: [\n \"GET /Benefits\",\n \"GET /Benefits/{id}\",\n \"GET /Deductions\",\n \"GET /Deductions/{deductionId}\",\n \"GET /EarningsOrders\",\n \"GET /EarningsOrders/{id}\",\n \"GET /EarningsRates\",\n \"GET /EarningsRates/{EarningsRateID}\",\n \"GET /LeaveTypes\",\n \"GET /LeaveTypes/{LeaveTypeID}\",\n \"GET /PayRunCalendars\",\n \"GET /PayRunCalendars/{PayRunCalendarID}\",\n \"GET /PayRunCalendars/{PayrollCalendarID}\",\n \"GET /Reimbursements\",\n \"GET /Reimbursements/{ReimbursementID}\",\n \"GET /Settings\",\n \"GET /Settings/TrackingCategories\",\n \"GET /Settings/trackingCategories\",\n \"GET /StatutoryDeductions\",\n \"GET /StatutoryDeductions/{id}\",\n \"GET /StatutoryLeaves/Sick/{StatutorySickLeaveID}\",\n \"GET /StatutoryLeaves/Summary/{EmployeeID}\",\n \"GET /Superannuations\",\n \"GET /Superannuations/{SuperannuationID}\",\n ],\n },\n {\n name: \"payroll.timesheets\",\n rules: [\n \"GET /Timesheets\",\n \"POST /Timesheets\",\n \"GET /Timesheets/{TimesheetID}\",\n \"DELETE /Timesheets/{TimesheetID}\",\n \"POST /Timesheets/{TimesheetID}/Approve\",\n \"POST /Timesheets/{TimesheetID}/Lines\",\n \"PUT /Timesheets/{TimesheetID}/Lines/{TimesheetLineID}\",\n \"DELETE /Timesheets/{TimesheetID}/Lines/{TimesheetLineID}\",\n \"POST /Timesheets/{TimesheetID}/RevertToDraft\",\n ],\n },\n {\n name: \"payroll.timesheets.read\",\n rules: [\n \"GET /Timesheets\",\n \"GET /Timesheets/{TimesheetID}\",\n ],\n },\n ],\n },\n {\n base: \"https://api.xero.com/projects.xro/2.0\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.XERO_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"projects\",\n rules: [\n \"GET /Projects\",\n \"POST /Projects\",\n \"GET /Projects/{projectId}\",\n \"PUT /Projects/{projectId}\",\n \"PATCH /Projects/{projectId}\",\n \"GET /Projects/{projectId}/Tasks\",\n \"POST /Projects/{projectId}/Tasks\",\n \"GET /Projects/{projectId}/Tasks/{taskId}\",\n \"PUT /Projects/{projectId}/Tasks/{taskId}\",\n \"DELETE /Projects/{projectId}/Tasks/{taskId}\",\n \"GET /Projects/{projectId}/Time\",\n \"POST /Projects/{projectId}/Time\",\n \"GET /Projects/{projectId}/Time/{timeEntryId}\",\n \"PUT /Projects/{projectId}/Time/{timeEntryId}\",\n \"DELETE /Projects/{projectId}/Time/{timeEntryId}\",\n \"GET /ProjectsUsers\",\n ],\n },\n {\n name: \"projects.read\",\n rules: [\n \"GET /Projects\",\n \"GET /Projects/{projectId}\",\n \"GET /Projects/{projectId}/Tasks\",\n \"GET /Projects/{projectId}/Tasks/{taskId}\",\n \"GET /Projects/{projectId}/Time\",\n \"GET /Projects/{projectId}/Time/{timeEntryId}\",\n \"GET /ProjectsUsers\",\n ],\n },\n ],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Google's Discovery API.\n// Source: https://www.googleapis.com/discovery/v1/apis/youtube/v3/rest\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:youtube\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const youtubeFirewall = {\n name: \"youtube\",\n description: \"YouTube Data API\",\n placeholders: {\n YOUTUBE_TOKEN: \"AIzaSyBCoffeeSafeLocalCoffeeSafeLocalCo\",\n },\n apis: [\n {\n base: \"https://youtube.googleapis.com/youtube\",\n auth: {\n headers: {\n \"X-Goog-Api-Key\": \"${{ secrets.YOUTUBE_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"youtube\",\n description: \"Manage your YouTube account\",\n rules: [\n \"POST /v3/abuseReports\",\n \"GET /v3/activities\",\n \"POST /v3/channelBanners/insert\",\n \"GET /v3/channelSections\",\n \"POST /v3/channelSections\",\n \"PUT /v3/channelSections\",\n \"DELETE /v3/channelSections\",\n \"GET /v3/channels\",\n \"PUT /v3/channels\",\n \"GET /v3/i18nLanguages\",\n \"GET /v3/i18nRegions\",\n \"GET /v3/liveBroadcasts\",\n \"POST /v3/liveBroadcasts\",\n \"PUT /v3/liveBroadcasts\",\n \"DELETE /v3/liveBroadcasts\",\n \"POST /v3/liveBroadcasts/bind\",\n \"POST /v3/liveBroadcasts/cuepoint\",\n \"POST /v3/liveBroadcasts/transition\",\n \"POST /v3/liveChat/bans\",\n \"DELETE /v3/liveChat/bans\",\n \"GET /v3/liveChat/messages\",\n \"POST /v3/liveChat/messages\",\n \"DELETE /v3/liveChat/messages\",\n \"GET /v3/liveChat/messages/stream\",\n \"POST /v3/liveChat/messages/transition\",\n \"GET /v3/liveChat/moderators\",\n \"POST /v3/liveChat/moderators\",\n \"DELETE /v3/liveChat/moderators\",\n \"GET /v3/liveStreams\",\n \"POST /v3/liveStreams\",\n \"PUT /v3/liveStreams\",\n \"DELETE /v3/liveStreams\",\n \"GET /v3/playlistImages\",\n \"POST /v3/playlistImages\",\n \"PUT /v3/playlistImages\",\n \"DELETE /v3/playlistImages\",\n \"GET /v3/playlistItems\",\n \"POST /v3/playlistItems\",\n \"PUT /v3/playlistItems\",\n \"DELETE /v3/playlistItems\",\n \"GET /v3/playlists\",\n \"POST /v3/playlists\",\n \"PUT /v3/playlists\",\n \"DELETE /v3/playlists\",\n \"GET /v3/search\",\n \"GET /v3/subscriptions\",\n \"POST /v3/subscriptions\",\n \"DELETE /v3/subscriptions\",\n \"GET /v3/superChatEvents\",\n \"POST /v3/thumbnails/set\",\n \"GET /v3/videoAbuseReportReasons\",\n \"GET /v3/videoCategories\",\n \"GET /v3/videoTrainability\",\n \"GET /v3/videos\",\n \"POST /v3/videos\",\n \"PUT /v3/videos\",\n \"DELETE /v3/videos\",\n \"GET /v3/videos/getRating\",\n \"POST /v3/videos/rate\",\n \"POST /v3/videos/reportAbuse\",\n \"POST /v3/watermarks/set\",\n \"POST /v3/watermarks/unset\",\n ],\n },\n {\n name: \"youtube.channel-memberships.creator\",\n description: \"See a list of your current active channel members, their current level, and when they became a member\",\n rules: [\n \"GET /v3/members\",\n \"GET /v3/membershipsLevels\",\n ],\n },\n {\n name: \"youtube.force-ssl\",\n description: \"See, edit, and permanently delete your YouTube videos, ratings, comments and captions\",\n rules: [\n \"POST /v3/abuseReports\",\n \"GET /v3/activities\",\n \"GET /v3/captions\",\n \"POST /v3/captions\",\n \"PUT /v3/captions\",\n \"DELETE /v3/captions\",\n \"GET /v3/captions/{id}\",\n \"POST /v3/channelBanners/insert\",\n \"GET /v3/channelSections\",\n \"POST /v3/channelSections\",\n \"PUT /v3/channelSections\",\n \"DELETE /v3/channelSections\",\n \"GET /v3/channels\",\n \"PUT /v3/channels\",\n \"GET /v3/commentThreads\",\n \"POST /v3/commentThreads\",\n \"GET /v3/comments\",\n \"POST /v3/comments\",\n \"PUT /v3/comments\",\n \"DELETE /v3/comments\",\n \"POST /v3/comments/markAsSpam\",\n \"POST /v3/comments/setModerationStatus\",\n \"GET /v3/i18nLanguages\",\n \"GET /v3/i18nRegions\",\n \"GET /v3/liveBroadcasts\",\n \"POST /v3/liveBroadcasts\",\n \"PUT /v3/liveBroadcasts\",\n \"DELETE /v3/liveBroadcasts\",\n \"POST /v3/liveBroadcasts/bind\",\n \"POST /v3/liveBroadcasts/cuepoint\",\n \"POST /v3/liveBroadcasts/transition\",\n \"POST /v3/liveChat/bans\",\n \"DELETE /v3/liveChat/bans\",\n \"GET /v3/liveChat/messages\",\n \"POST /v3/liveChat/messages\",\n \"DELETE /v3/liveChat/messages\",\n \"GET /v3/liveChat/messages/stream\",\n \"POST /v3/liveChat/messages/transition\",\n \"GET /v3/liveChat/moderators\",\n \"POST /v3/liveChat/moderators\",\n \"DELETE /v3/liveChat/moderators\",\n \"GET /v3/liveStreams\",\n \"POST /v3/liveStreams\",\n \"PUT /v3/liveStreams\",\n \"DELETE /v3/liveStreams\",\n \"GET /v3/playlistImages\",\n \"POST /v3/playlistImages\",\n \"PUT /v3/playlistImages\",\n \"DELETE /v3/playlistImages\",\n \"GET /v3/playlistItems\",\n \"POST /v3/playlistItems\",\n \"PUT /v3/playlistItems\",\n \"DELETE /v3/playlistItems\",\n \"GET /v3/playlists\",\n \"POST /v3/playlists\",\n \"PUT /v3/playlists\",\n \"DELETE /v3/playlists\",\n \"GET /v3/search\",\n \"GET /v3/subscriptions\",\n \"POST /v3/subscriptions\",\n \"DELETE /v3/subscriptions\",\n \"GET /v3/superChatEvents\",\n \"POST /v3/thumbnails/set\",\n \"GET /v3/videoAbuseReportReasons\",\n \"GET /v3/videoCategories\",\n \"GET /v3/videoTrainability\",\n \"GET /v3/videos\",\n \"POST /v3/videos\",\n \"PUT /v3/videos\",\n \"DELETE /v3/videos\",\n \"GET /v3/videos/getRating\",\n \"POST /v3/videos/rate\",\n \"POST /v3/videos/reportAbuse\",\n \"POST /v3/watermarks/set\",\n \"POST /v3/watermarks/unset\",\n ],\n },\n {\n name: \"youtube.readonly\",\n description: \"View your YouTube account\",\n rules: [\n \"GET /v3/activities\",\n \"GET /v3/channelSections\",\n \"GET /v3/channels\",\n \"GET /v3/i18nLanguages\",\n \"GET /v3/i18nRegions\",\n \"GET /v3/liveBroadcasts\",\n \"GET /v3/liveChat/messages\",\n \"GET /v3/liveChat/messages/stream\",\n \"GET /v3/liveChat/moderators\",\n \"GET /v3/liveStreams\",\n \"GET /v3/playlistImages\",\n \"GET /v3/playlistItems\",\n \"GET /v3/playlists\",\n \"GET /v3/search\",\n \"GET /v3/subscriptions\",\n \"GET /v3/superChatEvents\",\n \"POST /v3/tests\",\n \"GET /v3/videoAbuseReportReasons\",\n \"GET /v3/videoCategories\",\n \"GET /v3/videoTrainability\",\n \"GET /v3/videos\",\n ],\n },\n {\n name: \"youtube.upload\",\n description: \"Manage your YouTube videos\",\n rules: [\n \"POST /v3/channelBanners/insert\",\n \"POST /v3/thumbnails/set\",\n \"POST /v3/videos\",\n \"POST /v3/watermarks/set\",\n ],\n },\n {\n name: \"youtubepartner\",\n description: \"View and manage your assets and associated content on YouTube\",\n rules: [\n \"GET /v3/captions\",\n \"POST /v3/captions\",\n \"PUT /v3/captions\",\n \"DELETE /v3/captions\",\n \"GET /v3/captions/{id}\",\n \"GET /v3/channelSections\",\n \"POST /v3/channelSections\",\n \"PUT /v3/channelSections\",\n \"DELETE /v3/channelSections\",\n \"GET /v3/channels\",\n \"PUT /v3/channels\",\n \"GET /v3/i18nLanguages\",\n \"GET /v3/i18nRegions\",\n \"POST /v3/liveBroadcasts/cuepoint\",\n \"GET /v3/playlistImages\",\n \"POST /v3/playlistImages\",\n \"PUT /v3/playlistImages\",\n \"DELETE /v3/playlistImages\",\n \"GET /v3/playlistItems\",\n \"POST /v3/playlistItems\",\n \"PUT /v3/playlistItems\",\n \"DELETE /v3/playlistItems\",\n \"GET /v3/playlists\",\n \"POST /v3/playlists\",\n \"PUT /v3/playlists\",\n \"DELETE /v3/playlists\",\n \"GET /v3/search\",\n \"GET /v3/subscriptions\",\n \"POST /v3/subscriptions\",\n \"DELETE /v3/subscriptions\",\n \"POST /v3/thumbnails/set\",\n \"GET /v3/videoCategories\",\n \"GET /v3/videoTrainability\",\n \"GET /v3/videos\",\n \"POST /v3/videos\",\n \"PUT /v3/videos\",\n \"DELETE /v3/videos\",\n \"GET /v3/videos/getRating\",\n \"POST /v3/videos/rate\",\n \"POST /v3/videos/reportAbuse\",\n \"POST /v3/watermarks/set\",\n \"POST /v3/watermarks/unset\",\n ],\n },\n {\n name: \"youtubepartner-channel-audit\",\n description: \"View private information of your YouTube channel relevant during the audit process with a YouTube partner\",\n rules: [\n \"GET /v3/channels\",\n ],\n },\n ],\n },\n {\n base: \"https://youtube.googleapis.com/upload/youtube\",\n auth: {\n headers: {\n \"X-Goog-Api-Key\": \"${{ secrets.YOUTUBE_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"youtube\",\n description: \"Manage your YouTube account\",\n rules: [\n \"POST /v3/channelBanners/insert\",\n \"POST /v3/playlistImages\",\n \"PUT /v3/playlistImages\",\n \"POST /v3/thumbnails/set\",\n \"POST /v3/videos\",\n \"POST /v3/watermarks/set\",\n ],\n },\n {\n name: \"youtube.force-ssl\",\n description: \"See, edit, and permanently delete your YouTube videos, ratings, comments and captions\",\n rules: [\n \"POST /v3/captions\",\n \"PUT /v3/captions\",\n \"POST /v3/channelBanners/insert\",\n \"POST /v3/playlistImages\",\n \"PUT /v3/playlistImages\",\n \"POST /v3/thumbnails/set\",\n \"POST /v3/videos\",\n \"POST /v3/watermarks/set\",\n ],\n },\n {\n name: \"youtube.upload\",\n description: \"Manage your YouTube videos\",\n rules: [\n \"POST /v3/channelBanners/insert\",\n \"POST /v3/thumbnails/set\",\n \"POST /v3/videos\",\n \"POST /v3/watermarks/set\",\n ],\n },\n {\n name: \"youtubepartner\",\n description: \"View and manage your assets and associated content on YouTube\",\n rules: [\n \"POST /v3/captions\",\n \"PUT /v3/captions\",\n \"POST /v3/playlistImages\",\n \"PUT /v3/playlistImages\",\n \"POST /v3/thumbnails/set\",\n \"POST /v3/videos\",\n \"POST /v3/watermarks/set\",\n ],\n },\n ],\n },\n {\n base: \"https://youtube.googleapis.com/resumable/upload/youtube\",\n auth: {\n headers: {\n \"X-Goog-Api-Key\": \"${{ secrets.YOUTUBE_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"youtube\",\n description: \"Manage your YouTube account\",\n rules: [\n \"POST /v3/channelBanners/insert\",\n \"POST /v3/playlistImages\",\n \"PUT /v3/playlistImages\",\n \"POST /v3/thumbnails/set\",\n \"POST /v3/videos\",\n \"POST /v3/watermarks/set\",\n ],\n },\n {\n name: \"youtube.force-ssl\",\n description: \"See, edit, and permanently delete your YouTube videos, ratings, comments and captions\",\n rules: [\n \"POST /v3/captions\",\n \"PUT /v3/captions\",\n \"POST /v3/channelBanners/insert\",\n \"POST /v3/playlistImages\",\n \"PUT /v3/playlistImages\",\n \"POST /v3/thumbnails/set\",\n \"POST /v3/videos\",\n \"POST /v3/watermarks/set\",\n ],\n },\n {\n name: \"youtube.upload\",\n description: \"Manage your YouTube videos\",\n rules: [\n \"POST /v3/channelBanners/insert\",\n \"POST /v3/thumbnails/set\",\n \"POST /v3/videos\",\n \"POST /v3/watermarks/set\",\n ],\n },\n {\n name: \"youtubepartner\",\n description: \"View and manage your assets and associated content on YouTube\",\n rules: [\n \"POST /v3/captions\",\n \"PUT /v3/captions\",\n \"POST /v3/playlistImages\",\n \"PUT /v3/playlistImages\",\n \"POST /v3/thumbnails/set\",\n \"POST /v3/videos\",\n \"POST /v3/watermarks/set\",\n ],\n },\n ],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Zapier AI Actions API docs.\n// Source: https://actions.zapier.com/docs/guides/getting-started/intro\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:zapier\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const zapierFirewall = {\n name: \"zapier\",\n description: \"Zapier AI Actions API\",\n placeholders: {\n ZAPIER_TOKEN: \"sk-ak-CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLo\",\n },\n apis: [\n {\n base: \"https://actions.zapier.com\",\n auth: {\n headers: {\n \"x-api-key\": \"${{ secrets.ZAPIER_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from ZapSign API docs.\n// Source: https://docs.zapsign.com.br/english/authentication/autenticacao\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:zapsign\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const zapsignFirewall = {\n name: \"zapsign\",\n description: \"ZapSign API\",\n placeholders: {\n ZAPSIGN_TOKEN: \"c0ffee5a-fe10-ca1c-0ffe-e5afe10c\",\n },\n apis: [\n {\n base: \"https://api.zapsign.com.br\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.ZAPSIGN_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Zendesk API docs.\n// Source: https://developer.zendesk.com/api-reference/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:zendesk\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const zendeskFirewall = {\n name: \"zendesk\",\n description: \"Zendesk Support API\",\n placeholders: {\n ZENDESK_API_TOKEN: \"zkTkn_CoffeeSafeLocalCoffeeSafeLocalCoffeeSa\",\n },\n apis: [\n {\n base: \"https://${{ vars.ZENDESK_SUBDOMAIN }}.zendesk.com\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.ZENDESK_API_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Zep API docs.\n// Source: https://help.getzep.com/api\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:zep\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const zepFirewall = {\n name: \"zep\",\n description: \"Zep\",\n placeholders: {\n ZEP_TOKEN: \"z_CoffeeSafeLocalCoffeeSafeLocalCo\",\n },\n apis: [\n {\n base: \"https://api.getzep.com\",\n auth: {\n headers: {\n Authorization: \"Api-Key ${{ secrets.ZEP_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from ZeptoMail API docs.\n// Source: https://www.zoho.com/zeptomail/help/api/email-sending.html\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:zeptomail\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const zeptomailFirewall = {\n name: \"zeptomail\",\n description: \"ZeptoMail API\",\n placeholders: {\n ZEPTOMAIL_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCo\",\n },\n apis: [\n {\n base: \"https://api.zeptomail.com\",\n auth: {\n headers: {\n Authorization: \"Zoho-enczapikey ${{ secrets.ZEPTOMAIL_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","// Auto-generated from Zoom API docs.\n// Source: https://developers.zoom.us/docs/api/\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:zoom\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const zoomFirewall = {\n name: \"zoom\",\n description: \"Zoom API\",\n placeholders: {\n ZOOM_TOKEN: \"CoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocalCoffeeSafeLocal\",\n },\n apis: [\n {\n base: \"https://api.zoom.us\",\n auth: {\n headers: {\n Authorization: \"Bearer ${{ secrets.ZOOM_TOKEN }}\",\n },\n },\n permissions: [],\n },\n ],\n} as const satisfies FirewallConfig;\n","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 { 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 before delegating with \"zero run\"`,\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","import { Command } from \"commander\";\nimport { listCommand } from \"./list\";\nimport { searchCommand } from \"./search\";\nimport { statusCommand } from \"./status\";\n\nexport const zeroConnectorCommand = new Command()\n .name(\"connector\")\n .description(\"Check third-party service connections (GitHub, Slack, etc.)\")\n .addCommand(listCommand)\n .addCommand(searchCommand)\n .addCommand(statusCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n CONNECTOR_TYPES,\n type ConnectorType,\n} from \"@vm0/connectors/connectors\";\nimport { isFeatureEnabled } from \"@vm0/core/feature-switch\";\nimport { listZeroConnectors } from \"../../../lib/api\";\nimport { getActiveOrg } from \"../../../lib/api/config\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { resolveAgentContext } from \"./agent-context\";\nimport { padEndAnsi, renderConnectedAsCell, stripAnsi } from \"./connected-as\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all connectors and their status\")\n .option(\"--agent <id>\", \"Show per-agent authorization column\")\n .action(\n withErrorHandler(async (options: { agent?: string }) => {\n const [{ connectors }, orgId, agentCtx] = await Promise.all([\n listZeroConnectors(),\n getActiveOrg(),\n resolveAgentContext(options.agent),\n ]);\n const connectedMap = new Map(\n connectors.map((c) => {\n return [c.type, c];\n }),\n );\n\n const allTypesRaw = Object.keys(CONNECTOR_TYPES) as ConnectorType[];\n const allTypes: ConnectorType[] = [];\n for (const type of allTypesRaw) {\n const config = CONNECTOR_TYPES[type];\n const flag = config.featureFlag;\n const hasApiToken = \"api-token\" in config.authMethods;\n if (\n flag &&\n !isFeatureEnabled(flag, { orgId }) &&\n (!hasApiToken || config.strictFeatureFlag)\n ) {\n continue;\n }\n allTypes.push(type);\n }\n\n const typeWidth = Math.max(\n 4,\n ...allTypes.map((t) => {\n return t.length;\n }),\n );\n\n const connectedAsHeader = \"CONNECTED AS\";\n const connectedCells = allTypes.map((type) => {\n return renderConnectedAsCell(connectedMap.get(type));\n });\n const connectedAsWidth = Math.max(\n connectedAsHeader.length,\n ...connectedCells.map((c) => {\n return stripAnsi(c).length;\n }),\n );\n\n const authorizedHeader = agentCtx\n ? `AUTHORIZED FOR ${agentCtx.displayName}`\n : null;\n\n // Print header\n const headerParts = [\n \"TYPE\".padEnd(typeWidth),\n connectedAsHeader.padEnd(connectedAsWidth),\n ];\n if (authorizedHeader) headerParts.push(authorizedHeader);\n console.log(chalk.dim(headerParts.join(\" \")));\n\n // Print rows\n for (let i = 0; i < allTypes.length; i++) {\n const type = allTypes[i]!;\n const connectedCell = padEndAnsi(connectedCells[i]!, connectedAsWidth);\n const parts = [type.padEnd(typeWidth), connectedCell];\n if (agentCtx) {\n parts.push(\n agentCtx.authorizedTypes.has(type)\n ? chalk.green(\"✓\")\n : chalk.dim(\"-\"),\n );\n }\n console.log(parts.join(\" \"));\n }\n }),\n );\n","/**\n * Feature switch system\n *\n * Provides centralized feature flag management with user-identity based overrides.\n * User IDs are stored as FNV-1a hashes to avoid exposing plain-text identifiers in source code.\n *\n * NOT AN AUTHORIZATION BOUNDARY. Any authenticated user can self-enable any\n * switch via `POST /api/zero/feature-switches` — overrides are read by\n * `isFeatureEnabled` before the registry. For money-granting, credential,\n * or privilege-escalation endpoints, gate with a hard identity check\n * (e.g. `isStaffOrg()` from `./staff-org`) instead of this system.\n */\n\nimport { FeatureSwitchKey } from \"./feature-switch-key\";\nimport { STAFF_ORG_ID_HASHES, fnv1a } from \"./identity-hash\";\n\nexport interface FeatureSwitch {\n readonly maintainer: string;\n readonly description?: string;\n readonly enabled: boolean;\n readonly enabledUserHashes?: readonly string[];\n readonly enabledEmailHashes?: readonly string[];\n readonly enabledOrgIdHashes?: readonly string[];\n}\n\nexport interface FeatureSwitchContext {\n readonly userId?: string;\n readonly email?: string;\n readonly orgId?: string;\n readonly overrides?: Partial<Record<FeatureSwitchKey, boolean>>;\n}\n\n/**\n * Registry of all feature switches\n */\nconst FEATURE_SWITCHES: Record<FeatureSwitchKey, FeatureSwitch> = {\n [FeatureSwitchKey.Dummy]: {\n maintainer: \"ethan@vm0.ai\",\n description: \"Test-only feature switch for flag system validation\",\n enabled: true,\n },\n [FeatureSwitchKey.AhrefsConnector]: {\n maintainer: \"ethan@vm0.ai\",\n description: \"Enable the Ahrefs SEO connector\",\n enabled: false,\n },\n [FeatureSwitchKey.CanvaConnector]: {\n maintainer: \"ethan@vm0.ai\",\n description: \"Enable the Canva design connector\",\n enabled: false,\n },\n [FeatureSwitchKey.ComputerConnector]: {\n maintainer: \"ethan@vm0.ai\",\n description: \"Enable the Computer connector for local service tunneling\",\n enabled: false,\n },\n [FeatureSwitchKey.DeelConnector]: {\n maintainer: \"ethan@vm0.ai\",\n description: \"Enable the Deel HR connector\",\n enabled: false,\n },\n [FeatureSwitchKey.DocuSignConnector]: {\n maintainer: \"ethan@vm0.ai\",\n description: \"Enable the DocuSign e-signature connector\",\n enabled: false,\n },\n [FeatureSwitchKey.DropboxConnector]: {\n maintainer: \"ethan@vm0.ai\",\n description: \"Enable the Dropbox file storage connector\",\n enabled: false,\n },\n [FeatureSwitchKey.FigmaConnector]: {\n maintainer: \"ethan@vm0.ai\",\n description: \"Enable the Figma design connector\",\n enabled: false,\n },\n [FeatureSwitchKey.MercuryConnector]: {\n maintainer: \"ethan@vm0.ai\",\n description: \"Enable the Mercury banking connector\",\n enabled: false,\n },\n [FeatureSwitchKey.NeonConnector]: {\n maintainer: \"ethan@vm0.ai\",\n description: \"Enable the Neon serverless Postgres connector\",\n enabled: false,\n },\n [FeatureSwitchKey.GarminConnectConnector]: {\n maintainer: \"ethan@vm0.ai\",\n description: \"Enable the Garmin Connect wellness connector\",\n enabled: false,\n },\n [FeatureSwitchKey.RedditConnector]: {\n maintainer: \"ethan@vm0.ai\",\n description: \"Enable the Reddit connector integration\",\n enabled: false,\n },\n [FeatureSwitchKey.SupabaseConnector]: {\n maintainer: \"ethan@vm0.ai\",\n description: \"Enable the Supabase database connector integration\",\n enabled: false,\n },\n [FeatureSwitchKey.CloseConnector]: {\n maintainer: \"ethan@vm0.ai\",\n description: \"Enable the Close CRM connector\",\n enabled: false,\n },\n [FeatureSwitchKey.WebflowConnector]: {\n maintainer: \"ethan@vm0.ai\",\n description: \"Enable the Webflow site management connector\",\n enabled: false,\n },\n [FeatureSwitchKey.OutlookMailConnector]: {\n maintainer: \"ethan@vm0.ai\",\n description: \"Enable the Outlook Mail connector\",\n enabled: false,\n },\n [FeatureSwitchKey.OutlookCalendarConnector]: {\n maintainer: \"ethan@vm0.ai\",\n description: \"Enable the Outlook Calendar connector\",\n enabled: false,\n },\n [FeatureSwitchKey.MetaAdsConnector]: {\n maintainer: \"ethan@vm0.ai\",\n description: \"Enable the Meta Ads Manager connector\",\n enabled: false,\n },\n [FeatureSwitchKey.StripeConnector]: {\n maintainer: \"ethan@vm0.ai\",\n description: \"Enable the Stripe payment connector integration\",\n enabled: false,\n },\n [FeatureSwitchKey.PosthogConnector]: {\n maintainer: \"ethan@vm0.ai\",\n description: \"Enable the PostHog analytics connector\",\n enabled: false,\n },\n [FeatureSwitchKey.PwaOfflineCache]: {\n maintainer: \"ethan@vm0.ai\",\n description:\n \"Enable PWA offline caching (static asset cache-first, offline fallback page, and service worker updateViaCache: none)\",\n enabled: false,\n },\n [FeatureSwitchKey.MailchimpConnector]: {\n maintainer: \"ethan@vm0.ai\",\n description: \"Enable the Mailchimp email marketing connector\",\n enabled: false,\n },\n [FeatureSwitchKey.ResendConnector]: {\n maintainer: \"ethan@vm0.ai\",\n description: \"Enable the Resend email service connector\",\n enabled: false,\n },\n [FeatureSwitchKey.SpotifyConnector]: {\n maintainer: \"ethan@vm0.ai\",\n description: \"Enable the Spotify connector integration\",\n enabled: false,\n },\n [FeatureSwitchKey.DataExport]: {\n maintainer: \"ethan@vm0.ai\",\n description: \"Show the data export option in account menu\",\n enabled: false,\n },\n [FeatureSwitchKey.UsageAnalytics]: {\n maintainer: \"ethan@vm0.ai\",\n description:\n \"Show admin-only daily credits chart and per-run records on Usage page\",\n enabled: false,\n },\n [FeatureSwitchKey.ZeroDebug]: {\n maintainer: \"ethan@vm0.ai\",\n description:\n \"Reveal activity debug surfaces, activity log navigation, appended system prompts, and Debug preferences\",\n enabled: false,\n },\n [FeatureSwitchKey.ComputerUse]: {\n maintainer: \"ethan@vm0.ai\",\n description: \"Enable remote desktop host registration\",\n enabled: false,\n },\n [FeatureSwitchKey.Lab]: {\n maintainer: \"ethan@vm0.ai\",\n description: \"Show the Lab page for toggling experimental features\",\n enabled: false,\n },\n [FeatureSwitchKey.AuditLink]: {\n maintainer: \"ethan@vm0.ai\",\n description: \"Show audit log links in integration replies\",\n enabled: false,\n },\n [FeatureSwitchKey.AudioInput]: {\n maintainer: \"lancy@vm0.ai\",\n description:\n \"Enable voice input (microphone + STT) in chat — gates the mic button and the /api/zero/voice-io/stt route\",\n enabled: true,\n },\n [FeatureSwitchKey.AudioOutput]: {\n maintainer: \"lancy@vm0.ai\",\n description:\n \"Enable audio output in chat (TTS read-aloud + auto-read) — gates the volume/read buttons and the /api/zero/voice-io/tts route\",\n enabled: false,\n },\n [FeatureSwitchKey.AutoSkill]: {\n maintainer: \"lancy@vm0.ai\",\n description: \"Enable automatic skill creation in agent prompts\",\n enabled: false,\n },\n [FeatureSwitchKey.TestOauthConnector]: {\n maintainer: \"liangyou@vm0.ai\",\n description:\n \"Enable the test-oauth connector, a synthetic OAuth 2.0 provider used only for automated tests. Off in prod.\",\n enabled: false,\n },\n [FeatureSwitchKey.ChatHeaderNewButton]: {\n maintainer: \"ethan@vm0.ai\",\n description:\n \"Replace the Invite people button in the agent chat page header with a New button that creates a new chat thread\",\n enabled: false,\n },\n [FeatureSwitchKey.ChatArtifactsDrawer]: {\n maintainer: \"ethan@vm0.ai\",\n description:\n \"Show an artifacts button in the chat header that opens a drawer listing uploaded files grouped by run\",\n enabled: true,\n },\n [FeatureSwitchKey.ChatManualHistory]: {\n maintainer: \"linghan@vm0.ai\",\n description:\n \"Enable manual chat history loading from a Load history button at the top of a thread. When off, chat stays in the latest-50/no-history mode.\",\n enabled: false,\n },\n [FeatureSwitchKey.ChatMessageStartButton]: {\n maintainer: \"linghan@vm0.ai\",\n description:\n \"Show an icon button in assistant message group actions that scrolls back to the start of that message group.\",\n enabled: false,\n },\n [FeatureSwitchKey.FreshdeskConnector]: {\n maintainer: \"ethan@vm0.ai\",\n description: \"Enable the Freshdesk helpdesk connector\",\n enabled: false,\n },\n [FeatureSwitchKey.StabilityAiConnector]: {\n maintainer: \"ethan@vm0.ai\",\n description: \"Enable the Stability AI image generation connector\",\n enabled: false,\n },\n [FeatureSwitchKey.ZoomConnector]: {\n maintainer: \"ethan@vm0.ai\",\n description:\n \"Enable the Zoom connector (OAuth 2.0) for meetings, past participants, and cloud recordings access\",\n enabled: false,\n },\n\n [FeatureSwitchKey.ApiKeys]: {\n maintainer: \"ethan@vm0.ai\",\n description:\n \"Gate the custom /settings/api-keys UI for issuing personal access tokens used by the /api/v1 public surface. When disabled, the settings page redirects to / and the sidebar menu item is hidden. The backend /api/v1 verification does NOT consult this flag — previously issued PATs continue to work.\",\n enabled: false,\n },\n [FeatureSwitchKey.ConnectorCategories]: {\n maintainer: \"ethan@vm0.ai\",\n description:\n \"Show category sections and the hover-reveal outline menu on the Connectors settings page. \" +\n \"Staff-only during rollout.\",\n enabled: false,\n enabledOrgIdHashes: STAFF_ORG_ID_HASHES,\n },\n [FeatureSwitchKey.PlatformConnectors]: {\n maintainer: \"liangyou@vm0.ai\",\n description:\n \"Gate the entire platform-managed connector UI (Enable button and \" +\n \"POST /api/zero/platform-connectors/:type). When off, only api-token \" +\n \"and OAuth methods surface in connectors list/search, and the enable \" +\n \"endpoint 404s. Staff-only during rollout.\",\n enabled: false,\n enabledOrgIdHashes: STAFF_ORG_ID_HASHES,\n },\n [FeatureSwitchKey.TelegramIntegration]: {\n maintainer: \"ethan@vm0.ai\",\n description:\n \"Show the Telegram integration settings UI. The backend Telegram routes do not consult this frontend rollout flag.\",\n enabled: true,\n },\n [FeatureSwitchKey.Trinity]: {\n maintainer: \"ethan@vm0.ai\",\n description:\n \"Embed the voice-chat mic toggle + voice-mode layout into the agent chat page. Gates the mic launcher, composer swap, and status/subtitle/task-card UI.\",\n enabled: false,\n },\n [FeatureSwitchKey.ZapierConnector]: {\n maintainer: \"ethan@vm0.ai\",\n description:\n \"Enable the Zapier connector. When disabled, Zapier is hidden from the connectors list and cannot be connected.\",\n enabled: false,\n },\n};\n\ninterface ResolvedHashes {\n readonly userHash?: string;\n readonly emailHash?: string;\n readonly orgIdHash?: string;\n}\n\nfunction evaluateSwitch(fs: FeatureSwitch, hashes: ResolvedHashes): boolean {\n if (fs.enabled) return true;\n if (hashes.userHash && fs.enabledUserHashes?.includes(hashes.userHash))\n return true;\n if (hashes.emailHash && fs.enabledEmailHashes?.includes(hashes.emailHash))\n return true;\n if (hashes.orgIdHash && fs.enabledOrgIdHashes?.includes(hashes.orgIdHash))\n return true;\n return false;\n}\n\n/**\n * Evaluate all feature switches at once for the given context.\n *\n * Computes identity hashes once and checks all switches synchronously.\n */\nexport function getAllFeatureStates(\n ctx?: FeatureSwitchContext,\n): Record<FeatureSwitchKey, boolean> {\n const switches = Object.values(FEATURE_SWITCHES);\n const hashes: ResolvedHashes = {\n userHash:\n ctx?.userId &&\n switches.some((s) => {\n return s.enabledUserHashes?.length;\n })\n ? fnv1a(ctx.userId)\n : undefined,\n emailHash:\n ctx?.email &&\n switches.some((s) => {\n return s.enabledEmailHashes?.length;\n })\n ? fnv1a(ctx.email.toLowerCase())\n : undefined,\n orgIdHash:\n ctx?.orgId &&\n switches.some((s) => {\n return s.enabledOrgIdHashes?.length;\n })\n ? fnv1a(ctx.orgId)\n : undefined,\n };\n\n const result = {} as Record<FeatureSwitchKey, boolean>;\n for (const key of Object.values(FeatureSwitchKey)) {\n result[key] = evaluateSwitch(FEATURE_SWITCHES[key], hashes);\n }\n\n if (ctx?.overrides) {\n for (const [key, value] of Object.entries(ctx.overrides)) {\n if (key in FEATURE_SWITCHES && value !== undefined) {\n result[key as FeatureSwitchKey] = value;\n }\n }\n }\n\n return result;\n}\n\n/**\n * Return the description for every feature switch.\n */\nexport function getFeatureSwitchDescriptions(): Record<\n FeatureSwitchKey,\n string | undefined\n> {\n const result = {} as Record<FeatureSwitchKey, string | undefined>;\n for (const key of Object.values(FeatureSwitchKey)) {\n result[key] = FEATURE_SWITCHES[key].description;\n }\n return result;\n}\n\n/**\n * Check if a feature is enabled for the given context.\n */\nexport function isFeatureEnabled(\n key: FeatureSwitchKey,\n ctx?: FeatureSwitchContext,\n): boolean {\n const override = ctx?.overrides?.[key];\n if (override !== undefined) {\n return override;\n }\n\n const featureSwitch = FEATURE_SWITCHES[key];\n if (featureSwitch.enabled) {\n return true;\n }\n if (ctx?.userId && featureSwitch.enabledUserHashes?.length) {\n if (featureSwitch.enabledUserHashes.includes(fnv1a(ctx.userId)))\n return true;\n }\n if (ctx?.email && featureSwitch.enabledEmailHashes?.length) {\n if (\n featureSwitch.enabledEmailHashes.includes(fnv1a(ctx.email.toLowerCase()))\n )\n return true;\n }\n if (ctx?.orgId && featureSwitch.enabledOrgIdHashes?.length) {\n if (featureSwitch.enabledOrgIdHashes.includes(fnv1a(ctx.orgId)))\n return true;\n }\n return false;\n}\n","export { FeatureSwitchKey } from \"@vm0/connectors/feature-switch-key\";\n","/**\n * Identity hashing — FNV-1a 32-bit hash used to reference users / orgs / emails\n * without embedding plain-text identifiers in source code.\n *\n * Shared between the feature-switch registry (UI rollout targeting) and\n * `staff-org.ts` (authorization primitive). The hash is deterministic and\n * synchronous; no crypto API needed.\n */\n\nexport function fnv1a(input: string): string {\n let h = 2166136261 >>> 0;\n for (let i = 0; i < input.length; i++) {\n h ^= input.charCodeAt(i);\n h = Math.imul(h, 16777619) >>> 0;\n }\n return h.toString(16).padStart(8, \"0\");\n}\n\n/**\n * Hashes of internal staff org IDs.\n *\n * This list is the source of truth for `isStaffOrg()` — adding an entry here\n * grants that org access to every endpoint that uses `isStaffOrg` as an\n * authorization check. Treat changes with the same care as role grants.\n */\nexport const STAFF_ORG_ID_HASHES: readonly string[] = [\n \"afce210e\", // org_3ANttyrbWYJk6JKRSTRLEsbsDLe\n];\n","import { getZeroAgent, getZeroAgentUserConnectors } from \"../../../lib/api\";\n\ninterface AgentContext {\n agentId: string;\n displayName: string;\n authorizedTypes: Set<string>;\n}\n\nexport async function resolveAgentContext(\n flagAgentId: string | undefined,\n): Promise<AgentContext | null> {\n const agentId = flagAgentId ?? process.env.ZERO_AGENT_ID;\n if (!agentId) return null;\n\n const [agent, enabledTypes] = await Promise.all([\n getZeroAgent(agentId),\n getZeroAgentUserConnectors(agentId),\n ]);\n\n return {\n agentId: agent.agentId,\n displayName: agent.displayName ?? agent.agentId,\n authorizedTypes: new Set(enabledTypes),\n };\n}\n","import chalk from \"chalk\";\nimport { hasRequiredScopes } from \"@vm0/connectors/connector-utils\";\nimport type { ConnectorListResponse } from \"@vm0/api-contracts/contracts/connector-schemas\";\n\ntype Connector = ConnectorListResponse[\"connectors\"][number];\n\nfunction renderIdentity(connector: Connector): string {\n if (connector.externalUsername) return `@${connector.externalUsername}`;\n if (connector.externalEmail) return connector.externalEmail;\n return \"-\";\n}\n\nexport function renderConnectedAsCell(\n connector: Connector | undefined,\n): string {\n if (!connector) return chalk.dim(\"(not connected)\");\n const identity = renderIdentity(connector);\n if (connector.needsReconnect) {\n return chalk.yellow(`${identity} (reconnect needed)`);\n }\n const scopeMismatch =\n connector.authMethod === \"oauth\" &&\n !hasRequiredScopes(connector.type, connector.oauthScopes);\n if (scopeMismatch) {\n return chalk.yellow(`${identity} (permissions update available)`);\n }\n return identity;\n}\n\nconst ESC = \"\\u001b\";\nconst ANSI_PATTERN = new RegExp(`${ESC}\\\\[[0-9;]*m`, \"g\");\n\nexport function stripAnsi(s: string): string {\n return s.replace(ANSI_PATTERN, \"\");\n}\n\nexport function padEndAnsi(s: string, width: number): string {\n const visible = stripAnsi(s).length;\n return s + \" \".repeat(Math.max(0, width - visible));\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n CONNECTOR_TYPES,\n type ConnectorType,\n} from \"@vm0/connectors/connectors\";\nimport { searchConnectors } from \"@vm0/connectors/connector-utils\";\nimport { isFeatureEnabled } from \"@vm0/core/feature-switch\";\nimport { listZeroConnectors } from \"../../../lib/api\";\nimport { getActiveOrg } from \"../../../lib/api/config\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { resolveAgentContext } from \"./agent-context\";\nimport { padEndAnsi, renderConnectedAsCell, stripAnsi } from \"./connected-as\";\n\nconst DEFAULT_LIMIT = 5;\nconst EXACT_MATCH_THRESHOLD = 80;\n\nfunction parseLimit(raw: string): number {\n const n = Number.parseInt(raw, 10);\n if (!Number.isFinite(n) || n <= 0) {\n throw new Error(`--limit must be a positive integer, got \"${raw}\".`);\n }\n return n;\n}\n\nexport const searchCommand = new Command()\n .name(\"search\")\n .description(\"Search connectors by type, label, env var, secret, or tag\")\n .argument(\"<keyword>\", \"Search keyword (case-insensitive)\")\n .option(\"--agent <id>\", \"Show per-agent authorization column\")\n .option(\n \"--limit <n>\",\n `Maximum number of results to display (default ${DEFAULT_LIMIT})`,\n parseLimit,\n DEFAULT_LIMIT,\n )\n .action(\n withErrorHandler(\n async (keyword: string, options: { agent?: string; limit: number }) => {\n const trimmed = keyword.trim();\n if (!trimmed) {\n throw new Error(\"Keyword cannot be empty.\");\n }\n\n const [{ connectors }, orgId, agentCtx] = await Promise.all([\n listZeroConnectors(),\n getActiveOrg(),\n resolveAgentContext(options.agent),\n ]);\n const connectedMap = new Map(\n connectors.map((c) => {\n return [c.type, c];\n }),\n );\n\n const isTypeAvailable = (type: ConnectorType): boolean => {\n const config = CONNECTOR_TYPES[type];\n const flag = config.featureFlag;\n const hasApiToken = \"api-token\" in config.authMethods;\n return (\n !flag ||\n isFeatureEnabled(flag, { orgId }) ||\n (hasApiToken && !config.strictFeatureFlag)\n );\n };\n\n const { results, total } = searchConnectors(\n trimmed,\n options.limit,\n isTypeAvailable,\n );\n\n if (results.length === 0) {\n console.log(\"No matches found.\");\n return;\n }\n\n const topScore = results[0]!.score;\n if (topScore < EXACT_MATCH_THRESHOLD) {\n console.log(\"No exact match. Showing closest:\");\n }\n if (total > options.limit) {\n console.log(`Too many results (top ${options.limit} of ${total}):`);\n }\n\n const typeHeader = \"TYPE\";\n const connectedAsHeader = \"CONNECTED AS\";\n\n const connectedCells = results.map((r) => {\n return renderConnectedAsCell(connectedMap.get(r.type));\n });\n\n const typeWidth = Math.max(\n typeHeader.length,\n ...results.map((r) => {\n return r.type.length;\n }),\n );\n const connectedAsWidth = Math.max(\n connectedAsHeader.length,\n ...connectedCells.map((c) => {\n return stripAnsi(c).length;\n }),\n );\n\n const headerParts = [\n typeHeader.padEnd(typeWidth),\n connectedAsHeader.padEnd(connectedAsWidth),\n ];\n if (agentCtx) {\n headerParts.push(`AUTHORIZED FOR ${agentCtx.displayName}`);\n }\n console.log(chalk.dim(headerParts.join(\" \")));\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i]!;\n const parts = [\n result.type.padEnd(typeWidth),\n padEndAnsi(connectedCells[i]!, connectedAsWidth),\n ];\n if (agentCtx) {\n parts.push(\n agentCtx.authorizedTypes.has(result.type)\n ? chalk.green(\"✓\")\n : chalk.dim(\"-\"),\n );\n }\n console.log(parts.join(\" \"));\n }\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n CONNECTOR_TYPES,\n connectorTypeSchema,\n} from \"@vm0/connectors/connectors\";\nimport {\n getScopeDiff,\n hasRequiredScopes,\n} from \"@vm0/connectors/connector-utils\";\nimport { getZeroConnector } from \"../../../lib/api\";\nimport { formatDateTime } from \"../../../lib/domain/schedule-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { resolveAgentContext } from \"./agent-context\";\nimport { getPlatformOrigin } from \"../doctor/platform-url\";\n\nconst LABEL_WIDTH = 16;\n\nexport const statusCommand = new Command()\n .name(\"status\")\n .description(\"Show detailed status of a connector\")\n .argument(\"<type>\", \"Connector type (e.g., github)\")\n .option(\"--agent <id>\", \"Show authorization state for the given agent\")\n .action(\n withErrorHandler(async (type: string, options: { agent?: string }) => {\n const parseResult = connectorTypeSchema.safeParse(type);\n if (!parseResult.success) {\n const available = Object.keys(CONNECTOR_TYPES).join(\", \");\n throw new Error(`Unknown connector type: ${type}`, {\n cause: new Error(`Available connectors: ${available}`),\n });\n }\n\n const [connector, agentCtx] = await Promise.all([\n getZeroConnector(parseResult.data),\n resolveAgentContext(options.agent),\n ]);\n\n console.log(`Connector: ${chalk.cyan(type)}`);\n console.log();\n\n if (connector) {\n console.log(\n `${\"Status:\".padEnd(LABEL_WIDTH)}${chalk.green(\"connected\")}`,\n );\n console.log(\n `${\"Account:\".padEnd(LABEL_WIDTH)}@${connector.externalUsername}`,\n );\n console.log(\n `${\"Auth Method:\".padEnd(LABEL_WIDTH)}${connector.authMethod}`,\n );\n\n if (connector.oauthScopes && connector.oauthScopes.length > 0) {\n console.log(\n `${\"OAuth Scopes:\".padEnd(LABEL_WIDTH)}${connector.oauthScopes.join(\", \")}`,\n );\n }\n\n if (\n connector.authMethod === \"oauth\" &&\n !hasRequiredScopes(parseResult.data, connector.oauthScopes)\n ) {\n const diff = getScopeDiff(parseResult.data, connector.oauthScopes);\n console.log(\n `${\"Permissions:\".padEnd(LABEL_WIDTH)}${chalk.yellow(\"update available\")}`,\n );\n if (diff.addedScopes.length > 0) {\n console.log(\n `${\" Added:\".padEnd(LABEL_WIDTH)}${diff.addedScopes.join(\", \")}`,\n );\n }\n if (diff.removedScopes.length > 0) {\n console.log(\n `${\" Removed:\".padEnd(LABEL_WIDTH)}${diff.removedScopes.join(\", \")}`,\n );\n }\n }\n\n console.log(\n `${\"Connected:\".padEnd(LABEL_WIDTH)}${formatDateTime(connector.createdAt)}`,\n );\n\n if (connector.updatedAt !== connector.createdAt) {\n console.log(\n `${\"Last Updated:\".padEnd(LABEL_WIDTH)}${formatDateTime(connector.updatedAt)}`,\n );\n }\n } else {\n console.log(\n `${\"Status:\".padEnd(LABEL_WIDTH)}${chalk.dim(\"not connected\")}`,\n );\n }\n\n if (agentCtx) {\n const authorized = agentCtx.authorizedTypes.has(parseResult.data);\n const isConnected = connector !== null;\n const agentLabel =\n agentCtx.displayName === agentCtx.agentId\n ? agentCtx.agentId\n : `${agentCtx.displayName} (${agentCtx.agentId})`;\n\n console.log();\n if (authorized) {\n console.log(\n `The ${parseResult.data} connector is authorized for agent ${agentLabel}.`,\n );\n } else if (!isConnected) {\n const origin = await getPlatformOrigin();\n const url = `${origin}/connectors/${parseResult.data}/connect?agentId=${agentCtx.agentId}`;\n console.log(\n `The ${parseResult.data} connector is not connected. Once connected, it will be authorized for agent ${agentLabel}.`,\n );\n console.log(`Connect it at: [Connect ${parseResult.data}](${url})`);\n } else {\n const origin = await getPlatformOrigin();\n const url = `${origin}/connectors/${parseResult.data}/authorize?agentId=${agentCtx.agentId}`;\n console.log(\n `The ${parseResult.data} connector is not authorized for agent ${agentLabel}.`,\n );\n console.log(\n `Authorize it at: [Authorize ${parseResult.data}](${url})`,\n );\n }\n }\n }),\n );\n","/**\n * Format a date string as relative time (e.g., \"in 2h\", \"3d ago\")\n */\nexport function formatRelativeTime(dateStr: string | null): string {\n if (!dateStr) return \"-\";\n\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = date.getTime() - now.getTime();\n const diffAbs = Math.abs(diffMs);\n\n const minutes = Math.floor(diffAbs / (1000 * 60));\n const hours = Math.floor(diffAbs / (1000 * 60 * 60));\n const days = Math.floor(diffAbs / (1000 * 60 * 60 * 24));\n\n const isPast = diffMs < 0;\n\n if (days > 0) {\n return isPast ? `${days}d ago` : `in ${days}d`;\n } else if (hours > 0) {\n return isPast ? `${hours}h ago` : `in ${hours}h`;\n } else if (minutes > 0) {\n return isPast ? `${minutes}m ago` : `in ${minutes}m`;\n } else {\n return isPast ? \"just now\" : \"soon\";\n }\n}\n\n/**\n * Format a date string with both absolute and relative time\n * e.g., \"2025-01-14 09:00 (in 2h)\"\n * Uses local timezone, but doesn't include timezone in output (shown separately)\n */\nexport function formatDateTime(dateStr: string | null): string {\n if (!dateStr) return \"-\";\n\n const date = new Date(dateStr);\n\n // Format: YYYY-MM-DD HH:MM (no seconds, no timezone - shown separately)\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n\n const formatted = `${year}-${month}-${day} ${hours}:${minutes}`;\n const relative = formatRelativeTime(dateStr);\n\n return `${formatted} (${relative})`;\n}\n\n/**\n * Frequency type for schedule wizard\n */\nexport type ScheduleFrequency =\n | \"daily\"\n | \"weekly\"\n | \"monthly\"\n | \"once\"\n | \"loop\";\n\n/**\n * Generate cron expression from user-friendly inputs\n * @param frequency - Schedule frequency type\n * @param time - Time in HH:MM format (24-hour)\n * @param day - Day of week (0-6, Sun=0) for weekly, or day of month (1-31) for monthly\n * @returns Cron expression string\n */\nexport function generateCronExpression(\n frequency: Exclude<ScheduleFrequency, \"once\" | \"loop\">,\n time: string,\n day?: number,\n): string {\n const [hourStr, minuteStr] = time.split(\":\");\n const hour = parseInt(hourStr ?? \"0\", 10);\n const minute = parseInt(minuteStr ?? \"0\", 10);\n\n switch (frequency) {\n case \"daily\":\n return `${minute} ${hour} * * *`;\n case \"weekly\":\n return `${minute} ${hour} * * ${day ?? 1}`;\n case \"monthly\":\n return `${minute} ${hour} ${day ?? 1} * *`;\n }\n}\n\n/**\n * Detect system timezone using Intl API\n * @returns IANA timezone identifier (e.g., \"America/New_York\")\n */\nexport function detectTimezone(): string {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n}\n\n/**\n * Validate time format (HH:MM, 24-hour)\n * @param time - Time string to validate\n * @returns true if valid, error message if invalid\n */\nexport function validateTimeFormat(time: string): boolean | string {\n const match = time.match(/^(\\d{1,2}):(\\d{2})$/);\n if (!match) {\n return \"Invalid format. Use HH:MM (e.g., 09:00)\";\n }\n\n const hour = parseInt(match[1]!, 10);\n const minute = parseInt(match[2]!, 10);\n\n if (hour < 0 || hour > 23) {\n return \"Hour must be 0-23\";\n }\n if (minute < 0 || minute > 59) {\n return \"Minute must be 0-59\";\n }\n if (minute % 5 !== 0) {\n return \"Minute must be a multiple of 5 (0, 5, 10, ..., 55)\";\n }\n\n return true;\n}\n\n/**\n * Validate date format (YYYY-MM-DD)\n * @param date - Date string to validate\n * @returns true if valid, error message if invalid\n */\nexport function validateDateFormat(date: string): boolean | string {\n const match = date.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n if (!match) {\n return \"Invalid format. Use YYYY-MM-DD (e.g., 2025-01-15)\";\n }\n\n const year = parseInt(match[1]!, 10);\n const month = parseInt(match[2]!, 10);\n const day = parseInt(match[3]!, 10);\n\n if (year < 2000 || year > 2100) {\n return \"Year must be between 2000 and 2100\";\n }\n if (month < 1 || month > 12) {\n return \"Month must be 1-12\";\n }\n if (day < 1 || day > 31) {\n return \"Day must be 1-31\";\n }\n\n // Validate the date is actually valid (e.g., not Feb 30)\n const testDate = new Date(year, month - 1, day);\n if (\n testDate.getFullYear() !== year ||\n testDate.getMonth() !== month - 1 ||\n testDate.getDate() !== day\n ) {\n return \"Invalid date\";\n }\n\n return true;\n}\n\n/**\n * Get tomorrow's date in local timezone as YYYY-MM-DD\n * @returns Date string in YYYY-MM-DD format\n */\nexport function getTomorrowDateLocal(): string {\n const tomorrow = new Date();\n tomorrow.setDate(tomorrow.getDate() + 1);\n const year = tomorrow.getFullYear();\n const month = String(tomorrow.getMonth() + 1).padStart(2, \"0\");\n const day = String(tomorrow.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n}\n\n/**\n * Get current time in local timezone as HH:MM\n * @returns Time string in HH:MM format\n */\nexport function getCurrentTimeLocal(): string {\n const now = new Date();\n const hours = String(now.getHours()).padStart(2, \"0\");\n const minutes = String(now.getMinutes()).padStart(2, \"0\");\n return `${hours}:${minutes}`;\n}\n\n/**\n * Convert a human-readable datetime string to ISO format\n * Supports formats: \"YYYY-MM-DD HH:MM\" or full ISO string\n * @param dateTimeStr - DateTime string (e.g., \"2025-01-15 14:30\")\n * @returns ISO format string (e.g., \"2025-01-15T14:30:00.000Z\")\n */\nexport function toISODateTime(dateTimeStr: string): string {\n // If already in ISO format, return as-is\n if (dateTimeStr.includes(\"T\") && dateTimeStr.endsWith(\"Z\")) {\n return dateTimeStr;\n }\n\n // Convert \"YYYY-MM-DD HH:MM\" to ISO\n const isoStr = dateTimeStr.replace(\" \", \"T\") + \":00\";\n const date = new Date(isoStr);\n return date.toISOString();\n}\n","import { getApiUrl } from \"../../../lib/api/config\";\n\n/**\n * Transform the API host to the platform (app) host.\n *\n * www.vm0.ai → app.vm0.ai\n * platform.vm0.ai → app.vm0.ai\n * tunnel-user-host-www.vm7.ai → tunnel-user-host-app.vm7.ai\n * custom.example.com → app.custom.example.com\n */\nexport function toPlatformUrl(apiUrl: string): URL {\n const parsed = new URL(apiUrl);\n const parts = parsed.hostname.split(\".\");\n if (parts[0]!.endsWith(\"-www\")) {\n parts[0] = parts[0]!.slice(0, -\"-www\".length) + \"-app\";\n } else if (parts[0] === \"www\" || parts[0] === \"platform\") {\n parts[0] = \"app\";\n } else if (parts[0] !== \"app\" && parts[0] !== \"localhost\") {\n parts.unshift(\"app\");\n }\n parsed.hostname = parts.join(\".\");\n return parsed;\n}\n\nexport async function getPlatformOrigin(): Promise<string> {\n const apiUrl = await getApiUrl();\n return toPlatformUrl(apiUrl).origin;\n}\n","import { Command } from \"commander\";\nimport { checkConnectorCommand } from \"./check-connector\";\nimport { permissionDenyCommand } from \"./permission-deny\";\nimport { permissionChangeCommand } from \"./permission-change\";\n\nexport const zeroDoctorCommand = new Command()\n .name(\"doctor\")\n .description(\"Diagnose runtime issues (connector health, permission denials)\")\n .addCommand(checkConnectorCommand)\n .addCommand(permissionDenyCommand)\n .addCommand(permissionChangeCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Check a connector? zero doctor check-connector --env-name GITHUB_TOKEN\n Check a URL? zero doctor check-connector --url https://api.github.com/repos/owner/repo\n Check with permission? zero doctor check-connector --env-name SLACK_TOKEN --check-permission chat:write\n Permission denied? zero doctor permission-deny github --method GET --path /repos/owner/repo\n Change a permission? zero doctor permission-change github --permission contents:read --enable\n\nNotes:\n - Use this when your task fails due to a missing environment variable or permission denial\n - The doctor will identify the issue and give the user a link to resolve it`,\n );\n","import { Command, Option } from \"commander\";\nimport {\n CONNECTOR_TYPES,\n type ConnectorType,\n} from \"@vm0/connectors/connectors\";\nimport {\n getConnectorEnvironmentMapping,\n getConnectorTypeForSecretName,\n} from \"@vm0/connectors/connector-utils\";\nimport { findMatchingPermissions } from \"@vm0/connectors/firewall-rule-matcher\";\nimport { extractSecretNamesFromApis } from \"@vm0/connectors/firewall-types\";\nimport {\n getConnectorFirewall,\n isFirewallConnectorType,\n} from \"@vm0/connectors/firewalls\";\nimport type {\n FirewallConfig,\n NetworkPolicies,\n} from \"@vm0/connectors/firewall-types\";\nimport type { RunContextResponse } from \"@vm0/api-contracts/contracts/zero-runs\";\nimport { getApiUrl } from \"../../../lib/api/config\";\nimport { getZeroConnector } from \"../../../lib/api/domains/zero-connectors\";\nimport { getZeroAgentUserConnectors } from \"../../../lib/api/domains/zero-agents\";\nimport { getZeroRunContext } from \"../../../lib/api/domains/zero-runs\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { toPlatformUrl } from \"./platform-url\";\nimport { decodeZeroTokenPayload } from \"../../../lib/api/zero-token\";\n\ninterface CheckConnectorOptions {\n envName?: string;\n url?: string;\n method: string;\n checkPermission?: string;\n}\n\ninterface DiagContext {\n envName: string;\n connectorType: string;\n label: string;\n platformOrigin: string;\n agentId: string | undefined;\n}\n\ninterface UrlLookupResult {\n connectorType: string;\n envName: string;\n matchedBase: string;\n relativePath: string;\n}\n\n/**\n * Reverse-lookup a full URL to find which connector handles it.\n * Iterates all connector firewall configs and checks if the URL\n * starts with any registered base URL (scheme + host + optional path prefix).\n */\nfunction resolveConnectorFromUrl(url: string): UrlLookupResult | null {\n const allTypes = Object.keys(CONNECTOR_TYPES) as ConnectorType[];\n\n // Normalize: strip trailing slash for comparison\n const normalized = url.endsWith(\"/\") ? url.slice(0, -1) : url;\n\n let bestMatch: {\n connectorType: string;\n base: string;\n config: FirewallConfig;\n } | null = null;\n\n for (const type of allTypes) {\n if (!isFirewallConnectorType(type)) continue;\n const config = getConnectorFirewall(type);\n for (const api of config.apis) {\n const base = api.base.endsWith(\"/\") ? api.base.slice(0, -1) : api.base;\n // URL must match the base exactly or have the base as a prefix followed by /\n if (normalized === base || normalized.startsWith(base + \"/\")) {\n // Pick the longest (most specific) base URL match\n if (!bestMatch || base.length > bestMatch.base.length) {\n bestMatch = { connectorType: type, base, config };\n }\n }\n }\n }\n\n if (!bestMatch) return null;\n\n // Derive the env var name from the connector's environment mapping\n const mapping = getConnectorEnvironmentMapping(\n bestMatch.connectorType as ConnectorType,\n );\n const envName = Object.keys(mapping)[0];\n if (!envName) return null;\n\n const relativePath =\n normalized === bestMatch.base\n ? \"/\"\n : normalized.slice(bestMatch.base.length);\n\n return {\n connectorType: bestMatch.connectorType,\n envName,\n matchedBase: bestMatch.base,\n relativePath,\n };\n}\n\nfunction checkEnvVariable(ctx: DiagContext): boolean {\n console.log(\"## Step 1: Sandbox environment variable\");\n console.log(\"\");\n const envPresent = Boolean(process.env[ctx.envName]);\n console.log(\n `Checking process.env.${ctx.envName}: ${envPresent ? \"present\" : \"not present\"}`,\n );\n if (envPresent) {\n console.log(\n \"A placeholder value is present in the sandbox environment. This value is not the real credential — it is a stand-in that gets replaced at the network boundary when requests are sent to registered base URLs.\",\n );\n } else {\n console.log(\n \"No value found for this environment variable. Note: credential replacement at the network boundary is independent of this variable — the proxy injects auth headers based on the destination URL, not the presence of this env var.\",\n );\n }\n console.log(\"\");\n return envPresent;\n}\n\nasync function checkConnectorStatus(ctx: DiagContext): Promise<{\n isConnected: boolean;\n isExpired: boolean;\n hasPermission: boolean;\n}> {\n console.log(\"## Step 2: Connector configuration\");\n console.log(\"\");\n console.log(\n \"A Connector holds the real credentials (OAuth tokens or API keys) for an external service. These credentials are never injected into the sandbox. Instead, when the sandbox sends an HTTP request to a base URL registered by the Connector, the network boundary intercepts the request and replaces the auth headers with real credentials. For this to work, three conditions must be met:\",\n );\n console.log(\"\");\n\n const [connector, enabledTypes] = await Promise.all([\n getZeroConnector(ctx.connectorType as ConnectorType),\n ctx.agentId\n ? getZeroAgentUserConnectors(ctx.agentId)\n : Promise.resolve(null),\n ]);\n\n const isConnected = connector !== null;\n const isExpired = connector?.needsReconnect === true;\n const hasPermission =\n enabledTypes !== null && enabledTypes.includes(ctx.connectorType);\n\n // 2a: Connector status — user must have configured the connector (OAuth or API token)\n console.log(\n `### 2a: Connector status (user must configure via OAuth login or API key)`,\n );\n console.log(\"\");\n if (!isConnected) {\n console.log(`The ${ctx.label} connector is not connected.`);\n if (!ctx.agentId) {\n // No agentId: can't scope the authorize page, so fall back to a plain\n // connect link. With agentId, 2b's Authorize link performs the initial\n // OAuth connect before granting permission — one link covers both steps.\n const connectUrl = `${ctx.platformOrigin}/connectors/${ctx.connectorType}/connect`;\n console.log(`Connect it at: [Connect ${ctx.label}](${connectUrl})`);\n }\n } else if (isExpired) {\n const url = `${ctx.platformOrigin}/connectors`;\n console.log(\n `The ${ctx.label} connector is connected but has expired and needs to be reconnected.`,\n );\n console.log(`Reconnect it at: [Reconnect ${ctx.label}](${url})`);\n } else {\n console.log(`The ${ctx.label} connector is connected and active.`);\n }\n console.log(\"\");\n\n // 2b: Agent authorization — user must authorize the agent to use this connector\n console.log(\n `### 2b: Agent authorization (user must authorize agent to use this connector)`,\n );\n console.log(\"\");\n if (!ctx.agentId) {\n console.log(\"ZERO_AGENT_ID is not set — cannot check agent authorization.\");\n } else if (isExpired) {\n // The /authorize page treats an expired connector as \"already connected\"\n // and won't re-trigger OAuth. Defer to 2a's Reconnect link in that case.\n console.log(\n `Skipped — agent authorization can only be checked once the ${ctx.label} connector is reconnected (see 2a).`,\n );\n } else if (hasPermission) {\n console.log(`The ${ctx.label} connector is authorized for this agent.`);\n } else {\n const url = `${ctx.platformOrigin}/connectors/${ctx.connectorType}/authorize?agentId=${ctx.agentId}`;\n console.log(\n isConnected\n ? `The ${ctx.label} connector is not authorized for this agent (${ctx.agentId}).`\n : `The ${ctx.label} connector needs to be connected and authorized for this agent (${ctx.agentId}).`,\n );\n console.log(`Authorize it at: [Authorize ${ctx.label}](${url})`);\n }\n console.log(\"\");\n\n return { isConnected, isExpired, hasPermission };\n}\n\nasync function checkConnectorDomains(\n ctx: DiagContext,\n): Promise<NetworkPolicies | null> {\n // 2c: Registered base URLs — connector defines which URL prefixes get credential replacement\n console.log(\n `### 2c: Registered base URLs (credential replacement only applies to URLs matching these prefixes)`,\n );\n console.log(\"\");\n\n const payload = decodeZeroTokenPayload();\n const runId = payload?.runId;\n\n if (!runId) {\n console.log(\n \"Cannot determine run ID from ZERO_TOKEN — skipping base URL check.\",\n );\n console.log(\"\");\n return null;\n }\n\n const runContext = await getZeroRunContext(runId);\n\n printConnectorDomains(ctx, runContext);\n console.log(\"\");\n return runContext.networkPolicies;\n}\n\nfunction printConnectorDomains(\n ctx: DiagContext,\n runContext: RunContextResponse,\n): void {\n const matchingEntry = runContext.firewalls.find((fw) => {\n return fw.name === ctx.connectorType;\n });\n\n if (!matchingEntry) {\n console.log(\n `No configuration found for the ${ctx.label} connector in this run.`,\n );\n console.log(\n \"This means no base URLs are registered for credential replacement for this connector.\",\n );\n return;\n }\n\n console.log(\n `The ${ctx.label} connector is configured for this run with the following base URLs:`,\n );\n for (const api of matchingEntry.apis) {\n console.log(` - ${api.base}`);\n }\n console.log(\"\");\n console.log(\n \"When the sandbox sends an HTTP request matching one of these URL prefixes, the network boundary intercepts the request and injects real credentials into the auth headers.\",\n );\n\n if (isFirewallConnectorType(ctx.connectorType)) {\n const firewallConfig = getConnectorFirewall(ctx.connectorType);\n const secretNames = extractSecretNamesFromApis(firewallConfig.apis);\n if (secretNames.length > 0) {\n console.log(`Credentials resolved from: ${secretNames.join(\", \")}`);\n }\n }\n}\n\nfunction checkPermissionPolicy(\n connectorType: string,\n label: string,\n permissionName: string,\n networkPolicies: NetworkPolicies | null,\n): void {\n console.log(\"## Step 3: Permission policy check\");\n console.log(\"\");\n console.log(\n `Checking permission: \"${permissionName}\" for the ${label} connector.`,\n );\n console.log(\n `Beyond credential replacement, the ${label} connector enforces permission policies on each API path. A request either matches a named permission or falls through to the unknown-endpoint policy.`,\n );\n console.log(\"\");\n\n if (!networkPolicies) {\n console.log(\n \"Network policies are not available for this run — cannot check permission status.\",\n );\n console.log(\"\");\n return;\n }\n\n const connectorPolicies = networkPolicies[connectorType];\n\n if (!connectorPolicies) {\n console.log(\n `No policy entry found for the ${label} connector in this run's network policies.`,\n );\n console.log(\n \"When a connector has no policy entry, all requests are fully permissive (allowed).\",\n );\n console.log(\"\");\n return;\n }\n\n console.log(`Permission policies for the ${label} connector:`);\n console.log(` allow list: [${connectorPolicies.allow.join(\", \")}]`);\n console.log(` deny list: [${connectorPolicies.deny.join(\", \")}]`);\n console.log(` unknown endpoint policy: ${connectorPolicies.unknownPolicy}`);\n console.log(\"\");\n\n const isInAllow = connectorPolicies.allow.includes(permissionName);\n const isInDeny = connectorPolicies.deny.includes(permissionName);\n\n if (isInAllow) {\n console.log(\n `Result: \"${permissionName}\" is in the allow list. Requests matching this permission are allowed.`,\n );\n } else if (isInDeny) {\n console.log(\n `Result: \"${permissionName}\" is in the deny list. Requests matching this permission are denied.`,\n );\n } else {\n console.log(\n `Result: \"${permissionName}\" is not in any permission list. It will be handled by the unknown endpoint policy: ${connectorPolicies.unknownPolicy}.`,\n );\n }\n console.log(\"\");\n}\n\n/**\n * When --url is provided, auto-detect the matching permission by running\n * the URL's relative path against the connector's firewall rules.\n */\nfunction resolvePermissionFromUrl(\n connectorType: string,\n label: string,\n method: string,\n relativePath: string,\n matchedBase: string,\n networkPolicies: NetworkPolicies | null,\n): void {\n console.log(\"## Step 3: Permission policy check (auto-detected from URL)\");\n console.log(\"\");\n console.log(\n `Matching ${method} ${relativePath} (relative to base URL ${matchedBase}) against the ${label} connector's permission rules.`,\n );\n console.log(\"\");\n\n if (!isFirewallConnectorType(connectorType)) {\n console.log(\n `The ${label} connector does not have permission rules defined.`,\n );\n console.log(\"\");\n return;\n }\n\n const config = getConnectorFirewall(connectorType);\n const matchedPermissions = findMatchingPermissions(\n method,\n relativePath,\n config,\n );\n\n if (matchedPermissions.length === 0) {\n console.log(\n `No named permission matches ${method} ${relativePath}. This request falls through to the unknown-endpoint policy.`,\n );\n } else {\n console.log(`Matched permissions: [${matchedPermissions.join(\", \")}]`);\n }\n console.log(\"\");\n\n if (!networkPolicies) {\n console.log(\n \"Network policies are not available for this run — cannot check allow/deny status.\",\n );\n console.log(\"\");\n return;\n }\n\n const connectorPolicies = networkPolicies[connectorType];\n\n if (!connectorPolicies) {\n console.log(\n `No policy entry found for the ${label} connector. All requests are fully permissive (allowed).`,\n );\n console.log(\"\");\n return;\n }\n\n console.log(`Permission policies for the ${label} connector:`);\n console.log(` allow list: [${connectorPolicies.allow.join(\", \")}]`);\n console.log(` deny list: [${connectorPolicies.deny.join(\", \")}]`);\n console.log(` unknown endpoint policy: ${connectorPolicies.unknownPolicy}`);\n console.log(\"\");\n\n if (matchedPermissions.length === 0) {\n console.log(\n `Result: No permission matched. The unknown endpoint policy applies: ${connectorPolicies.unknownPolicy}.`,\n );\n } else {\n for (const perm of matchedPermissions) {\n const isInAllow = connectorPolicies.allow.includes(perm);\n const isInDeny = connectorPolicies.deny.includes(perm);\n if (isInAllow) {\n console.log(`Result: \"${perm}\" is in the allow list — allowed.`);\n } else if (isInDeny) {\n console.log(`Result: \"${perm}\" is in the deny list — denied.`);\n } else {\n console.log(\n `Result: \"${perm}\" is not in any list — falls through to unknown endpoint policy: ${connectorPolicies.unknownPolicy}.`,\n );\n }\n }\n }\n console.log(\"\");\n}\n\nexport const checkConnectorCommand = new Command()\n .name(\"check-connector\")\n .description(\n \"Diagnose connector health: environment variable, connector configuration, and permission policies\",\n )\n .addOption(\n new Option(\n \"--env-name <ENV_NAME>\",\n \"The environment variable name to check (e.g. GITHUB_TOKEN)\",\n ),\n )\n .addOption(\n new Option(\n \"--url <URL>\",\n \"A full URL to diagnose — auto-detects the connector, env var, and permission (e.g. https://api.github.com/repos/owner/repo)\",\n ),\n )\n .addOption(\n new Option(\n \"--method <METHOD>\",\n \"HTTP method to use when matching permissions with --url (default: GET)\",\n ).default(\"GET\"),\n )\n .addOption(\n new Option(\n \"--check-permission <name>\",\n \"Check whether a specific permission is allowed or denied (e.g. contents:read)\",\n ),\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n zero doctor check-connector --env-name GITHUB_TOKEN\n zero doctor check-connector --url https://api.github.com/repos/owner/repo\n zero doctor check-connector --url https://slack.com/api/chat.postMessage --method POST\n zero doctor check-connector --env-name SLACK_TOKEN --check-permission chat:write\n\nHow connectors work:\n A Connector holds the real credentials for an external service. These credentials\n are never injected into the sandbox. Instead, when the sandbox sends an HTTP\n request to a base URL registered by the Connector, the network boundary intercepts\n the request and replaces the auth headers with real credentials.\n\n This command checks each part of that pipeline and reports what it finds.`,\n )\n .action(\n withErrorHandler(async (opts: CheckConnectorOptions) => {\n if (!opts.envName && !opts.url) {\n throw new Error(\n \"Either --env-name or --url is required. Use --help for usage.\",\n );\n }\n\n let envName: string;\n let connectorType: string;\n let urlLookup: UrlLookupResult | null = null;\n\n if (opts.url) {\n urlLookup = resolveConnectorFromUrl(opts.url);\n if (!urlLookup) {\n throw new Error(\n `No connector found for URL: ${opts.url} — no registered base URL matches this URL`,\n );\n }\n connectorType = urlLookup.connectorType;\n envName = opts.envName ?? urlLookup.envName;\n console.log(\n `URL ${opts.url} matches the ${CONNECTOR_TYPES[connectorType as ConnectorType].label} connector (type: ${connectorType}).`,\n );\n console.log(` Matched base URL: ${urlLookup.matchedBase}`);\n console.log(` Relative path: ${urlLookup.relativePath}`);\n console.log(` Environment var: ${envName}`);\n } else {\n connectorType = getConnectorTypeForSecretName(\n (envName = opts.envName!),\n )!;\n if (!connectorType) {\n throw new Error(\n `Unknown environment variable: ${envName} — not managed by any connector`,\n );\n }\n console.log(\n `${envName} is managed by the ${CONNECTOR_TYPES[connectorType as ConnectorType].label} connector (type: ${connectorType}).`,\n );\n }\n console.log(\"\");\n\n const { label } = CONNECTOR_TYPES[connectorType as ConnectorType];\n const apiUrl = await getApiUrl();\n const platformUrl = toPlatformUrl(apiUrl);\n\n const ctx: DiagContext = {\n envName,\n connectorType,\n label,\n platformOrigin: platformUrl.origin,\n agentId: process.env.ZERO_AGENT_ID || undefined,\n };\n\n checkEnvVariable(ctx);\n const { isConnected, isExpired, hasPermission } =\n await checkConnectorStatus(ctx);\n const networkPolicies = await checkConnectorDomains(ctx);\n\n // Summary for Step 2\n if (isConnected && !isExpired && hasPermission) {\n console.log(\n `Steps 1-2 summary: The ${label} connector is connected, active, and authorized. Outbound requests to the registered base URLs will have credentials injected at the network boundary.`,\n );\n }\n console.log(\"\");\n\n // Step 3: Permission policy check\n if (urlLookup) {\n // --url mode: auto-detect permission from URL path\n resolvePermissionFromUrl(\n connectorType,\n label,\n opts.method,\n urlLookup.relativePath,\n urlLookup.matchedBase,\n networkPolicies,\n );\n } else if (opts.checkPermission) {\n // --env-name mode with explicit --check-permission\n checkPermissionPolicy(\n connectorType,\n label,\n opts.checkPermission,\n networkPolicies,\n );\n }\n\n // Re-diagnose hint\n const args: string[] = [];\n if (opts.url) {\n args.push(`--url ${opts.url}`);\n if (opts.method !== \"GET\") {\n args.push(`--method ${opts.method}`);\n }\n } else {\n args.push(`--env-name ${envName}`);\n }\n if (opts.checkPermission) {\n args.push(`--check-permission ${opts.checkPermission}`);\n }\n console.log(\n `To re-diagnose after changes, run: zero doctor check-connector ${args.join(\" \")}`,\n );\n }),\n );\n","import type { FirewallConfig } from \"./firewall-types\";\nimport { parseSegment } from \"./segment-parser\";\n\n/**\n * Match a runtime segment against a mixed pattern's literal prefix/suffix.\n *\n * Byte-exact comparison; callers must case-fold inputs themselves when\n * needed. Returns the captured middle on success, or null if prefix/suffix\n * don't match or the middle would be empty (non-empty guard).\n */\nfunction matchMixedSegment(\n runtime: string,\n prefix: string,\n suffix: string,\n): string | null {\n if (!runtime.startsWith(prefix)) return null;\n if (!runtime.endsWith(suffix)) return null;\n if (runtime.length <= prefix.length + suffix.length) return null;\n return runtime.slice(prefix.length, runtime.length - suffix.length);\n}\n\n/**\n * Match a URL path against a rule path pattern.\n *\n * Ported from the Python MITM addon's `match_path()` function\n * (crates/runner/mitm-addon/src/matching.py).\n *\n * - Literal segments must match exactly (case-sensitive).\n * - `{name}` matches a single non-empty path segment.\n * - `prefix{name}suffix` (mixed) matches a segment that starts with\n * `prefix` and ends with `suffix`, with a non-empty middle captured\n * into `name`.\n * - `{name+}` matches the rest of the path (one or more segments). Must be last.\n * - `{name*}` matches the rest of the path (zero or more segments). Must be last.\n *\n * Returns extracted parameters on match, or null on mismatch.\n */\nexport function matchFirewallPath(\n path: string,\n pattern: string,\n): Record<string, string> | null {\n const pathSegs = path.split(\"/\").filter(Boolean);\n const patternSegs = pattern.split(\"/\").filter(Boolean);\n\n const params: Record<string, string> = {};\n let pi = 0;\n\n for (const seg of patternSegs) {\n const parsed = parseSegment(seg);\n // Invalid patterns are rejected by validateRule at ingest time, so\n // kind \"error\" should never appear here on validated inputs.\n if (parsed.kind === \"error\") return null;\n if (parsed.kind === \"literal\") {\n if (pi >= pathSegs.length || pathSegs[pi] !== parsed.value) return null;\n pi++;\n continue;\n }\n const { name, prefix, suffix, greedy } = parsed;\n if (greedy === \"+\") {\n if (pi >= pathSegs.length) return null;\n params[name] = pathSegs.slice(pi).join(\"/\");\n return params;\n }\n if (greedy === \"*\") {\n params[name] = pathSegs.slice(pi).join(\"/\");\n return params;\n }\n if (pi >= pathSegs.length) return null;\n const runtime = pathSegs[pi]!;\n if (prefix === \"\" && suffix === \"\") {\n params[name] = runtime;\n } else {\n const captured = matchMixedSegment(runtime, prefix, suffix);\n if (captured === null) return null;\n params[name] = captured;\n }\n pi++;\n }\n\n // All pattern segments consumed; path must also be fully consumed\n if (pi !== pathSegs.length) return null;\n return params;\n}\n\n/**\n * Find all permission names from a firewall config whose rules match\n * the given HTTP method and relative path.\n *\n * Method matching is case-insensitive. The special method `ANY` matches\n * any HTTP method.\n */\nexport function findMatchingPermissions(\n method: string,\n path: string,\n config: FirewallConfig,\n): string[] {\n const upperMethod = method.toUpperCase();\n const matched = new Set<string>();\n\n for (const api of config.apis) {\n if (!api.permissions) continue;\n for (const perm of api.permissions) {\n if (matched.has(perm.name)) continue;\n for (const rule of perm.rules) {\n const spaceIdx = rule.indexOf(\" \");\n if (spaceIdx === -1) continue;\n const ruleMethod = rule.slice(0, spaceIdx).toUpperCase();\n const rest = rule.slice(spaceIdx + 1);\n if (ruleMethod !== \"ANY\" && ruleMethod !== upperMethod) continue;\n\n if (matchFirewallPath(path, rest) !== null) {\n matched.add(perm.name);\n break;\n }\n }\n }\n }\n\n return [...matched];\n}\n","import { Command, Option } from \"commander\";\nimport { CONNECTOR_TYPES } from \"@vm0/connectors/connectors\";\nimport { findMatchingPermissions } from \"@vm0/connectors/firewall-rule-matcher\";\nimport {\n getConnectorFirewall,\n isFirewallConnectorType,\n} from \"@vm0/connectors/firewalls\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const permissionDenyCommand = new Command()\n .name(\"permission-deny\")\n .description(\n \"Diagnose a permission denial and find the permission that covers it\",\n )\n .argument(\"<connector-ref>\", \"The connector type (e.g. github)\")\n .addOption(\n new Option(\n \"--method <method>\",\n \"The denied HTTP method\",\n ).makeOptionMandatory(),\n )\n .addOption(\n new Option(\"--path <path>\", \"The denied path\").makeOptionMandatory(),\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n zero doctor permission-deny github --method GET --path /repos/owner/repo/pulls\n zero doctor permission-deny slack --method POST --path /chat.postMessage\n\nNotes:\n - Identifies which named permission covers a denied request\n - Use permission-change to request or enable the permission`,\n )\n .action(\n withErrorHandler(\n async (connectorRef: string, opts: { method: string; path: string }) => {\n if (!isFirewallConnectorType(connectorRef)) {\n throw new Error(`Unknown connector type: ${connectorRef}`);\n }\n\n const { label } = CONNECTOR_TYPES[connectorRef];\n const config = getConnectorFirewall(connectorRef);\n const permissions = findMatchingPermissions(\n opts.method,\n opts.path,\n config,\n );\n\n console.log(\n `The ${label} permission filtered ${opts.method} ${opts.path}.`,\n );\n\n if (permissions.length === 0) {\n console.log(\"No named permission was found covering this request.\");\n return;\n }\n\n // Count total rules per permission name across all APIs\n const ruleCount = new Map<string, number>();\n for (const api of config.apis) {\n if (!api.permissions) continue;\n for (const perm of api.permissions) {\n ruleCount.set(\n perm.name,\n (ruleCount.get(perm.name) ?? 0) + perm.rules.length,\n );\n }\n }\n\n // Pick the permission with the fewest rules (most specific)\n const permission = permissions.reduce((narrowest, current) => {\n return (ruleCount.get(current) ?? Infinity) <\n (ruleCount.get(narrowest) ?? Infinity)\n ? current\n : narrowest;\n });\n console.log(`This is covered by the \"${permission}\" permission.`);\n console.log(\n `To request this permission, run: zero doctor permission-change ${connectorRef} --permission ${permission} --enable --reason \"why this is needed\"`,\n );\n },\n ),\n );\n","import { Command, Option } from \"commander\";\nimport { CONNECTOR_TYPES } from \"@vm0/connectors/connectors\";\nimport {\n getConnectorFirewall,\n isFirewallConnectorType,\n} from \"@vm0/connectors/firewalls\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { getPlatformOrigin } from \"./platform-url\";\nimport { resolveAgentRole } from \"./resolve-role\";\n\nfunction findPermissionInConfig(ref: string, permissionName: string): boolean {\n if (!isFirewallConnectorType(ref)) return false;\n const config = getConnectorFirewall(ref);\n for (const api of config.apis) {\n if (!api.permissions) continue;\n for (const p of api.permissions) {\n if (p.name === permissionName) return true;\n }\n }\n return false;\n}\n\n/**\n * Core logic for outputting a permission change message.\n * Shared by both `permission-change` and `permission-deny` commands.\n */\nconst REASON_MAX_LENGTH = 500;\n\nasync function outputPermissionChangeMessage(\n connectorRef: string,\n permission: string,\n action: \"enable\" | \"disable\",\n reason?: string,\n): Promise<void> {\n const { label } =\n CONNECTOR_TYPES[connectorRef as keyof typeof CONNECTOR_TYPES];\n\n const platformOrigin = await getPlatformOrigin();\n const agentId = process.env.ZERO_AGENT_ID;\n const role = agentId ? await resolveAgentRole(agentId) : \"unknown\";\n\n const urlParams = new URLSearchParams({\n ref: connectorRef,\n permission,\n action: action === \"enable\" ? \"allow\" : \"deny\",\n });\n\n // Only include reason for member role (admin/owner can change directly)\n if (role === \"member\" && reason) {\n const truncated =\n reason.length > REASON_MAX_LENGTH\n ? reason.slice(0, REASON_MAX_LENGTH)\n : reason;\n urlParams.set(\"reason\", truncated);\n }\n\n const pagePath = agentId ? `/agents/${agentId}/permissions` : \"/agents\";\n const url = `${platformOrigin}${pagePath}?${urlParams.toString()}`;\n\n // Slack chat:write: strongly recommend bot-based messaging over user identity\n if (\n connectorRef === \"slack\" &&\n permission === \"chat:write\" &&\n action === \"enable\"\n ) {\n console.log(\"\");\n console.log(\n \"IMPORTANT: Granting chat:write allows sending messages AS THE USER's identity, not as a bot.\",\n );\n console.log(\n \"Use `zero slack message send -c <channel> -t <text>` to send messages as the bot instead — this is the recommended approach for most use cases.\",\n );\n console.log(\n \"Only request user approval below if acting as the user is specifically required.\",\n );\n console.log(\"\");\n }\n\n // Gmail gmail.send: strongly recommend draft-based workflow over direct send\n if (\n connectorRef === \"gmail\" &&\n permission === \"gmail.send\" &&\n action === \"enable\"\n ) {\n console.log(\"\");\n console.log(\n \"IMPORTANT: Granting gmail.send allows the agent to send emails directly as the user.\",\n );\n console.log(\n \"Consider keeping gmail.send disabled and using gmail.compose instead — the agent can create drafts for the user to review and send manually.\",\n );\n console.log(\n \"Only request user approval below if direct sending is specifically required.\",\n );\n console.log(\"\");\n }\n\n if (role === \"admin\" || role === \"owner\") {\n console.log(\n `You can ${action} the \"${permission}\" permission directly: [Manage ${label} permissions](${url})`,\n );\n } else if (role === \"member\") {\n if (!reason) {\n console.log(\n `IMPORTANT: Re-run with \\`--reason \"one sentence why this is needed\"\\` so the admin can review your request faster.`,\n );\n } else if (action === \"enable\") {\n console.log(\n `Permission changes require admin approval. Request access at: [Request ${label} access](${url})`,\n );\n } else {\n console.log(\n `Permission changes require admin approval. Contact an org admin to disable this permission: [View ${label} permissions](${url})`,\n );\n }\n } else {\n console.log(\n `To ${action} the \"${permission}\" permission for ${label}: [Manage ${label} permissions](${url})`,\n );\n }\n}\n\nexport const permissionChangeCommand = new Command()\n .name(\"permission-change\")\n .description(\"Request a permission change (enable or disable)\")\n .argument(\"<connector-ref>\", \"The connector type (e.g. github)\")\n .addOption(\n new Option(\n \"--permission <name>\",\n \"The permission name to change\",\n ).makeOptionMandatory(),\n )\n .addOption(\n new Option(\"--enable\", \"Request to enable the permission\").conflicts(\n \"disable\",\n ),\n )\n .addOption(\n new Option(\"--disable\", \"Request to disable the permission\").conflicts(\n \"enable\",\n ),\n )\n .addOption(\n new Option(\n \"--reason <text>\",\n \"Brief reason why the permission is needed (max 500 chars)\",\n ),\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n zero doctor permission-change github --permission contents:read --enable\n zero doctor permission-change slack --permission chat:write --disable\n\nNotes:\n - Outputs a platform URL for the user to adjust the permission\n - Admins can change permissions directly; members must request approval`,\n )\n .action(\n withErrorHandler(\n async (\n connectorRef: string,\n opts: {\n permission: string;\n enable?: boolean;\n disable?: boolean;\n reason?: string;\n },\n ) => {\n if (!opts.enable && !opts.disable) {\n throw new Error(\"Either --enable or --disable is required\");\n }\n\n if (!isFirewallConnectorType(connectorRef)) {\n throw new Error(`Unknown connector type: ${connectorRef}`);\n }\n\n if (!findPermissionInConfig(connectorRef, opts.permission)) {\n throw new Error(\n `Unknown permission \"${opts.permission}\" for ${connectorRef}`,\n );\n }\n\n const action = opts.enable ? \"enable\" : \"disable\";\n await outputPermissionChangeMessage(\n connectorRef,\n opts.permission,\n action,\n opts.reason,\n );\n },\n ),\n );\n","import { getZeroOrg } from \"../../../lib/api/domains/zero-orgs\";\nimport { getZeroAgent } from \"../../../lib/api/domains/zero-agents\";\nimport { decodeZeroTokenPayload } from \"../../../lib/api/zero-token\";\nimport { decodeCliTokenPayload } from \"../../../lib/api/cli-token\";\nimport { getToken } from \"../../../lib/api/config\";\n\ntype AgentRole = \"admin\" | \"owner\" | \"member\" | \"unknown\";\n\n/**\n * Resolve the current user's userId from the available token.\n * Tries ZERO_TOKEN (sandbox) first, then CLI token.\n */\nasync function resolveUserId(): Promise<string | undefined> {\n const zeroPayload = decodeZeroTokenPayload();\n if (zeroPayload?.userId) return zeroPayload.userId;\n\n const token = await getToken();\n const cliPayload = decodeCliTokenPayload(token);\n return cliPayload?.userId;\n}\n\n/**\n * Best-effort role detection that also considers agent ownership.\n *\n * Returns \"admin\" if the user is an org admin (can manage any agent).\n * Returns \"owner\" if the user is a non-admin but owns the specified agent.\n * Returns \"member\" if the user is a non-admin, non-owner member.\n * Returns \"unknown\" on any API failure.\n */\nexport async function resolveAgentRole(agentId: string): Promise<AgentRole> {\n try {\n const org = await getZeroOrg();\n if (org.role === \"admin\") return \"admin\";\n\n if (org.role === \"member\") {\n // Check if the member owns this agent\n const userId = await resolveUserId();\n if (userId) {\n const agent = await getZeroAgent(agentId);\n if (agent.ownerId === userId) return \"owner\";\n }\n return \"member\";\n }\n\n return \"unknown\";\n } catch (error: unknown) {\n console.debug(\"resolveAgentRole failed, falling back to unknown:\", error);\n return \"unknown\";\n }\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n getZeroUserPreferences,\n updateZeroUserPreferences,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { isInteractive, promptText } from \"../../../lib/utils/prompt-utils\";\n\n/**\n * Detect system timezone using Intl API\n */\nfunction detectTimezone(): string {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n}\n\n/**\n * Validate timezone using Intl.DateTimeFormat\n */\nfunction isValidTimezone(timezone: string): boolean {\n try {\n Intl.DateTimeFormat(undefined, { timeZone: timezone });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Display current preferences\n */\nfunction displayPreferences(prefs: { timezone: string | null }): void {\n console.log(chalk.bold(\"Current preferences:\"));\n console.log(\n ` Timezone: ${prefs.timezone ? chalk.cyan(prefs.timezone) : chalk.dim(\"not set\")}`,\n );\n}\n\ninterface PreferenceOpts {\n timezone?: string;\n}\n\n/**\n * Build updates from CLI flags, exiting on invalid input\n */\nfunction buildUpdates(opts: PreferenceOpts): { timezone?: string } | null {\n if (opts.timezone === undefined) return null;\n\n if (!isValidTimezone(opts.timezone)) {\n throw new Error(`Invalid timezone: ${opts.timezone}`, {\n cause: new Error(\n \"Use an IANA timezone identifier (e.g., America/New_York, Asia/Shanghai)\",\n ),\n });\n }\n\n return { timezone: opts.timezone };\n}\n\n/**\n * Print confirmation after a successful update\n */\nfunction printUpdateResult(\n updates: { timezone?: string },\n result: { timezone: string | null },\n): void {\n if (updates.timezone !== undefined) {\n console.log(\n chalk.green(\n `Timezone set to ${chalk.cyan(result.timezone ?? updates.timezone)}`,\n ),\n );\n }\n}\n\n/**\n * Interactive prompts when no flags provided\n */\nasync function interactiveSetup(prefs: {\n timezone: string | null;\n}): Promise<void> {\n if (!prefs.timezone) {\n const detectedTz = detectTimezone();\n console.log(chalk.dim(`\\nSystem timezone detected: ${detectedTz}`));\n const tz = await promptText(\n \"Set timezone? (enter timezone or leave empty to skip)\",\n detectedTz,\n );\n if (tz?.trim()) {\n if (!isValidTimezone(tz.trim())) {\n throw new Error(`Invalid timezone: ${tz.trim()}`);\n }\n await updateZeroUserPreferences({ timezone: tz.trim() });\n console.log(chalk.green(`Timezone set to ${chalk.cyan(tz.trim())}`));\n }\n }\n}\n\n/**\n * zero preference\n *\n * View or update user preferences (timezone).\n */\nexport const zeroPreferenceCommand = new Command()\n .name(\"preference\")\n .description(\"View or update user preferences (timezone, notifications)\")\n .option(\"--timezone <timezone>\", \"IANA timezone (e.g., America/New_York)\")\n .action(\n withErrorHandler(async (opts: PreferenceOpts) => {\n const updates = buildUpdates(opts);\n\n if (updates) {\n const result = await updateZeroUserPreferences(updates);\n printUpdateResult(updates, result);\n return;\n }\n\n // No flags: display current preferences\n const prefs = await getZeroUserPreferences();\n displayPreferences(prefs);\n\n if (isInteractive()) {\n await interactiveSetup(prefs);\n } else if (!prefs.timezone) {\n console.log();\n console.log(\n `To set timezone: ${chalk.cyan(\"zero preference --timezone <timezone>\")}`,\n );\n console.log(\n chalk.dim(\"Example: zero preference --timezone America/New_York\"),\n );\n }\n }),\n );\n","import { mainRunCommand } from \"./run\";\nimport { continueCommand } from \"./continue\";\n\nmainRunCommand.addCommand(continueCommand);\n\nmainRunCommand.addHelpText(\n \"after\",\n `\nExamples:\n Discover teammates: zero agent list\n Delegate a task: zero run <agent-id> \"your task\"\n Continue delegation: zero run continue <session-id> \"follow up\"`,\n);\n\nexport const zeroRunCommand = mainRunCommand;\n","import { Command, Option } from \"commander\";\nimport { createZeroRun } from \"../../../lib/api\";\nimport { isUUID, renderRunCreated } from \"../../run/shared\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { pollZeroEvents, showZeroNextSteps } from \"./shared\";\n\nexport const mainRunCommand = new Command()\n .name(\"run\")\n .description(\"Delegate a task to a teammate agent\")\n .argument(\"<agent-id>\", \"Agent UUID (from `zero agent list`)\")\n .argument(\"<prompt>\", \"Task prompt for the agent\")\n .option(\n \"--model-provider <type>\",\n \"Override model provider (e.g., anthropic-api-key)\",\n )\n .option(\"--verbose\", \"Show full tool inputs and outputs\")\n .addOption(new Option(\"--debug-no-mock-claude\").hideHelp())\n .addHelpText(\n \"after\",\n `\nExamples:\n Delegate a task: zero run <agent-id> \"summarize the latest issues\"\n With verbose output: zero run <agent-id> \"fix the bug\" --verbose\n\nNotes:\n - Get agent IDs from \"zero agent list\"\n - The command streams events until the delegated run completes\n - On success, a session ID is printed for follow-up with \"zero run continue\"`,\n )\n .action(\n withErrorHandler(\n async (\n agentId: string,\n prompt: string,\n options: {\n modelProvider?: string;\n verbose?: boolean;\n debugNoMockClaude?: boolean;\n },\n ) => {\n // 1. Validate agent-id is a UUID\n if (!isUUID(agentId)) {\n throw new Error(`Invalid agent ID format: ${agentId}`, {\n cause: new Error(\n \"Agent ID must be a valid UUID. Use `zero agent list` to find agent IDs.\",\n ),\n });\n }\n\n // 2. Create zero run\n const response = await createZeroRun({\n agentId,\n prompt,\n modelProvider: options.modelProvider,\n debugNoMockClaude: options.debugNoMockClaude,\n });\n\n // 3. Check for immediate failure\n if (response.status === \"failed\") {\n throw new Error(\n \"Run preparation failed\",\n response.error ? { cause: new Error(response.error) } : undefined,\n );\n }\n\n // 4. Display run started/queued info\n renderRunCreated(response);\n\n // 5. Poll for events\n const result = await pollZeroEvents(response.runId, {\n verbose: options.verbose,\n });\n if (!result.succeeded) {\n throw new Error(\"Run failed\");\n }\n\n // 6. Show next steps\n showZeroNextSteps(result);\n },\n ),\n );\n","import chalk from \"chalk\";\nimport { getZeroRunAgentEvents, getZeroRun } from \"../../../lib/api\";\nimport type { RunResult } from \"../../../lib/api\";\nimport { parseEvent } from \"../../../lib/events/event-parser-factory\";\nimport { EventRenderer } from \"../../../lib/events/event-renderer\";\nimport type { PollResult, EventRenderingOptions } from \"../../run/shared\";\n\ninterface SequencedEvent {\n sequenceNumber: number;\n}\n\ntype ZeroRunResponse = Awaited<ReturnType<typeof getZeroRun>>;\ntype TerminalRunStatus = \"completed\" | \"failed\" | \"timeout\" | \"cancelled\";\ntype TerminalRunResponse = ZeroRunResponse & { status: TerminalRunStatus };\n\nconst TERMINAL_RUN_STATUSES: readonly TerminalRunStatus[] = [\n \"completed\",\n \"failed\",\n \"timeout\",\n \"cancelled\",\n];\n\n/**\n * Safely narrow GetRunResponse.result to RunResult.\n * GetRunResponse.result has all fields optional (due to .passthrough()),\n * but RunResult requires checkpointId, agentSessionId, conversationId.\n * Extra fields (artifact, volumes) are preserved at runtime via passthrough.\n */\nfunction toRunResult(result: {\n output?: string;\n executionTimeMs?: number;\n agentSessionId?: string;\n checkpointId?: string;\n conversationId?: string;\n}): RunResult | undefined {\n const { checkpointId, agentSessionId, conversationId } = result;\n if (!checkpointId || !agentSessionId || !conversationId) {\n return undefined;\n }\n return { checkpointId, agentSessionId, conversationId };\n}\n\nfunction filterContiguousEvents<T extends SequencedEvent>(\n events: T[],\n lastSequence: number,\n): T[] {\n const contiguousEvents: T[] = [];\n let expectedSequence = lastSequence + 1;\n\n for (const event of events) {\n if (event.sequenceNumber < expectedSequence) {\n continue;\n }\n if (event.sequenceNumber !== expectedSequence) {\n break;\n }\n contiguousEvents.push(event);\n expectedSequence++;\n }\n\n return contiguousEvents;\n}\n\nconst POLL_INTERVAL_MS = 1000;\nconst TERMINAL_DRAIN_POLL_INTERVAL_MS = 500;\nconst TERMINAL_DRAIN_IDLE_MS = 1000;\nconst TERMINAL_DRAIN_MAX_MS = 3000;\n\nfunction isTerminalRunResponse(\n runResponse: ZeroRunResponse,\n): runResponse is TerminalRunResponse {\n return TERMINAL_RUN_STATUSES.includes(\n runResponse.status as TerminalRunStatus,\n );\n}\n\nfunction shouldDrainNextEventPage<T>(\n eventsResponse: { hasMore: boolean; events: T[] },\n contiguousEvents: T[],\n): boolean {\n return (\n eventsResponse.hasMore &&\n contiguousEvents.length > 0 &&\n contiguousEvents.length === eventsResponse.events.length\n );\n}\n\nfunction hasSequenceGap<T>(\n eventsResponse: { events: T[] },\n contiguousEvents: T[],\n): boolean {\n return (\n eventsResponse.events.length > 0 &&\n contiguousEvents.length < eventsResponse.events.length\n );\n}\n\nfunction shouldCompleteTerminalDrain(\n terminalSeenAt: number,\n lastTerminalProgressAt: number,\n blockedByGap: boolean,\n): boolean {\n const now = Date.now();\n const terminalElapsedMs = now - terminalSeenAt;\n const terminalIdleMs = now - lastTerminalProgressAt;\n return (\n terminalElapsedMs >= TERMINAL_DRAIN_MAX_MS ||\n (!blockedByGap && terminalIdleMs >= TERMINAL_DRAIN_IDLE_MS)\n );\n}\n\nfunction renderTerminalRunResult(\n runId: string,\n runResponse: TerminalRunResponse,\n): PollResult {\n if (runResponse.status === \"completed\") {\n EventRenderer.renderRunCompleted(\n runResponse.result ? toRunResult(runResponse.result) : undefined,\n );\n return {\n succeeded: true,\n runId,\n sessionId: runResponse.result?.agentSessionId,\n checkpointId: runResponse.result?.checkpointId,\n };\n }\n\n if (runResponse.status === \"failed\") {\n EventRenderer.renderRunFailed(runResponse.error, runId);\n return { succeeded: false, runId };\n }\n\n if (runResponse.status === \"timeout\") {\n console.error(chalk.red(\"\\n✗ Run timed out\"));\n return { succeeded: false, runId };\n }\n\n console.error(chalk.yellow(\"\\n✗ Run cancelled\"));\n return { succeeded: false, runId };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n return setTimeout(resolve, ms);\n });\n}\n\n/**\n * Poll for zero run events until run completes.\n * Uses dual-poll approach: telemetry endpoint for events, getById for status.\n */\nexport async function pollZeroEvents(\n runId: string,\n options?: EventRenderingOptions,\n): Promise<PollResult> {\n const renderer = new EventRenderer({ verbose: options?.verbose });\n\n let lastSequence = -1;\n let complete = false;\n let result: PollResult = { succeeded: true, runId };\n let terminalRunResponse: TerminalRunResponse | undefined;\n let terminalSeenAt = 0;\n let lastTerminalProgressAt = 0;\n\n while (!complete) {\n // 1. Fetch events from telemetry endpoint\n const eventsResponse = await getZeroRunAgentEvents(runId, {\n since: lastSequence,\n limit: 100,\n order: \"asc\",\n });\n\n const contiguousEvents = filterContiguousEvents(\n eventsResponse.events,\n lastSequence,\n );\n\n // 2. Parse and render each event\n for (const event of contiguousEvents) {\n const eventData = event.eventData as Record<string, unknown>;\n const parsed = parseEvent(eventData);\n if (parsed) {\n renderer.render(parsed);\n }\n }\n\n // 3. Track last sequence number for pagination\n if (contiguousEvents.length > 0) {\n lastSequence =\n contiguousEvents[contiguousEvents.length - 1]!.sequenceNumber;\n if (terminalRunResponse) {\n lastTerminalProgressAt = Date.now();\n }\n }\n\n const blockedByGap = hasSequenceGap(eventsResponse, contiguousEvents);\n\n // If this page is fully contiguous and the server says more are already\n // queryable, drain the next page before checking terminal status. Otherwise\n // a completed run with >100 unseen events would render only the final page's\n // first batch and then exit.\n if (shouldDrainNextEventPage(eventsResponse, contiguousEvents)) {\n continue;\n }\n\n // 4. Fetch run status separately. During terminal drain, keep the latest\n // terminal state because timeout runs can still be upgraded to completed.\n const runResponse = await getZeroRun(runId);\n if (isTerminalRunResponse(runResponse)) {\n if (!terminalRunResponse) {\n terminalSeenAt = Date.now();\n lastTerminalProgressAt = terminalSeenAt;\n }\n terminalRunResponse = runResponse;\n }\n\n if (terminalRunResponse) {\n if (\n shouldCompleteTerminalDrain(\n terminalSeenAt,\n lastTerminalProgressAt,\n blockedByGap,\n )\n ) {\n result = renderTerminalRunResult(runId, terminalRunResponse);\n complete = true;\n }\n }\n\n if (!complete) {\n await sleep(\n terminalRunResponse\n ? TERMINAL_DRAIN_POLL_INTERVAL_MS\n : POLL_INTERVAL_MS,\n );\n }\n }\n\n return result;\n}\n\n/**\n * Display next steps after successful zero run\n */\nexport function showZeroNextSteps(result: PollResult): void {\n const { sessionId } = result;\n\n console.log();\n\n if (sessionId) {\n console.log(\" Continue delegation:\");\n console.log(\n chalk.cyan(` zero run continue ${sessionId} \"your next prompt\"`),\n );\n }\n}\n","import { Command } from \"commander\";\nimport { createZeroRun } from \"../../../lib/api\";\nimport { isUUID, renderRunCreated } from \"../../run/shared\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { pollZeroEvents, showZeroNextSteps } from \"./shared\";\n\nexport const continueCommand = new Command()\n .name(\"continue\")\n .description(\"Continue a previous delegation from a session\")\n .argument(\"<session-id>\", \"Session ID from a previous run\")\n .argument(\"<prompt>\", \"Follow-up prompt for the agent\")\n .option(\n \"--model-provider <type>\",\n \"Override model provider (e.g., anthropic-api-key)\",\n )\n .option(\"--verbose\", \"Show full tool inputs and outputs\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero run continue <session-id> \"now deploy it\"\n zero run continue <session-id> \"add tests\" --verbose\n\nNotes:\n - The session ID is printed after a successful \"zero run\" delegation\n - Continues the same agent session with full prior context`,\n )\n .action(\n withErrorHandler(\n async (\n sessionId: string,\n prompt: string,\n options: {\n modelProvider?: string;\n verbose?: boolean;\n },\n ) => {\n // 1. Validate session-id is a UUID\n if (!isUUID(sessionId)) {\n throw new Error(`Invalid session ID format: ${sessionId}`, {\n cause: new Error(\"Session ID must be a valid UUID\"),\n });\n }\n\n // 2. Create zero run with sessionId (no agentId needed)\n const response = await createZeroRun({\n sessionId,\n prompt,\n modelProvider: options.modelProvider,\n });\n\n // 3. Check for immediate failure\n if (response.status === \"failed\") {\n throw new Error(\n \"Run preparation failed\",\n response.error ? { cause: new Error(response.error) } : undefined,\n );\n }\n\n // 4. Display run started/queued info\n renderRunCreated(response);\n\n // 5. Poll for events\n const result = await pollZeroEvents(response.runId, {\n verbose: options.verbose,\n });\n if (!result.succeeded) {\n throw new Error(\"Run failed\");\n }\n\n // 6. Show next steps\n showZeroNextSteps(result);\n },\n ),\n );\n","import { Command } from \"commander\";\nimport { setupCommand } from \"./setup\";\nimport { listCommand } from \"./list\";\nimport { statusCommand } from \"./status\";\nimport { deleteCommand } from \"./delete\";\nimport { enableCommand } from \"./enable\";\nimport { disableCommand } from \"./disable\";\n\nexport const zeroScheduleCommand = new Command()\n .name(\"schedule\")\n .description(\"Create or manage recurring scheduled tasks\")\n .addCommand(setupCommand)\n .addCommand(listCommand)\n .addCommand(statusCommand)\n .addCommand(deleteCommand)\n .addCommand(enableCommand)\n .addCommand(disableCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Create a schedule: zero schedule setup --help\n Check all schedules: zero schedule list\n Check schedule status: zero schedule status <agent-id>\n Pause a schedule: zero schedule disable <agent-id>\n Resume a schedule: zero schedule enable <agent-id>\n Delete a schedule: zero schedule delete <agent-id>`,\n );\n","import { Command } from \"commander\";\nimport { readFileSync } from \"node:fs\";\nimport chalk from \"chalk\";\nimport {\n isInteractive,\n promptText,\n promptSelect,\n promptConfirm,\n} from \"../../../lib/utils/prompt-utils\";\nimport {\n generateCronExpression,\n detectTimezone,\n validateTimeFormat,\n validateDateFormat,\n getTomorrowDateLocal,\n getCurrentTimeLocal,\n toISODateTime,\n type ScheduleFrequency,\n} from \"../../../lib/domain/schedule-utils\";\nimport {\n resolveCompose,\n deployZeroSchedule,\n listZeroSchedules,\n enableZeroSchedule,\n getZeroUserPreferences,\n ApiRequestError,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { parseModelFlag } from \"../../../lib/domain/model-provider/shared\";\n\nconst FREQUENCY_CHOICES = [\n { title: \"Daily\", value: \"daily\" as const, description: \"Run every day\" },\n {\n title: \"Weekly\",\n value: \"weekly\" as const,\n description: \"Run once per week\",\n },\n {\n title: \"Monthly\",\n value: \"monthly\" as const,\n description: \"Run once per month\",\n },\n {\n title: \"One-time\",\n value: \"once\" as const,\n description: \"Run once at specific time\",\n },\n {\n title: \"Loop\",\n value: \"loop\" as const,\n description: \"Run repeatedly at fixed intervals\",\n },\n];\n\nconst DAY_OF_WEEK_CHOICES = [\n { title: \"Monday\", value: 1 },\n { title: \"Tuesday\", value: 2 },\n { title: \"Wednesday\", value: 3 },\n { title: \"Thursday\", value: 4 },\n { title: \"Friday\", value: 5 },\n { title: \"Saturday\", value: 6 },\n { title: \"Sunday\", value: 0 },\n];\n\nfunction parseDayOption(\n day: string,\n frequency: ScheduleFrequency,\n): number | undefined {\n if (frequency === \"weekly\") {\n const dayMap: Record<string, number> = {\n sun: 0,\n mon: 1,\n tue: 2,\n wed: 3,\n thu: 4,\n fri: 5,\n sat: 6,\n };\n return dayMap[day.toLowerCase()];\n } else if (frequency === \"monthly\") {\n const num = parseInt(day, 10);\n if (num >= 1 && num <= 31) {\n return num;\n }\n }\n return undefined;\n}\n\nfunction formatInTimezone(isoDate: string, timezone: string): string {\n const date = new Date(isoDate);\n const parts = new Intl.DateTimeFormat(\"en-CA\", {\n timeZone: timezone,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n }).formatToParts(date);\n\n const get = (type: string) => {\n return (\n parts.find((p) => {\n return p.type === type;\n })?.value ?? \"\"\n );\n };\n return `${get(\"year\")}-${get(\"month\")}-${get(\"day\")} ${get(\"hour\")}:${get(\"minute\")}`;\n}\n\nfunction parseFrequencyFromCron(\n cron: string,\n): { frequency: ScheduleFrequency; day?: number; time: string } | null {\n const parts = cron.split(\" \");\n if (parts.length !== 5) return null;\n\n const [minute, hour, dayOfMonth, , dayOfWeek] = parts;\n const time = `${hour!.padStart(2, \"0\")}:${minute!.padStart(2, \"0\")}`;\n\n if (dayOfMonth === \"*\" && dayOfWeek === \"*\") {\n return { frequency: \"daily\", time };\n } else if (dayOfMonth === \"*\" && dayOfWeek !== \"*\") {\n return { frequency: \"weekly\", day: parseInt(dayOfWeek!, 10), time };\n } else if (dayOfMonth !== \"*\" && dayOfWeek === \"*\") {\n return { frequency: \"monthly\", day: parseInt(dayOfMonth!, 10), time };\n }\n\n return null;\n}\n\ninterface SetupOptions {\n name?: string;\n frequency?: string;\n time?: string;\n day?: string;\n interval?: string;\n timezone?: string;\n prompt?: string;\n promptFile?: string;\n enable?: boolean;\n modelProvider?: string;\n model?: string;\n}\n\ninterface ExistingScheduleDefaults {\n frequency?: ScheduleFrequency;\n day?: number;\n time?: string;\n intervalSeconds?: number;\n}\n\ninterface ScheduleListItem {\n name: string;\n agentId: string;\n triggerType?: \"cron\" | \"once\" | \"loop\";\n cronExpression?: string | null;\n atTime?: string | null;\n intervalSeconds?: number | null;\n timezone: string;\n prompt: string;\n enabled?: boolean;\n}\n\nfunction getExistingDefaults(\n existingSchedule: ScheduleListItem | undefined,\n): ExistingScheduleDefaults {\n const defaults: ExistingScheduleDefaults = {};\n\n if (existingSchedule?.triggerType === \"loop\") {\n defaults.frequency = \"loop\";\n defaults.intervalSeconds = existingSchedule.intervalSeconds ?? undefined;\n } else if (existingSchedule?.cronExpression) {\n const parsed = parseFrequencyFromCron(existingSchedule.cronExpression);\n if (parsed) {\n defaults.frequency = parsed.frequency;\n defaults.day = parsed.day;\n defaults.time = parsed.time;\n }\n } else if (existingSchedule?.atTime) {\n defaults.frequency = \"once\";\n }\n\n return defaults;\n}\n\nasync function gatherFrequency(\n optionFrequency: string | undefined,\n existingFrequency: ScheduleFrequency | undefined,\n): Promise<ScheduleFrequency | null> {\n let frequency = optionFrequency as ScheduleFrequency | undefined;\n\n if (\n frequency &&\n [\"daily\", \"weekly\", \"monthly\", \"once\", \"loop\"].includes(frequency)\n ) {\n return frequency;\n }\n\n if (!isInteractive()) {\n throw new Error(\"--frequency is required (daily|weekly|monthly|once|loop)\");\n }\n\n const defaultIndex = existingFrequency\n ? FREQUENCY_CHOICES.findIndex((c) => {\n return c.value === existingFrequency;\n })\n : 0;\n\n frequency = await promptSelect<ScheduleFrequency>(\n \"Schedule frequency\",\n FREQUENCY_CHOICES,\n defaultIndex >= 0 ? defaultIndex : 0,\n );\n\n return frequency || null;\n}\n\nasync function gatherDay(\n frequency: ScheduleFrequency,\n optionDay: string | undefined,\n existingDay: number | undefined,\n): Promise<number | null> {\n if (frequency !== \"weekly\" && frequency !== \"monthly\") {\n return null;\n }\n\n if (optionDay) {\n const day = parseDayOption(optionDay, frequency);\n if (day === undefined) {\n throw new Error(\n `Invalid day: ${optionDay}. Use mon-sun for weekly or 1-31 for monthly.`,\n );\n }\n return day;\n }\n\n if (!isInteractive()) {\n throw new Error(\"--day is required for weekly/monthly\");\n }\n\n if (frequency === \"weekly\") {\n const defaultDayIndex =\n existingDay !== undefined\n ? DAY_OF_WEEK_CHOICES.findIndex((c) => {\n return c.value === existingDay;\n })\n : 0;\n const day = await promptSelect(\n \"Day of week\",\n DAY_OF_WEEK_CHOICES,\n defaultDayIndex >= 0 ? defaultDayIndex : 0,\n );\n return day ?? null;\n }\n\n const dayStr = await promptText(\n \"Day of month (1-31)\",\n existingDay?.toString() || \"1\",\n );\n if (!dayStr) return null;\n\n const day = parseInt(dayStr, 10);\n if (isNaN(day) || day < 1 || day > 31) {\n throw new Error(\"Day must be between 1 and 31\");\n }\n return day;\n}\n\nasync function gatherRecurringTime(\n optionTime: string | undefined,\n existingTime: string | undefined,\n): Promise<string | undefined> {\n if (optionTime) {\n const validation = validateTimeFormat(optionTime);\n if (validation !== true) {\n throw new Error(`Invalid time: ${validation}`);\n }\n return optionTime;\n }\n\n if (!isInteractive()) {\n throw new Error(\"--time is required (HH:MM format)\");\n }\n\n return await promptText(\n \"Time (HH:MM)\",\n existingTime || \"09:00\",\n validateTimeFormat,\n );\n}\n\nasync function gatherOneTimeSchedule(\n optionDay: string | undefined,\n optionTime: string | undefined,\n existingTime: string | undefined,\n): Promise<string | null> {\n if (optionDay && optionTime) {\n if (!validateDateFormat(optionDay)) {\n throw new Error(\n `Invalid date format: ${optionDay}. Use YYYY-MM-DD format.`,\n );\n }\n if (!validateTimeFormat(optionTime)) {\n throw new Error(`Invalid time format: ${optionTime}. Use HH:MM format.`);\n }\n return `${optionDay} ${optionTime}`;\n }\n\n if (!isInteractive()) {\n throw new Error(\"One-time schedules require interactive mode\", {\n cause: new Error(\n \"Or provide --day (YYYY-MM-DD) and --time (HH:MM) flags\",\n ),\n });\n }\n\n const tomorrowDate = getTomorrowDateLocal();\n const date = await promptText(\n \"Date (YYYY-MM-DD, default tomorrow)\",\n tomorrowDate,\n validateDateFormat,\n );\n if (!date) return null;\n\n const currentTime = getCurrentTimeLocal();\n const time = await promptText(\n \"Time (HH:MM)\",\n existingTime || currentTime,\n validateTimeFormat,\n );\n if (!time) return null;\n\n return `${date} ${time}`;\n}\n\nasync function gatherTimezone(\n optionTimezone: string | undefined,\n existingTimezone: string | undefined | null,\n): Promise<string | undefined> {\n if (optionTimezone) return optionTimezone;\n\n let userTimezone: string | null = null;\n try {\n const prefs = await getZeroUserPreferences();\n userTimezone = prefs.timezone;\n } catch {\n console.log(\n chalk.dim(\"Could not fetch timezone preference, using detected timezone\"),\n );\n }\n\n const defaultTimezone = userTimezone || detectTimezone();\n\n if (!isInteractive()) {\n return defaultTimezone;\n }\n\n return await promptText(\"Timezone\", existingTimezone || defaultTimezone);\n}\n\nasync function gatherPromptText(\n optionPrompt: string | undefined,\n optionPromptFile: string | undefined,\n existingPrompt: string | undefined | null,\n): Promise<string | undefined> {\n if (optionPrompt && optionPromptFile) {\n throw new Error(\"Cannot use --prompt and --prompt-file together\");\n }\n\n if (optionPromptFile) {\n return readFileSync(optionPromptFile, \"utf-8\");\n }\n\n if (optionPrompt) return optionPrompt;\n\n if (!isInteractive()) {\n throw new Error(\"--prompt or --prompt-file is required\");\n }\n\n return await promptText(\n \"Prompt to run\",\n existingPrompt || \"let's start working.\",\n );\n}\n\nasync function gatherInterval(\n optionInterval: string | undefined,\n existingInterval: number | undefined,\n): Promise<number | null> {\n if (optionInterval) {\n const val = parseInt(optionInterval, 10);\n if (isNaN(val) || val < 0) {\n throw new Error(\n \"Invalid interval. Must be a non-negative integer (seconds)\",\n );\n }\n return val;\n }\n\n if (!isInteractive()) {\n throw new Error(\"--interval is required for loop schedules (seconds)\");\n }\n\n const defaultVal =\n existingInterval !== undefined ? String(existingInterval) : \"300\";\n const result = await promptText(\n \"Interval in seconds (time between runs)\",\n defaultVal,\n (v: string) => {\n const n = parseInt(v, 10);\n if (isNaN(n) || n < 0) return \"Must be a non-negative integer\";\n return true;\n },\n );\n if (!result) return null;\n return parseInt(result, 10);\n}\n\nasync function gatherTiming(\n frequency: ScheduleFrequency,\n options: SetupOptions,\n defaults: ExistingScheduleDefaults,\n): Promise<{\n day: number | undefined;\n time: string | undefined;\n atTime: string | undefined;\n intervalSeconds: number | undefined;\n} | null> {\n if (frequency === \"loop\") {\n const intervalSeconds = await gatherInterval(\n options.interval,\n defaults.intervalSeconds,\n );\n if (intervalSeconds === null) return null;\n return {\n day: undefined,\n time: undefined,\n atTime: undefined,\n intervalSeconds,\n };\n }\n\n if (frequency === \"once\") {\n const result = await gatherOneTimeSchedule(\n options.day,\n options.time,\n defaults.time,\n );\n if (!result) return null;\n return {\n day: undefined,\n time: undefined,\n atTime: result,\n intervalSeconds: undefined,\n };\n }\n\n const day =\n (await gatherDay(frequency, options.day, defaults.day)) ?? undefined;\n if (day === null && (frequency === \"weekly\" || frequency === \"monthly\")) {\n return null;\n }\n\n const time = await gatherRecurringTime(options.time, defaults.time);\n if (!time) return null;\n\n return { day, time, atTime: undefined, intervalSeconds: undefined };\n}\n\nasync function findExistingSchedule(\n agentId: string,\n scheduleName: string,\n): Promise<ScheduleListItem | undefined> {\n const { schedules } = await listZeroSchedules();\n return schedules.find((s) => {\n return s.agentId === agentId && s.name === scheduleName;\n });\n}\n\ninterface DeployResult {\n created: boolean;\n schedule: {\n triggerType?: \"cron\" | \"once\" | \"loop\";\n timezone: string;\n cronExpression?: string | null;\n nextRunAt?: string | null;\n atTime?: string | null;\n intervalSeconds?: number | null;\n };\n}\n\nasync function buildAndDeploy(params: {\n scheduleName: string;\n agentId: string;\n agentName: string;\n frequency: ScheduleFrequency;\n time: string | undefined;\n day: number | undefined;\n atTime: string | undefined;\n intervalSeconds: number | undefined;\n timezone: string;\n prompt: string;\n existingEnabled: boolean | undefined;\n modelProviderId: string | null | undefined;\n selectedModel: string | null | undefined;\n}): Promise<DeployResult> {\n let cronExpression: string | undefined;\n let atTimeISO: string | undefined;\n\n if (params.frequency === \"loop\") {\n // Loop mode: intervalSeconds is passed directly\n } else if (params.atTime) {\n atTimeISO = toISODateTime(params.atTime);\n } else if (params.time && params.frequency !== \"once\") {\n cronExpression = generateCronExpression(\n params.frequency,\n params.time,\n params.day,\n );\n }\n\n console.log(\n `\\nDeploying schedule for agent ${chalk.cyan(params.agentName)}...`,\n );\n\n // Preserve enabled state on update so loop schedules don't lose nextRunAt.\n // On create, existingEnabled is undefined → omit the field so the server\n // applies its default (disabled; enable happens later via the enable flow).\n const deployResult = await deployZeroSchedule({\n name: params.scheduleName,\n agentId: params.agentId,\n cronExpression,\n atTime: atTimeISO,\n intervalSeconds: params.intervalSeconds,\n timezone: params.timezone,\n prompt: params.prompt,\n ...(params.existingEnabled !== undefined && {\n enabled: params.existingEnabled,\n }),\n ...(params.modelProviderId !== undefined && {\n modelProviderId: params.modelProviderId,\n }),\n ...(params.selectedModel !== undefined && {\n selectedModel: params.selectedModel,\n }),\n });\n\n return deployResult;\n}\n\nfunction displayDeployResult(\n scheduleName: string,\n deployResult: DeployResult,\n): void {\n if (deployResult.created) {\n console.log(chalk.green(`✓ Schedule \"${scheduleName}\" created`));\n } else {\n console.log(chalk.green(`✓ Schedule \"${scheduleName}\" updated`));\n }\n\n console.log(chalk.dim(` Timezone: ${deployResult.schedule.timezone}`));\n\n if (\n deployResult.schedule.triggerType === \"loop\" &&\n deployResult.schedule.intervalSeconds != null\n ) {\n console.log(\n chalk.dim(\n ` Mode: Loop (interval ${deployResult.schedule.intervalSeconds}s)`,\n ),\n );\n } else if (deployResult.schedule.cronExpression) {\n console.log(chalk.dim(` Cron: ${deployResult.schedule.cronExpression}`));\n if (deployResult.schedule.nextRunAt) {\n const nextRun = formatInTimezone(\n deployResult.schedule.nextRunAt,\n deployResult.schedule.timezone,\n );\n console.log(chalk.dim(` Next run: ${nextRun}`));\n }\n } else if (deployResult.schedule.atTime) {\n const atTimeFormatted = formatInTimezone(\n deployResult.schedule.atTime,\n deployResult.schedule.timezone,\n );\n console.log(chalk.dim(` At: ${atTimeFormatted}`));\n }\n}\n\nasync function tryEnableSchedule(\n scheduleName: string,\n agentId: string,\n agentName: string,\n): Promise<void> {\n try {\n await enableZeroSchedule({ name: scheduleName, agentId });\n console.log(chalk.green(`✓ Schedule \"${scheduleName}\" enabled`));\n } catch (error) {\n console.error(chalk.yellow(\"⚠ Failed to enable schedule\"));\n if (error instanceof ApiRequestError) {\n if (error.code === \"SCHEDULE_PAST\") {\n console.error(chalk.dim(\" Scheduled time has already passed\"));\n } else {\n console.error(chalk.dim(` ${error.message}`));\n }\n } else if (error instanceof Error) {\n console.error(chalk.dim(` ${error.message}`));\n }\n console.log(\n ` To enable manually: ${chalk.cyan(`zero schedule enable ${agentName}`)}`,\n );\n }\n}\n\nfunction showEnableHint(agentName: string): void {\n console.log();\n console.log(\n ` To enable: ${chalk.cyan(`zero schedule enable ${agentName}`)}`,\n );\n}\n\nasync function handleScheduleEnabling(params: {\n scheduleName: string;\n agentId: string;\n agentName: string;\n enableFlag: boolean;\n shouldPromptEnable: boolean;\n}): Promise<void> {\n const { scheduleName, agentId, agentName, enableFlag, shouldPromptEnable } =\n params;\n\n if (enableFlag) {\n await tryEnableSchedule(scheduleName, agentId, agentName);\n return;\n }\n\n if (shouldPromptEnable && isInteractive()) {\n const enableNow = await promptConfirm(\"Enable this schedule?\", true);\n if (enableNow) {\n await tryEnableSchedule(scheduleName, agentId, agentName);\n } else {\n showEnableHint(agentName);\n }\n return;\n }\n\n if (shouldPromptEnable) {\n showEnableHint(agentName);\n }\n}\n\nexport const setupCommand = new Command()\n .name(\"setup\")\n .description(\"Create or edit a schedule for a zero agent\")\n .argument(\"<agent-id>\", \"Agent ID\")\n .option(\"-n, --name <schedule-name>\", 'Schedule name (default: \"default\")')\n .option(\"-f, --frequency <type>\", \"Frequency: daily|weekly|monthly|once|loop\")\n .option(\"-t, --time <HH:MM>\", \"Time to run (24-hour format)\")\n .option(\"-d, --day <day>\", \"Day of week (mon-sun) or day of month (1-31)\")\n .option(\"-i, --interval <seconds>\", \"Interval in seconds for loop mode\")\n .option(\"-z, --timezone <tz>\", \"IANA timezone\")\n .option(\"-p, --prompt <text>\", \"Prompt to run\")\n .option(\n \"--prompt-file <path>\",\n \"Read prompt from file (cannot be used with --prompt)\",\n )\n .option(\"-e, --enable\", \"Enable schedule immediately after creation\")\n .option(\n \"--model-provider <id>\",\n \"Model provider UUID, or 'default' to inherit from agent/org\",\n )\n .option(\n \"--model <name>\",\n \"Model name (e.g. claude-sonnet-4-6, MiniMax-M2.7), or 'default' to inherit\",\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n Daily at 9am: zero schedule setup <agent-id> -f daily -t 09:00 -p \"run report\"\n Weekly on Monday: zero schedule setup <agent-id> -f weekly -d mon -t 10:00 -p \"weekly sync\"\n Monthly on the 1st: zero schedule setup <agent-id> -f monthly -d 1 -t 08:00 -p \"monthly review\"\n One-time: zero schedule setup <agent-id> -f once -d 2026-04-01 -t 14:00 -p \"one-off task\"\n Loop every 5 minutes: zero schedule setup <agent-id> -f loop -i 300 -p \"poll for updates\"\n Prompt from file: zero schedule setup <agent-id> -f daily -t 09:00 --prompt-file ./prompt.md\n Create and enable: zero schedule setup <agent-id> -f daily -t 09:00 -p \"run report\" --enable\n Override model: zero schedule setup <agent-id> -f daily -t 09:00 -p \"...\" --model-provider <id> --model MiniMax-M2.7\n Reset model override: zero schedule setup <agent-id> -f daily -t 09:00 -p \"...\" --model-provider default --model default\n\nNotes:\n - Re-running setup with the same agent updates the existing \"default\" schedule\n - Use -n to manage multiple named schedules for the same agent\n - --model-provider and --model default to inheriting the agent's configuration\n - Use 'zero org model-provider list' to see available providers and models\n - All flags are required in non-interactive mode; interactive mode prompts for missing values\n - If the user wants to be notified when a schedule completes, ask them where they want to receive the notification: web chat or Slack, then include it in the prompt`,\n )\n .action(\n withErrorHandler(async (agentIdentifier: string, options: SetupOptions) => {\n // 1. Resolve agent identifier (UUID or name) to compose ID\n const compose = await resolveCompose(agentIdentifier);\n if (!compose) {\n throw new Error(`Agent not found: ${agentIdentifier}`);\n }\n const agentId = compose.id;\n const scheduleName = options.name || \"default\";\n\n // 2. Check for existing schedule\n const existingSchedule = await findExistingSchedule(\n agentId,\n scheduleName,\n );\n\n const agentName = compose.name;\n console.log(\n chalk.dim(\n existingSchedule\n ? `Editing existing schedule for agent ${agentName}`\n : `Creating new schedule for agent ${agentName}`,\n ),\n );\n\n const defaults = getExistingDefaults(existingSchedule);\n\n // 3. Gather frequency\n const frequency = await gatherFrequency(\n options.frequency,\n defaults.frequency,\n );\n if (!frequency) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n\n // 4. Gather day and time\n const timing = await gatherTiming(frequency, options, defaults);\n if (!timing) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n const { day, time, atTime, intervalSeconds } = timing;\n\n // 5. Gather timezone\n const timezone = await gatherTimezone(\n options.timezone,\n existingSchedule?.timezone,\n );\n if (!timezone) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n\n // 6. Gather prompt\n const promptText_ = await gatherPromptText(\n options.prompt,\n options.promptFile,\n existingSchedule?.prompt,\n );\n if (!promptText_) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n\n // 7. Build trigger and deploy\n const deployResult = await buildAndDeploy({\n scheduleName,\n agentId,\n agentName,\n frequency,\n time,\n day,\n atTime,\n intervalSeconds,\n timezone,\n prompt: promptText_,\n existingEnabled: existingSchedule?.enabled,\n modelProviderId: parseModelFlag(options.modelProvider),\n selectedModel: parseModelFlag(options.model),\n });\n\n // 8. Display deployment result\n displayDeployResult(scheduleName, deployResult);\n\n // 9. Handle schedule enabling\n const shouldPromptEnable =\n deployResult.created ||\n (existingSchedule !== undefined && !existingSchedule.enabled);\n\n await handleScheduleEnabling({\n scheduleName,\n agentId,\n agentName,\n enableFlag: options.enable ?? false,\n shouldPromptEnable,\n });\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroSchedules } from \"../../../lib/api\";\nimport { formatRelativeTime } from \"../../../lib/domain/schedule-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all zero schedules\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero schedule list`,\n )\n .action(\n withErrorHandler(async () => {\n const result = await listZeroSchedules();\n\n if (result.schedules.length === 0) {\n console.log(chalk.dim(\"No schedules found\"));\n console.log(\n chalk.dim(\" Create one with: zero schedule setup <agent-id>\"),\n );\n return;\n }\n\n const agentWidth = Math.max(\n 5,\n ...result.schedules.map((s) => {\n return s.agentId.length;\n }),\n );\n const scheduleWidth = Math.max(\n 8,\n ...result.schedules.map((s) => {\n return s.name.length;\n }),\n );\n const triggerWidth = Math.max(\n 7,\n ...result.schedules.map((s) => {\n return s.cronExpression\n ? s.cronExpression.length + s.timezone.length + 3\n : s.atTime?.length || 0;\n }),\n );\n\n const header = [\n \"AGENT\".padEnd(agentWidth),\n \"SCHEDULE\".padEnd(scheduleWidth),\n \"TRIGGER\".padEnd(triggerWidth),\n \"STATUS\".padEnd(8),\n \"NEXT RUN\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n for (const schedule of result.schedules) {\n const trigger = schedule.cronExpression\n ? `${schedule.cronExpression} (${schedule.timezone})`\n : schedule.atTime || \"-\";\n\n const status = schedule.enabled\n ? chalk.green(\"enabled\")\n : chalk.yellow(\"disabled\");\n\n const nextRun = schedule.enabled\n ? formatRelativeTime(schedule.nextRunAt)\n : \"-\";\n\n const row = [\n schedule.agentId.padEnd(agentWidth),\n schedule.name.padEnd(scheduleWidth),\n trigger.padEnd(triggerWidth),\n status.padEnd(8 + (schedule.enabled ? 0 : 2)),\n nextRun,\n ].join(\" \");\n console.log(row);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { resolveZeroScheduleByAgent } from \"../../../lib/api\";\nimport {\n formatDateTime,\n detectTimezone,\n} from \"../../../lib/domain/schedule-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport type { ScheduleResponse } from \"@vm0/api-contracts/contracts/zero-schedules\";\n\n/**\n * Format date with styled relative time (adds chalk formatting)\n */\nfunction formatDateTimeStyled(dateStr: string | null): string {\n if (!dateStr) return chalk.dim(\"-\");\n const formatted = formatDateTime(dateStr);\n return formatted.replace(/\\(([^)]+)\\)$/, chalk.dim(\"($1)\"));\n}\n\n/**\n * Format trigger (cron or at) - timezone shown separately\n */\nfunction formatTrigger(schedule: ScheduleResponse): string {\n if (schedule.triggerType === \"loop\" && schedule.intervalSeconds !== null) {\n return `interval ${schedule.intervalSeconds}s ${chalk.dim(\"(loop)\")}`;\n }\n if (schedule.cronExpression) {\n return schedule.cronExpression;\n }\n if (schedule.atTime) {\n return `${schedule.atTime} ${chalk.dim(\"(one-time)\")}`;\n }\n return chalk.dim(\"-\");\n}\n\n/**\n * Print run configuration section\n */\nfunction printRunConfiguration(\n schedule: ScheduleResponse,\n showFullPrompt: boolean,\n): void {\n const statusText = schedule.enabled\n ? chalk.green(\"enabled\")\n : chalk.yellow(\"disabled\");\n console.log(`${\"Status:\".padEnd(16)}${statusText}`);\n\n console.log(`${\"Agent:\".padEnd(16)}${schedule.agentId}`);\n\n if (showFullPrompt) {\n console.log(`${\"Prompt:\".padEnd(16)}${chalk.dim(schedule.prompt)}`);\n } else {\n const truncated = schedule.prompt.length > 60;\n const promptPreview = truncated\n ? schedule.prompt.slice(0, 57) + \"...\"\n : schedule.prompt;\n console.log(`${\"Prompt:\".padEnd(16)}${chalk.dim(promptPreview)}`);\n if (truncated) {\n console.log(\n chalk.dim(\" Run with --prompt (-p) to see full prompt\"),\n );\n }\n }\n\n if (schedule.vars && Object.keys(schedule.vars).length > 0) {\n console.log(\n `${\"Variables:\".padEnd(16)}${Object.keys(schedule.vars).join(\", \")}`,\n );\n }\n\n if (schedule.secretNames && schedule.secretNames.length > 0) {\n console.log(`${\"Secrets:\".padEnd(16)}${schedule.secretNames.join(\", \")}`);\n }\n\n if (\n schedule.volumeVersions &&\n Object.keys(schedule.volumeVersions).length > 0\n ) {\n console.log(\n `${\"Volumes:\".padEnd(16)}${Object.keys(schedule.volumeVersions).join(\", \")}`,\n );\n }\n}\n\n/**\n * Print time schedule section\n */\nfunction printTimeSchedule(schedule: ScheduleResponse): void {\n console.log();\n console.log(`${\"Trigger:\".padEnd(16)}${formatTrigger(schedule)}`);\n console.log(`${\"Timezone:\".padEnd(16)}${detectTimezone()}`);\n\n if (schedule.enabled) {\n console.log(\n `${\"Next Run:\".padEnd(16)}${formatDateTimeStyled(schedule.nextRunAt)}`,\n );\n }\n\n if (schedule.triggerType === \"loop\" || schedule.triggerType === \"cron\") {\n const failureText =\n schedule.consecutiveFailures > 0\n ? chalk.yellow(`${schedule.consecutiveFailures}/3`)\n : chalk.dim(\"0/3\");\n console.log(`${\"Failures:\".padEnd(16)}${failureText}`);\n }\n}\n\nexport const statusCommand = new Command()\n .name(\"status\")\n .description(\"Show detailed status of a zero schedule\")\n .argument(\"<agent-id>\", \"Agent ID\")\n .option(\n \"-n, --name <schedule-name>\",\n \"Schedule name (required when agent has multiple schedules)\",\n )\n .option(\"-p, --prompt\", \"Show full prompt content without truncation\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero schedule status <agent-id>\n zero schedule status <agent-id> -n my-schedule\n zero schedule status <agent-id> --prompt`,\n )\n .action(\n withErrorHandler(\n async (\n agentName: string,\n options: { name?: string; prompt?: boolean },\n ) => {\n const schedule = await resolveZeroScheduleByAgent(\n agentName,\n options.name,\n );\n\n console.log();\n console.log(`Schedule for agent: ${chalk.cyan(agentName)}`);\n console.log(chalk.dim(\"━\".repeat(50)));\n\n printRunConfiguration(schedule, options.prompt ?? false);\n printTimeSchedule(schedule);\n\n console.log();\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n deleteZeroSchedule,\n resolveZeroScheduleByAgent,\n} 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 schedule\")\n .argument(\"<agent-id>\", \"Agent ID\")\n .option(\n \"-n, --name <schedule-name>\",\n \"Schedule name (required when agent has multiple schedules)\",\n )\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero schedule delete <agent-id>\n zero schedule delete <agent-id> -n my-schedule -y\n\nNotes:\n - Use -y to skip confirmation in non-interactive mode`,\n )\n .action(\n withErrorHandler(\n async (agentName: string, options: { name?: string; yes?: boolean }) => {\n const resolved = await resolveZeroScheduleByAgent(\n agentName,\n options.name,\n );\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 schedule for agent ${chalk.cyan(agentName)}?`,\n false,\n );\n if (!confirmed) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n }\n\n await deleteZeroSchedule({\n name: resolved.name,\n agentId: resolved.agentId,\n });\n\n console.log(chalk.green(`✓ Schedule \"${resolved.name}\" deleted`));\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n enableZeroSchedule,\n resolveZeroScheduleByAgent,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const enableCommand = new Command()\n .name(\"enable\")\n .description(\"Enable a zero schedule\")\n .argument(\"<agent-id>\", \"Agent ID\")\n .option(\n \"-n, --name <schedule-name>\",\n \"Schedule name (required when agent has multiple schedules)\",\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n zero schedule enable <agent-id>\n zero schedule enable <agent-id> -n my-schedule`,\n )\n .action(\n withErrorHandler(async (agentName: string, options: { name?: string }) => {\n const resolved = await resolveZeroScheduleByAgent(\n agentName,\n options.name,\n );\n\n await enableZeroSchedule({\n name: resolved.name,\n agentId: resolved.agentId,\n });\n\n console.log(chalk.green(`✓ Schedule \"${resolved.name}\" enabled`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n disableZeroSchedule,\n resolveZeroScheduleByAgent,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const disableCommand = new Command()\n .name(\"disable\")\n .description(\"Disable a zero schedule\")\n .argument(\"<agent-id>\", \"Agent ID\")\n .option(\n \"-n, --name <schedule-name>\",\n \"Schedule name (required when agent has multiple schedules)\",\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n zero schedule disable <agent-id>\n zero schedule disable <agent-id> -n my-schedule`,\n )\n .action(\n withErrorHandler(async (agentName: string, options: { name?: string }) => {\n const resolved = await resolveZeroScheduleByAgent(\n agentName,\n options.name,\n );\n\n await disableZeroSchedule({\n name: resolved.name,\n agentId: resolved.agentId,\n });\n\n console.log(chalk.green(`✓ Schedule \"${resolved.name}\" disabled`));\n }),\n );\n","import { Command } from \"commander\";\nimport { listCommand } from \"./list\";\nimport { setCommand } from \"./set\";\nimport { deleteCommand } from \"./delete\";\n\nexport const zeroSecretCommand = new Command()\n .name(\"secret\")\n .description(\"Read or write secrets (API keys, tokens)\")\n .addCommand(listCommand)\n .addCommand(setCommand)\n .addCommand(deleteCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getConnectorDerivedNames } from \"@vm0/connectors/connector-utils\";\nimport { listZeroSecrets } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all secrets\")\n .action(\n withErrorHandler(async () => {\n const result = await listZeroSecrets();\n\n if (result.secrets.length === 0) {\n console.log(chalk.dim(\"No secrets found\"));\n console.log();\n console.log(\"To add a secret:\");\n console.log(chalk.cyan(\" zero secret set MY_API_KEY --body <value>\"));\n return;\n }\n\n console.log(chalk.bold(\"Secrets:\"));\n console.log();\n\n for (const secret of result.secrets) {\n let typeIndicator = \"\";\n let derivedLine: string | null = null;\n\n if (secret.type === \"model-provider\") {\n typeIndicator = chalk.dim(\" [model-provider]\");\n } else if (secret.type === \"connector\") {\n const derived = getConnectorDerivedNames(secret.name);\n if (derived) {\n typeIndicator = chalk.dim(` [${derived.connectorLabel} connector]`);\n derivedLine = chalk.dim(\n `Available as: ${derived.envVarNames.join(\", \")}`,\n );\n } else {\n typeIndicator = chalk.dim(\" [connector]\");\n }\n } else if (secret.type === \"user\") {\n const derived = getConnectorDerivedNames(secret.name);\n if (derived) {\n typeIndicator = chalk.dim(` [${derived.connectorLabel} connector]`);\n derivedLine = chalk.dim(\n `Available as: ${derived.envVarNames.join(\", \")}`,\n );\n }\n }\n\n console.log(` ${chalk.cyan(secret.name)}${typeIndicator}`);\n if (derivedLine) {\n console.log(` ${derivedLine}`);\n }\n if (secret.description) {\n console.log(` ${chalk.dim(secret.description)}`);\n }\n console.log(\n ` ${chalk.dim(`Updated: ${new Date(secret.updatedAt).toLocaleString()}`)}`,\n );\n console.log();\n }\n\n console.log(chalk.dim(`Total: ${result.secrets.length} secret(s)`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { setZeroSecret } from \"../../../lib/api\";\nimport { isInteractive, promptPassword } from \"../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const setCommand = new Command()\n .name(\"set\")\n .description(\"Create or update a secret\")\n .argument(\"<name>\", \"Secret name (uppercase, e.g., MY_API_KEY)\")\n .option(\n \"-b, --body <value>\",\n \"Secret value (required in non-interactive mode)\",\n )\n .option(\"-d, --description <description>\", \"Optional description\")\n .action(\n withErrorHandler(\n async (\n name: string,\n options: { body?: string; description?: string },\n ) => {\n let value: string;\n\n if (options.body !== undefined) {\n value = options.body;\n } else if (isInteractive()) {\n const prompted = await promptPassword(\"Enter secret value:\");\n if (prompted === undefined) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n value = prompted;\n } else {\n throw new Error(\"--body is required in non-interactive mode\", {\n cause: new Error(\n `Usage: zero secret set ${name} --body \"your-secret-value\"`,\n ),\n });\n }\n\n let secret;\n try {\n secret = await setZeroSecret({\n name,\n value,\n description: options.description,\n });\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\"must contain only uppercase\")\n ) {\n throw new Error(error.message, {\n cause: new Error(\n \"Examples of valid secret names: MY_API_KEY, GITHUB_TOKEN, AWS_ACCESS_KEY_ID\",\n ),\n });\n }\n throw error;\n }\n\n console.log(chalk.green(`✓ Secret \"${secret.name}\" saved`));\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { deleteZeroSecret } 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 .description(\"Delete a secret\")\n .argument(\"<name>\", \"Secret name to delete\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .action(\n withErrorHandler(async (name: string, options: { yes?: boolean }) => {\n if (!options.yes) {\n if (!isInteractive()) {\n throw new Error(\"--yes flag is required in non-interactive mode\");\n }\n\n const confirmed = await promptConfirm(\n `Are you sure you want to delete secret \"${name}\"?`,\n false,\n );\n\n if (!confirmed) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n }\n\n await deleteZeroSecret(name);\n console.log(chalk.green(`✓ Secret \"${name}\" deleted`));\n }),\n );\n","import { Command } from \"commander\";\nimport { zeroChatMessageCommand } from \"./message\";\n\nexport const zeroChatCommand = new Command()\n .name(\"chat\")\n .description(\"Send messages to web chat threads\")\n .addCommand(zeroChatMessageCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Send to thread: zero chat message send -t <thread-id> --text \"Hello!\"\n Send to agent: zero chat message send -a <agent-id> --text \"Hello!\"`,\n );\n","import { Command } from \"commander\";\nimport { sendCommand } from \"./send\";\n\nexport const zeroChatMessageCommand = new Command()\n .name(\"message\")\n .description(\"Manage chat messages\")\n .addCommand(sendCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n zero chat message send -t <thread-id> --text \"Hello!\"`,\n );\n","import { readFileSync } from \"fs\";\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { sendChatMessage } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const sendCommand = new Command()\n .name(\"send\")\n .description(\"Send a message to a web chat thread\")\n .option(\"-t, --thread <id>\", \"Existing chat thread ID\")\n .option(\"-a, --agent <agentId>\", \"Agent ID (creates a new thread)\")\n .option(\"--text <message>\", \"Message text\")\n .option(\"--title <title>\", \"Thread title (only with --agent)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Send to existing thread: zero chat message send -t <thread-id> --text \"Hello!\"\n Send to agent (new thread): zero chat message send -a <agent-id> --text \"Hello!\"\n\nNotes:\n - Either --thread or --agent is required; they are mutually exclusive\n - --text is required (or pipe via stdin)`,\n )\n .action(\n withErrorHandler(\n async (options: {\n thread?: string;\n agent?: string;\n text?: string;\n title?: string;\n }) => {\n let text = options.text;\n const { thread, agent, title } = options;\n\n // Validate mutual exclusion: exactly one of --thread or --agent\n if (!thread && !agent) {\n throw new Error(\"Either --thread or --agent must be provided\", {\n cause: new Error(\n 'Usage: zero chat message send -t THREAD_ID --text \"your message\"\\n zero chat message send -a AGENT_ID --text \"your message\"',\n ),\n });\n }\n if (thread && agent) {\n throw new Error(\"--thread and --agent are mutually exclusive\", {\n cause: new Error(\n \"Provide either --thread to send to an existing thread or --agent to create a new thread, not both\",\n ),\n });\n }\n\n // Read from stdin if text not provided and stdin is explicitly piped\n if (!text && process.stdin.isTTY === false) {\n text = readFileSync(\"/dev/stdin\", \"utf8\").trim();\n }\n\n if (!text) {\n throw new Error(\"--text is required\", {\n cause: new Error(\n 'Usage: zero chat message send -t THREAD_ID --text \"your message\"',\n ),\n });\n }\n\n const result = await sendChatMessage({\n thread: thread || undefined,\n agent: agent || undefined,\n text,\n title: title || undefined,\n });\n\n console.log(\n chalk.green(\n `✓ Message sent (id: ${result.messageId}, thread: ${result.threadId})`,\n ),\n );\n },\n ),\n );\n","import { Command } from \"commander\";\nimport { zeroSlackMessageCommand } from \"./message\";\nimport { uploadFileCommand } from \"./upload-file\";\nimport { downloadFileCommand } from \"./download-file\";\n\nexport const zeroSlackCommand = new Command()\n .name(\"slack\")\n .description(\n \"Send messages, upload files, and download files from Slack as the bot\",\n )\n .addCommand(zeroSlackMessageCommand)\n .addCommand(uploadFileCommand)\n .addCommand(downloadFileCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Send a message: zero slack message send -c <channel-id> -t \"Hello!\"\n Reply in a thread: zero slack message send -c <channel-id> --thread <ts> -t \"reply\"\n Upload a file: zero slack upload-file -f /tmp/report.pdf -c <channel-id>\n Download a file: zero slack download-file <file-id> -o /tmp/out.png`,\n );\n","import { Command } from \"commander\";\nimport { sendCommand } from \"./send\";\n\nexport const zeroSlackMessageCommand = new Command()\n .name(\"message\")\n .description(\"Manage Slack messages\")\n .addCommand(sendCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n zero slack message send -c <channel-id> -t \"Hello!\"`,\n );\n","import { readFileSync } from \"fs\";\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { sendSlackMessage } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const sendCommand = new Command()\n .name(\"send\")\n .description(\"Send a message to a Slack channel or DM a user\")\n .option(\"-c, --channel <id>\", \"Channel ID\")\n .option(\"-u, --user <id>\", 'Slack user ID for DM (use \"me\" for yourself)')\n .option(\"-t, --text <message>\", \"Message text\")\n .option(\"--thread <ts>\", \"Thread timestamp for replies\")\n .option(\"--blocks <json>\", \"Block Kit JSON string\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Simple message: zero slack message send -c C01234 -t \"Hello!\"\n DM a user: zero slack message send -u U0A8V9X98QJ -t \"Hello!\"\n DM yourself: zero slack message send -u me -t \"Hello!\"\n Reply in thread: zero slack message send -c C01234 --thread 1234567890.123456 -t \"reply\"\n Rich blocks: zero slack message send -c C01234 --blocks '[{\"type\":\"section\",\"text\":{\"type\":\"mrkdwn\",\"text\":\"*Bold*\"}}]'\n\nNotes:\n - Either --channel or --user is required; they are mutually exclusive\n - Either --text or --blocks is required; both can be used together`,\n )\n .action(\n withErrorHandler(\n async (options: {\n channel?: string;\n user?: string;\n text?: string;\n thread?: string;\n blocks?: string;\n }) => {\n let text = options.text;\n const { channel, user, thread, blocks: blocksStr } = options;\n\n // Validate mutual exclusion: exactly one of --channel or --user\n if (!channel && !user) {\n throw new Error(\"Either --channel or --user must be provided\", {\n cause: new Error(\n 'Usage: zero slack message send -c CHANNEL_ID -t \"your message\"\\n zero slack message send -u USER_ID -t \"your message\"',\n ),\n });\n }\n if (channel && user) {\n throw new Error(\"--channel and --user are mutually exclusive\", {\n cause: new Error(\n \"Provide either --channel to send to a channel or --user to DM a user, not both\",\n ),\n });\n }\n\n // Read from stdin if text not provided and stdin is explicitly piped\n // (isTTY is false when piped, undefined when no TTY context e.g. tests)\n if (!text && process.stdin.isTTY === false) {\n text = readFileSync(\"/dev/stdin\", \"utf8\").trim();\n }\n\n // Parse blocks JSON if provided\n let blocks: Array<{ type: string; [key: string]: unknown }> | undefined;\n if (blocksStr) {\n try {\n blocks = JSON.parse(blocksStr) as Array<{\n type: string;\n [key: string]: unknown;\n }>;\n } catch {\n throw new Error(\"Invalid JSON for --blocks flag\", {\n cause: new Error(\n \"Provide a valid JSON array of Block Kit blocks\",\n ),\n });\n }\n }\n\n // Validate at least one of text or blocks\n if (!text && !blocks) {\n throw new Error(\"Either --text or --blocks must be provided\", {\n cause: new Error(\n 'Usage: zero slack message send -c CHANNEL_ID -t \"your message\"',\n ),\n });\n }\n\n const result = await sendSlackMessage({\n channel: channel || undefined,\n user: user || undefined,\n text: text || undefined,\n threadTs: thread,\n blocks,\n });\n\n const tsInfo = result.ts ? ` (ts: ${result.ts})` : \"\";\n console.log(chalk.green(`✓ Message sent${tsInfo}`));\n },\n ),\n );\n","import { statSync, readFileSync } from \"fs\";\nimport { basename } from \"path\";\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { initSlackFileUpload, completeSlackFileUpload } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const uploadFileCommand = new Command()\n .name(\"upload-file\")\n .description(\"Upload a file to a Slack channel as the bot\")\n .requiredOption(\"-f, --file <path>\", \"Local file path to upload\")\n .requiredOption(\"-c, --channel <id>\", \"Slack channel ID\")\n .option(\"--thread <ts>\", \"Thread timestamp to post as a reply\")\n .option(\"--title <title>\", \"Display title for the file\")\n .option(\"--comment <text>\", \"Initial comment to accompany the file\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Upload a file: zero slack upload-file -f /tmp/report.pdf -c C01234\n Upload to thread: zero slack upload-file -f /tmp/log.txt -c C01234 --thread 1234567890.123456\n With title and comment: zero slack upload-file -f /tmp/data.csv -c C01234 --title \"Daily Report\" --comment \"Here's the report\"\n\nNotes:\n - Uses the bot token (not user SLACK_TOKEN), so no files:write permission is needed\n - Returns file_id and permalink for reference`,\n )\n .action(\n withErrorHandler(\n async (options: {\n file: string;\n channel: string;\n thread?: string;\n title?: string;\n comment?: string;\n }) => {\n // Validate file exists and get size\n let fileSize: number;\n try {\n const stat = statSync(options.file);\n fileSize = stat.size;\n } catch {\n throw new Error(`File not found: ${options.file}`);\n }\n\n if (fileSize === 0) {\n throw new Error(\"File is empty\");\n }\n\n const filename = basename(options.file);\n\n // Step 1: Get pre-signed upload URL from server\n const { uploadUrl, fileId } = await initSlackFileUpload({\n filename,\n length: fileSize,\n });\n\n // Step 2: Upload file directly to Slack's pre-signed URL\n const fileContent = readFileSync(options.file);\n const uploadResponse = await fetch(uploadUrl, {\n method: \"POST\",\n body: fileContent,\n });\n\n if (!uploadResponse.ok) {\n throw new Error(\n `File upload failed: ${uploadResponse.status} ${uploadResponse.statusText}`,\n );\n }\n\n // Step 3: Complete the upload and share to channel/thread\n const result = await completeSlackFileUpload({\n fileId,\n channel: options.channel,\n threadTs: options.thread,\n title: options.title,\n initialComment: options.comment,\n });\n\n console.log(chalk.green(`✓ File uploaded (file_id: ${result.fileId})`));\n console.log(chalk.dim(` permalink: ${result.permalink}`));\n },\n ),\n );\n","import { join } from \"path\";\nimport { tmpdir } from \"os\";\nimport { Command } from \"commander\";\nimport { downloadSlackFile } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\n/**\n * Derive a local output path for a Slack file id.\n * Uses the system temp directory; extension is appended later once the\n * mimetype is known.\n */\nfunction defaultOutPath(fileId: string): string {\n return join(tmpdir(), `slack-${fileId}`);\n}\n\nexport const downloadFileCommand = new Command()\n .name(\"download-file\")\n .description(\"Download a Slack file by id using the bot token\")\n .argument(\"<file-id>\", \"Slack file id (e.g. F01234ABCD)\")\n .option(\n \"-o, --out <path>\",\n \"Output path for the downloaded file (default: /tmp/slack-<file-id>)\",\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n Download to default temp path: zero slack download-file F01234ABCD\n Download to explicit path: zero slack download-file F01234ABCD -o /tmp/image.png\n\nOutput:\n Prints a JSON object to stdout on success:\n {\"path\":\"/tmp/slack-F01234ABCD\",\"mimetype\":\"image/png\",\"size\":12345}\n\nHow to read the downloaded file:\n - Images (png/jpg/gif/webp/svg): open the file path with your image viewing tool\n - Videos (mp4/mov/webm): extract frames first with\n ffmpeg -i <path> -vf \"fps=1\" -q:v 2 /tmp/<file-id>_frame_%03d.jpg\n then view the extracted frames\n - PDF/text/csv/json/markdown: read the file directly\n\nNotes:\n - Uses the bot token on the server side; no user Slack token is needed\n - Streams the file bytes directly to disk`,\n )\n .action(\n withErrorHandler(async (fileId: string, options: { out?: string }) => {\n const outPath = options.out ?? defaultOutPath(fileId);\n const result = await downloadSlackFile(fileId, outPath);\n console.log(JSON.stringify(result));\n }),\n );\n","import { Command } from \"commander\";\nimport { zeroTelegramBotCommand } from \"./bot\";\nimport { downloadFileCommand } from \"./download-file\";\nimport { zeroTelegramMessageCommand } from \"./message\";\nimport { uploadFileCommand } from \"./upload-file\";\n\nexport const zeroTelegramCommand = new Command()\n .name(\"telegram\")\n .description(\n \"Inspect bots, send messages, upload files, and download files from Telegram\",\n )\n .addCommand(zeroTelegramBotCommand)\n .addCommand(zeroTelegramMessageCommand)\n .addCommand(downloadFileCommand)\n .addCommand(uploadFileCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n List bots: zero telegram bot list\n Send a message: zero telegram message send --bot-id <bot-id> -c <chat-id> -t \"Hello!\"\n Upload a file: zero telegram upload-file -f /tmp/report.pdf --bot-id <bot-id> -c <chat-id>\n Download a file: zero telegram download-file <file-id> --bot-id <bot-id> -o /tmp/out.jpg`,\n );\n","import { Command } from \"commander\";\nimport { listCommand } from \"./list\";\n\nexport const zeroTelegramBotCommand = new Command()\n .name(\"bot\")\n .description(\"Inspect Telegram bots\")\n .addCommand(listCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n zero telegram bot list`,\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listTelegramBots } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\nimport type { TelegramBotListItem } from \"@vm0/api-contracts/contracts/integrations\";\n\nfunction usernameLabel(bot: TelegramBotListItem): string {\n if (!bot.username) return \"-\";\n return bot.username.startsWith(\"@\") ? bot.username : `@${bot.username}`;\n}\n\nfunction statusLabel(bot: TelegramBotListItem): string {\n if (bot.tokenStatus === \"valid\") return chalk.green(\"valid\");\n if (bot.tokenStatus === \"invalid\") return chalk.red(\"invalid\");\n return chalk.yellow(\"unknown\");\n}\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List Telegram bots available in the active organization\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero telegram bot list\n\nNotes:\n - Use this to find the --bot-id value before sending Telegram messages.`,\n )\n .action(\n withErrorHandler(async () => {\n const result = await listTelegramBots();\n const { bots } = result;\n\n if (bots.length === 0) {\n console.log(chalk.dim(\"No Telegram bots found\"));\n console.log(\n chalk.dim(\" Add one from Settings > Integrations > Telegram\"),\n );\n return;\n }\n\n const botIdWidth = Math.max(\n 6,\n ...bots.map((bot) => {\n return bot.id.length;\n }),\n );\n const usernameWidth = Math.max(\n 8,\n ...bots.map((bot) => {\n return usernameLabel(bot).length;\n }),\n );\n const agentWidth = Math.max(\n 5,\n ...bots.map((bot) => {\n return (bot.agent?.name ?? \"-\").length;\n }),\n );\n\n const header = [\n \"BOT ID\".padEnd(botIdWidth),\n \"USERNAME\".padEnd(usernameWidth),\n \"AGENT\".padEnd(agentWidth),\n \"CONNECTED\",\n \"TOKEN\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n for (const bot of bots) {\n const row = [\n bot.id.padEnd(botIdWidth),\n usernameLabel(bot).padEnd(usernameWidth),\n (bot.agent?.name ?? \"-\").padEnd(agentWidth),\n (bot.isConnected ? \"yes\" : \"no\").padEnd(9),\n statusLabel(bot),\n ].join(\" \");\n console.log(row);\n }\n }),\n );\n","import { join } from \"path\";\nimport { tmpdir } from \"os\";\nimport { Command } from \"commander\";\nimport { downloadTelegramFile } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\n/**\n * Derive a local output path for a Telegram file id.\n * Uses the system temp directory.\n */\nfunction defaultOutPath(fileId: string): string {\n return join(tmpdir(), `telegram-${fileId}`);\n}\n\nexport const downloadFileCommand = new Command()\n .name(\"download-file\")\n .description(\"Download a Telegram file by id using the bot token\")\n .argument(\"<file-id>\", \"Telegram file id from a [Telegram file] block\")\n .option(\n \"-o, --out <path>\",\n \"Output path for the downloaded file (default: /tmp/telegram-<file-id>)\",\n )\n .requiredOption(\n \"--bot-id <bot-id>\",\n \"Telegram bot id from the [Telegram file] block\",\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n Download to default temp path: zero telegram download-file AgACAgUAAxkBAA --bot-id 123456789\n Download to explicit path: zero telegram download-file AgACAgUAAxkBAA --bot-id 123456789 -o /tmp/photo.jpg\n\nOutput:\n Prints a JSON object to stdout on success:\n {\"path\":\"/tmp/telegram-AgACAgUAAxkBAA\",\"mimetype\":\"image/jpeg\",\"size\":12345}\n\nHow to read the downloaded file:\n - Images (png/jpg/gif/webp/svg): open the file path with your image viewing tool\n - Videos (mp4/mov/webm): extract frames first with\n ffmpeg -i <path> -vf \"fps=1\" -q:v 2 /tmp/<file-id>_frame_%03d.jpg\n then view the extracted frames\n - PDF/text/csv/json/markdown: read the file directly\n\nNotes:\n - Uses the Telegram bot token on the server side\n - Streams the file bytes directly to disk`,\n )\n .action(\n withErrorHandler(\n async (fileId: string, options: { out?: string; botId: string }) => {\n const outPath = options.out ?? defaultOutPath(fileId);\n const result = await downloadTelegramFile(\n fileId,\n options.botId,\n outPath,\n );\n console.log(JSON.stringify(result));\n },\n ),\n );\n","import { Command } from \"commander\";\nimport { sendCommand } from \"./send\";\n\nexport const zeroTelegramMessageCommand = new Command()\n .name(\"message\")\n .description(\"Manage Telegram messages\")\n .addCommand(sendCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n zero telegram message send --bot-id <bot-id> -c <chat-id> -t \"Hello!\"`,\n );\n","import { readFileSync } from \"fs\";\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { sendTelegramMessage } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nfunction parsePositiveInteger(value: string, flag: string): number {\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(`${flag} must be a positive integer`);\n }\n return parsed;\n}\n\nexport const sendCommand = new Command()\n .name(\"send\")\n .description(\"Send a message to a Telegram chat as the bot\")\n .requiredOption(\"--bot-id <id>\", \"Telegram bot ID\")\n .requiredOption(\"-c, --chat-id <id>\", \"Telegram chat ID\")\n .option(\"-t, --text <message>\", \"Message text\")\n .option(\"--reply-to-message-id <id>\", \"Message ID to reply to\")\n .option(\"--message-thread-id <id>\", \"Telegram forum topic thread ID\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Simple message: zero telegram message send --bot-id 123456789 -c -1001234567890 -t \"Hello!\"\n Reply to message: zero telegram message send --bot-id 123456789 -c -1001234567890 --reply-to-message-id 42 -t \"reply\"\n Forum topic message: zero telegram message send --bot-id 123456789 -c -1001234567890 --message-thread-id 7 -t \"topic update\"\n\nNotes:\n - Message text can be provided with --text or piped on stdin\n - Choose an explicit --bot-id. Run \"zero telegram bot list\" to inspect available bots.`,\n )\n .action(\n withErrorHandler(\n async (options: {\n botId: string;\n chatId: string;\n text?: string;\n replyToMessageId?: string;\n messageThreadId?: string;\n }) => {\n let text = options.text;\n if (!text && process.stdin.isTTY === false) {\n text = readFileSync(\"/dev/stdin\", \"utf8\").trim();\n }\n\n if (!text) {\n throw new Error(\"Either --text or piped stdin must be provided\", {\n cause: new Error(\n 'Usage: zero telegram message send --bot-id BOT_ID -c CHAT_ID -t \"your message\"',\n ),\n });\n }\n\n const result = await sendTelegramMessage({\n botId: options.botId,\n chatId: options.chatId,\n text,\n replyToMessageId: options.replyToMessageId\n ? parsePositiveInteger(\n options.replyToMessageId,\n \"reply-to-message-id\",\n )\n : undefined,\n messageThreadId: options.messageThreadId\n ? parsePositiveInteger(options.messageThreadId, \"message-thread-id\")\n : undefined,\n });\n\n console.log(\n chalk.green(`✓ Message sent (message_id: ${result.messageId})`),\n );\n },\n ),\n );\n","import { readFileSync, statSync } from \"fs\";\nimport { basename, extname } from \"path\";\nimport { Command } from \"commander\";\nimport {\n completeTelegramFileUpload,\n initTelegramFileUpload,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nconst MIME_BY_EXTENSION: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".svg\": \"image/svg+xml\",\n \".mp4\": \"video/mp4\",\n \".webm\": \"video/webm\",\n \".mov\": \"video/quicktime\",\n \".pdf\": \"application/pdf\",\n \".txt\": \"text/plain\",\n \".csv\": \"text/csv\",\n \".md\": \"text/markdown\",\n \".json\": \"application/json\",\n};\n\nfunction inferContentType(localPath: string): string {\n const ext = extname(localPath).toLowerCase();\n return MIME_BY_EXTENSION[ext] ?? \"application/octet-stream\";\n}\n\nfunction parseMessageThreadId(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const parsed = Number(value);\n if (!Number.isSafeInteger(parsed) || parsed <= 0) {\n throw new Error(\"message-thread-id must be a positive integer\");\n }\n return parsed;\n}\n\nexport const uploadFileCommand = new Command()\n .name(\"upload-file\")\n .description(\"Upload a local file to a Telegram chat as the bot\")\n .requiredOption(\"-f, --file <path>\", \"Local file path to upload\")\n .requiredOption(\"--bot-id <bot-id>\", \"Telegram bot id to send through\")\n .requiredOption(\"-c, --chat-id <chat-id>\", \"Telegram chat id or @channel\")\n .option(\"--caption <text>\", \"Caption to accompany the file\")\n .option(\"--message-thread-id <id>\", \"Forum topic message thread id\")\n .option(\"--content-type <mime>\", \"Override inferred content type\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Upload a file: zero telegram upload-file -f /tmp/report.pdf --bot-id 123456789 -c -1001234567890\n Upload to a topic: zero telegram upload-file -f /tmp/log.txt --bot-id 123456789 -c -1001234567890 --message-thread-id 42\n With a caption: zero telegram upload-file -f /tmp/data.csv --bot-id 123456789 -c @channel --caption \"Daily report\"\n\nOutput:\n Prints a JSON object to stdout on success:\n {\"messageId\":123,\"chatId\":\"-1001234567890\",\"fileId\":\"...\",\"filename\":\"report.pdf\",\"mimetype\":\"application/pdf\",\"size\":12345,\"url\":\"https://...\"}\n\nNotes:\n - Uses the Telegram bot token on the server side\n - Uploads through VM0 storage first, then asks Telegram to fetch the file URL\n - VM0 does not apply file type or size restrictions before calling Telegram`,\n )\n .action(\n withErrorHandler(\n async (options: {\n file: string;\n botId: string;\n chatId: string;\n caption?: string;\n messageThreadId?: string;\n contentType?: string;\n }) => {\n let fileSize: number;\n try {\n const stat = statSync(options.file);\n if (!stat.isFile()) {\n throw new Error(`Not a regular file: ${options.file}`);\n }\n fileSize = stat.size;\n } catch (error) {\n if (error instanceof Error && error.message.startsWith(\"Not \")) {\n throw error;\n }\n throw new Error(`File not found: ${options.file}`);\n }\n\n if (fileSize === 0) {\n throw new Error(\"File is empty\");\n }\n const filename = basename(options.file);\n const contentType =\n options.contentType ?? inferContentType(options.file);\n const messageThreadId = parseMessageThreadId(options.messageThreadId);\n\n const prepared = await initTelegramFileUpload({\n filename,\n contentType,\n length: fileSize,\n });\n\n const fileContent = readFileSync(options.file);\n const uploadResponse = await fetch(prepared.uploadUrl, {\n method: \"PUT\",\n headers: { \"Content-Type\": prepared.contentType },\n body: new Uint8Array(fileContent),\n });\n\n if (!uploadResponse.ok) {\n throw new Error(\n `File upload failed: ${uploadResponse.status} ${uploadResponse.statusText}`,\n );\n }\n\n const result = await completeTelegramFileUpload({\n uploadId: prepared.uploadId,\n botId: options.botId,\n chatId: options.chatId,\n contentType: prepared.contentType,\n caption: options.caption,\n messageThreadId,\n });\n\n console.log(JSON.stringify(result));\n },\n ),\n );\n","import { Command } from \"commander\";\nimport { listCommand } from \"./list\";\nimport { setCommand } from \"./set\";\nimport { deleteCommand } from \"./delete\";\n\nexport const zeroVariableCommand = new Command()\n .name(\"variable\")\n .description(\"Read or write non-sensitive configuration values\")\n .addCommand(listCommand)\n .addCommand(setCommand)\n .addCommand(deleteCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroVariables } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\n/**\n * Truncate value for display if too long\n */\nfunction truncateValue(value: string, maxLength: number = 60): string {\n if (value.length <= maxLength) {\n return value;\n }\n return value.slice(0, maxLength - 15) + \"... [truncated]\";\n}\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all variables\")\n .action(\n withErrorHandler(async () => {\n const result = await listZeroVariables();\n\n if (result.variables.length === 0) {\n console.log(chalk.dim(\"No variables found\"));\n console.log();\n console.log(\"To add a variable:\");\n console.log(chalk.cyan(\" zero variable set MY_VAR <value>\"));\n return;\n }\n\n console.log(chalk.bold(\"Variables:\"));\n console.log();\n\n for (const variable of result.variables) {\n const displayValue = truncateValue(variable.value);\n console.log(` ${chalk.cyan(variable.name)} = ${displayValue}`);\n if (variable.description) {\n console.log(` ${chalk.dim(variable.description)}`);\n }\n console.log(\n ` ${chalk.dim(`Updated: ${new Date(variable.updatedAt).toLocaleString()}`)}`,\n );\n console.log();\n }\n\n console.log(chalk.dim(`Total: ${result.variables.length} variable(s)`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { setZeroVariable } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const setCommand = new Command()\n .name(\"set\")\n .description(\"Create or update a variable\")\n .argument(\"<name>\", \"Variable name (uppercase, e.g., MY_VAR)\")\n .argument(\"<value>\", \"Variable value\")\n .option(\"-d, --description <description>\", \"Optional description\")\n .action(\n withErrorHandler(\n async (\n name: string,\n value: string,\n options: { description?: string },\n ) => {\n let variable;\n try {\n variable = await setZeroVariable({\n name,\n value,\n description: options.description,\n });\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\"must contain only uppercase\")\n ) {\n throw new Error(error.message, {\n cause: new Error(\n \"Examples of valid variable names: MY_VAR, API_URL, DEBUG_MODE\",\n ),\n });\n }\n throw error;\n }\n\n console.log(chalk.green(`✓ Variable \"${variable.name}\" saved`));\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { deleteZeroVariable } 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 .description(\"Delete a variable\")\n .argument(\"<name>\", \"Variable name to delete\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .action(\n withErrorHandler(async (name: string, options: { yes?: boolean }) => {\n if (!options.yes) {\n if (!isInteractive()) {\n throw new Error(\"--yes flag is required in non-interactive mode\");\n }\n\n const confirmed = await promptConfirm(\n `Are you sure you want to delete variable \"${name}\"?`,\n false,\n );\n\n if (!confirmed) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n }\n\n await deleteZeroVariable(name);\n console.log(chalk.green(`✓ Variable \"${name}\" deleted`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n getApiUrl,\n getActiveOrg,\n getToken,\n decodeZeroTokenPayload,\n} from \"../../lib/api/config\";\nimport {\n listZeroConnectors,\n getZeroAgent,\n getZeroAgentUserConnectors,\n} from \"../../lib/api\";\nimport { withErrorHandler } from \"../../lib/command\";\nimport {\n isFirewallConnectorType,\n getConnectorFirewall,\n resolveFirewallPolicies,\n} from \"@vm0/connectors/firewalls\";\nimport type { FirewallPolicies } from \"@vm0/connectors/firewall-types\";\nimport { policyIcon } from \"../../lib/utils/format-utils\";\n\n/**\n * Detect if running inside a zero sandbox (agent runtime).\n * Uses ZERO_AGENT_ID (not VM0_RUN_ID) because the zero CLI operates in the\n * zero agent context where ZERO_AGENT_ID is the canonical sandbox indicator.\n */\nfunction isInsideSandbox(): boolean {\n return !!process.env.ZERO_AGENT_ID;\n}\n\nfunction formatConnectorIdentity(connector: {\n externalUsername: string | null;\n externalEmail: string | null;\n needsReconnect: boolean;\n}): string {\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 (connector.needsReconnect) {\n identity += ` ${chalk.yellow(\"(needs reconnect)\")}`;\n }\n return identity;\n}\n\nfunction printConnectorPermissions(\n type: string,\n resolvedPolicies: FirewallPolicies | null,\n): void {\n if (!isFirewallConnectorType(type)) return;\n\n const refPolicy = resolvedPolicies?.[type];\n if (!refPolicy) {\n console.log(chalk.dim(\" full access — no permission rules configured\"));\n return;\n }\n\n const config = getConnectorFirewall(type);\n const permissions = config.apis.flatMap((a) => {\n return a.permissions ?? [];\n });\n\n if (\n permissions.length === 0 &&\n Object.keys(refPolicy.policies).length === 0\n ) {\n const unknownIcon = policyIcon(refPolicy.unknownPolicy ?? \"allow\");\n console.log(` ${unknownIcon} unknown endpoints`);\n return;\n }\n\n const nameWidth = Math.max(\n \"unknown endpoints\".length,\n ...permissions.map((p) => {\n return p.name.length;\n }),\n );\n\n for (const perm of permissions) {\n const policy = refPolicy.policies[perm.name] ?? \"deny\";\n const icon = policyIcon(policy);\n const desc = perm.description ?? \"\";\n console.log(` ${icon} ${perm.name.padEnd(nameWidth)} ${desc}`);\n }\n\n const unknownIcon = policyIcon(refPolicy.unknownPolicy ?? \"allow\");\n console.log(\n ` ${unknownIcon} ${\"unknown endpoints\".padEnd(nameWidth)} Endpoints not matching any rule`,\n );\n}\n\nasync function showSandboxInfo(showPermissions: boolean): Promise<void> {\n const agentId = process.env.ZERO_AGENT_ID;\n const payload = decodeZeroTokenPayload();\n\n console.log(`Agent ID: ${agentId}`);\n console.log(`Run ID: ${payload?.runId ?? chalk.dim(\"unavailable\")}`);\n console.log(`Org ID: ${payload?.orgId ?? chalk.dim(\"unavailable\")}`);\n\n // Capabilities section\n if (payload?.capabilities?.length) {\n console.log();\n console.log(chalk.bold(\"Capabilities:\"));\n console.log(` ${payload.capabilities.join(\", \")}`);\n }\n\n // Connected Services section\n try {\n if (showPermissions) {\n // Full mode: fetch all 3 APIs for permission details\n const [connectorsResult, agentResult, enabledResult] =\n await Promise.allSettled([\n listZeroConnectors(),\n getZeroAgent(agentId!),\n getZeroAgentUserConnectors(agentId!),\n ]);\n\n if (connectorsResult.status === \"rejected\") return;\n\n const identities = connectorsResult.value.connectors.filter((c) => {\n return c.externalUsername !== null || c.externalEmail !== null;\n });\n\n if (identities.length === 0) return;\n\n let resolvedPolicies: FirewallPolicies | null = null;\n const permissionDataAvailable =\n agentResult.status === \"fulfilled\" &&\n enabledResult.status === \"fulfilled\";\n if (permissionDataAvailable) {\n resolvedPolicies = resolveFirewallPolicies(\n agentResult.value.permissionPolicies,\n enabledResult.value,\n );\n }\n\n console.log();\n console.log(chalk.bold(\"Connectors:\"));\n for (const connector of identities) {\n const identity = formatConnectorIdentity(connector);\n console.log(` ${connector.type.padEnd(14)}${identity}`);\n\n if (permissionDataAvailable) {\n printConnectorPermissions(connector.type, resolvedPolicies);\n }\n }\n } else {\n // Default mode: only fetch connector identities (1 API call)\n const connectors = await listZeroConnectors();\n const identities = connectors.connectors.filter((c) => {\n return c.externalUsername !== null || c.externalEmail !== null;\n });\n\n if (identities.length === 0) return;\n\n console.log();\n console.log(chalk.bold(\"Connectors:\"));\n for (const connector of identities) {\n const identity = formatConnectorIdentity(connector);\n console.log(` ${connector.type.padEnd(14)}${identity}`);\n }\n }\n } catch {\n // Silently skip — connector info is supplementary\n }\n}\n\nasync function showLocalInfo(): Promise<void> {\n const token = await getToken();\n const apiUrl = await getApiUrl();\n const activeOrg = await getActiveOrg();\n\n // Auth section\n console.log(chalk.bold(\"Auth:\"));\n if (token) {\n const tokenSource = process.env.ZERO_TOKEN\n ? \"ZERO_TOKEN env var\"\n : process.env.VM0_TOKEN\n ? \"VM0_TOKEN env var\"\n : \"config file\";\n console.log(\n ` Status: ${chalk.green(\"Authenticated\")} (via ${tokenSource})`,\n );\n } else {\n console.log(` Status: ${chalk.dim(\"Not authenticated\")}`);\n }\n console.log(` API: ${apiUrl}`);\n console.log();\n\n // Org section\n if (activeOrg) {\n console.log(chalk.bold(\"Org:\"));\n console.log(` Active: ${activeOrg}`);\n }\n}\n\nexport const zeroWhoamiCommand = new Command()\n .name(\"whoami\")\n .description(\"Show agent identity, run ID, and capabilities\")\n .option(\"--permissions\", \"Show full permission details for each connector\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero whoami\n zero whoami --permissions\n\nNotes:\n - Inside sandbox: shows agent ID, run ID, org ID, and granted capabilities\n - Use --permissions to see detailed permission breakdown per connector\n - Your agent ID is also available as $ZERO_AGENT_ID`,\n )\n .action(\n withErrorHandler(async (options: { permissions?: boolean }) => {\n if (isInsideSandbox()) {\n await showSandboxInfo(options.permissions ?? false);\n } else {\n await showLocalInfo();\n }\n }),\n );\n","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 zeroSkillCommand = new Command(\"skill\")\n .description(\"Manage custom skills\")\n .addCommand(createCommand)\n .addCommand(editCommand)\n .addCommand(viewCommand)\n .addCommand(listCommand)\n .addCommand(deleteCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Create from directory: zero skill create my-skill --dir ./skills/my-skill/\n List all skills: zero skill list\n View skill content: zero skill view my-skill\n Update skill content: zero skill edit my-skill --dir ./skills/my-skill/\n Delete a skill: zero skill delete my-skill -y\n\nSkill Binding:\n Bind to agent: zero agent edit <id> --add-skill my-skill\n Unbind from agent: zero agent edit <id> --remove-skill my-skill\n Replace all skills: zero agent edit <id> --skills a,b,c`,\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { createSkill } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { readSkillDirectory } from \"../../../lib/skill-directory\";\n\nexport const createCommand = new Command()\n .name(\"create\")\n .description(\"Create a custom skill in the organization\")\n .argument(\"<name>\", \"Skill name (lowercase alphanumeric with hyphens)\")\n .requiredOption(\"--dir <path>\", \"Path to directory containing SKILL.md\")\n .option(\"--display-name <name>\", \"Skill display name\")\n .option(\"--description <text>\", \"Skill description\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero skill create my-skill --dir ./skills/my-skill/\n zero skill create my-skill --dir ./skills/my-skill/ --display-name \"My Skill\" --description \"Does things\"\n\nNotes:\n - The directory must contain a SKILL.md file\n - All files in the directory are uploaded (hidden files and node_modules excluded)\n - The skill is created in the organization but not bound to any agent\n - Use 'zero agent edit <id> --add-skill <name>' to bind a skill to an agent`,\n )\n .action(\n withErrorHandler(\n async (\n name: string,\n options: {\n dir: string;\n displayName?: string;\n description?: string;\n },\n ) => {\n const files = readSkillDirectory(options.dir);\n\n const skill = await createSkill({\n name,\n files,\n displayName: options.displayName,\n description: options.description,\n });\n\n console.log(chalk.green(`✓ Skill \"${skill.name}\" created`));\n console.log(` Name: ${skill.name}`);\n console.log(` Files: ${files.length} file(s)`);\n if (skill.displayName) {\n console.log(` Display Name: ${skill.displayName}`);\n }\n if (skill.description) {\n console.log(` Description: ${skill.description}`);\n }\n },\n ),\n );\n","import { readFileSync, readdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nconst IGNORED_NAMES = new Set([\"node_modules\", \".git\", \".DS_Store\"]);\n\n/**\n * Recursively read all files from a skill directory.\n *\n * Skips hidden files (starting with .), node_modules, and .git.\n * Throws if SKILL.md is not found at the root.\n */\nexport function readSkillDirectory(\n dirPath: string,\n): Array<{ path: string; content: string }> {\n const files: Array<{ path: string; content: string }> = [];\n\n function walk(dir: string, prefix: string) {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.name.startsWith(\".\") || IGNORED_NAMES.has(entry.name)) continue;\n\n const relPath = prefix ? `${prefix}/${entry.name}` : entry.name;\n if (entry.isDirectory()) {\n walk(join(dir, entry.name), relPath);\n } else {\n files.push({\n path: relPath,\n content: readFileSync(join(dir, entry.name), \"utf-8\"),\n });\n }\n }\n }\n\n walk(dirPath, \"\");\n\n if (\n !files.some((f) => {\n return f.path === \"SKILL.md\";\n })\n ) {\n throw new Error(`SKILL.md not found in ${dirPath}`);\n }\n\n return files;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { updateSkill } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { readSkillDirectory } from \"../../../lib/skill-directory\";\n\nexport const editCommand = new Command()\n .name(\"edit\")\n .description(\"Update a custom skill's content\")\n .argument(\"<name>\", \"Skill name\")\n .requiredOption(\n \"--dir <path>\",\n \"Path to directory containing updated skill files\",\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n zero skill edit my-skill --dir ./skills/my-skill/`,\n )\n .action(\n withErrorHandler(async (name: string, options: { dir: string }) => {\n const files = readSkillDirectory(options.dir);\n await updateSkill(name, { files });\n\n console.log(\n chalk.green(`✓ Skill \"${name}\" updated (${files.length} file(s))`),\n );\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getSkill } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const viewCommand = new Command()\n .name(\"view\")\n .description(\"View a custom skill\")\n .argument(\"<name>\", \"Skill name\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero skill view my-skill`,\n )\n .action(\n withErrorHandler(async (name: string) => {\n const skill = await getSkill(name);\n\n console.log(chalk.bold(skill.name));\n if (skill.displayName) console.log(chalk.dim(skill.displayName));\n console.log();\n console.log(`Name: ${skill.name}`);\n if (skill.displayName) console.log(`Display Name: ${skill.displayName}`);\n if (skill.description) console.log(`Description: ${skill.description}`);\n\n if (skill.files && skill.files.length > 0) {\n console.log();\n console.log(chalk.dim(\"── Files ──\"));\n for (const f of skill.files) {\n console.log(` ${f.path} (${f.size} bytes)`);\n }\n }\n\n console.log();\n if (skill.content) {\n console.log(chalk.dim(\"── SKILL.md ──\"));\n console.log(skill.content);\n } else {\n console.log(chalk.dim(\"No content\"));\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listSkills } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List custom skills in the organization\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero skill list`,\n )\n .action(\n withErrorHandler(async () => {\n const skills = await listSkills();\n\n if (skills.length === 0) {\n console.log(chalk.dim(\"No custom skills found\"));\n console.log(\n chalk.dim(\" Create one with: zero skill create <name> --dir <path>\"),\n );\n return;\n }\n\n const nameWidth = Math.max(\n 4,\n ...skills.map((s) => {\n return s.name.length;\n }),\n );\n const displayWidth = Math.max(\n 12,\n ...skills.map((s) => {\n return (s.displayName ?? \"\").length;\n }),\n );\n\n const header = [\n \"NAME\".padEnd(nameWidth),\n \"DISPLAY NAME\".padEnd(displayWidth),\n \"DESCRIPTION\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n for (const skill of skills) {\n const row = [\n skill.name.padEnd(nameWidth),\n (skill.displayName ?? \"-\").padEnd(displayWidth),\n skill.description ?? \"-\",\n ].join(\" \");\n console.log(row);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getSkill, deleteSkill } 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 custom skill from the organization\")\n .argument(\"<name>\", \"Skill name\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero skill delete my-skill\n zero skill delete my-skill -y\n\nNotes:\n - This removes the skill from the organization and unbinds it from all agents\n - Use -y to skip confirmation in non-interactive mode`,\n )\n .action(\n withErrorHandler(async (name: string, options: { yes?: boolean }) => {\n await getSkill(name);\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 skill '${name}'? This will unbind it from all agents.`,\n false,\n );\n if (!confirmed) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n }\n\n await deleteSkill(name);\n console.log(chalk.green(`✓ Skill \"${name}\" deleted`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getZeroRunAgentEvents, type RunEvent } from \"../../../lib/api\";\nimport { parseTime } from \"../../../lib/utils/time-parser\";\nimport { ClaudeEventParser } from \"../../../lib/events/claude-event-parser\";\nimport { EventRenderer } from \"../../../lib/events/event-renderer\";\nimport { paginate } from \"../../../lib/utils/paginate\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { isUUID } from \"../../run/shared\";\nimport { listCommand } from \"./list\";\nimport { searchCommand } from \"./search\";\n\nconst PAGE_LIMIT = 100;\n\nfunction renderAgentEvent(event: RunEvent, renderer: EventRenderer): void {\n const eventData = event.eventData as Record<string, unknown>;\n const parsed = ClaudeEventParser.parse(eventData);\n if (parsed) {\n parsed.timestamp = new Date(event.createdAt);\n renderer.render(parsed);\n }\n}\n\nasync function showAgentEvents(\n runId: string,\n options: {\n since?: number;\n targetCount: number | \"all\";\n order: \"asc\" | \"desc\";\n },\n): Promise<void> {\n const firstResponse = await getZeroRunAgentEvents(runId, {\n since: options.since,\n limit: PAGE_LIMIT,\n order: options.order,\n });\n\n if (firstResponse.events.length === 0) {\n console.log(chalk.yellow(\"No agent events found for this run\"));\n return;\n }\n\n let allEvents: RunEvent[];\n\n if (\n !firstResponse.hasMore ||\n (options.targetCount !== \"all\" &&\n firstResponse.events.length >= options.targetCount)\n ) {\n allEvents =\n options.targetCount === \"all\"\n ? firstResponse.events\n : firstResponse.events.slice(0, options.targetCount);\n } else {\n const lastEvent = firstResponse.events[firstResponse.events.length - 1];\n const firstPageTimestamp = lastEvent\n ? new Date(lastEvent.createdAt).getTime()\n : undefined;\n\n const remainingEvents = await paginate<RunEvent>({\n fetchPage: async (since) => {\n const response = await getZeroRunAgentEvents(runId, {\n since,\n limit: PAGE_LIMIT,\n order: options.order,\n });\n return { items: response.events, hasMore: response.hasMore };\n },\n getTimestamp: (event) => {\n return new Date(event.createdAt).getTime();\n },\n targetCount:\n options.targetCount === \"all\"\n ? \"all\"\n : options.targetCount - firstResponse.events.length,\n initialSince: firstPageTimestamp,\n });\n\n allEvents = [...firstResponse.events, ...remainingEvents];\n\n if (\n options.targetCount !== \"all\" &&\n allEvents.length > options.targetCount\n ) {\n allEvents = allEvents.slice(0, options.targetCount);\n }\n }\n\n const events =\n options.order === \"desc\" ? [...allEvents].reverse() : allEvents;\n\n const renderer = new EventRenderer({\n showTimestamp: true,\n verbose: true,\n });\n\n for (const event of events) {\n renderAgentEvent(event, renderer);\n }\n}\n\nexport const zeroLogsCommand = new Command()\n .name(\"logs\")\n .description(\"View and search agent run logs\")\n .argument(\"[runId]\", \"Run ID to view agent events for\")\n .addCommand(listCommand)\n .addCommand(searchCommand)\n .option(\n \"--since <time>\",\n \"Show logs since timestamp (e.g., 5m, 2h, 1d, 2024-01-15T10:30:00Z)\",\n )\n .option(\"--tail <n>\", \"Show last N entries (default: 5)\")\n .option(\"--head <n>\", \"Show first N entries\")\n .option(\"--all\", \"Fetch all log entries\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero logs list\n zero logs <runId>\n zero logs <runId> --tail 10\n zero logs <runId> --all\n zero logs search \"error\"`,\n )\n .action(\n withErrorHandler(\n async (\n runId: string | undefined,\n options: {\n since?: string;\n tail?: string;\n head?: string;\n all?: boolean;\n },\n ) => {\n if (!runId) {\n zeroLogsCommand.help();\n return;\n }\n\n if (!isUUID(runId)) {\n console.error(\n chalk.red(`✗ Invalid run ID \"${runId}\" — expected a UUID`),\n );\n console.error(chalk.dim(\" Run: zero logs list to find run IDs\"));\n process.exit(1);\n }\n\n const countModes = [\n options.tail !== undefined,\n options.head !== undefined,\n options.all === true,\n ].filter(Boolean).length;\n if (countModes > 1) {\n throw new Error(\n \"Options --tail, --head, and --all are mutually exclusive\",\n );\n }\n\n let since: number | undefined;\n if (options.since) {\n since = parseTime(options.since);\n }\n\n const isAll = options.all === true;\n const isHead = options.head !== undefined;\n const isTail = options.tail !== undefined;\n\n let targetCount: number | \"all\";\n if (isAll) {\n targetCount = \"all\";\n } else if (isHead) {\n targetCount = Math.max(1, parseInt(options.head!, 10));\n } else if (isTail) {\n targetCount = Math.max(1, parseInt(options.tail!, 10));\n } else {\n targetCount = 5;\n }\n\n const order: \"asc\" | \"desc\" = isHead ? \"asc\" : \"desc\";\n\n await showAgentEvents(runId, { since, targetCount, order });\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroLogs } from \"../../../lib/api\";\nimport { parseTime } from \"../../../lib/utils/time-parser\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nfunction formatStatus(status: string): string {\n switch (status) {\n case \"completed\":\n return chalk.green(status);\n case \"failed\":\n case \"timeout\":\n return chalk.red(status);\n case \"running\":\n case \"pending\":\n case \"queued\":\n return chalk.yellow(status);\n case \"cancelled\":\n return chalk.dim(status);\n default:\n return status;\n }\n}\n\nfunction formatTime(iso: string): string {\n return new Date(iso).toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n}\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List agent run logs\")\n .option(\"--agent <name>\", \"Filter by agent name\")\n .option(\n \"--status <status>\",\n \"Filter by status (queued|pending|running|completed|failed|timeout|cancelled)\",\n )\n .option(\n \"--since <time>\",\n \"Filter runs created since (e.g., 5m, 2h, 1d, 2024-01-15T10:30:00Z)\",\n )\n .option(\"--limit <n>\", \"Maximum number of results (default: 20)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero logs list\n zero logs list --agent my-agent\n zero logs list --status completed --limit 10\n zero logs list --since 1h\n zero logs list --since 1d --status completed`,\n )\n .action(\n withErrorHandler(\n async (options: {\n agent?: string;\n status?: string;\n since?: string;\n limit?: string;\n }) => {\n const limit = options.limit ? parseInt(options.limit, 10) : undefined;\n const since = options.since ? parseTime(options.since) : undefined;\n\n const result = await listZeroLogs({\n agent: options.agent,\n status: options.status,\n since,\n limit,\n });\n\n if (result.data.length === 0) {\n console.log(chalk.dim(\"No logs found\"));\n return;\n }\n\n const nameCol = Math.max(\n 5,\n ...result.data.map((r) => {\n return (r.displayName || r.agentId || \"-\").length;\n }),\n );\n const statusCol = Math.max(\n 6,\n ...result.data.map((r) => {\n return r.status.length;\n }),\n );\n\n const header = [\n \"RUN ID\".padEnd(38),\n \"AGENT\".padEnd(nameCol),\n \"STATUS\".padEnd(statusCol),\n \"CREATED\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n for (const entry of result.data) {\n const runId = entry.id;\n const name = entry.displayName || entry.agentId || \"-\";\n const row = [\n runId.padEnd(38),\n name.padEnd(nameCol),\n formatStatus(entry.status).padEnd(statusCol),\n formatTime(entry.createdAt),\n ].join(\" \");\n console.log(row);\n }\n\n if (result.pagination.hasMore) {\n console.log();\n console.log(\n chalk.dim(\n ` Showing ${result.data.length} of more results. Use --limit to adjust.`,\n ),\n );\n }\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n searchZeroLogs,\n type RunEvent,\n type LogsSearchResponse,\n} from \"../../../lib/api\";\nimport { parseTime } from \"../../../lib/utils/time-parser\";\nimport { ClaudeEventParser } from \"../../../lib/events/claude-event-parser\";\nimport { EventRenderer } from \"../../../lib/events/event-renderer\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { isUUID } from \"../../run/shared\";\n\nconst SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000;\n\nexport interface LogsSearchCliOptions {\n afterContext?: string;\n beforeContext?: string;\n context?: string;\n agent?: string;\n run?: string;\n since?: string;\n limit?: string;\n}\n\nfunction renderEvent(event: RunEvent, renderer: EventRenderer): void {\n const eventData = event.eventData as Record<string, unknown>;\n const parsed = ClaudeEventParser.parse(eventData);\n if (parsed) {\n parsed.timestamp = new Date(event.createdAt);\n renderer.render(parsed);\n }\n}\n\nfunction formatRunHeader(\n runId: string,\n agentName: string,\n timestamp: string,\n): string {\n const time = new Date(timestamp).toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n return `── Run ${runId} (${agentName}, ${time}) ──────────`;\n}\n\nfunction parseContextOptions(options: LogsSearchCliOptions): {\n before: number;\n after: number;\n} {\n const contextN = options.context ? parseInt(options.context, 10) : 0;\n const before = options.beforeContext\n ? parseInt(options.beforeContext, 10)\n : contextN;\n const after = options.afterContext\n ? parseInt(options.afterContext, 10)\n : contextN;\n\n if (isNaN(before) || before < 0 || before > 10) {\n throw new Error(\"--before-context must be between 0 and 10\");\n }\n if (isNaN(after) || after < 0 || after > 10) {\n throw new Error(\"--after-context must be between 0 and 10\");\n }\n\n return { before, after };\n}\n\nfunction parseLimit(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const limit = parseInt(value, 10);\n if (isNaN(limit) || limit < 1 || limit > 50) {\n throw new Error(\"--limit must be between 1 and 50\");\n }\n return limit;\n}\n\nfunction renderResults(response: LogsSearchResponse): void {\n const grouped = new Map<\n string,\n { agentName: string; results: LogsSearchResponse[\"results\"] }\n >();\n for (const result of response.results) {\n const existing = grouped.get(result.runId);\n if (existing) {\n existing.results.push(result);\n } else {\n grouped.set(result.runId, {\n agentName: result.agentName,\n results: [result],\n });\n }\n }\n\n let isFirstGroup = true;\n for (const [runId, group] of grouped) {\n if (!isFirstGroup) {\n console.log();\n }\n isFirstGroup = false;\n\n const firstTimestamp = group.results[0]!.matchedEvent.createdAt;\n console.log(\n chalk.bold(formatRunHeader(runId, group.agentName, firstTimestamp)),\n );\n\n for (const result of group.results) {\n const renderer = new EventRenderer({\n showTimestamp: true,\n verbose: false,\n buffered: false,\n });\n\n for (const event of result.contextBefore) {\n renderEvent(event, renderer);\n }\n renderEvent(result.matchedEvent, renderer);\n for (const event of result.contextAfter) {\n renderEvent(event, renderer);\n }\n }\n }\n\n if (response.hasMore) {\n console.log();\n console.log(\n chalk.dim(\n ` Showing first ${response.results.length} matches. Use --limit to see more.`,\n ),\n );\n }\n}\n\nexport async function runLogsSearch(\n keyword: string,\n options: LogsSearchCliOptions,\n): Promise<void> {\n const { before, after } = parseContextOptions(options);\n\n if (options.run && !isUUID(options.run)) {\n console.error(\n chalk.red(`✗ Invalid run ID \"${options.run}\" — expected a UUID`),\n );\n console.error(chalk.dim(\" Run: zero logs list to find run IDs\"));\n process.exit(1);\n }\n\n const since = options.since\n ? parseTime(options.since)\n : Date.now() - SEVEN_DAYS_MS;\n const limit = parseLimit(options.limit);\n\n const response = await searchZeroLogs({\n keyword,\n agent: options.agent,\n runId: options.run,\n since,\n limit,\n before,\n after,\n });\n\n if (response.results.length === 0) {\n console.log(chalk.dim(\"No matches found\"));\n console.log(\n chalk.dim(\n \" Try a broader search with --since 30d or a different keyword\",\n ),\n );\n return;\n }\n\n renderResults(response);\n}\n\nexport const searchCommand = new Command()\n .name(\"search\")\n .description(\"Search agent events across runs\")\n .argument(\"<keyword>\", \"Search keyword\")\n .option(\"-A, --after-context <n>\", \"Show n events after each match\")\n .option(\"-B, --before-context <n>\", \"Show n events before each match\")\n .option(\"-C, --context <n>\", \"Show n events before and after each match\")\n .option(\"--agent <name>\", \"Filter by agent name\")\n .option(\"--run <id>\", \"Filter by specific run ID\")\n .option(\"--since <time>\", \"Search logs since (default: 7d)\")\n .option(\"--limit <n>\", \"Maximum number of matches (default: 20)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero logs search \"error\"\n zero logs search \"timeout\" --agent my-agent -C 2\n zero logs search \"failed\" --since 30d --limit 50`,\n )\n .action(\n withErrorHandler(async (keyword: string, options: LogsSearchCliOptions) => {\n await runLogsSearch(keyword, options);\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { runLogsSearch, type LogsSearchCliOptions } from \"../logs/search\";\nimport { searchZeroChat } from \"../../../lib/api\";\nimport type {\n ChatSearchMessage,\n ChatSearchResponse,\n} from \"@vm0/api-contracts/contracts/chat-threads\";\nimport { parseTime } from \"../../../lib/utils/time-parser\";\n\nconst SUPPORTED_SOURCES = [\"logs\", \"chat\", \"slack\"] as const;\ntype Source = (typeof SUPPORTED_SOURCES)[number];\n\nconst SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000;\n\nexport const SEARCH_EXPLAINER = `\nAvailable sources:\n logs full agent event stream (tool calls, tokens, system events) from agent runs\n chat user/assistant text messages as shown in the web chat UI\n slack returns a recipe for calling the Slack API directly; requires the Slack connector\n\nUsage: zero search <query> --source <logs|chat|slack> [flags]\nRun 'zero search --help' for all flags.`;\n\nexport function buildSlackRecipe(query: string): string {\n const encoded = encodeURIComponent(query);\n return `The \\`slack\\` source does not call Slack from this CLI. Run the\nfollowing inside an agent sandbox that has $SLACK_TOKEN available:\n\n curl -H \"Authorization: Bearer $SLACK_TOKEN\" \\\\\n \"https://slack.com/api/search.messages?query=${encoded}\"\n\nIf you don't have $SLACK_TOKEN, check the connector status:\n zero connector status slack\n\nTo verify the token and network policy end-to-end:\n zero doctor check-connector --env-name SLACK_TOKEN\n\nSlack API docs: https://api.slack.com/methods/search.messages\n\nNote: CLI-local flags (--limit, --since, -A/-B/-C) are ignored for the\nslack source. Pass equivalents to Slack's API via count= / highlight=\nquery parameters instead.`;\n}\n\ninterface SearchOptions {\n source: string[];\n agent?: string;\n run?: string;\n since?: string;\n limit?: string;\n afterContext?: string;\n beforeContext?: string;\n context?: string;\n}\n\nfunction collectSource(value: string, previous: string[]): string[] {\n return [...previous, value];\n}\n\nfunction parseContextOptions(options: SearchOptions): {\n before: number;\n after: number;\n} {\n const contextN = options.context ? parseInt(options.context, 10) : 0;\n const before = options.beforeContext\n ? parseInt(options.beforeContext, 10)\n : contextN;\n const after = options.afterContext\n ? parseInt(options.afterContext, 10)\n : contextN;\n\n if (isNaN(before) || before < 0 || before > 10) {\n throw new Error(\"--before-context must be between 0 and 10\");\n }\n if (isNaN(after) || after < 0 || after > 10) {\n throw new Error(\"--after-context must be between 0 and 10\");\n }\n\n return { before, after };\n}\n\nfunction parseLimit(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const limit = parseInt(value, 10);\n if (isNaN(limit) || limit < 1 || limit > 50) {\n throw new Error(\"--limit must be between 1 and 50\");\n }\n return limit;\n}\n\nasync function runLogsSource(\n query: string,\n options: SearchOptions,\n): Promise<void> {\n const logsOptions: LogsSearchCliOptions = {\n afterContext: options.afterContext,\n beforeContext: options.beforeContext,\n context: options.context,\n agent: options.agent,\n run: options.run,\n since: options.since,\n limit: options.limit,\n };\n await runLogsSearch(query, logsOptions);\n}\n\nfunction formatTimestamp(iso: string): string {\n return new Date(iso).toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n}\n\nfunction renderChatMessage(msg: ChatSearchMessage, isMatch: boolean): void {\n const marker = isMatch ? chalk.yellow(\"▸\") : chalk.dim(\"·\");\n const header = `${marker} ${chalk.dim(msg.role)} ${chalk.dim(formatTimestamp(msg.createdAt))}`;\n console.log(header);\n console.log(isMatch ? msg.content : chalk.dim(msg.content));\n}\n\nfunction renderChatResults(response: ChatSearchResponse): void {\n let isFirst = true;\n for (const result of response.results) {\n if (!isFirst) console.log();\n isFirst = false;\n\n console.log(\n chalk.bold(\n `── Thread ${result.chatThreadId} (${result.agentName}) ──────────`,\n ),\n );\n for (const msg of result.contextBefore) {\n renderChatMessage(msg, false);\n }\n renderChatMessage(result.matchedMessage, true);\n for (const msg of result.contextAfter) {\n renderChatMessage(msg, false);\n }\n }\n\n if (response.hasMore) {\n console.log();\n console.log(\n chalk.dim(\n ` Showing first ${response.results.length} matches. Use --limit to see more.`,\n ),\n );\n }\n}\n\nasync function runChatSource(\n query: string,\n options: SearchOptions,\n): Promise<void> {\n if (options.run) {\n throw new Error(\"--run is not supported with --source chat\");\n }\n\n const { before, after } = parseContextOptions(options);\n const limit = parseLimit(options.limit);\n const since = options.since\n ? parseTime(options.since)\n : Date.now() - SEVEN_DAYS_MS;\n\n const response = await searchZeroChat({\n keyword: query,\n agent: options.agent,\n since,\n limit,\n before,\n after,\n });\n\n if (response.results.length === 0) {\n console.log(chalk.dim(\"No matches found\"));\n console.log(\n chalk.dim(\n \" Try a broader search with --since 30d or a different keyword\",\n ),\n );\n return;\n }\n\n renderChatResults(response);\n}\n\nasync function runSlackSource(\n query: string,\n _options: SearchOptions,\n): Promise<void> {\n console.log(buildSlackRecipe(query));\n}\n\nexport const zeroSearchCommand = new Command()\n .name(\"search\")\n .description(\"Search logs, chat, or get a recipe for external sources\")\n .argument(\"<query>\", \"Search query\")\n .option(\n \"--source <type>\",\n \"Source to search: logs | chat | slack (pass once)\",\n collectSource,\n [] as string[],\n )\n .option(\"--agent <name>\", \"Filter by agent name\")\n .option(\"--run <id>\", \"Filter by run ID\")\n .option(\"--since <time>\", \"Time window (e.g., 7d, 2h)\")\n .option(\"--limit <n>\", \"Maximum number of matches\")\n .option(\"-A, --after-context <n>\", \"Show n items after each match\")\n .option(\"-B, --before-context <n>\", \"Show n items before each match\")\n .option(\"-C, --context <n>\", \"Show n items before and after each match\")\n .addHelpText(\"after\", SEARCH_EXPLAINER)\n .action(\n withErrorHandler(async (query: string, options: SearchOptions) => {\n const sources = options.source;\n\n if (sources.length === 0) {\n console.log(SEARCH_EXPLAINER);\n return;\n }\n\n if (sources.length > 1) {\n throw new Error(\"Only one --source is allowed.\");\n }\n\n const source = sources[0]!;\n if (!SUPPORTED_SOURCES.includes(source as Source)) {\n throw new Error(\n `Unknown --source \"${source}\". Expected one of: ${SUPPORTED_SOURCES.join(\", \")}`,\n );\n }\n\n switch (source as Source) {\n case \"logs\":\n await runLogsSource(query, options);\n return;\n case \"chat\":\n await runChatSource(query, options);\n return;\n case \"slack\":\n await runSlackSource(query, options);\n return;\n }\n }),\n );\n","import { Command } from \"commander\";\nimport { withErrorHandler } from \"../../lib/command\";\nimport {\n requestDeveloperSupportConsent,\n submitDeveloperSupport,\n} from \"../../lib/api\";\n\nexport const zeroDeveloperSupportCommand = new Command()\n .name(\"developer-support\")\n .description(\"Submit a diagnostic report to the dev team\")\n .requiredOption(\"--title <text>\", \"Issue title\")\n .requiredOption(\"--description <text>\", \"Diagnostic description\")\n .option(\"--consent-code <code>\", \"User-provided verification code\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Step 1 — Get consent code:\n zero developer-support --title \"GitHub 403 error\" --description \"Connector connected but API returns 403\"\n\n Step 2 — Submit with code:\n zero developer-support --title \"GitHub 403 error\" --description \"Connector connected but API returns 403\" --consent-code A7X3\n\nNotes:\n - The consent code must be provided by the user to confirm sharing their conversation\n - The dev team will receive a diagnostic bundle with conversation, environment, and connector info`,\n )\n .action(\n withErrorHandler(\n async (options: {\n title: string;\n description: string;\n consentCode?: string;\n }) => {\n if (!options.consentCode) {\n const { consentCode } = await requestDeveloperSupportConsent({\n title: options.title,\n description: options.description,\n });\n console.log(\n \"Consent required to share chat history with developers.\",\n );\n console.log(`Code: ${consentCode}`);\n console.log(\"Ask the user to confirm by providing this code.\");\n } else {\n const { reference } = await submitDeveloperSupport({\n title: options.title,\n description: options.description,\n consentCode: options.consentCode,\n });\n console.log(\"Developer support request submitted successfully.\");\n console.log(`Reference: ${reference}`);\n }\n },\n ),\n );\n","import { Command } from \"commander\";\nimport { hostStartCommand, hostStopCommand } from \"./host\";\nimport {\n clientScreenshotCommand,\n clientZoomCommand,\n clientInfoCommand,\n clientLeftClickCommand,\n clientRightClickCommand,\n clientMiddleClickCommand,\n clientDoubleClickCommand,\n clientTripleClickCommand,\n clientLeftClickDragCommand,\n clientLeftMouseDownCommand,\n clientLeftMouseUpCommand,\n clientScrollCommand,\n clientReadClipboardCommand,\n clientWriteClipboardCommand,\n clientKeyCommand,\n clientHoldKeyCommand,\n clientTypeCommand,\n clientOpenAppCommand,\n clientMouseMoveCommand,\n clientCursorPositionCommand,\n} from \"./client\";\n\nconst hostCommand = new Command()\n .name(\"host\")\n .description(\"Manage computer-use host daemon\")\n .addCommand(hostStartCommand)\n .addCommand(hostStopCommand);\n\nconst clientCommand = new Command()\n .name(\"client\")\n .description(\"Interact with remote computer-use host\")\n .addCommand(clientScreenshotCommand)\n .addCommand(clientZoomCommand)\n .addCommand(clientInfoCommand)\n .addCommand(clientLeftClickCommand)\n .addCommand(clientRightClickCommand)\n .addCommand(clientMiddleClickCommand)\n .addCommand(clientDoubleClickCommand)\n .addCommand(clientTripleClickCommand)\n .addCommand(clientLeftClickDragCommand)\n .addCommand(clientLeftMouseDownCommand)\n .addCommand(clientLeftMouseUpCommand)\n .addCommand(clientScrollCommand)\n .addCommand(clientReadClipboardCommand)\n .addCommand(clientWriteClipboardCommand)\n .addCommand(clientKeyCommand)\n .addCommand(clientHoldKeyCommand)\n .addCommand(clientTypeCommand)\n .addCommand(clientOpenAppCommand)\n .addCommand(clientMouseMoveCommand)\n .addCommand(clientCursorPositionCommand);\n\nclientCommand.addHelpText(\n \"after\",\n `\nCoordinate System:\n All coordinates use macOS logical points, not physical pixels.\n On Retina displays, logical size = physical size / scaleFactor.\n Run \"info\" to check your screen's logical dimensions.\n\nExamples:\n zero computer-use client screenshot\n zero computer-use client zoom --x 0 --y 0 --width 500 --height 500\n zero computer-use client info\n zero computer-use client left-click 500 300\n zero computer-use client scroll 500 300 down 5\n zero computer-use client key \"cmd+c\"`,\n);\n\nexport const zeroComputerUseCommand = new Command()\n .name(\"computer-use\")\n .description(\"Remote desktop control for cloud agents\")\n .addCommand(hostCommand)\n .addCommand(clientCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\nimport {\n registerComputerUseHost,\n unregisterComputerUseHost,\n ApiRequestError,\n} from \"../../../lib/api\";\nimport {\n getRandomPort,\n startDesktopServer,\n} from \"../../../lib/computer-use/desktop-server\";\nimport { isCliclickInstalled } from \"../../../lib/computer-use/cliclick\";\nimport {\n startDesktopTunnel,\n stopDesktopTunnel,\n} from \"../../../lib/computer-use/ngrok\";\n\nexport const hostStartCommand = new Command()\n .name(\"start\")\n .description(\"Start the computer-use host daemon (macOS only)\")\n .action(\n withErrorHandler(async () => {\n if (process.platform !== \"darwin\") {\n throw new Error(\n \"Computer-use host requires macOS\\n\\n\" +\n \"The host daemon uses macOS-specific commands (screencapture, system_profiler).\",\n );\n }\n\n if (!(await isCliclickInstalled())) {\n console.log(\n chalk.yellow(\n \"⚠ cliclick not found. Mouse and keyboard operations will not be available.\\n\" +\n \" Install with: brew install cliclick\",\n ),\n );\n console.log();\n }\n\n console.log(chalk.cyan(\"Registering computer-use host...\"));\n const credentials = await registerComputerUseHost();\n\n const port = await getRandomPort();\n const server = await startDesktopServer(credentials.token, port);\n\n try {\n await startDesktopTunnel(\n credentials.ngrokToken,\n credentials.endpointPrefix,\n port,\n );\n\n console.log();\n console.log(chalk.green(\"✓ Computer-use host active\"));\n console.log(` Desktop: desktop.${credentials.domain}`);\n console.log();\n console.log(chalk.dim(\"Press ^C twice to disconnect\"));\n console.log();\n\n let sigintCount = 0;\n await new Promise<void>((resolve) => {\n const keepAlive = setInterval(() => {}, 60_000);\n const done = () => {\n clearInterval(keepAlive);\n process.removeListener(\"SIGINT\", onSigint);\n resolve();\n };\n const onSigint = () => {\n sigintCount++;\n if (sigintCount === 1) {\n console.log(\n chalk.dim(\"\\nPress ^C again to disconnect and exit...\"),\n );\n } else {\n done();\n }\n };\n process.on(\"SIGINT\", onSigint);\n process.once(\"SIGTERM\", done);\n });\n } finally {\n console.log();\n console.log(chalk.cyan(\"Stopping computer-use host...\"));\n server.close();\n await stopDesktopTunnel();\n await unregisterComputerUseHost().catch(() => {});\n console.log(chalk.green(\"✓ Host stopped\"));\n }\n }),\n );\n\nexport const hostStopCommand = new Command()\n .name(\"stop\")\n .description(\"Stop and unregister the computer-use host\")\n .action(\n withErrorHandler(async () => {\n console.log(chalk.cyan(\"Unregistering computer-use host...\"));\n try {\n await unregisterComputerUseHost();\n console.log(chalk.green(\"✓ Host unregistered\"));\n } catch (error) {\n if (error instanceof ApiRequestError && error.status === 404) {\n console.log(chalk.yellow(\"No active host registration found\"));\n return;\n }\n throw error;\n }\n }),\n );\n","import {\n createServer,\n type Server,\n type IncomingMessage,\n type ServerResponse,\n} from \"http\";\nimport { createServer as createNetServer } from \"net\";\nimport type { AddressInfo } from \"net\";\nimport {\n captureScreenshot,\n captureRegionScreenshot,\n getScreenInfo,\n} from \"./screencapture\";\nimport {\n leftClickDrag,\n leftMouseDown,\n leftMouseUp,\n executeMouseAction,\n getCursorPosition,\n VALID_ACTIONS,\n pressKey,\n holdKey,\n typeText,\n} from \"./cliclick\";\nimport type { MouseAction } from \"./cliclick\";\nimport { scroll, type ScrollDirection } from \"./scroll\";\nimport { readClipboard, writeClipboard } from \"./clipboard\";\nimport { openApplication } from \"./application\";\n\n/**\n * Read the full request body as a string.\n */\nfunction readBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => {\n chunks.push(chunk);\n });\n req.on(\"end\", () => {\n resolve(Buffer.concat(chunks).toString());\n });\n req.on(\"error\", reject);\n });\n}\n\ninterface MouseDragBody {\n action: \"left_click_drag\";\n startX: number;\n startY: number;\n endX: number;\n endY: number;\n}\n\ninterface MouseDownBody {\n action: \"left_mouse_down\";\n x: number;\n y: number;\n}\n\ninterface MouseUpBody {\n action: \"left_mouse_up\";\n x: number;\n y: number;\n}\n\ninterface MouseScrollBody {\n action: \"scroll\";\n x: number;\n y: number;\n direction: ScrollDirection;\n amount?: number;\n}\n\ntype MouseRequestBody =\n | MouseDragBody\n | MouseDownBody\n | MouseUpBody\n | MouseScrollBody;\n\nasync function handleZoom(\n searchParams: URLSearchParams,\n res: ServerResponse,\n): Promise<void> {\n const x = Number(searchParams.get(\"x\"));\n const y = Number(searchParams.get(\"y\"));\n const width = Number(searchParams.get(\"width\"));\n const height = Number(searchParams.get(\"height\"));\n\n if (\n [x, y, width, height].some((v) => {\n return !Number.isFinite(v);\n })\n ) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\n \"Missing or invalid query parameters: x, y, width, height are required numbers\",\n );\n return;\n }\n if (width <= 0 || height <= 0) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"width and height must be positive\");\n return;\n }\n if (x < 0 || y < 0) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"x and y must be non-negative\");\n return;\n }\n\n const info = await getScreenInfo();\n if (x + width > info.width || y + height > info.height) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(`Region exceeds screen bounds (${info.width}x${info.height})`);\n return;\n }\n\n const result = await captureRegionScreenshot({ x, y, width, height });\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(result));\n}\n\nfunction parseJsonBody(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n let size = 0;\n req.on(\"data\", (chunk: Buffer) => {\n size += chunk.length;\n if (size > 1024) {\n reject(new Error(\"Request body too large\"));\n req.destroy();\n return;\n }\n chunks.push(chunk);\n });\n req.on(\"end\", () => {\n try {\n resolve(JSON.parse(Buffer.concat(chunks).toString()));\n } catch {\n reject(new Error(\"Invalid JSON body\"));\n }\n });\n req.on(\"error\", reject);\n });\n}\n\nasync function handleMouseRequest(\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<void> {\n const body = await parseJsonBody(req);\n if (typeof body !== \"object\" || body === null || !(\"action\" in body)) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"Missing required fields: action, x, y\");\n return;\n }\n\n const { action } = body as { action: unknown };\n\n if (typeof action !== \"string\") {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"Invalid action\");\n return;\n }\n\n // Click actions with validation\n if (VALID_ACTIONS.has(action)) {\n if (!(\"x\" in body) || !(\"y\" in body)) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"Missing required fields: action, x, y\");\n return;\n }\n\n const { x, y } = body as { x: unknown; y: unknown };\n\n if (\n typeof x !== \"number\" ||\n typeof y !== \"number\" ||\n !Number.isFinite(x) ||\n !Number.isFinite(y)\n ) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"Coordinates x and y must be finite numbers\");\n return;\n }\n\n const info = await getScreenInfo();\n if (x < 0 || x >= info.width || y < 0 || y >= info.height) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\n `Coordinates out of bounds. Screen size: ${info.width}x${info.height} (points)`,\n );\n return;\n }\n\n await executeMouseAction(action as MouseAction, x, y);\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true }));\n return;\n }\n\n // Drag, mouse-down, mouse-up, scroll actions\n const typedBody = body as MouseRequestBody;\n switch (typedBody.action) {\n case \"left_click_drag\":\n await leftClickDrag(\n typedBody.startX,\n typedBody.startY,\n typedBody.endX,\n typedBody.endY,\n );\n break;\n case \"left_mouse_down\":\n await leftMouseDown(typedBody.x, typedBody.y);\n break;\n case \"left_mouse_up\":\n await leftMouseUp(typedBody.x, typedBody.y);\n break;\n case \"scroll\":\n await scroll(\n typedBody.x,\n typedBody.y,\n typedBody.direction,\n typedBody.amount,\n );\n break;\n default:\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\n `Unknown mouse action: ${(body as unknown as Record<string, unknown>).action}`,\n );\n return;\n }\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true }));\n}\n\ninterface KeyPressBody {\n action: \"key\";\n keys: string;\n}\n\ninterface HoldKeyBody {\n action: \"hold_key\";\n keys: string;\n durationMs: number;\n}\n\ninterface TypeTextBody {\n action: \"type\";\n text: string;\n}\n\ntype KeyboardRequestBody = KeyPressBody | HoldKeyBody | TypeTextBody;\n\nasync function handleKeyboard(\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<void> {\n const raw = await readBody(req);\n const body = JSON.parse(raw) as KeyboardRequestBody;\n\n switch (body.action) {\n case \"key\":\n await pressKey(body.keys);\n break;\n case \"hold_key\":\n if (\n typeof body.durationMs !== \"number\" ||\n !Number.isFinite(body.durationMs) ||\n body.durationMs <= 0\n ) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"durationMs must be a positive number\");\n return;\n }\n await holdKey(body.keys, body.durationMs);\n break;\n case \"type\":\n if (typeof body.text !== \"string\" || body.text.length === 0) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"text must be a non-empty string\");\n return;\n }\n await typeText(body.text);\n break;\n default:\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\n `Unknown keyboard action: ${(body as Record<string, unknown>).action}`,\n );\n return;\n }\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true }));\n}\n\nasync function handleClipboard(\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<void> {\n if (req.method === \"GET\") {\n const text = await readClipboard();\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ text }));\n } else if (req.method === \"POST\") {\n const raw = await readBody(req);\n const body = JSON.parse(raw) as { text: string };\n await writeClipboard(body.text);\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true }));\n } else {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"Not found\");\n }\n}\n\nasync function handleOpenApplication(\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<void> {\n const raw = await readBody(req);\n const body = JSON.parse(raw) as { nameOrBundleId: unknown };\n\n if (\n typeof body.nameOrBundleId !== \"string\" ||\n body.nameOrBundleId.length === 0\n ) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"nameOrBundleId must be a non-empty string\");\n return;\n }\n\n await openApplication(body.nameOrBundleId);\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true }));\n}\n\n/**\n * Allocate a random available port on localhost.\n */\nexport async function getRandomPort(): Promise<number> {\n return new Promise((resolve, reject) => {\n const server = createNetServer();\n server.listen(0, \"127.0.0.1\", () => {\n const { port } = server.address() as AddressInfo;\n server.close(() => {\n resolve(port);\n });\n });\n server.on(\"error\", reject);\n });\n}\n\nasync function handleCursorPosition(res: ServerResponse): Promise<void> {\n const position = await getCursorPosition();\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(position));\n}\n\nfunction routeKey(method: string, pathname: string): string {\n return `${method} ${pathname}`;\n}\n\nasync function handleRequest(\n token: string,\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<void> {\n if (req.headers[\"x-vm0-token\"] !== token) {\n res.writeHead(403, { \"Content-Type\": \"text/plain\" });\n res.end(\"Forbidden\");\n return;\n }\n\n const url = new URL(req.url ?? \"/\", \"http://localhost\");\n const { pathname, searchParams } = url;\n const key = routeKey(req.method ?? \"GET\", pathname);\n\n try {\n switch (key) {\n case \"GET /screenshot\": {\n const result = await captureScreenshot();\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(result));\n break;\n }\n case \"GET /info\": {\n const info = await getScreenInfo();\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(info));\n break;\n }\n case \"GET /zoom\":\n await handleZoom(searchParams, res);\n break;\n case \"POST /mouse\":\n await handleMouseRequest(req, res);\n break;\n case \"GET /clipboard\":\n case \"POST /clipboard\":\n await handleClipboard(req, res);\n break;\n case \"POST /keyboard\":\n await handleKeyboard(req, res);\n break;\n case \"POST /open-application\":\n await handleOpenApplication(req, res);\n break;\n case \"GET /cursor-position\":\n await handleCursorPosition(res);\n break;\n default:\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"Not found\");\n }\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Internal server error\";\n res.writeHead(500, { \"Content-Type\": \"text/plain\" });\n res.end(message);\n }\n}\n\n/**\n * Start the desktop HTTP server.\n * Validates x-vm0-token on every request and serves /screenshot and /info endpoints.\n */\nexport function startDesktopServer(\n token: string,\n port: number,\n): Promise<Server> {\n return new Promise((resolve, reject) => {\n const server = createServer((req, res) => {\n handleRequest(token, req, res).catch(() => {\n if (!res.headersSent) {\n res.writeHead(500, { \"Content-Type\": \"text/plain\" });\n res.end(\"Internal server error\");\n }\n });\n });\n\n server.on(\"error\", reject);\n server.listen(port, \"127.0.0.1\", () => {\n resolve(server);\n });\n });\n}\n","import { execFile } from \"child_process\";\nimport { readFile, unlink } from \"fs/promises\";\nimport { randomUUID } from \"crypto\";\nimport { join } from \"path\";\nimport { tmpdir } from \"os\";\nimport { promisify } from \"util\";\n\nconst execFileAsync = promisify(execFile);\n\ninterface ScreenInfo {\n width: number;\n height: number;\n scaleFactor: number;\n}\n\ninterface ScreenshotResult extends ScreenInfo {\n image: string;\n format: string;\n}\n\ninterface RegionParams {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/**\n * Capture a screenshot on macOS using the screencapture command.\n * Returns the image as a base64 string at logical resolution along with screen metadata.\n */\nexport async function captureScreenshot(): Promise<ScreenshotResult> {\n const tmpPath = join(tmpdir(), `vm0-screenshot-${randomUUID()}.jpg`);\n\n try {\n await execFileAsync(\"screencapture\", [\"-x\", \"-t\", \"jpg\", tmpPath]);\n const info = await getScreenInfo();\n\n if (info.scaleFactor > 1) {\n await execFileAsync(\"sips\", [\n \"-z\",\n String(info.height),\n String(info.width),\n \"-s\",\n \"formatOptions\",\n \"80\",\n tmpPath,\n ]);\n }\n\n const buffer = await readFile(tmpPath);\n\n return {\n image: buffer.toString(\"base64\"),\n width: info.width,\n height: info.height,\n scaleFactor: info.scaleFactor,\n format: \"jpg\",\n };\n } finally {\n await unlink(tmpPath).catch(() => {});\n }\n}\n\n/**\n * Capture a screenshot of a specific screen region on macOS.\n * Uses screencapture -R x,y,w,h to crop to the given rectangle (logical coordinates).\n * Returns the image at logical resolution to match the coordinate space.\n */\nexport async function captureRegionScreenshot(\n region: RegionParams,\n): Promise<ScreenshotResult> {\n const tmpPath = join(tmpdir(), `vm0-zoom-${randomUUID()}.jpg`);\n\n try {\n const regionArg = `${region.x},${region.y},${region.width},${region.height}`;\n await execFileAsync(\"screencapture\", [\n \"-x\",\n \"-t\",\n \"jpg\",\n \"-R\",\n regionArg,\n tmpPath,\n ]);\n\n const info = await getScreenInfo();\n\n if (info.scaleFactor > 1) {\n await execFileAsync(\"sips\", [\n \"-z\",\n String(region.height),\n String(region.width),\n \"-s\",\n \"formatOptions\",\n \"80\",\n tmpPath,\n ]);\n }\n\n const buffer = await readFile(tmpPath);\n\n return {\n image: buffer.toString(\"base64\"),\n width: region.width,\n height: region.height,\n scaleFactor: info.scaleFactor,\n format: \"jpg\",\n };\n } finally {\n await unlink(tmpPath).catch(() => {});\n }\n}\n\ninterface DisplayResolution {\n _spdisplays_pixels?: string;\n _spdisplays_resolution?: string;\n spdisplays_resolution?: string;\n}\n\ninterface DisplayData {\n spdisplays_ndrvs?: DisplayResolution[];\n}\n\n/**\n * Get screen logical resolution and scale factor on macOS using system_profiler.\n * Returns logical (point) dimensions that match the coordinate space used by all operations.\n */\nexport async function getScreenInfo(): Promise<ScreenInfo> {\n const { stdout } = await execFileAsync(\"system_profiler\", [\n \"SPDisplaysDataType\",\n \"-json\",\n ]);\n\n const data = JSON.parse(stdout) as { SPDisplaysDataType?: DisplayData[] };\n const displays = data.SPDisplaysDataType ?? [];\n\n for (const gpu of displays) {\n const screens = gpu.spdisplays_ndrvs ?? [];\n for (const screen of screens) {\n const pixelStr = screen._spdisplays_pixels;\n if (pixelStr) {\n const pixelMatch = pixelStr.match(/(\\d+)\\s*x\\s*(\\d+)/);\n if (pixelMatch?.[1] && pixelMatch[2]) {\n const physicalWidth = parseInt(pixelMatch[1], 10);\n const physicalHeight = parseInt(pixelMatch[2], 10);\n\n const resStr =\n screen._spdisplays_resolution ?? screen.spdisplays_resolution ?? \"\";\n const resMatch = resStr.match(/(\\d+)\\s*x\\s*(\\d+)/);\n\n let scaleFactor: number;\n let logicalWidth: number;\n let logicalHeight: number;\n\n if (resMatch?.[1] && resMatch[2]) {\n logicalWidth = parseInt(resMatch[1], 10);\n logicalHeight = parseInt(resMatch[2], 10);\n scaleFactor = Math.round(physicalWidth / logicalWidth);\n } else {\n const isRetina = /retina/i.test(resStr);\n scaleFactor = isRetina ? 2 : 1;\n logicalWidth = Math.floor(physicalWidth / scaleFactor);\n logicalHeight = Math.floor(physicalHeight / scaleFactor);\n }\n\n return {\n width: logicalWidth,\n height: logicalHeight,\n scaleFactor,\n };\n }\n }\n }\n }\n\n return { width: 1920, height: 1080, scaleFactor: 1 };\n}\n","import { execFile } from \"child_process\";\nimport { promisify } from \"util\";\nimport { setTimeout as sleep } from \"timers/promises\";\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Drag from (startX, startY) to (endX, endY) using cliclick.\n * Sends dd (drag down) at start, then du (drag up) at end.\n */\nexport async function leftClickDrag(\n startX: number,\n startY: number,\n endX: number,\n endY: number,\n): Promise<void> {\n await execFileAsync(\"cliclick\", [\n `dd:${startX},${startY}`,\n `du:${endX},${endY}`,\n ]);\n}\n\n/**\n * Press and hold the left mouse button at (x, y).\n */\nexport async function leftMouseDown(x: number, y: number): Promise<void> {\n await execFileAsync(\"cliclick\", [`dd:${x},${y}`]);\n}\n\n/**\n * Release the left mouse button at (x, y).\n */\nexport async function leftMouseUp(x: number, y: number): Promise<void> {\n await execFileAsync(\"cliclick\", [`du:${x},${y}`]);\n}\n\nexport type MouseAction =\n | \"left_click\"\n | \"right_click\"\n | \"middle_click\"\n | \"double_click\"\n | \"triple_click\"\n | \"move\";\n\nconst ACTION_COMMANDS: Record<MouseAction, string> = {\n left_click: \"c\",\n right_click: \"rc\",\n middle_click: \"mc\",\n double_click: \"dc\",\n triple_click: \"tc\",\n move: \"m\",\n};\n\nexport const VALID_ACTIONS = new Set<string>(Object.keys(ACTION_COMMANDS));\n\n/**\n * Check whether cliclick is available on the system.\n * Returns true if installed, false otherwise.\n */\nexport async function isCliclickInstalled(): Promise<boolean> {\n try {\n await execFileAsync(\"which\", [\"cliclick\"]);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Verify that cliclick is installed on the system.\n * Throws with install instructions if not found.\n */\nasync function checkCliclickInstalled(): Promise<void> {\n try {\n await execFileAsync(\"which\", [\"cliclick\"]);\n } catch {\n throw new Error(\"cliclick not found. Install with: brew install cliclick\");\n }\n}\n\n/**\n * Execute a mouse action at the given coordinates using cliclick.\n */\nexport async function executeMouseAction(\n action: MouseAction,\n x: number,\n y: number,\n): Promise<void> {\n await checkCliclickInstalled();\n const prefix = ACTION_COMMANDS[action];\n await execFileAsync(\"cliclick\", [`${prefix}:${x},${y}`]);\n}\n\n/**\n * Get the current cursor position using cliclick.\n * Returns coordinates in points.\n */\nexport async function getCursorPosition(): Promise<{\n x: number;\n y: number;\n}> {\n await checkCliclickInstalled();\n const { stdout } = await execFileAsync(\"cliclick\", [\"p\"]);\n const parts = stdout.trim().split(\",\");\n const xStr = parts[0];\n const yStr = parts[1];\n if (parts.length !== 2 || xStr === undefined || yStr === undefined) {\n throw new Error(`Unexpected cliclick output: ${stdout.trim()}`);\n }\n const x = parseInt(xStr, 10);\n const y = parseInt(yStr, 10);\n if (Number.isNaN(x) || Number.isNaN(y)) {\n throw new Error(`Failed to parse cursor position: ${stdout.trim()}`);\n }\n return { x, y };\n}\n\nconst VALID_SPECIAL_KEYS = new Set([\n \"cmd\",\n \"ctrl\",\n \"alt\",\n \"shift\",\n \"fn\",\n \"arrow-up\",\n \"arrow-down\",\n \"arrow-left\",\n \"arrow-right\",\n \"tab\",\n \"esc\",\n \"space\",\n \"delete\",\n \"return\",\n \"enter\",\n \"home\",\n \"end\",\n \"page-up\",\n \"page-down\",\n ...Array.from({ length: 19 }, (_, i) => {\n return `f${i + 1}`;\n }),\n]);\n\nfunction isValidKeyName(key: string): boolean {\n return VALID_SPECIAL_KEYS.has(key) || key.length === 1;\n}\n\nfunction parseKeyCombo(keys: string): {\n modifiers: string[];\n mainKey: string;\n} {\n const parts = keys.split(\"+\");\n if (\n parts.length === 0 ||\n parts.some((p) => {\n return p === \"\";\n })\n ) {\n throw new Error(`Invalid key combo: \"${keys}\"`);\n }\n\n const mainKey = parts[parts.length - 1]!;\n const modifiers = parts.slice(0, -1);\n\n for (const key of parts) {\n if (!isValidKeyName(key)) {\n throw new Error(\n `Unknown key: \"${key}\". Valid keys: single characters, or special keys like cmd, ctrl, alt, shift, tab, esc, return, arrow-up, f1-f19, etc.`,\n );\n }\n }\n\n return { modifiers, mainKey };\n}\n\n/**\n * Build the cliclick command to press or type a key.\n * Special keys (return, tab, arrow-up, etc.) use `kp:`, regular characters use `t:`.\n */\nfunction keyAction(key: string): string {\n return VALID_SPECIAL_KEYS.has(key) ? `kp:${key}` : `t:${key}`;\n}\n\n/**\n * Press a key combination using cliclick.\n * Accepts combo strings like \"cmd+c\", \"ctrl+shift+s\", or single keys like \"return\".\n */\nexport async function pressKey(keys: string): Promise<void> {\n const { modifiers, mainKey } = parseKeyCombo(keys);\n\n if (modifiers.length === 0) {\n await execFileAsync(\"cliclick\", [keyAction(mainKey)]);\n return;\n }\n\n const args: string[] = [];\n for (const mod of modifiers) {\n args.push(`kd:${mod}`);\n }\n args.push(keyAction(mainKey));\n for (let i = modifiers.length - 1; i >= 0; i--) {\n args.push(`ku:${modifiers[i]}`);\n }\n await execFileAsync(\"cliclick\", args);\n}\n\n/**\n * Hold key(s) down for a specified duration then release.\n * Accepts combo strings like \"shift\" or \"cmd+shift\".\n */\nexport async function holdKey(keys: string, durationMs: number): Promise<void> {\n const { modifiers, mainKey } = parseKeyCombo(keys);\n const allKeys = [...modifiers, mainKey];\n\n const downArgs = allKeys.map((k) => {\n return `kd:${k}`;\n });\n const upArgs = [...allKeys].reverse().map((k) => {\n return `ku:${k}`;\n });\n\n await execFileAsync(\"cliclick\", downArgs);\n await sleep(durationMs);\n await execFileAsync(\"cliclick\", upArgs);\n}\n\n/**\n * Type text at the current cursor position using cliclick.\n */\nexport async function typeText(text: string): Promise<void> {\n await execFileAsync(\"cliclick\", [`t:${text}`]);\n}\n","import { execFile } from \"child_process\";\nimport { promisify } from \"util\";\n\nconst execFileAsync = promisify(execFile);\n\nexport type ScrollDirection = \"up\" | \"down\" | \"left\" | \"right\";\n\nconst DEFAULT_SCROLL_AMOUNT = 3;\n\n/**\n * Scroll at the given screen position using cliclick (mouse move) + osascript (CGEvent scroll).\n *\n * cliclick handles cursor positioning; osascript with CoreGraphics CGEvent API\n * handles the scroll wheel event (cliclick has no native scroll support).\n */\nexport async function scroll(\n x: number,\n y: number,\n direction: ScrollDirection,\n amount: number = DEFAULT_SCROLL_AMOUNT,\n): Promise<void> {\n // Move cursor to target position\n await execFileAsync(\"cliclick\", [`m:${x},${y}`]);\n\n // CGEvent scroll: positive dy = scroll up, negative dy = scroll down\n // Second wheel axis: positive dx = scroll left, negative dx = scroll right\n let dy = 0;\n let dx = 0;\n switch (direction) {\n case \"up\":\n dy = amount;\n break;\n case \"down\":\n dy = -amount;\n break;\n case \"left\":\n dx = amount;\n break;\n case \"right\":\n dx = -amount;\n break;\n }\n\n const script = [\n \"ObjC.import('CoreGraphics');\",\n `var e = $.CGEventCreateScrollWheelEvent(null, 0, 2, ${dy}, ${dx});`,\n \"$.CGEventPost($.kCGHIDEventTap, e);\",\n ].join(\" \");\n\n await execFileAsync(\"osascript\", [\"-l\", \"JavaScript\", \"-e\", script]);\n}\n","import { execFile, spawn } from \"child_process\";\nimport { promisify } from \"util\";\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Read text content from the macOS clipboard using pbpaste.\n */\nexport async function readClipboard(): Promise<string> {\n const { stdout } = await execFileAsync(\"pbpaste\");\n return stdout;\n}\n\n/**\n * Write text content to the macOS clipboard using pbcopy.\n */\nexport async function writeClipboard(text: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const proc = spawn(\"pbcopy\", { stdio: [\"pipe\", \"ignore\", \"ignore\"] });\n proc.on(\"error\", reject);\n proc.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`pbcopy exited with code ${code}`));\n }\n });\n proc.stdin.end(text);\n });\n}\n","import { execFile } from \"child_process\";\nimport { promisify } from \"util\";\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Open or activate a macOS application by name or bundle ID.\n * Detects bundle IDs by the presence of dots (e.g., com.apple.Safari).\n */\nexport async function openApplication(nameOrBundleId: string): Promise<void> {\n const isBundleId = nameOrBundleId.includes(\".\");\n const flag = isBundleId ? \"-b\" : \"-a\";\n await execFileAsync(\"open\", [flag, nameOrBundleId]);\n}\n","// Dynamic import is intentional: @ngrok/ngrok contains native binaries that\n// crash on systems with GLIBC version mismatches. Lazy-loading ensures the\n// crash only affects the command that needs ngrok, not the entire CLI.\n// See: https://github.com/vm0-ai/vm0/issues/6825\nasync function loadNgrok(): Promise<typeof import(\"@ngrok/ngrok\")> {\n try {\n const mod = await import(\"@ngrok/ngrok\");\n return mod.default;\n } catch (cause) {\n throw new Error(\n \"Failed to load ngrok tunnel module. \" +\n \"This may be caused by a system library (GLIBC) incompatibility. \" +\n \"See: https://github.com/vm0-ai/vm0/issues/6825\",\n { cause },\n );\n }\n}\n\nexport async function startDesktopTunnel(\n ngrokToken: string,\n endpointPrefix: string,\n port: number,\n): Promise<void> {\n const ngrok = await loadNgrok();\n\n await ngrok.forward({\n addr: `localhost:${port}`,\n authtoken: ngrokToken,\n domain: `desktop.${endpointPrefix}.internal`,\n });\n}\n\nexport async function stopDesktopTunnel(): Promise<void> {\n const ngrok = await loadNgrok();\n await ngrok.kill();\n}\n","import { Command } from \"commander\";\nimport { writeFile, mkdir } from \"fs/promises\";\nimport { join } from \"path\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\nimport { callHost } from \"../../../lib/computer-use/client\";\n\nfunction mouseClickCommand(\n name: string,\n action: string,\n description: string,\n): Command {\n return new Command()\n .name(name)\n .description(description)\n .argument(\"<x>\", \"X coordinate (points)\")\n .argument(\"<y>\", \"Y coordinate (points)\")\n .action(\n withErrorHandler(async (xStr: string, yStr: string) => {\n const x = parseInt(xStr, 10);\n const y = parseInt(yStr, 10);\n if (Number.isNaN(x) || Number.isNaN(y)) {\n throw new Error(\"Coordinates must be integers\");\n }\n const response = await callHost(\"/mouse\", {\n method: \"POST\",\n body: { action, x, y },\n });\n const data = await response.json();\n process.stdout.write(JSON.stringify(data) + \"\\n\");\n }),\n );\n}\n\nexport const clientScreenshotCommand = new Command()\n .name(\"screenshot\")\n .description(\"Capture a screenshot from the remote host\")\n .action(\n withErrorHandler(async () => {\n const response = await callHost(\"/screenshot\");\n const data = (await response.json()) as {\n width: number;\n height: number;\n scaleFactor: number;\n format: string;\n image: string;\n };\n\n const dir = \"/tmp/computer-use\";\n await mkdir(dir, { recursive: true });\n\n const timestamp = Date.now();\n const filePath = join(dir, `screenshot-${timestamp}.${data.format}`);\n const buffer = Buffer.from(data.image, \"base64\");\n await writeFile(filePath, buffer);\n\n // Path to stdout for programmatic consumption\n process.stdout.write(`${filePath}\\n`);\n\n // Metadata to stderr for human/debug consumption\n process.stderr.write(\n JSON.stringify({\n width: data.width,\n height: data.height,\n scaleFactor: data.scaleFactor,\n }) + \"\\n\",\n );\n }),\n );\n\nexport const clientZoomCommand = new Command()\n .name(\"zoom\")\n .description(\"Capture a region screenshot from the remote host\")\n .requiredOption(\"--x <number>\", \"X coordinate of the region\")\n .requiredOption(\"--y <number>\", \"Y coordinate of the region\")\n .requiredOption(\"--width <number>\", \"Width of the region\")\n .requiredOption(\"--height <number>\", \"Height of the region\")\n .action(\n withErrorHandler(\n async (opts: { x: string; y: string; width: string; height: string }) => {\n const params = new URLSearchParams({\n x: opts.x,\n y: opts.y,\n width: opts.width,\n height: opts.height,\n });\n const response = await callHost(`/zoom?${params.toString()}`);\n const data = (await response.json()) as {\n width: number;\n height: number;\n scaleFactor: number;\n format: string;\n image: string;\n };\n\n const dir = \"/tmp/computer-use\";\n await mkdir(dir, { recursive: true });\n\n const timestamp = Date.now();\n const filePath = join(dir, `zoom-${timestamp}.${data.format}`);\n const buffer = Buffer.from(data.image, \"base64\");\n await writeFile(filePath, buffer);\n\n process.stdout.write(`${filePath}\\n`);\n\n process.stderr.write(\n JSON.stringify({\n width: data.width,\n height: data.height,\n scaleFactor: data.scaleFactor,\n }) + \"\\n\",\n );\n },\n ),\n );\n\nexport const clientInfoCommand = new Command()\n .name(\"info\")\n .description(\"Get screen info from the remote host\")\n .action(\n withErrorHandler(async () => {\n const response = await callHost(\"/info\");\n const data = (await response.json()) as {\n width: number;\n height: number;\n scaleFactor: number;\n };\n\n process.stdout.write(JSON.stringify(data) + \"\\n\");\n }),\n );\n\nexport const clientLeftClickCommand = mouseClickCommand(\n \"left-click\",\n \"left_click\",\n \"Perform a left click at coordinates\",\n);\n\nexport const clientRightClickCommand = mouseClickCommand(\n \"right-click\",\n \"right_click\",\n \"Perform a right click at coordinates\",\n);\n\nexport const clientMiddleClickCommand = mouseClickCommand(\n \"middle-click\",\n \"middle_click\",\n \"Perform a middle click at coordinates\",\n);\n\nexport const clientDoubleClickCommand = mouseClickCommand(\n \"double-click\",\n \"double_click\",\n \"Perform a double click at coordinates\",\n);\n\nexport const clientTripleClickCommand = mouseClickCommand(\n \"triple-click\",\n \"triple_click\",\n \"Perform a triple click at coordinates\",\n);\n\nexport const clientLeftClickDragCommand = new Command()\n .name(\"left-click-drag\")\n .description(\"Drag from (startX, startY) to (endX, endY)\")\n .argument(\"<startX>\", \"Start X coordinate\")\n .argument(\"<startY>\", \"Start Y coordinate\")\n .argument(\"<endX>\", \"End X coordinate\")\n .argument(\"<endY>\", \"End Y coordinate\")\n .action(\n withErrorHandler(\n async (startX: string, startY: string, endX: string, endY: string) => {\n await callHost(\"/mouse\", {\n method: \"POST\",\n body: {\n action: \"left_click_drag\",\n startX: Number(startX),\n startY: Number(startY),\n endX: Number(endX),\n endY: Number(endY),\n },\n });\n process.stdout.write(\"ok\\n\");\n },\n ),\n );\n\nexport const clientLeftMouseDownCommand = new Command()\n .name(\"left-mouse-down\")\n .description(\"Press and hold the left mouse button at (x, y)\")\n .argument(\"<x>\", \"X coordinate\")\n .argument(\"<y>\", \"Y coordinate\")\n .action(\n withErrorHandler(async (x: string, y: string) => {\n await callHost(\"/mouse\", {\n method: \"POST\",\n body: { action: \"left_mouse_down\", x: Number(x), y: Number(y) },\n });\n process.stdout.write(\"ok\\n\");\n }),\n );\n\nexport const clientLeftMouseUpCommand = new Command()\n .name(\"left-mouse-up\")\n .description(\"Release the left mouse button at (x, y)\")\n .argument(\"<x>\", \"X coordinate\")\n .argument(\"<y>\", \"Y coordinate\")\n .action(\n withErrorHandler(async (x: string, y: string) => {\n await callHost(\"/mouse\", {\n method: \"POST\",\n body: { action: \"left_mouse_up\", x: Number(x), y: Number(y) },\n });\n process.stdout.write(\"ok\\n\");\n }),\n );\n\nexport const clientScrollCommand = new Command()\n .name(\"scroll\")\n .description(\"Scroll at the given screen position\")\n .argument(\"<x>\", \"X coordinate\")\n .argument(\"<y>\", \"Y coordinate\")\n .argument(\"<direction>\", \"Scroll direction: up, down, left, right\")\n .argument(\"[amount]\", \"Scroll amount in lines (default 3)\")\n .action(\n withErrorHandler(\n async (x: string, y: string, direction: string, amount?: string) => {\n await callHost(\"/mouse\", {\n method: \"POST\",\n body: {\n action: \"scroll\",\n x: Number(x),\n y: Number(y),\n direction,\n ...(amount !== undefined && { amount: Number(amount) }),\n },\n });\n process.stdout.write(\"ok\\n\");\n },\n ),\n );\n\nexport const clientReadClipboardCommand = new Command()\n .name(\"read-clipboard\")\n .description(\"Read text content from the remote clipboard\")\n .action(\n withErrorHandler(async () => {\n const response = await callHost(\"/clipboard\");\n const data = (await response.json()) as { text: string };\n process.stdout.write(data.text);\n }),\n );\n\nexport const clientWriteClipboardCommand = new Command()\n .name(\"write-clipboard\")\n .description(\"Write text content to the remote clipboard\")\n .argument(\"<text>\", \"Text to write to clipboard\")\n .action(\n withErrorHandler(async (text: string) => {\n await callHost(\"/clipboard\", {\n method: \"POST\",\n body: { text },\n });\n process.stdout.write(\"ok\\n\");\n }),\n );\n\nexport const clientKeyCommand = new Command()\n .name(\"key\")\n .description(\"Press a key or key combination (e.g., cmd+c, return)\")\n .argument(\"<combo>\", \"Key combo string (e.g., cmd+c, ctrl+shift+s, return)\")\n .action(\n withErrorHandler(async (combo: string) => {\n await callHost(\"/keyboard\", {\n method: \"POST\",\n body: { action: \"key\", keys: combo },\n });\n process.stdout.write(\"ok\\n\");\n }),\n );\n\nexport const clientHoldKeyCommand = new Command()\n .name(\"hold-key\")\n .description(\"Hold a key or key combination for a duration\")\n .argument(\"<combo>\", \"Key combo string (e.g., shift, cmd+shift)\")\n .argument(\"<durationMs>\", \"Duration to hold in milliseconds\")\n .action(\n withErrorHandler(async (combo: string, durationStr: string) => {\n const durationMs = parseInt(durationStr, 10);\n if (Number.isNaN(durationMs) || durationMs <= 0) {\n throw new Error(\"durationMs must be a positive integer\");\n }\n await callHost(\"/keyboard\", {\n method: \"POST\",\n body: { action: \"hold_key\", keys: combo, durationMs },\n });\n process.stdout.write(\"ok\\n\");\n }),\n );\n\nexport const clientTypeCommand = new Command()\n .name(\"type\")\n .description(\"Type text at the current cursor position\")\n .argument(\"<text>\", \"Text to type\")\n .action(\n withErrorHandler(async (text: string) => {\n await callHost(\"/keyboard\", {\n method: \"POST\",\n body: { action: \"type\", text },\n });\n process.stdout.write(\"ok\\n\");\n }),\n );\n\nexport const clientOpenAppCommand = new Command()\n .name(\"open-app\")\n .description(\"Open or activate a macOS application by name or bundle ID\")\n .argument(\n \"<nameOrBundleId>\",\n \"App name (e.g., Safari) or bundle ID (e.g., com.apple.Safari)\",\n )\n .action(\n withErrorHandler(async (nameOrBundleId: string) => {\n await callHost(\"/open-application\", {\n method: \"POST\",\n body: { nameOrBundleId },\n });\n process.stdout.write(\"ok\\n\");\n }),\n );\n\nexport const clientMouseMoveCommand = mouseClickCommand(\n \"mouse-move\",\n \"move\",\n \"Move mouse pointer to coordinates\",\n);\n\nexport const clientCursorPositionCommand = new Command()\n .name(\"cursor-position\")\n .description(\"Get current cursor position from the remote host\")\n .action(\n withErrorHandler(async () => {\n const response = await callHost(\"/cursor-position\");\n const data = (await response.json()) as { x: number; y: number };\n process.stdout.write(JSON.stringify(data) + \"\\n\");\n }),\n );\n","import { getComputerUseHost } from \"../api\";\n\nlet cachedHost: { domain: string; token: string; cachedAt: number } | null =\n null;\nconst CACHE_TTL_MS = 30_000;\n\n/**\n * Discover the active computer-use host for the current org/user.\n * Results are cached for 30 seconds.\n */\nasync function discoverHost(): Promise<{\n domain: string;\n token: string;\n}> {\n if (cachedHost && Date.now() - cachedHost.cachedAt < CACHE_TTL_MS) {\n return { domain: cachedHost.domain, token: cachedHost.token };\n }\n\n const host = await getComputerUseHost();\n if (!host) {\n throw new Error(\n \"No active computer-use host found\\n\\n\" +\n \"Start a host with: zero computer-use host start\",\n );\n }\n\n cachedHost = { ...host, cachedAt: Date.now() };\n return host;\n}\n\n/**\n * Make an HTTP request to the computer-use host.\n */\nexport async function callHost(\n path: string,\n options?: { method?: string; body?: unknown },\n): Promise<Response> {\n const { domain, token } = await discoverHost();\n const url = `https://desktop.${domain}${path}`;\n\n const headers: Record<string, string> = { \"x-vm0-token\": token };\n const init: RequestInit = { headers };\n\n if (options?.method) {\n init.method = options.method;\n }\n if (options?.body !== undefined) {\n headers[\"content-type\"] = \"application/json\";\n init.body = JSON.stringify(options.body);\n }\n\n const response = await fetch(url, init);\n\n if (!response.ok) {\n const body = await response.text().catch(() => {\n return \"\";\n });\n throw new Error(\n `Host returned ${response.status}: ${body || response.statusText}`,\n );\n }\n\n return response;\n}\n","import { Command } from \"commander\";\nimport { downloadFileCommand } from \"./download-file\";\nimport { uploadFileCommand } from \"./upload-file\";\n\nexport const zeroWebCommand = new Command()\n .name(\"web\")\n .description(\"Upload and download files via the web chat endpoint\")\n .addCommand(downloadFileCommand)\n .addCommand(uploadFileCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Upload a file: zero web upload-file -f /tmp/report.pdf\n Download a file: zero web download-file <file-id> -o /tmp/out.pdf`,\n );\n","import { join } from \"path\";\nimport { tmpdir } from \"os\";\nimport { Command } from \"commander\";\nimport { downloadWebFile } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\n/**\n * Derive a local output path for a web-uploaded file id.\n * Uses the system temp directory.\n */\nfunction defaultOutPath(fileId: string): string {\n return join(tmpdir(), `web-${fileId}`);\n}\n\nexport const downloadFileCommand = new Command()\n .name(\"download-file\")\n .description(\"Download a web-uploaded file by id\")\n .argument(\"<file-id>\", \"File id (UUID returned by the upload API)\")\n .option(\n \"-o, --out <path>\",\n \"Output path for the downloaded file (default: /tmp/web-<file-id>)\",\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n Download to default temp path: zero web download-file abc-123-def\n Download to explicit path: zero web download-file abc-123-def -o /tmp/report.pdf\n\nOutput:\n Prints a JSON object to stdout on success:\n {\"path\":\"/tmp/web-abc-123-def\",\"mimetype\":\"application/pdf\",\"size\":12345}\n\nHow to read the downloaded file:\n - Images (png/jpg/gif/webp/svg): open the file path with your image viewing tool\n - Videos (mp4/mov/webm): extract frames first with\n ffmpeg -i <path> -vf \"fps=1\" -q:v 2 /tmp/<file-id>_frame_%03d.jpg\n then view the extracted frames\n - PDF/text/csv/json/markdown: read the file directly\n\nNotes:\n - Authenticates via ZERO_TOKEN\n - Streams the file bytes directly to disk`,\n )\n .action(\n withErrorHandler(async (fileId: string, options: { out?: string }) => {\n const outPath = options.out ?? defaultOutPath(fileId);\n const result = await downloadWebFile(fileId, outPath);\n console.log(JSON.stringify(result));\n }),\n );\n","import { Command } from \"commander\";\nimport { uploadWebFile } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const uploadFileCommand = new Command()\n .name(\"upload-file\")\n .description(\"Upload a local file and print a permanent URL\")\n .requiredOption(\"-f, --file <path>\", \"Local file path to upload\")\n .option(\"--content-type <mime>\", \"Override inferred content type\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Upload a file: zero web upload-file -f /tmp/report.pdf\n Override content-type: zero web upload-file -f /tmp/data --content-type text/csv\n\nOutput:\n Prints a JSON object to stdout on success:\n {\"id\":\"...\",\"filename\":\"...\",\"contentType\":\"...\",\"size\":N,\"url\":\"https://...\"}\n\nNotes:\n - Authenticates via ZERO_TOKEN (requires file:write capability)\n - Returned URL is permanent (serves a short-lived signed redirect on access)\n - Safe to persist in chat messages or share over external channels\n - Max file size: 1 GB\n - Allowed types: png / jpeg / gif / webp / svg / mp4 / webm / mov / pdf / txt / csv / md / html / json`,\n )\n .action(\n withErrorHandler(\n async (options: { file: string; contentType?: string }) => {\n const result = await uploadWebFile(options.file, {\n contentType: options.contentType,\n });\n console.log(JSON.stringify(result));\n },\n ),\n );\n"],"mappings":"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ACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,aAAa;AAAA,UACb,OAAO;AAAA,YACL;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,aAAa;AAAA,UACb,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,aAAa;AAAA,UACb,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;A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AAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,Y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A,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAA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A,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAA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ACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,Q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YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,aAAa;AAAA,UACb,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,aAAa;AAAA,UACb,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,aAAa;AAAA,UACb,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,aAAa;AAAA,UACb,OAAO;AAAA,YACL;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,aAAa;AAAA,UACb,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,aAAa;AAAA,UACb,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,aAAa;AAAA,UACb,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;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ACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,aAAa;AAAA,UACb,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,aAAa;AAAA,UACb,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,aAAa;AAAA,UACb,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,aAAa;AAAA,UACb,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,aAAa;AAAA,UACb,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,aAAa;AAAA,UACb,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,aAAa;AAAA,UACb,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,aAAa;AAAA,UACb,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,aAAa;AAAA,UACb,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,QACJ,SAAS;AAAA,UACP,iBAAiB;AAAA,QACnB;AAAA,MACF;AAAA,MACA,aAAa;AAAA,QACX;AAAA,UACE,MAAM;AAAA,UACN,aAAa;AAAA,UACb,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,aAAa;AAAA,UACb,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAA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AAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;A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A,MACE,MAAM;AAAA,MACN,MAAM;AAAA,QACJ,SAAS;AAAA,UACP,eAAe;AAAA,QACjB;AAAA,MACF;AAAA,MACA,aAAa;AAAA,QACX;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,QACJ,SAAS;AAAA,UACP,eAAe;AAAA,QACjB;AAAA,MACF;AAAA,MACA,aAAa;AAAA,QACX;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,QACJ,SAAS;AAAA,UACP,eAAe;AAAA,QACjB;AAAA,MACF;AAAA,MACA,aAAa;AAAA,QACX;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,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QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,QACJ,SAAS;AAAA,UACP,eAAe;AAAA,QACjB;AAAA,MACF;AAAA,MACA,aAAa;AAAA,QACX;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,QACJ,SAAS;AAAA,UACP,eAAe;AAAA,QACjB;AAAA,MACF;AAAA,MACA,aAAa;AAAA,QACX;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACh8BA;AAQO,IAAM,kBAAkB;AAAA,EAC7B,MAAM;AAAA,EACN,aAAa;AAAA,EACb,cAAc;AAAA,IACZ,eAAe;AAAA,EACjB;AAAA,EACA,MAAM;AAAA,IACJ;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,QACJ,SAAS;AAAA,UACP,kBAAkB;AAAA,QACpB;AAAA,MACF;AAAA,MACA,aAAa;AAAA,QACX;AAAA,UACE,MAAM;AAAA,UACN,aAAa;AAAA,UACb,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,aAAa;AAAA,UACb,OAAO;AAAA,YACL;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,aAAa;AAAA,UACb,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AA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","names":["listCommand","setCommand","removeCommand","listCommand","setCommand","removeCommand","listCommand","setCommand","removeCommand","listCommand","setCommand","removeCommand","listCommand","import_prompts","prompts","type","config","prompts","selectedModel","provider","defaultNote","modelNote","removeCommand","listCommand","removeCommand","readFileSync","readFileSync","listCommand","deleteCommand","listCommand","deleteCommand","listCommand","statusCommand","listCommand","statusCommand","detectTimezone","readFileSync","day","readFileSync","setupCommand","listCommand","statusCommand","deleteCommand","setupCommand","listCommand","statusCommand","deleteCommand","listCommand","setCommand","deleteCommand","listCommand","setCommand","deleteCommand","readFileSync","readFileSync","readFileSync","sendCommand","readFileSync","sendCommand","readFileSync","readFileSync","listCommand","listCommand","join","tmpdir","defaultOutPath","join","tmpdir","downloadFileCommand","readFileSync","sendCommand","readFileSync","sendCommand","readFileSync","statSync","basename","uploadFileCommand","statSync","basename","readFileSync","downloadFileCommand","uploadFileCommand","truncateValue","listCommand","setCommand","deleteCommand","listCommand","setCommand","deleteCommand","formatConnectorIdentity","unknownIcon","readFileSync","join","createCommand","editCommand","viewCommand","listCommand","deleteCommand","createCommand","editCommand","viewCommand","listCommand","deleteCommand","listCommand","parseLimit","searchCommand","listCommand","searchCommand","SEVEN_DAYS_MS","parseContextOptions","parseLimit","join","tmpdir","execFile","promisify","sleep","execFileAsync","execFile","promisify","execFileAsync","execFile","promisify","execFileAsync","execFile","promisify","execFileAsync","join","join","join","tmpdir","defaultOutPath","join","tmpdir","downloadFileCommand","uploadFileCommand","downloadFileCommand","uploadFileCommand"]}
|
|
1
|
+
{"version":3,"sources":["../src/zero.ts","../src/commands/zero/org/index.ts","../src/commands/zero/org/status.ts","../src/commands/zero/org/set.ts","../src/commands/zero/org/list.ts","../src/commands/zero/org/use.ts","../src/commands/zero/org/members.ts","../src/commands/zero/org/invite.ts","../src/commands/zero/org/remove.ts","../src/commands/zero/org/leave.ts","../src/commands/zero/org/delete.ts","../src/commands/zero/org/secret/index.ts","../src/commands/zero/org/secret/list.ts","../src/commands/zero/org/secret/set.ts","../src/commands/zero/org/secret/remove.ts","../src/commands/zero/org/variable/index.ts","../src/commands/zero/org/variable/list.ts","../src/commands/zero/org/variable/set.ts","../src/commands/zero/org/variable/remove.ts","../src/commands/zero/org/model-provider/index.ts","../src/commands/zero/org/model-provider/list.ts","../src/commands/zero/org/model-provider/setup.ts","../src/lib/domain/model-provider/shared.ts","../src/commands/zero/org/model-provider/remove.ts","../src/commands/zero/org/model-provider/set-default.ts","../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/lib/utils/format-utils.ts","../src/commands/zero/agent/list.ts","../src/commands/zero/agent/delete.ts","../src/commands/zero/connector/index.ts","../src/commands/zero/connector/list.ts","../src/commands/zero/connector/agent-context.ts","../src/commands/zero/connector/connected-as.ts","../src/commands/zero/connector/search.ts","../src/commands/zero/connector/status.ts","../src/lib/domain/schedule-utils.ts","../src/commands/zero/doctor/platform-url.ts","../src/commands/zero/doctor/index.ts","../src/commands/zero/doctor/check-connector.ts","../src/commands/zero/doctor/permission-deny.ts","../src/commands/zero/doctor/permission-change.ts","../src/commands/zero/doctor/resolve-role.ts","../src/commands/zero/preference/index.ts","../src/commands/zero/run/index.ts","../src/commands/zero/run/run.ts","../src/commands/zero/run/shared.ts","../src/commands/zero/run/continue.ts","../src/commands/zero/schedule/index.ts","../src/commands/zero/schedule/setup.ts","../src/commands/zero/schedule/list.ts","../src/commands/zero/schedule/status.ts","../src/commands/zero/schedule/delete.ts","../src/commands/zero/schedule/enable.ts","../src/commands/zero/schedule/disable.ts","../src/commands/zero/secret/index.ts","../src/commands/zero/secret/list.ts","../src/commands/zero/secret/set.ts","../src/commands/zero/secret/delete.ts","../src/commands/zero/chat/index.ts","../src/commands/zero/chat/message/index.ts","../src/commands/zero/chat/message/send.ts","../src/commands/zero/slack/index.ts","../src/commands/zero/slack/message/index.ts","../src/commands/zero/slack/message/send.ts","../src/commands/zero/slack/upload-file.ts","../src/commands/zero/slack/download-file.ts","../src/commands/zero/telegram/index.ts","../src/commands/zero/telegram/bot/index.ts","../src/commands/zero/telegram/bot/list.ts","../src/commands/zero/telegram/download-file.ts","../src/commands/zero/telegram/message/index.ts","../src/commands/zero/telegram/message/send.ts","../src/commands/zero/telegram/upload-file.ts","../src/commands/zero/variable/index.ts","../src/commands/zero/variable/list.ts","../src/commands/zero/variable/set.ts","../src/commands/zero/variable/delete.ts","../src/commands/zero/whoami.ts","../src/commands/zero/skill/index.ts","../src/commands/zero/skill/create.ts","../src/lib/skill-directory.ts","../src/commands/zero/skill/edit.ts","../src/commands/zero/skill/view.ts","../src/commands/zero/skill/list.ts","../src/commands/zero/skill/delete.ts","../src/commands/zero/logs/index.ts","../src/commands/zero/logs/list.ts","../src/commands/zero/logs/search.ts","../src/commands/zero/search/index.ts","../src/commands/zero/developer-support.ts","../src/commands/zero/computer-use/index.ts","../src/commands/zero/computer-use/host.ts","../src/lib/computer-use/desktop-server.ts","../src/lib/computer-use/screencapture.ts","../src/lib/computer-use/cliclick.ts","../src/lib/computer-use/scroll.ts","../src/lib/computer-use/clipboard.ts","../src/lib/computer-use/application.ts","../src/lib/computer-use/ngrok.ts","../src/commands/zero/computer-use/client.ts","../src/lib/computer-use/client.ts","../src/commands/zero/web/index.ts","../src/commands/zero/web/download-file.ts","../src/commands/zero/web/upload-file.ts"],"sourcesContent":["// Zero CLI entry point - standalone binary for zero platform commands\n// Sentry must be initialized before any other imports\nimport \"./instrument.js\";\nimport { Command } from \"commander\";\nimport { configureGlobalProxyFromEnv } from \"./lib/network/proxy.js\";\nimport { zeroOrgCommand } from \"./commands/zero/org\";\nimport { zeroAgentCommand } from \"./commands/zero/agent\";\nimport { zeroConnectorCommand } from \"./commands/zero/connector\";\nimport { zeroDoctorCommand } from \"./commands/zero/doctor\";\nimport { zeroPreferenceCommand } from \"./commands/zero/preference\";\nimport { zeroRunCommand } from \"./commands/zero/run\";\nimport { zeroScheduleCommand } from \"./commands/zero/schedule\";\nimport { zeroSecretCommand } from \"./commands/zero/secret\";\nimport { zeroChatCommand } from \"./commands/zero/chat\";\nimport { zeroSlackCommand } from \"./commands/zero/slack\";\nimport { zeroTelegramCommand } from \"./commands/zero/telegram\";\nimport { zeroVariableCommand } from \"./commands/zero/variable\";\nimport { zeroWhoamiCommand } from \"./commands/zero/whoami\";\nimport { zeroSkillCommand } from \"./commands/zero/skill\";\nimport { zeroLogsCommand } from \"./commands/zero/logs\";\nimport { zeroSearchCommand } from \"./commands/zero/search\";\nimport { zeroDeveloperSupportCommand } from \"./commands/zero/developer-support\";\nimport { zeroComputerUseCommand } from \"./commands/zero/computer-use\";\nimport { zeroWebCommand } from \"./commands/zero/web\";\nimport {\n decodeZeroTokenPayload,\n type ZeroTokenPayload,\n} from \"./lib/api/zero-token.js\";\n\n/**\n * Map of command names to the capability required to see them.\n * Commands not in this map are hidden when ZERO_TOKEN is active.\n * Use an array when a top-level command has subcommands with different\n * capability gates and any one of them should make the command visible.\n * Use `null` for commands that should always be visible in sandbox.\n */\nconst COMMAND_CAPABILITY_MAP: Record<\n string,\n string | readonly string[] | null\n> = {\n agent: \"agent:read\",\n skill: \"agent:read\",\n connector: \"connector:read\",\n run: \"agent-run:write\",\n schedule: \"schedule:read\",\n doctor: null,\n logs: \"agent-run:read\",\n search: \"chat-message:read\",\n chat: \"chat-message:write\",\n slack: \"slack:write\",\n telegram: [\"telegram:read\", \"telegram:write\"],\n whoami: null,\n \"developer-support\": null,\n \"computer-use\": \"computer-use:write\",\n web: null,\n};\n\nconst DEFAULT_COMMANDS: Command[] = [\n zeroOrgCommand,\n zeroAgentCommand,\n zeroConnectorCommand,\n zeroDoctorCommand,\n zeroPreferenceCommand,\n zeroRunCommand,\n zeroScheduleCommand,\n zeroSecretCommand,\n zeroChatCommand,\n zeroSlackCommand,\n zeroTelegramCommand,\n zeroVariableCommand,\n zeroLogsCommand,\n zeroSearchCommand,\n zeroWhoamiCommand,\n zeroSkillCommand,\n zeroDeveloperSupportCommand,\n zeroComputerUseCommand,\n zeroWebCommand,\n];\n\nfunction shouldHideCommand(\n name: string,\n payload: ZeroTokenPayload | undefined,\n): boolean {\n if (!payload) return false;\n const requiredCap = COMMAND_CAPABILITY_MAP[name];\n if (requiredCap === undefined) return true;\n if (requiredCap === null) return false;\n if (typeof requiredCap !== \"string\") {\n return !requiredCap.some((capability) => {\n return payload.capabilities.includes(capability);\n });\n }\n return !payload.capabilities.includes(requiredCap);\n}\n\n/**\n * Register commands with visibility based on ZERO_TOKEN capabilities.\n * Commands not granted by the token are registered as hidden via\n * Commander's public `addCommand(cmd, { hidden: true })` API.\n * When no ZERO_TOKEN is present, all commands remain visible.\n *\n * @param commands - override default commands (used in tests)\n */\nexport function registerZeroCommands(\n prog: Command,\n commands?: Command[],\n): void {\n const token = process.env.ZERO_TOKEN;\n const payload = token ? decodeZeroTokenPayload(token) : undefined;\n\n for (const cmd of commands ?? DEFAULT_COMMANDS) {\n const hidden = shouldHideCommand(cmd.name(), payload);\n prog.addCommand(cmd, hidden ? { hidden: true } : {});\n }\n}\n\nconst program = new Command();\n\ndeclare const __CLI_VERSION__: string;\n\nprogram\n .name(\"zero\")\n .description(\n \"Zero CLI — interact with the zero platform from inside the sandbox\",\n )\n .version(__CLI_VERSION__)\n .addHelpText(\n \"after\",\n `\nExamples:\n Check a connector? zero doctor check-connector --env-name <ENV_NAME>\n Send a Slack message? zero slack message send --help\n List Telegram bots? zero telegram bot list\n Send Telegram? zero telegram message send --help\n Upload Telegram? zero telegram upload-file --help\n Download Telegram? zero telegram download-file --help\n Set up a schedule? zero schedule setup --help\n Update yourself? zero agent --help\n Manage custom skills? zero skill --help\n Check your identity? zero whoami`,\n );\n\nexport { program };\n\nif (\n process.argv[1]?.endsWith(\"zero.js\") ||\n process.argv[1]?.endsWith(\"zero.ts\") ||\n process.argv[1]?.endsWith(\"zero\")\n) {\n configureGlobalProxyFromEnv();\n registerZeroCommands(program);\n program.parse();\n}\n","import { Command } from \"commander\";\nimport { statusCommand } from \"./status\";\nimport { setCommand } from \"./set\";\nimport { listCommand } from \"./list\";\nimport { useCommand } from \"./use\";\nimport { membersCommand } from \"./members\";\nimport { inviteCommand } from \"./invite\";\nimport { removeCommand } from \"./remove\";\nimport { leaveCommand } from \"./leave\";\nimport { deleteCommand } from \"./delete\";\nimport { zeroOrgSecretCommand } from \"./secret\";\nimport { zeroOrgVariableCommand } from \"./variable\";\nimport { zeroOrgModelProviderCommand } from \"./model-provider\";\n\nexport const zeroOrgCommand = new Command()\n .name(\"org\")\n .description(\"Manage organization settings, members, and providers\")\n .addCommand(statusCommand)\n .addCommand(setCommand)\n .addCommand(listCommand)\n .addCommand(useCommand)\n .addCommand(membersCommand)\n .addCommand(inviteCommand)\n .addCommand(removeCommand)\n .addCommand(leaveCommand)\n .addCommand(deleteCommand)\n .addCommand(zeroOrgSecretCommand)\n .addCommand(zeroOrgVariableCommand)\n .addCommand(zeroOrgModelProviderCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getZeroOrg } from \"../../../lib/api\";\nimport { ApiRequestError } from \"../../../lib/api/core/client-factory\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const statusCommand = new Command()\n .name(\"status\")\n .description(\"View current organization status\")\n .action(\n withErrorHandler(async () => {\n try {\n const org = await getZeroOrg();\n\n console.log(chalk.bold(\"Organization Information:\"));\n console.log(` Slug: ${chalk.green(org.slug)}`);\n } catch (error) {\n if (error instanceof ApiRequestError && error.status === 404) {\n throw new Error(\"No organization configured\", {\n cause: new Error(\"Set your organization with: zero org set <slug>\"),\n });\n }\n throw error;\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getZeroOrg, updateZeroOrg, switchZeroOrg } from \"../../../lib/api\";\nimport { saveConfig } from \"../../../lib/api/config\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const setCommand = new Command()\n .name(\"set\")\n .description(\"Rename your organization slug\")\n .argument(\"<slug>\", \"The new organization slug\")\n .option(\n \"--force\",\n \"Force change existing organization (may break references)\",\n )\n .action(\n withErrorHandler(async (slug: string, options: { force?: boolean }) => {\n try {\n const existingOrg = await getZeroOrg();\n\n if (!options.force) {\n throw new Error(\n `You already have an organization: ${existingOrg.slug}`,\n {\n cause: new Error(`To change, use: zero org set ${slug} --force`),\n },\n );\n }\n\n const org = await updateZeroOrg({ slug, force: true });\n\n const result = await switchZeroOrg(org.slug);\n await saveConfig({\n token: result.access_token,\n });\n\n console.log(chalk.green(`✓ Organization updated to ${org.slug}`));\n console.log();\n console.log(\"Your agents will now be namespaced as:\");\n console.log(chalk.cyan(` ${org.slug}/<agent-name>`));\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\"already exists\")\n ) {\n throw new Error(\n `Organization \"${slug}\" is already taken. Please choose a different slug.`,\n );\n }\n throw error;\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroOrgs } from \"../../../lib/api\";\nimport { getActiveOrg } from \"../../../lib/api/config\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .description(\"List all accessible organizations\")\n .action(\n withErrorHandler(async () => {\n const result = await listZeroOrgs();\n const activeOrg = await getActiveOrg();\n\n console.log(chalk.bold(\"Available organizations:\"));\n for (const org of result.orgs) {\n const isCurrent = org.slug === activeOrg;\n const marker = isCurrent ? chalk.green(\"* \") : \" \";\n const roleLabel = org.role ? ` (${org.role})` : \"\";\n const currentLabel = isCurrent ? chalk.dim(\" ← current\") : \"\";\n console.log(`${marker}${org.slug}${roleLabel}${currentLabel}`);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroOrgs, switchZeroOrg } from \"../../../lib/api\";\nimport { saveConfig } from \"../../../lib/api/config\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const useCommand = new Command()\n .name(\"use\")\n .description(\"Switch to a different organization\")\n .argument(\"<slug>\", \"Organization slug to switch to\")\n .action(\n withErrorHandler(async (slug: string) => {\n const orgList = await listZeroOrgs();\n const target = orgList.orgs.find((s) => {\n return s.slug === slug;\n });\n if (!target) {\n throw new Error(`Organization '${slug}' not found or not accessible.`);\n }\n\n const result = await switchZeroOrg(slug);\n await saveConfig({\n token: result.access_token,\n });\n console.log(chalk.green(`✓ Switched to organization: ${slug}`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getZeroOrgMembers } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const membersCommand = new Command()\n .name(\"members\")\n .description(\"View organization members\")\n .action(\n withErrorHandler(async () => {\n const status = await getZeroOrgMembers();\n\n console.log(chalk.bold(`Organization: ${status.slug}`));\n console.log(` Role: ${status.role}`);\n console.log(\n ` Created: ${new Date(status.createdAt).toLocaleDateString()}`,\n );\n console.log();\n console.log(chalk.bold(\"Members:\"));\n for (const member of status.members) {\n const roleTag =\n member.role === \"admin\"\n ? chalk.yellow(` (${member.role})`)\n : chalk.dim(` (${member.role})`);\n console.log(` ${member.email}${roleTag}`);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { inviteZeroOrgMember } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const inviteCommand = new Command()\n .name(\"invite\")\n .description(\"Invite a member to the current organization\")\n .requiredOption(\"--email <email>\", \"Email address of the member to invite\")\n .option(\n \"--role <role>\",\n \"Role for the invited member (member or admin)\",\n \"member\",\n )\n .action(\n withErrorHandler(async (options: { email: string; role: string }) => {\n if (options.role !== \"member\" && options.role !== \"admin\") {\n throw new Error(\n `Invalid role \"${options.role}\". Must be \"member\" or \"admin\".`,\n );\n }\n await inviteZeroOrgMember(options.email, options.role);\n console.log(\n chalk.green(`✓ Invitation sent to ${options.email} as ${options.role}`),\n );\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { removeZeroOrgMember } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const removeCommand = new Command()\n .name(\"remove\")\n .description(\"Remove a member from the current organization\")\n .argument(\"<email>\", \"Email address of the member to remove\")\n .action(\n withErrorHandler(async (email: string) => {\n await removeZeroOrgMember(email);\n console.log(chalk.green(`✓ Removed ${email} from organization`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { leaveZeroOrg, listZeroOrgs, switchZeroOrg } from \"../../../lib/api\";\nimport { saveConfig } from \"../../../lib/api/config\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const leaveCommand = new Command()\n .name(\"leave\")\n .description(\"Leave the current organization\")\n .action(\n withErrorHandler(async () => {\n await leaveZeroOrg();\n\n const { orgs } = await listZeroOrgs();\n if (orgs.length === 0) {\n await saveConfig({ token: undefined });\n console.log(chalk.green(\"✓ Left organization.\"));\n console.log(\n chalk.yellow(\"No remaining organizations. Run: vm0 auth login\"),\n );\n return;\n }\n\n const nextOrg = orgs[0]!.slug;\n const result = await switchZeroOrg(nextOrg);\n await saveConfig({\n token: result.access_token,\n });\n console.log(chalk.green(`✓ Left organization. Switched to: ${nextOrg}`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { deleteZeroOrg } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const deleteCommand = new Command()\n .name(\"delete\")\n .description(\"Delete the current organization (admin only)\")\n .argument(\"<slug>\", \"Organization slug to confirm deletion\")\n .action(\n withErrorHandler(async (slug: string) => {\n await deleteZeroOrg(slug);\n console.log(chalk.green(`✓ Organization '${slug}' has been deleted.`));\n }),\n );\n","import { Command } from \"commander\";\nimport { listCommand } from \"./list\";\nimport { setCommand } from \"./set\";\nimport { removeCommand } from \"./remove\";\n\nexport const zeroOrgSecretCommand = new Command()\n .name(\"secret\")\n .description(\"Manage org-level secrets (admin)\")\n .addCommand(listCommand)\n .addCommand(setCommand)\n .addCommand(removeCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroOrgSecrets } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all org-level secrets\")\n .action(\n withErrorHandler(async () => {\n const result = await listZeroOrgSecrets();\n\n if (result.secrets.length === 0) {\n console.log(chalk.dim(\"No org secrets found\"));\n console.log();\n console.log(\"To add an org secret:\");\n console.log(\n chalk.cyan(\" zero org secret set MY_API_KEY --body <value>\"),\n );\n return;\n }\n\n console.log(chalk.bold(\"Org Secrets:\"));\n console.log();\n\n for (const secret of result.secrets) {\n console.log(` ${chalk.cyan(secret.name)}`);\n if (secret.description) {\n console.log(` ${chalk.dim(secret.description)}`);\n }\n console.log(\n ` ${chalk.dim(`Updated: ${new Date(secret.updatedAt).toLocaleString()}`)}`,\n );\n console.log();\n }\n\n console.log(chalk.dim(`Total: ${result.secrets.length} secret(s)`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { setZeroOrgSecret } from \"../../../../lib/api\";\nimport {\n isInteractive,\n promptPassword,\n} from \"../../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const setCommand = new Command()\n .name(\"set\")\n .description(\"Create or update an org-level secret (admin only)\")\n .argument(\"<name>\", \"Secret name (uppercase, e.g., MY_API_KEY)\")\n .option(\n \"-b, --body <value>\",\n \"Secret value (required in non-interactive mode)\",\n )\n .option(\"-d, --description <description>\", \"Optional description\")\n .action(\n withErrorHandler(\n async (\n name: string,\n options: { body?: string; description?: string },\n ) => {\n let value: string;\n\n if (options.body !== undefined) {\n value = options.body;\n } else if (isInteractive()) {\n const prompted = await promptPassword(\"Enter secret value:\");\n if (prompted === undefined) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n value = prompted;\n } else {\n throw new Error(\"--body is required in non-interactive mode\", {\n cause: new Error(\n `Usage: zero org secret set ${name} --body \"your-secret-value\"`,\n ),\n });\n }\n\n let secret;\n try {\n secret = await setZeroOrgSecret({\n name,\n value,\n description: options.description,\n });\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\"must contain only uppercase\")\n ) {\n throw new Error(error.message, {\n cause: new Error(\n \"Examples of valid secret names: MY_API_KEY, GITHUB_TOKEN, AWS_ACCESS_KEY_ID\",\n ),\n });\n }\n throw error;\n }\n\n console.log(chalk.green(`✓ Org secret \"${secret.name}\" saved`));\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { deleteZeroOrgSecret } from \"../../../../lib/api\";\nimport {\n isInteractive,\n promptConfirm,\n} from \"../../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const removeCommand = new Command()\n .name(\"remove\")\n .description(\"Delete an org-level secret (admin only)\")\n .argument(\"<name>\", \"Secret name to delete\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .action(\n withErrorHandler(async (name: string, options: { yes?: boolean }) => {\n if (!options.yes) {\n if (!isInteractive()) {\n throw new Error(\"--yes flag is required in non-interactive mode\");\n }\n\n const confirmed = await promptConfirm(\n `Are you sure you want to delete org secret \"${name}\"?`,\n false,\n );\n\n if (!confirmed) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n }\n\n await deleteZeroOrgSecret(name);\n console.log(chalk.green(`✓ Org secret \"${name}\" deleted`));\n }),\n );\n","import { Command } from \"commander\";\nimport { listCommand } from \"./list\";\nimport { setCommand } from \"./set\";\nimport { removeCommand } from \"./remove\";\n\nexport const zeroOrgVariableCommand = new Command()\n .name(\"variable\")\n .description(\"Manage org-level variables (admin)\")\n .addCommand(listCommand)\n .addCommand(setCommand)\n .addCommand(removeCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroOrgVariables } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\n/**\n * Truncate value for display if too long\n */\nfunction truncateValue(value: string, maxLength: number = 60): string {\n if (value.length <= maxLength) {\n return value;\n }\n return value.slice(0, maxLength - 15) + \"... [truncated]\";\n}\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all org-level variables\")\n .action(\n withErrorHandler(async () => {\n const result = await listZeroOrgVariables();\n\n if (result.variables.length === 0) {\n console.log(chalk.dim(\"No org variables found\"));\n console.log();\n console.log(\"To add an org variable:\");\n console.log(chalk.cyan(\" zero org variable set MY_VAR <value>\"));\n return;\n }\n\n console.log(chalk.bold(\"Org Variables:\"));\n console.log();\n\n for (const variable of result.variables) {\n const displayValue = truncateValue(variable.value);\n console.log(` ${chalk.cyan(variable.name)} = ${displayValue}`);\n if (variable.description) {\n console.log(` ${chalk.dim(variable.description)}`);\n }\n console.log(\n ` ${chalk.dim(`Updated: ${new Date(variable.updatedAt).toLocaleString()}`)}`,\n );\n console.log();\n }\n\n console.log(chalk.dim(`Total: ${result.variables.length} variable(s)`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { setZeroOrgVariable } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const setCommand = new Command()\n .name(\"set\")\n .description(\"Create or update an org-level variable (admin only)\")\n .argument(\"<name>\", \"Variable name (uppercase, e.g., MY_VAR)\")\n .argument(\"<value>\", \"Variable value\")\n .option(\"-d, --description <description>\", \"Optional description\")\n .action(\n withErrorHandler(\n async (\n name: string,\n value: string,\n options: { description?: string },\n ) => {\n let variable;\n try {\n variable = await setZeroOrgVariable({\n name,\n value,\n description: options.description,\n });\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\"must contain only uppercase\")\n ) {\n throw new Error(error.message, {\n cause: new Error(\n \"Examples of valid variable names: MY_VAR, API_URL, DEBUG_MODE\",\n ),\n });\n }\n throw error;\n }\n\n console.log(chalk.green(`✓ Org variable \"${variable.name}\" saved`));\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { deleteZeroOrgVariable } from \"../../../../lib/api\";\nimport {\n isInteractive,\n promptConfirm,\n} from \"../../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const removeCommand = new Command()\n .name(\"remove\")\n .description(\"Delete an org-level variable (admin only)\")\n .argument(\"<name>\", \"Variable name to delete\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .action(\n withErrorHandler(async (name: string, options: { yes?: boolean }) => {\n if (!options.yes) {\n if (!isInteractive()) {\n throw new Error(\"--yes flag is required in non-interactive mode\");\n }\n\n const confirmed = await promptConfirm(\n `Are you sure you want to delete org variable \"${name}\"?`,\n false,\n );\n\n if (!confirmed) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n }\n\n await deleteZeroOrgVariable(name);\n console.log(chalk.green(`✓ Org variable \"${name}\" deleted`));\n }),\n );\n","import { Command } from \"commander\";\nimport { listCommand } from \"./list\";\nimport { setupCommand } from \"./setup\";\nimport { removeCommand } from \"./remove\";\nimport { setDefaultCommand } from \"./set-default\";\n\nexport const zeroOrgModelProviderCommand = new Command()\n .name(\"model-provider\")\n .description(\"Manage org-level model providers\")\n .addCommand(listCommand)\n .addCommand(setupCommand)\n .addCommand(removeCommand)\n .addCommand(setDefaultCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n MODEL_PROVIDER_TYPES,\n allowsCustomModel,\n getModels,\n type ModelProviderType,\n} from \"@vm0/api-contracts/contracts/model-providers\";\nimport { listZeroOrgModelProviders } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all org-level model providers\")\n .action(\n withErrorHandler(async () => {\n const result = await listZeroOrgModelProviders();\n\n if (result.modelProviders.length === 0) {\n console.log(chalk.dim(\"No org-level model providers configured\"));\n console.log();\n console.log(\"To add an org-level model provider:\");\n console.log(chalk.cyan(\" zero org model-provider setup\"));\n return;\n }\n\n // Group by framework\n const byFramework = result.modelProviders.reduce(\n (acc, p) => {\n const fw = p.framework;\n if (!acc[fw]) {\n acc[fw] = [];\n }\n acc[fw].push(p);\n return acc;\n },\n {} as Record<string, typeof result.modelProviders>,\n );\n\n console.log(chalk.bold(\"Org Model Providers:\"));\n console.log();\n\n for (const [framework, providers] of Object.entries(byFramework)) {\n console.log(` ${chalk.cyan(framework)}:`);\n for (const provider of providers) {\n const defaultTag = provider.isDefault\n ? chalk.green(\" (default)\")\n : \"\";\n const modelTag = provider.selectedModel\n ? chalk.dim(` [${provider.selectedModel}]`)\n : \"\";\n console.log(` ${provider.type}${defaultTag}${modelTag}`);\n console.log(chalk.dim(` ID: ${provider.id}`));\n if (provider.type in MODEL_PROVIDER_TYPES) {\n const type = provider.type as ModelProviderType;\n const available = getModels(type) ?? [];\n if (available.length > 0) {\n console.log(\n chalk.dim(` Available models: ${available.join(\", \")}`),\n );\n } else if (allowsCustomModel(type)) {\n console.log(\n chalk.dim(\" Available models: (custom — any model name)\"),\n );\n }\n }\n console.log(\n chalk.dim(\n ` Updated: ${new Date(provider.updatedAt).toLocaleString()}`,\n ),\n );\n }\n console.log();\n }\n\n console.log(\n chalk.dim(`Total: ${result.modelProviders.length} provider(s)`),\n );\n console.log();\n console.log(\n chalk.dim(\n \"Use a provider ID with: zero agent edit <agent-id> --model-provider <id> --model <name>\",\n ),\n );\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport prompts from \"prompts\";\nimport {\n listZeroOrgModelProviders,\n upsertZeroOrgModelProvider,\n updateZeroOrgModelProviderModel,\n setZeroOrgModelProviderDefault,\n} from \"../../../../lib/api\";\nimport {\n MODEL_PROVIDER_TYPES,\n hasModelSelection,\n hasAuthMethods,\n getSelectableProviderTypes,\n type ModelProviderType,\n} from \"@vm0/api-contracts/contracts/model-providers\";\nimport { isInteractive } from \"../../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../../lib/command\";\nimport {\n type SetupInput,\n handleNonInteractiveMode,\n promptForModelSelection,\n promptForAuthMethod,\n promptForSecrets,\n collectSecrets,\n} from \"../../../../lib/domain/model-provider/shared\";\n\nasync function handleInteractiveMode(): Promise<SetupInput | null> {\n if (!isInteractive()) {\n throw new Error(\"Interactive mode requires a TTY\", {\n cause: new Error(\n 'Use non-interactive mode: zero org model-provider setup --type <type> --secret \"<value>\"',\n ),\n });\n }\n\n let cancelled = false;\n const onCancel = () => {\n cancelled = true;\n return false;\n };\n\n // Fetch configured org providers to annotate choices\n const { modelProviders: configuredProviders } =\n await listZeroOrgModelProviders();\n const configuredTypes = new Set(\n configuredProviders.map((p) => {\n return p.type;\n }),\n );\n\n // Build provider choices with configuration status (only selectable providers)\n const annotatedChoices = getSelectableProviderTypes().map((type) => {\n const config = MODEL_PROVIDER_TYPES[type];\n const isConfigured = configuredTypes.has(type);\n const isExperimental = hasAuthMethods(type);\n let title: string = config.label;\n if (isConfigured) {\n title = `${title} ✓`;\n }\n if (isExperimental) {\n title = `${title} ${chalk.dim(\"(experimental)\")}`;\n }\n return {\n title,\n value: type,\n };\n });\n\n const typeResponse = await prompts(\n {\n type: \"select\",\n name: \"type\",\n message: \"Select provider type:\",\n choices: annotatedChoices,\n },\n { onCancel },\n );\n\n if (cancelled) {\n console.log(chalk.dim(\"Cancelled\"));\n return null;\n }\n\n const type = typeResponse.type as ModelProviderType;\n\n // Check if provider is already configured using the list we already fetched\n const existingProvider = configuredProviders.find((p) => {\n return p.type === type;\n });\n\n if (existingProvider) {\n console.log();\n console.log(`\"${type}\" is already configured`);\n console.log();\n\n const actionResponse = await prompts(\n {\n type: \"select\",\n name: \"action\",\n message: \"\",\n choices: [\n { title: \"Keep existing secret\", value: \"keep\" },\n { title: \"Update secret\", value: \"update\" },\n ],\n },\n { onCancel },\n );\n\n if (cancelled) {\n console.log(chalk.dim(\"Cancelled\"));\n return null;\n }\n\n if (actionResponse.action === \"keep\") {\n const selectedModel = await promptForModelSelection(type);\n return {\n type,\n keepExistingSecret: true,\n selectedModel,\n isInteractiveMode: true,\n };\n }\n // Fall through to secret prompt for \"update\"\n }\n\n const config = MODEL_PROVIDER_TYPES[type];\n\n console.log();\n if (\"helpText\" in config) {\n console.log(chalk.dim(config.helpText));\n }\n console.log();\n\n // Handle multi-auth providers\n if (hasAuthMethods(type)) {\n const authMethod = await promptForAuthMethod(type);\n const secrets = await promptForSecrets(type, authMethod);\n const selectedModel = await promptForModelSelection(type);\n\n return {\n type,\n authMethod,\n secrets,\n selectedModel,\n isInteractiveMode: true,\n };\n }\n\n // Single-secret provider (legacy)\n const secretLabel = \"secretLabel\" in config ? config.secretLabel : \"secret\";\n\n const secretResponse = await prompts(\n {\n type: \"password\",\n name: \"secret\",\n message: `Enter your ${secretLabel}:`,\n validate: (value: string) => {\n return value.length > 0 || `${secretLabel} is required`;\n },\n },\n { onCancel },\n );\n\n if (cancelled) {\n console.log(chalk.dim(\"Cancelled\"));\n return null;\n }\n\n const secret = secretResponse.secret as string;\n const selectedModel = await promptForModelSelection(type);\n\n return { type, secret, selectedModel, isInteractiveMode: true };\n}\n\nasync function promptSetAsDefault(\n type: ModelProviderType,\n framework: string,\n isDefault: boolean,\n): Promise<void> {\n if (isDefault) return;\n\n let cancelled = false;\n const response = await prompts(\n {\n type: \"confirm\",\n name: \"setDefault\",\n message: \"Set this provider as default?\",\n initial: false,\n },\n {\n onCancel: () => {\n cancelled = true;\n return false;\n },\n },\n );\n\n if (cancelled) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n\n if (response.setDefault) {\n await setZeroOrgModelProviderDefault(type);\n console.log(chalk.green(`✓ Default for ${framework} set to \"${type}\"`));\n }\n}\n\nexport const setupCommand = new Command()\n .name(\"setup\")\n .description(\"Configure an org-level model provider\")\n .option(\"-t, --type <type>\", \"Provider type (for non-interactive mode)\")\n .option(\n \"-s, --secret <value>\",\n \"Secret value (can be used multiple times, supports VALUE or KEY=VALUE format)\",\n collectSecrets,\n [],\n )\n .option(\n \"-a, --auth-method <method>\",\n \"Auth method (required for multi-auth providers like aws-bedrock)\",\n )\n .option(\"-m, --model <model>\", \"Model selection (for non-interactive mode)\")\n .action(\n withErrorHandler(\n async (options: {\n type?: string;\n secret?: string[];\n authMethod?: string;\n model?: string;\n }) => {\n let input: SetupInput;\n const secretArgs = options.secret ?? [];\n\n if (options.type && secretArgs.length > 0) {\n input = handleNonInteractiveMode({\n type: options.type,\n secret: secretArgs,\n authMethod: options.authMethod,\n model: options.model,\n commandPrefix: \"zero org model-provider setup\",\n });\n } else if (options.type || secretArgs.length > 0) {\n throw new Error(\"Both --type and --secret are required\");\n } else {\n const result = await handleInteractiveMode();\n if (result === null) {\n return;\n }\n input = result;\n }\n\n // Handle \"keep existing secret\" flow\n if (input.keepExistingSecret) {\n const provider = await updateZeroOrgModelProviderModel(\n input.type,\n input.selectedModel,\n );\n\n const defaultNote = provider.isDefault\n ? ` (default for ${provider.framework})`\n : \"\";\n const modelNote = provider.selectedModel\n ? ` with model: ${provider.selectedModel}`\n : \"\";\n\n if (!hasModelSelection(input.type)) {\n console.log(\n chalk.green(`✓ Org model provider \"${input.type}\" unchanged`),\n );\n } else {\n console.log(\n chalk.green(\n `✓ Org model provider \"${input.type}\" updated${defaultNote}${modelNote}`,\n ),\n );\n }\n if (input.isInteractiveMode) {\n await promptSetAsDefault(\n input.type,\n provider.framework,\n provider.isDefault,\n );\n }\n return;\n }\n\n // Standard upsert flow with secret\n const { provider, created } = await upsertZeroOrgModelProvider({\n type: input.type,\n secret: input.secret,\n authMethod: input.authMethod,\n secrets: input.secrets,\n selectedModel: input.selectedModel,\n });\n\n const action = created ? \"created\" : \"updated\";\n const defaultNote = provider.isDefault\n ? ` (default for ${provider.framework})`\n : \"\";\n const modelNote = provider.selectedModel\n ? ` with model: ${provider.selectedModel}`\n : \"\";\n console.log(\n chalk.green(\n `✓ Org model provider \"${input.type}\" ${action}${defaultNote}${modelNote}`,\n ),\n );\n if (input.isInteractiveMode) {\n await promptSetAsDefault(\n input.type,\n provider.framework,\n provider.isDefault,\n );\n }\n },\n ),\n );\n","import chalk from \"chalk\";\nimport prompts from \"prompts\";\nimport {\n MODEL_PROVIDER_TYPES,\n getModels,\n getDefaultModel,\n hasModelSelection,\n allowsCustomModel,\n getCustomModelPlaceholder,\n hasAuthMethods,\n getAuthMethodsForType,\n getDefaultAuthMethod,\n getSecretsForAuthMethod,\n type ModelProviderType,\n} from \"@vm0/api-contracts/contracts/model-providers\";\n\nexport interface SetupInput {\n type: ModelProviderType;\n secret?: string;\n // Multi-auth support\n authMethod?: string;\n secrets?: Record<string, string>;\n selectedModel?: string;\n keepExistingSecret?: boolean;\n isInteractiveMode?: boolean;\n}\n\nfunction validateProviderType(typeStr: string): ModelProviderType {\n if (!Object.keys(MODEL_PROVIDER_TYPES).includes(typeStr)) {\n const validTypes = Object.keys(MODEL_PROVIDER_TYPES).join(\", \");\n throw new Error(`Invalid type \"${typeStr}\"`, {\n cause: new Error(`Valid types: ${validTypes}`),\n });\n }\n return typeStr as ModelProviderType;\n}\n\nfunction validateModel(\n type: ModelProviderType,\n modelStr: string,\n): string | never {\n const models = getModels(type);\n\n // Allow any model if provider supports custom models\n if (allowsCustomModel(type)) {\n return modelStr;\n }\n\n if (models && !models.includes(modelStr)) {\n throw new Error(`Invalid model \"${modelStr}\"`, {\n cause: new Error(`Valid models: ${models.join(\", \")}`),\n });\n }\n return modelStr;\n}\n\nfunction validateAuthMethod(\n type: ModelProviderType,\n authMethodStr: string,\n): string | never {\n const authMethods = getAuthMethodsForType(type);\n if (!authMethods || !(authMethodStr in authMethods)) {\n const validMethods = authMethods\n ? Object.keys(authMethods).join(\", \")\n : \"none\";\n throw new Error(`Invalid auth method \"${authMethodStr}\"`, {\n cause: new Error(`Valid auth methods: ${validMethods}`),\n });\n }\n return authMethodStr;\n}\n\n/**\n * Parse secret arguments into a secrets object.\n * Supports two formats:\n * - Single value (e.g., \"sk-xxx\") - auto-mapped to the provider's secret name\n * - KEY=VALUE format (e.g., \"AWS_REGION=us-east-1\") - explicit mapping\n */\nfunction parseSecrets(\n type: ModelProviderType,\n authMethod: string,\n secretArgs: string[],\n): Record<string, string> {\n const secretsConfig = getSecretsForAuthMethod(type, authMethod);\n if (!secretsConfig) {\n throw new Error(`Invalid auth method \"${authMethod}\"`);\n }\n\n const secretNames = Object.keys(secretsConfig);\n\n // Single value without = sign: only allowed for single-secret auth methods\n const firstArg = secretArgs[0];\n if (secretArgs.length === 1 && firstArg && !firstArg.includes(\"=\")) {\n if (secretNames.length !== 1) {\n throw new Error(\n \"Must use KEY=VALUE format for multi-secret auth methods\",\n { cause: new Error(`Required secrets: ${secretNames.join(\", \")}`) },\n );\n }\n const firstSecretName = secretNames[0];\n if (!firstSecretName) {\n throw new Error(\"No secrets defined for this auth method\");\n }\n return { [firstSecretName]: firstArg };\n }\n\n // KEY=VALUE format\n const secrets: Record<string, string> = {};\n for (const arg of secretArgs) {\n const eqIndex = arg.indexOf(\"=\");\n if (eqIndex === -1) {\n throw new Error(`Invalid secret format \"${arg}\"`, {\n cause: new Error(\"Use KEY=VALUE format (e.g., AWS_REGION=us-east-1)\"),\n });\n }\n const key = arg.slice(0, eqIndex);\n const value = arg.slice(eqIndex + 1);\n secrets[key] = value;\n }\n return secrets;\n}\n\n/**\n * Validate secrets against the auth method config.\n */\nfunction validateSecrets(\n type: ModelProviderType,\n authMethod: string,\n secrets: Record<string, string>,\n): void {\n const secretsConfig = getSecretsForAuthMethod(type, authMethod);\n if (!secretsConfig) {\n throw new Error(`Invalid auth method \"${authMethod}\"`);\n }\n\n // Check required fields\n for (const [name, fieldConfig] of Object.entries(secretsConfig)) {\n if (fieldConfig.required && !secrets[name]) {\n const requiredNames = Object.entries(secretsConfig)\n .filter(([, fc]) => {\n return fc.required;\n })\n .map(([n]) => {\n return n;\n })\n .join(\", \");\n throw new Error(`Missing required secret: ${name}`, {\n cause: new Error(`Required secrets: ${requiredNames}`),\n });\n }\n }\n\n // Check for unknown fields\n for (const name of Object.keys(secrets)) {\n if (!(name in secretsConfig)) {\n const validNames = Object.keys(secretsConfig).join(\", \");\n throw new Error(`Unknown secret: ${name}`, {\n cause: new Error(`Valid secrets: ${validNames}`),\n });\n }\n }\n}\n\nexport function handleNonInteractiveMode(options: {\n type: string;\n secret: string[];\n authMethod?: string;\n model?: string;\n commandPrefix?: string;\n}): SetupInput {\n const type = validateProviderType(options.type);\n const cmdPrefix = options.commandPrefix ?? \"zero org model-provider setup\";\n\n let selectedModel: string | undefined;\n\n if (options.model) {\n selectedModel = validateModel(type, options.model);\n } else if (hasModelSelection(type)) {\n const defaultModel = getDefaultModel(type);\n // Empty defaultModel means \"auto\" mode - don't set selectedModel\n selectedModel = defaultModel || undefined;\n }\n\n // Handle multi-auth providers\n if (hasAuthMethods(type)) {\n // Determine auth method\n let authMethod: string;\n if (options.authMethod) {\n authMethod = validateAuthMethod(type, options.authMethod);\n } else {\n const defaultAuthMethod = getDefaultAuthMethod(type);\n const authMethods = getAuthMethodsForType(type);\n if (!defaultAuthMethod || !authMethods) {\n throw new Error(`Provider \"${type}\" requires --auth-method`);\n }\n // If there's only one auth method, use it; otherwise require explicit selection\n const authMethodNames = Object.keys(authMethods);\n if (authMethodNames.length === 1) {\n authMethod = authMethodNames[0]!;\n } else {\n const methods = authMethodNames.join(\", \");\n throw new Error(\n `--auth-method is required for \"${type}\" (multiple auth methods available)`,\n {\n cause: new Error(\n `Available: ${methods}. Example: ${cmdPrefix} --type ${type} --auth-method ${authMethodNames[0]} --secret KEY=VALUE`,\n ),\n },\n );\n }\n }\n\n // Parse and validate secrets\n const secrets = parseSecrets(type, authMethod, options.secret);\n validateSecrets(type, authMethod, secrets);\n\n return {\n type,\n authMethod,\n secrets,\n selectedModel,\n isInteractiveMode: false,\n };\n }\n\n // Single-secret provider (legacy)\n // Accept single value or KEY=VALUE format\n const secretArgs = options.secret;\n const firstArg = secretArgs[0];\n if (!firstArg) {\n throw new Error(\"Secret is required\");\n }\n\n // If KEY=VALUE format, extract the value\n let secret: string;\n if (firstArg.includes(\"=\")) {\n secret = firstArg.slice(firstArg.indexOf(\"=\") + 1);\n } else {\n secret = firstArg;\n }\n\n return {\n type,\n secret,\n selectedModel,\n isInteractiveMode: false,\n };\n}\n\nexport async function promptForModelSelection(\n type: ModelProviderType,\n): Promise<string | undefined> {\n if (!hasModelSelection(type)) {\n return undefined;\n }\n\n const models = getModels(type) ?? [];\n const defaultModel = getDefaultModel(type);\n const supportsCustomModel = allowsCustomModel(type);\n\n // Build choices\n const modelChoices: { title: string; value: string }[] = [];\n\n // Add auto option if defaultModel is empty string\n if (defaultModel === \"\") {\n modelChoices.push({ title: \"auto (Recommended)\", value: \"\" });\n }\n\n // Add predefined models\n for (const model of models) {\n modelChoices.push({\n title: model === defaultModel ? `${model} (Recommended)` : model,\n value: model,\n });\n }\n\n // Add custom model option if supported\n if (supportsCustomModel) {\n modelChoices.push({ title: \"Custom model ID\", value: \"__custom__\" });\n }\n\n const modelResponse = await prompts(\n {\n type: \"select\",\n name: \"model\",\n message: \"Select model:\",\n choices: modelChoices,\n },\n {\n onCancel: () => {\n return process.exit(0);\n },\n },\n );\n\n const selected = modelResponse.model as string;\n\n // Handle custom model input\n if (selected === \"__custom__\") {\n const placeholder = getCustomModelPlaceholder(type);\n if (placeholder) {\n console.log(chalk.dim(`Example: ${placeholder}`));\n }\n const customResponse = await prompts(\n {\n type: \"text\",\n name: \"customModel\",\n message: \"Enter model ID:\",\n validate: (value: string) => {\n return value.length > 0 || \"Model ID is required\";\n },\n },\n {\n onCancel: () => {\n return process.exit(0);\n },\n },\n );\n return customResponse.customModel as string;\n }\n\n // Return undefined for auto mode (empty string)\n return selected === \"\" ? undefined : selected;\n}\n\n/**\n * Prompt for auth method selection (only for multi-auth providers)\n */\nexport async function promptForAuthMethod(\n type: ModelProviderType,\n): Promise<string> {\n const authMethods = getAuthMethodsForType(type);\n const defaultAuthMethod = getDefaultAuthMethod(type);\n\n if (!authMethods) {\n return \"default\";\n }\n\n const choices = Object.entries(authMethods).map(([method, config]) => {\n return {\n title:\n method === defaultAuthMethod\n ? `${config.label} (Recommended)`\n : config.label,\n value: method,\n };\n });\n\n const response = await prompts(\n {\n type: \"select\",\n name: \"authMethod\",\n message: \"Select authentication method:\",\n choices,\n },\n {\n onCancel: () => {\n return process.exit(0);\n },\n },\n );\n\n return response.authMethod as string;\n}\n\n/**\n * Determine if a secret should be masked (password type)\n * Non-secret values like region should be visible\n */\nfunction isSensitiveSecret(name: string): boolean {\n const nonSecretPatterns = [\"REGION\", \"ENDPOINT\", \"URL\"];\n return !nonSecretPatterns.some((pattern) => {\n return name.toUpperCase().includes(pattern);\n });\n}\n\nexport async function promptForSecrets(\n type: ModelProviderType,\n authMethod: string,\n): Promise<Record<string, string>> {\n const secretsConfig = getSecretsForAuthMethod(type, authMethod);\n\n if (!secretsConfig) {\n throw new Error(`Invalid auth method \"${authMethod}\"`);\n }\n\n const secrets: Record<string, string> = {};\n\n for (const [name, fieldConfig] of Object.entries(secretsConfig)) {\n if (fieldConfig.helpText) {\n console.log(chalk.dim(fieldConfig.helpText));\n }\n\n const isSensitive = isSensitiveSecret(name);\n const placeholder =\n \"placeholder\" in fieldConfig ? (fieldConfig.placeholder as string) : \"\";\n\n if (fieldConfig.required) {\n const response = await prompts(\n {\n type: isSensitive ? \"password\" : \"text\",\n name: \"value\",\n message: `${fieldConfig.label}:`,\n initial: placeholder ? \"\" : undefined,\n validate: (value: string) => {\n return value.length > 0 || `${fieldConfig.label} is required`;\n },\n },\n {\n onCancel: () => {\n return process.exit(0);\n },\n },\n );\n secrets[name] = response.value as string;\n } else {\n // Optional field\n const response = await prompts(\n {\n type: isSensitive ? \"password\" : \"text\",\n name: \"value\",\n message: `${fieldConfig.label} (optional):`,\n },\n {\n onCancel: () => {\n return process.exit(0);\n },\n },\n );\n const value = response.value as string;\n if (value && value.trim()) {\n secrets[name] = value.trim();\n }\n }\n }\n\n return secrets;\n}\n\n/**\n * Collect secret values from repeatable --secret option\n */\nexport function collectSecrets(value: string, previous: string[]): string[] {\n return previous.concat([value]);\n}\n\n/**\n * Parse a CLI model/model-provider flag value.\n *\n * Returns:\n * - `undefined` when the flag was not provided (preserve existing value)\n * - `null` when the user passed \"default\" (clear the override, inherit from org)\n * - the string value otherwise (set the specific model/provider)\n */\nexport function parseModelFlag(\n value: string | undefined,\n): string | null | undefined {\n if (value === undefined) return undefined;\n if (value === \"default\") return null;\n return value;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { deleteZeroOrgModelProvider } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\nimport {\n MODEL_PROVIDER_TYPES,\n type ModelProviderType,\n} from \"@vm0/api-contracts/contracts/model-providers\";\n\nexport const removeCommand = new Command()\n .name(\"remove\")\n .description(\"Remove an org-level model provider\")\n .argument(\"<type>\", \"Model provider type to remove\")\n .action(\n withErrorHandler(async (type: string) => {\n if (!Object.keys(MODEL_PROVIDER_TYPES).includes(type)) {\n const validTypes = Object.keys(MODEL_PROVIDER_TYPES).join(\", \");\n throw new Error(`Invalid type \"${type}\"`, {\n cause: new Error(`Valid types: ${validTypes}`),\n });\n }\n\n await deleteZeroOrgModelProvider(type as ModelProviderType);\n console.log(chalk.green(`✓ Org model provider \"${type}\" removed`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { setZeroOrgModelProviderDefault } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\nimport {\n MODEL_PROVIDER_TYPES,\n type ModelProviderType,\n} from \"@vm0/api-contracts/contracts/model-providers\";\n\nexport const setDefaultCommand = new Command()\n .name(\"set-default\")\n .description(\"Set an org-level model provider as default for its framework\")\n .argument(\"<type>\", \"Model provider type to set as default\")\n .action(\n withErrorHandler(async (type: string) => {\n if (!Object.keys(MODEL_PROVIDER_TYPES).includes(type)) {\n const validTypes = Object.keys(MODEL_PROVIDER_TYPES).join(\", \");\n throw new Error(`Invalid type \"${type}\"`, {\n cause: new Error(`Valid types: ${validTypes}`),\n });\n }\n\n const provider = await setZeroOrgModelProviderDefault(\n type as ModelProviderType,\n );\n console.log(\n chalk.green(\n `✓ Default for ${provider.framework} set to \"${provider.type}\"`,\n ),\n );\n }),\n );\n","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 Add a custom skill: zero agent edit $ZERO_AGENT_ID --add-skill my-skill\n Remove a skill: zero agent edit $ZERO_AGENT_ID --remove-skill my-skill\n\nNotes:\n Manage custom skills with 'zero skill --help'`,\n );\n","import { Command } from \"commander\";\nimport { readFileSync } from \"node:fs\";\nimport chalk from \"chalk\";\nimport { zeroAgentCustomSkillNameSchema } from \"@vm0/api-contracts/contracts/zero-agents\";\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(\n \"--skills <items>\",\n \"Comma-separated custom skill names to attach (e.g. my-skill,other-skill)\",\n )\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 skills: zero agent create --skills my-skill,other-skill --display-name \"My Agent\"\n With instructions: zero agent create --display-name \"My Agent\" --instructions-file ./instructions.md`,\n )\n .action(\n withErrorHandler(\n async (options: {\n skills?: string;\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 customSkills = options.skills\n ? options.skills.split(\",\").map((s) => {\n return s.trim();\n })\n : undefined;\n\n if (customSkills) {\n for (const name of customSkills) {\n const result = zeroAgentCustomSkillNameSchema.safeParse(name);\n if (!result.success) {\n throw new Error(\n `Invalid skill name \"${name}\": must be 2-64 characters, lowercase alphanumeric and hyphens only (e.g. my-skill)`,\n );\n }\n }\n }\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 customSkills,\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 (customSkills?.length) {\n console.log(` Skills: ${customSkills.join(\", \")}`);\n }\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 { zeroAgentCustomSkillNameSchema } from \"@vm0/api-contracts/contracts/zero-agents\";\nimport {\n getZeroAgent,\n updateZeroAgent,\n updateZeroAgentInstructions,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { parseModelFlag } from \"../../../lib/domain/model-provider/shared\";\nimport { type AvatarOptions, resolveAvatarUrl } from \"./avatar\";\n\ninterface AgentEditOptions extends AvatarOptions {\n displayName?: string;\n description?: string;\n sound?: string;\n skills?: string;\n addSkill?: string;\n removeSkill?: string;\n instructionsFile?: string;\n modelProvider?: string;\n model?: 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 options.skills !== undefined ||\n options.addSkill !== undefined ||\n options.removeSkill !== undefined ||\n options.modelProvider !== undefined ||\n options.model !== undefined\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 const customSkills = resolveCustomSkills(options, current.customSkills ?? []);\n\n const modelProviderId =\n options.modelProvider !== undefined\n ? parseModelFlag(options.modelProvider)\n : current.modelProviderId;\n const selectedModel =\n options.model !== undefined\n ? parseModelFlag(options.model)\n : current.selectedModel;\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 customSkills,\n modelProviderId,\n selectedModel,\n });\n}\n\nfunction validateSkillName(name: string): void {\n const result = zeroAgentCustomSkillNameSchema.safeParse(name);\n if (!result.success) {\n throw new Error(\n `Invalid skill name \"${name}\": must be 2-64 characters, lowercase alphanumeric and hyphens only (e.g. my-skill)`,\n );\n }\n}\n\nfunction resolveCustomSkills(\n options: { skills?: string; addSkill?: string; removeSkill?: string },\n existing: string[],\n): string[] | undefined {\n if (options.skills && (options.addSkill || options.removeSkill)) {\n throw new Error(\"Cannot use --skills with --add-skill or --remove-skill\");\n }\n\n if (options.skills) {\n const names = options.skills.split(\",\").map((s) => {\n return s.trim();\n });\n for (const name of names) {\n validateSkillName(name);\n }\n return names;\n }\n\n if (options.addSkill) {\n validateSkillName(options.addSkill);\n if (existing.includes(options.addSkill)) {\n throw new Error(\n `Skill \"${options.addSkill}\" is already attached to this agent`,\n );\n }\n return [...existing, options.addSkill];\n }\n\n if (options.removeSkill) {\n if (!existing.includes(options.removeSkill)) {\n throw new Error(\n `Skill \"${options.removeSkill}\" is not attached to this agent`,\n );\n }\n return existing.filter((s) => {\n return s !== options.removeSkill;\n });\n }\n\n return undefined;\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(\n \"--skills <items>\",\n \"Comma-separated custom skill names to attach (replaces existing)\",\n )\n .option(\"--add-skill <name>\", \"Add a custom skill to the agent\")\n .option(\"--remove-skill <name>\", \"Remove a custom skill from the agent\")\n .option(\"--instructions-file <path>\", \"Path to new instructions file\")\n .option(\n \"--model-provider <id>\",\n \"Model provider UUID, or 'default' to inherit org default\",\n )\n .option(\n \"--model <name>\",\n \"Model name (e.g. claude-sonnet-4-6, MiniMax-M2.7), or 'default' to inherit provider default\",\n )\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 Replace all skills: zero agent edit <agent-id> --skills my-skill,other-skill\n Add a skill: zero agent edit <agent-id> --add-skill my-skill\n Remove a skill: zero agent edit <agent-id> --remove-skill my-skill\n Update instructions: zero agent edit <agent-id> --instructions-file ./instructions.md\n Set model: zero agent edit <agent-id> --model-provider <provider-id> --model MiniMax-M2.7\n Reset model: zero agent edit <agent-id> --model-provider default --model default\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 - --skills replaces the entire skill list; --add-skill/--remove-skill modify incrementally\n - --skills cannot be combined with --add-skill or --remove-skill\n - Use 'zero org model-provider list' to see available providers and models\n - To create or edit skill content, use: zero skill --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-*, --skills, --add-skill, --remove-skill, --model-provider, --model, --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 listZeroConnectors,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport {\n isFirewallConnectorType,\n getConnectorFirewall,\n resolveFirewallPolicies,\n} from \"@vm0/connectors/firewalls\";\nimport type {\n FirewallPolicies,\n FirewallPolicyValue,\n} from \"@vm0/connectors/firewall-types\";\nimport type { ConnectorResponse } from \"@vm0/api-contracts/contracts/connector-schemas\";\nimport { policyIcon } from \"../../../lib/utils/format-utils\";\nimport { formatAvatar } from \"./avatar\";\n\ninterface ConnectorPermissionInfo {\n type: string;\n hasPermissions: boolean;\n permissions: Array<{ name: string; description?: string }>;\n policies: Record<string, FirewallPolicyValue> | null;\n unknownPolicy: FirewallPolicyValue;\n allowed: number;\n total: number;\n}\n\nfunction getConnectorPermissionInfo(\n type: string,\n resolvedPolicies: FirewallPolicies | null,\n): ConnectorPermissionInfo {\n if (!isFirewallConnectorType(type)) {\n return {\n type,\n hasPermissions: false,\n permissions: [],\n policies: null,\n unknownPolicy: \"allow\",\n allowed: 0,\n total: 0,\n };\n }\n\n const refPolicy = resolvedPolicies?.[type];\n const policies =\n refPolicy && Object.keys(refPolicy.policies).length > 0\n ? refPolicy.policies\n : null;\n const config = getConnectorFirewall(type);\n const permissions = config.apis.flatMap((a) => {\n return a.permissions ?? [];\n });\n const total = permissions.length;\n const allowed = policies\n ? permissions.filter((p) => {\n return policies[p.name] === \"allow\";\n }).length\n : 0;\n\n const unknownPolicy = refPolicy?.unknownPolicy ?? \"allow\";\n return {\n type,\n hasPermissions: true,\n permissions,\n policies,\n unknownPolicy,\n allowed,\n total,\n };\n}\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.needsReconnect) {\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 resolvedPolicies = resolveFirewallPolicies(\n agent.permissionPolicies,\n connectorTypes,\n );\n\n const connectorInfos = connectorTypes.map((type) => {\n return getConnectorPermissionInfo(type, resolvedPolicies);\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.customSkills?.length > 0) {\n console.log(`Skills: ${agent.customSkills.join(\", \")}`);\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 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 { 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 before delegating with \"zero run\"`,\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","import { Command } from \"commander\";\nimport { listCommand } from \"./list\";\nimport { searchCommand } from \"./search\";\nimport { statusCommand } from \"./status\";\n\nexport const zeroConnectorCommand = new Command()\n .name(\"connector\")\n .description(\"Check third-party service connections (GitHub, Slack, etc.)\")\n .addCommand(listCommand)\n .addCommand(searchCommand)\n .addCommand(statusCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n CONNECTOR_TYPES,\n type ConnectorType,\n} from \"@vm0/connectors/connectors\";\nimport { isFeatureEnabled } from \"@vm0/core/feature-switch\";\nimport { listZeroConnectors } from \"../../../lib/api\";\nimport { getActiveOrg } from \"../../../lib/api/config\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { resolveAgentContext } from \"./agent-context\";\nimport { padEndAnsi, renderConnectedAsCell, stripAnsi } from \"./connected-as\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all connectors and their status\")\n .option(\"--agent <id>\", \"Show per-agent authorization column\")\n .action(\n withErrorHandler(async (options: { agent?: string }) => {\n const [{ connectors }, orgId, agentCtx] = await Promise.all([\n listZeroConnectors(),\n getActiveOrg(),\n resolveAgentContext(options.agent),\n ]);\n const connectedMap = new Map(\n connectors.map((c) => {\n return [c.type, c];\n }),\n );\n\n const allTypesRaw = Object.keys(CONNECTOR_TYPES) as ConnectorType[];\n const allTypes: ConnectorType[] = [];\n for (const type of allTypesRaw) {\n const config = CONNECTOR_TYPES[type];\n const flag = config.featureFlag;\n const hasApiToken = \"api-token\" in config.authMethods;\n if (\n flag &&\n !isFeatureEnabled(flag, { orgId }) &&\n (!hasApiToken || config.strictFeatureFlag)\n ) {\n continue;\n }\n allTypes.push(type);\n }\n\n const typeWidth = Math.max(\n 4,\n ...allTypes.map((t) => {\n return t.length;\n }),\n );\n\n const connectedAsHeader = \"CONNECTED AS\";\n const connectedCells = allTypes.map((type) => {\n return renderConnectedAsCell(connectedMap.get(type));\n });\n const connectedAsWidth = Math.max(\n connectedAsHeader.length,\n ...connectedCells.map((c) => {\n return stripAnsi(c).length;\n }),\n );\n\n const authorizedHeader = agentCtx\n ? `AUTHORIZED FOR ${agentCtx.displayName}`\n : null;\n\n // Print header\n const headerParts = [\n \"TYPE\".padEnd(typeWidth),\n connectedAsHeader.padEnd(connectedAsWidth),\n ];\n if (authorizedHeader) headerParts.push(authorizedHeader);\n console.log(chalk.dim(headerParts.join(\" \")));\n\n // Print rows\n for (let i = 0; i < allTypes.length; i++) {\n const type = allTypes[i]!;\n const connectedCell = padEndAnsi(connectedCells[i]!, connectedAsWidth);\n const parts = [type.padEnd(typeWidth), connectedCell];\n if (agentCtx) {\n parts.push(\n agentCtx.authorizedTypes.has(type)\n ? chalk.green(\"✓\")\n : chalk.dim(\"-\"),\n );\n }\n console.log(parts.join(\" \"));\n }\n }),\n );\n","import { getZeroAgent, getZeroAgentUserConnectors } from \"../../../lib/api\";\n\ninterface AgentContext {\n agentId: string;\n displayName: string;\n authorizedTypes: Set<string>;\n}\n\nexport async function resolveAgentContext(\n flagAgentId: string | undefined,\n): Promise<AgentContext | null> {\n const agentId = flagAgentId ?? process.env.ZERO_AGENT_ID;\n if (!agentId) return null;\n\n const [agent, enabledTypes] = await Promise.all([\n getZeroAgent(agentId),\n getZeroAgentUserConnectors(agentId),\n ]);\n\n return {\n agentId: agent.agentId,\n displayName: agent.displayName ?? agent.agentId,\n authorizedTypes: new Set(enabledTypes),\n };\n}\n","import chalk from \"chalk\";\nimport { hasRequiredScopes } from \"@vm0/connectors/connector-utils\";\nimport type { ConnectorListResponse } from \"@vm0/api-contracts/contracts/connector-schemas\";\n\ntype Connector = ConnectorListResponse[\"connectors\"][number];\n\nfunction renderIdentity(connector: Connector): string {\n if (connector.externalUsername) return `@${connector.externalUsername}`;\n if (connector.externalEmail) return connector.externalEmail;\n return \"-\";\n}\n\nexport function renderConnectedAsCell(\n connector: Connector | undefined,\n): string {\n if (!connector) return chalk.dim(\"(not connected)\");\n const identity = renderIdentity(connector);\n if (connector.needsReconnect) {\n return chalk.yellow(`${identity} (reconnect needed)`);\n }\n const scopeMismatch =\n connector.authMethod === \"oauth\" &&\n !hasRequiredScopes(connector.type, connector.oauthScopes);\n if (scopeMismatch) {\n return chalk.yellow(`${identity} (permissions update available)`);\n }\n return identity;\n}\n\nconst ESC = \"\\u001b\";\nconst ANSI_PATTERN = new RegExp(`${ESC}\\\\[[0-9;]*m`, \"g\");\n\nexport function stripAnsi(s: string): string {\n return s.replace(ANSI_PATTERN, \"\");\n}\n\nexport function padEndAnsi(s: string, width: number): string {\n const visible = stripAnsi(s).length;\n return s + \" \".repeat(Math.max(0, width - visible));\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n CONNECTOR_TYPES,\n type ConnectorType,\n} from \"@vm0/connectors/connectors\";\nimport { searchConnectors } from \"@vm0/connectors/connector-utils\";\nimport { isFeatureEnabled } from \"@vm0/core/feature-switch\";\nimport { listZeroConnectors } from \"../../../lib/api\";\nimport { getActiveOrg } from \"../../../lib/api/config\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { resolveAgentContext } from \"./agent-context\";\nimport { padEndAnsi, renderConnectedAsCell, stripAnsi } from \"./connected-as\";\n\nconst DEFAULT_LIMIT = 5;\nconst EXACT_MATCH_THRESHOLD = 80;\n\nfunction parseLimit(raw: string): number {\n const n = Number.parseInt(raw, 10);\n if (!Number.isFinite(n) || n <= 0) {\n throw new Error(`--limit must be a positive integer, got \"${raw}\".`);\n }\n return n;\n}\n\nexport const searchCommand = new Command()\n .name(\"search\")\n .description(\"Search connectors by type, label, env var, secret, or tag\")\n .argument(\"<keyword>\", \"Search keyword (case-insensitive)\")\n .option(\"--agent <id>\", \"Show per-agent authorization column\")\n .option(\n \"--limit <n>\",\n `Maximum number of results to display (default ${DEFAULT_LIMIT})`,\n parseLimit,\n DEFAULT_LIMIT,\n )\n .action(\n withErrorHandler(\n async (keyword: string, options: { agent?: string; limit: number }) => {\n const trimmed = keyword.trim();\n if (!trimmed) {\n throw new Error(\"Keyword cannot be empty.\");\n }\n\n const [{ connectors }, orgId, agentCtx] = await Promise.all([\n listZeroConnectors(),\n getActiveOrg(),\n resolveAgentContext(options.agent),\n ]);\n const connectedMap = new Map(\n connectors.map((c) => {\n return [c.type, c];\n }),\n );\n\n const isTypeAvailable = (type: ConnectorType): boolean => {\n const config = CONNECTOR_TYPES[type];\n const flag = config.featureFlag;\n const hasApiToken = \"api-token\" in config.authMethods;\n return (\n !flag ||\n isFeatureEnabled(flag, { orgId }) ||\n (hasApiToken && !config.strictFeatureFlag)\n );\n };\n\n const { results, total } = searchConnectors(\n trimmed,\n options.limit,\n isTypeAvailable,\n );\n\n if (results.length === 0) {\n console.log(\"No matches found.\");\n return;\n }\n\n const topScore = results[0]!.score;\n if (topScore < EXACT_MATCH_THRESHOLD) {\n console.log(\"No exact match. Showing closest:\");\n }\n if (total > options.limit) {\n console.log(`Too many results (top ${options.limit} of ${total}):`);\n }\n\n const typeHeader = \"TYPE\";\n const connectedAsHeader = \"CONNECTED AS\";\n\n const connectedCells = results.map((r) => {\n return renderConnectedAsCell(connectedMap.get(r.type));\n });\n\n const typeWidth = Math.max(\n typeHeader.length,\n ...results.map((r) => {\n return r.type.length;\n }),\n );\n const connectedAsWidth = Math.max(\n connectedAsHeader.length,\n ...connectedCells.map((c) => {\n return stripAnsi(c).length;\n }),\n );\n\n const headerParts = [\n typeHeader.padEnd(typeWidth),\n connectedAsHeader.padEnd(connectedAsWidth),\n ];\n if (agentCtx) {\n headerParts.push(`AUTHORIZED FOR ${agentCtx.displayName}`);\n }\n console.log(chalk.dim(headerParts.join(\" \")));\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i]!;\n const parts = [\n result.type.padEnd(typeWidth),\n padEndAnsi(connectedCells[i]!, connectedAsWidth),\n ];\n if (agentCtx) {\n parts.push(\n agentCtx.authorizedTypes.has(result.type)\n ? chalk.green(\"✓\")\n : chalk.dim(\"-\"),\n );\n }\n console.log(parts.join(\" \"));\n }\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n CONNECTOR_TYPES,\n connectorTypeSchema,\n} from \"@vm0/connectors/connectors\";\nimport {\n getScopeDiff,\n hasRequiredScopes,\n} from \"@vm0/connectors/connector-utils\";\nimport { getZeroConnector } from \"../../../lib/api\";\nimport { formatDateTime } from \"../../../lib/domain/schedule-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { resolveAgentContext } from \"./agent-context\";\nimport { getPlatformOrigin } from \"../doctor/platform-url\";\n\nconst LABEL_WIDTH = 16;\n\nexport const statusCommand = new Command()\n .name(\"status\")\n .description(\"Show detailed status of a connector\")\n .argument(\"<type>\", \"Connector type (e.g., github)\")\n .option(\"--agent <id>\", \"Show authorization state for the given agent\")\n .action(\n withErrorHandler(async (type: string, options: { agent?: string }) => {\n const parseResult = connectorTypeSchema.safeParse(type);\n if (!parseResult.success) {\n const available = Object.keys(CONNECTOR_TYPES).join(\", \");\n throw new Error(`Unknown connector type: ${type}`, {\n cause: new Error(`Available connectors: ${available}`),\n });\n }\n\n const [connector, agentCtx] = await Promise.all([\n getZeroConnector(parseResult.data),\n resolveAgentContext(options.agent),\n ]);\n\n console.log(`Connector: ${chalk.cyan(type)}`);\n console.log();\n\n if (connector) {\n console.log(\n `${\"Status:\".padEnd(LABEL_WIDTH)}${chalk.green(\"connected\")}`,\n );\n console.log(\n `${\"Account:\".padEnd(LABEL_WIDTH)}@${connector.externalUsername}`,\n );\n console.log(\n `${\"Auth Method:\".padEnd(LABEL_WIDTH)}${connector.authMethod}`,\n );\n\n if (connector.oauthScopes && connector.oauthScopes.length > 0) {\n console.log(\n `${\"OAuth Scopes:\".padEnd(LABEL_WIDTH)}${connector.oauthScopes.join(\", \")}`,\n );\n }\n\n if (\n connector.authMethod === \"oauth\" &&\n !hasRequiredScopes(parseResult.data, connector.oauthScopes)\n ) {\n const diff = getScopeDiff(parseResult.data, connector.oauthScopes);\n console.log(\n `${\"Permissions:\".padEnd(LABEL_WIDTH)}${chalk.yellow(\"update available\")}`,\n );\n if (diff.addedScopes.length > 0) {\n console.log(\n `${\" Added:\".padEnd(LABEL_WIDTH)}${diff.addedScopes.join(\", \")}`,\n );\n }\n if (diff.removedScopes.length > 0) {\n console.log(\n `${\" Removed:\".padEnd(LABEL_WIDTH)}${diff.removedScopes.join(\", \")}`,\n );\n }\n }\n\n console.log(\n `${\"Connected:\".padEnd(LABEL_WIDTH)}${formatDateTime(connector.createdAt)}`,\n );\n\n if (connector.updatedAt !== connector.createdAt) {\n console.log(\n `${\"Last Updated:\".padEnd(LABEL_WIDTH)}${formatDateTime(connector.updatedAt)}`,\n );\n }\n } else {\n console.log(\n `${\"Status:\".padEnd(LABEL_WIDTH)}${chalk.dim(\"not connected\")}`,\n );\n }\n\n if (agentCtx) {\n const authorized = agentCtx.authorizedTypes.has(parseResult.data);\n const isConnected = connector !== null;\n const agentLabel =\n agentCtx.displayName === agentCtx.agentId\n ? agentCtx.agentId\n : `${agentCtx.displayName} (${agentCtx.agentId})`;\n\n console.log();\n if (authorized) {\n console.log(\n `The ${parseResult.data} connector is authorized for agent ${agentLabel}.`,\n );\n } else if (!isConnected) {\n const origin = await getPlatformOrigin();\n const url = `${origin}/connectors/${parseResult.data}/connect?agentId=${agentCtx.agentId}`;\n console.log(\n `The ${parseResult.data} connector is not connected. Once connected, it will be authorized for agent ${agentLabel}.`,\n );\n console.log(`Connect it at: [Connect ${parseResult.data}](${url})`);\n } else {\n const origin = await getPlatformOrigin();\n const url = `${origin}/connectors/${parseResult.data}/authorize?agentId=${agentCtx.agentId}`;\n console.log(\n `The ${parseResult.data} connector is not authorized for agent ${agentLabel}.`,\n );\n console.log(\n `Authorize it at: [Authorize ${parseResult.data}](${url})`,\n );\n }\n }\n }),\n );\n","/**\n * Format a date string as relative time (e.g., \"in 2h\", \"3d ago\")\n */\nexport function formatRelativeTime(dateStr: string | null): string {\n if (!dateStr) return \"-\";\n\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = date.getTime() - now.getTime();\n const diffAbs = Math.abs(diffMs);\n\n const minutes = Math.floor(diffAbs / (1000 * 60));\n const hours = Math.floor(diffAbs / (1000 * 60 * 60));\n const days = Math.floor(diffAbs / (1000 * 60 * 60 * 24));\n\n const isPast = diffMs < 0;\n\n if (days > 0) {\n return isPast ? `${days}d ago` : `in ${days}d`;\n } else if (hours > 0) {\n return isPast ? `${hours}h ago` : `in ${hours}h`;\n } else if (minutes > 0) {\n return isPast ? `${minutes}m ago` : `in ${minutes}m`;\n } else {\n return isPast ? \"just now\" : \"soon\";\n }\n}\n\n/**\n * Format a date string with both absolute and relative time\n * e.g., \"2025-01-14 09:00 (in 2h)\"\n * Uses local timezone, but doesn't include timezone in output (shown separately)\n */\nexport function formatDateTime(dateStr: string | null): string {\n if (!dateStr) return \"-\";\n\n const date = new Date(dateStr);\n\n // Format: YYYY-MM-DD HH:MM (no seconds, no timezone - shown separately)\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n\n const formatted = `${year}-${month}-${day} ${hours}:${minutes}`;\n const relative = formatRelativeTime(dateStr);\n\n return `${formatted} (${relative})`;\n}\n\n/**\n * Frequency type for schedule wizard\n */\nexport type ScheduleFrequency =\n | \"daily\"\n | \"weekly\"\n | \"monthly\"\n | \"once\"\n | \"loop\";\n\n/**\n * Generate cron expression from user-friendly inputs\n * @param frequency - Schedule frequency type\n * @param time - Time in HH:MM format (24-hour)\n * @param day - Day of week (0-6, Sun=0) for weekly, or day of month (1-31) for monthly\n * @returns Cron expression string\n */\nexport function generateCronExpression(\n frequency: Exclude<ScheduleFrequency, \"once\" | \"loop\">,\n time: string,\n day?: number,\n): string {\n const [hourStr, minuteStr] = time.split(\":\");\n const hour = parseInt(hourStr ?? \"0\", 10);\n const minute = parseInt(minuteStr ?? \"0\", 10);\n\n switch (frequency) {\n case \"daily\":\n return `${minute} ${hour} * * *`;\n case \"weekly\":\n return `${minute} ${hour} * * ${day ?? 1}`;\n case \"monthly\":\n return `${minute} ${hour} ${day ?? 1} * *`;\n }\n}\n\n/**\n * Detect system timezone using Intl API\n * @returns IANA timezone identifier (e.g., \"America/New_York\")\n */\nexport function detectTimezone(): string {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n}\n\n/**\n * Validate time format (HH:MM, 24-hour)\n * @param time - Time string to validate\n * @returns true if valid, error message if invalid\n */\nexport function validateTimeFormat(time: string): boolean | string {\n const match = time.match(/^(\\d{1,2}):(\\d{2})$/);\n if (!match) {\n return \"Invalid format. Use HH:MM (e.g., 09:00)\";\n }\n\n const hour = parseInt(match[1]!, 10);\n const minute = parseInt(match[2]!, 10);\n\n if (hour < 0 || hour > 23) {\n return \"Hour must be 0-23\";\n }\n if (minute < 0 || minute > 59) {\n return \"Minute must be 0-59\";\n }\n if (minute % 5 !== 0) {\n return \"Minute must be a multiple of 5 (0, 5, 10, ..., 55)\";\n }\n\n return true;\n}\n\n/**\n * Validate date format (YYYY-MM-DD)\n * @param date - Date string to validate\n * @returns true if valid, error message if invalid\n */\nexport function validateDateFormat(date: string): boolean | string {\n const match = date.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n if (!match) {\n return \"Invalid format. Use YYYY-MM-DD (e.g., 2025-01-15)\";\n }\n\n const year = parseInt(match[1]!, 10);\n const month = parseInt(match[2]!, 10);\n const day = parseInt(match[3]!, 10);\n\n if (year < 2000 || year > 2100) {\n return \"Year must be between 2000 and 2100\";\n }\n if (month < 1 || month > 12) {\n return \"Month must be 1-12\";\n }\n if (day < 1 || day > 31) {\n return \"Day must be 1-31\";\n }\n\n // Validate the date is actually valid (e.g., not Feb 30)\n const testDate = new Date(year, month - 1, day);\n if (\n testDate.getFullYear() !== year ||\n testDate.getMonth() !== month - 1 ||\n testDate.getDate() !== day\n ) {\n return \"Invalid date\";\n }\n\n return true;\n}\n\n/**\n * Get tomorrow's date in local timezone as YYYY-MM-DD\n * @returns Date string in YYYY-MM-DD format\n */\nexport function getTomorrowDateLocal(): string {\n const tomorrow = new Date();\n tomorrow.setDate(tomorrow.getDate() + 1);\n const year = tomorrow.getFullYear();\n const month = String(tomorrow.getMonth() + 1).padStart(2, \"0\");\n const day = String(tomorrow.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n}\n\n/**\n * Get current time in local timezone as HH:MM\n * @returns Time string in HH:MM format\n */\nexport function getCurrentTimeLocal(): string {\n const now = new Date();\n const hours = String(now.getHours()).padStart(2, \"0\");\n const minutes = String(now.getMinutes()).padStart(2, \"0\");\n return `${hours}:${minutes}`;\n}\n\n/**\n * Convert a human-readable datetime string to ISO format\n * Supports formats: \"YYYY-MM-DD HH:MM\" or full ISO string\n * @param dateTimeStr - DateTime string (e.g., \"2025-01-15 14:30\")\n * @returns ISO format string (e.g., \"2025-01-15T14:30:00.000Z\")\n */\nexport function toISODateTime(dateTimeStr: string): string {\n // If already in ISO format, return as-is\n if (dateTimeStr.includes(\"T\") && dateTimeStr.endsWith(\"Z\")) {\n return dateTimeStr;\n }\n\n // Convert \"YYYY-MM-DD HH:MM\" to ISO\n const isoStr = dateTimeStr.replace(\" \", \"T\") + \":00\";\n const date = new Date(isoStr);\n return date.toISOString();\n}\n","import { getApiUrl } from \"../../../lib/api/config\";\n\n/**\n * Transform the API host to the platform (app) host.\n *\n * www.vm0.ai → app.vm0.ai\n * platform.vm0.ai → app.vm0.ai\n * tunnel-user-host-www.vm7.ai → tunnel-user-host-app.vm7.ai\n * custom.example.com → app.custom.example.com\n */\nexport function toPlatformUrl(apiUrl: string): URL {\n const parsed = new URL(apiUrl);\n const parts = parsed.hostname.split(\".\");\n if (parts[0]!.endsWith(\"-www\")) {\n parts[0] = parts[0]!.slice(0, -\"-www\".length) + \"-app\";\n } else if (parts[0] === \"www\" || parts[0] === \"platform\") {\n parts[0] = \"app\";\n } else if (parts[0] !== \"app\" && parts[0] !== \"localhost\") {\n parts.unshift(\"app\");\n }\n parsed.hostname = parts.join(\".\");\n return parsed;\n}\n\nexport async function getPlatformOrigin(): Promise<string> {\n const apiUrl = await getApiUrl();\n return toPlatformUrl(apiUrl).origin;\n}\n","import { Command } from \"commander\";\nimport { checkConnectorCommand } from \"./check-connector\";\nimport { permissionDenyCommand } from \"./permission-deny\";\nimport { permissionChangeCommand } from \"./permission-change\";\n\nexport const zeroDoctorCommand = new Command()\n .name(\"doctor\")\n .description(\"Diagnose runtime issues (connector health, permission denials)\")\n .addCommand(checkConnectorCommand)\n .addCommand(permissionDenyCommand)\n .addCommand(permissionChangeCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Check a connector? zero doctor check-connector --env-name GITHUB_TOKEN\n Check a URL? zero doctor check-connector --url https://api.github.com/repos/owner/repo\n Check with permission? zero doctor check-connector --env-name SLACK_TOKEN --check-permission chat:write\n Permission denied? zero doctor permission-deny github --method GET --path /repos/owner/repo\n Change a permission? zero doctor permission-change github --permission contents:read --enable\n\nNotes:\n - Use this when your task fails due to a missing environment variable or permission denial\n - The doctor will identify the issue and give the user a link to resolve it`,\n );\n","import { Command, Option } from \"commander\";\nimport {\n CONNECTOR_TYPES,\n type ConnectorType,\n} from \"@vm0/connectors/connectors\";\nimport {\n getConnectorEnvironmentMapping,\n getConnectorTypeForSecretName,\n} from \"@vm0/connectors/connector-utils\";\nimport { findMatchingPermissions } from \"@vm0/connectors/firewall-rule-matcher\";\nimport { extractSecretNamesFromApis } from \"@vm0/connectors/firewall-types\";\nimport {\n getConnectorFirewall,\n isFirewallConnectorType,\n} from \"@vm0/connectors/firewalls\";\nimport type {\n FirewallConfig,\n NetworkPolicies,\n} from \"@vm0/connectors/firewall-types\";\nimport type { RunContextResponse } from \"@vm0/api-contracts/contracts/zero-runs\";\nimport { getApiUrl } from \"../../../lib/api/config\";\nimport { getZeroConnector } from \"../../../lib/api/domains/zero-connectors\";\nimport { getZeroAgentUserConnectors } from \"../../../lib/api/domains/zero-agents\";\nimport { getZeroRunContext } from \"../../../lib/api/domains/zero-runs\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { toPlatformUrl } from \"./platform-url\";\nimport { decodeZeroTokenPayload } from \"../../../lib/api/zero-token\";\n\ninterface CheckConnectorOptions {\n envName?: string;\n url?: string;\n method: string;\n checkPermission?: string;\n}\n\ninterface DiagContext {\n envName: string;\n connectorType: string;\n label: string;\n platformOrigin: string;\n agentId: string | undefined;\n}\n\ninterface UrlLookupResult {\n connectorType: string;\n envName: string;\n matchedBase: string;\n relativePath: string;\n}\n\n/**\n * Reverse-lookup a full URL to find which connector handles it.\n * Iterates all connector firewall configs and checks if the URL\n * starts with any registered base URL (scheme + host + optional path prefix).\n */\nfunction resolveConnectorFromUrl(url: string): UrlLookupResult | null {\n const allTypes = Object.keys(CONNECTOR_TYPES) as ConnectorType[];\n\n // Normalize: strip trailing slash for comparison\n const normalized = url.endsWith(\"/\") ? url.slice(0, -1) : url;\n\n let bestMatch: {\n connectorType: string;\n base: string;\n config: FirewallConfig;\n } | null = null;\n\n for (const type of allTypes) {\n if (!isFirewallConnectorType(type)) continue;\n const config = getConnectorFirewall(type);\n for (const api of config.apis) {\n const base = api.base.endsWith(\"/\") ? api.base.slice(0, -1) : api.base;\n // URL must match the base exactly or have the base as a prefix followed by /\n if (normalized === base || normalized.startsWith(base + \"/\")) {\n // Pick the longest (most specific) base URL match\n if (!bestMatch || base.length > bestMatch.base.length) {\n bestMatch = { connectorType: type, base, config };\n }\n }\n }\n }\n\n if (!bestMatch) return null;\n\n // Derive the env var name from the connector's environment mapping\n const mapping = getConnectorEnvironmentMapping(\n bestMatch.connectorType as ConnectorType,\n );\n const envName = Object.keys(mapping)[0];\n if (!envName) return null;\n\n const relativePath =\n normalized === bestMatch.base\n ? \"/\"\n : normalized.slice(bestMatch.base.length);\n\n return {\n connectorType: bestMatch.connectorType,\n envName,\n matchedBase: bestMatch.base,\n relativePath,\n };\n}\n\nfunction checkEnvVariable(ctx: DiagContext): boolean {\n console.log(\"## Step 1: Sandbox environment variable\");\n console.log(\"\");\n const envPresent = Boolean(process.env[ctx.envName]);\n console.log(\n `Checking process.env.${ctx.envName}: ${envPresent ? \"present\" : \"not present\"}`,\n );\n if (envPresent) {\n console.log(\n \"A placeholder value is present in the sandbox environment. This value is not the real credential — it is a stand-in that gets replaced at the network boundary when requests are sent to registered base URLs.\",\n );\n } else {\n console.log(\n \"No value found for this environment variable. Note: credential replacement at the network boundary is independent of this variable — the proxy injects auth headers based on the destination URL, not the presence of this env var.\",\n );\n }\n console.log(\"\");\n return envPresent;\n}\n\nasync function checkConnectorStatus(ctx: DiagContext): Promise<{\n isConnected: boolean;\n isExpired: boolean;\n hasPermission: boolean;\n}> {\n console.log(\"## Step 2: Connector configuration\");\n console.log(\"\");\n console.log(\n \"A Connector holds the real credentials (OAuth tokens or API keys) for an external service. These credentials are never injected into the sandbox. Instead, when the sandbox sends an HTTP request to a base URL registered by the Connector, the network boundary intercepts the request and replaces the auth headers with real credentials. For this to work, three conditions must be met:\",\n );\n console.log(\"\");\n\n const [connector, enabledTypes] = await Promise.all([\n getZeroConnector(ctx.connectorType as ConnectorType),\n ctx.agentId\n ? getZeroAgentUserConnectors(ctx.agentId)\n : Promise.resolve(null),\n ]);\n\n const isConnected = connector !== null;\n const isExpired = connector?.needsReconnect === true;\n const hasPermission =\n enabledTypes !== null && enabledTypes.includes(ctx.connectorType);\n\n // 2a: Connector status — user must have configured the connector (OAuth or API token)\n console.log(\n `### 2a: Connector status (user must configure via OAuth login or API key)`,\n );\n console.log(\"\");\n if (!isConnected) {\n console.log(`The ${ctx.label} connector is not connected.`);\n if (!ctx.agentId) {\n // No agentId: can't scope the authorize page, so fall back to a plain\n // connect link. With agentId, 2b's Authorize link performs the initial\n // OAuth connect before granting permission — one link covers both steps.\n const connectUrl = `${ctx.platformOrigin}/connectors/${ctx.connectorType}/connect`;\n console.log(`Connect it at: [Connect ${ctx.label}](${connectUrl})`);\n }\n } else if (isExpired) {\n const url = `${ctx.platformOrigin}/connectors`;\n console.log(\n `The ${ctx.label} connector is connected but has expired and needs to be reconnected.`,\n );\n console.log(`Reconnect it at: [Reconnect ${ctx.label}](${url})`);\n } else {\n console.log(`The ${ctx.label} connector is connected and active.`);\n }\n console.log(\"\");\n\n // 2b: Agent authorization — user must authorize the agent to use this connector\n console.log(\n `### 2b: Agent authorization (user must authorize agent to use this connector)`,\n );\n console.log(\"\");\n if (!ctx.agentId) {\n console.log(\"ZERO_AGENT_ID is not set — cannot check agent authorization.\");\n } else if (isExpired) {\n // The /authorize page treats an expired connector as \"already connected\"\n // and won't re-trigger OAuth. Defer to 2a's Reconnect link in that case.\n console.log(\n `Skipped — agent authorization can only be checked once the ${ctx.label} connector is reconnected (see 2a).`,\n );\n } else if (hasPermission) {\n console.log(`The ${ctx.label} connector is authorized for this agent.`);\n } else {\n const url = `${ctx.platformOrigin}/connectors/${ctx.connectorType}/authorize?agentId=${ctx.agentId}`;\n console.log(\n isConnected\n ? `The ${ctx.label} connector is not authorized for this agent (${ctx.agentId}).`\n : `The ${ctx.label} connector needs to be connected and authorized for this agent (${ctx.agentId}).`,\n );\n console.log(`Authorize it at: [Authorize ${ctx.label}](${url})`);\n }\n console.log(\"\");\n\n return { isConnected, isExpired, hasPermission };\n}\n\nasync function checkConnectorDomains(\n ctx: DiagContext,\n): Promise<NetworkPolicies | null> {\n // 2c: Registered base URLs — connector defines which URL prefixes get credential replacement\n console.log(\n `### 2c: Registered base URLs (credential replacement only applies to URLs matching these prefixes)`,\n );\n console.log(\"\");\n\n const payload = decodeZeroTokenPayload();\n const runId = payload?.runId;\n\n if (!runId) {\n console.log(\n \"Cannot determine run ID from ZERO_TOKEN — skipping base URL check.\",\n );\n console.log(\"\");\n return null;\n }\n\n const runContext = await getZeroRunContext(runId);\n\n printConnectorDomains(ctx, runContext);\n console.log(\"\");\n return runContext.networkPolicies;\n}\n\nfunction printConnectorDomains(\n ctx: DiagContext,\n runContext: RunContextResponse,\n): void {\n const matchingEntry = runContext.firewalls.find((fw) => {\n return fw.name === ctx.connectorType;\n });\n\n if (!matchingEntry) {\n console.log(\n `No configuration found for the ${ctx.label} connector in this run.`,\n );\n console.log(\n \"This means no base URLs are registered for credential replacement for this connector.\",\n );\n return;\n }\n\n console.log(\n `The ${ctx.label} connector is configured for this run with the following base URLs:`,\n );\n for (const api of matchingEntry.apis) {\n console.log(` - ${api.base}`);\n }\n console.log(\"\");\n console.log(\n \"When the sandbox sends an HTTP request matching one of these URL prefixes, the network boundary intercepts the request and injects real credentials into the auth headers.\",\n );\n\n if (isFirewallConnectorType(ctx.connectorType)) {\n const firewallConfig = getConnectorFirewall(ctx.connectorType);\n const secretNames = extractSecretNamesFromApis(firewallConfig.apis);\n if (secretNames.length > 0) {\n console.log(`Credentials resolved from: ${secretNames.join(\", \")}`);\n }\n }\n}\n\nfunction checkPermissionPolicy(\n connectorType: string,\n label: string,\n permissionName: string,\n networkPolicies: NetworkPolicies | null,\n): void {\n console.log(\"## Step 3: Permission policy check\");\n console.log(\"\");\n console.log(\n `Checking permission: \"${permissionName}\" for the ${label} connector.`,\n );\n console.log(\n `Beyond credential replacement, the ${label} connector enforces permission policies on each API path. A request either matches a named permission or falls through to the unknown-endpoint policy.`,\n );\n console.log(\"\");\n\n if (!networkPolicies) {\n console.log(\n \"Network policies are not available for this run — cannot check permission status.\",\n );\n console.log(\"\");\n return;\n }\n\n const connectorPolicies = networkPolicies[connectorType];\n\n if (!connectorPolicies) {\n console.log(\n `No policy entry found for the ${label} connector in this run's network policies.`,\n );\n console.log(\n \"When a connector has no policy entry, all requests are fully permissive (allowed).\",\n );\n console.log(\"\");\n return;\n }\n\n console.log(`Permission policies for the ${label} connector:`);\n console.log(` allow list: [${connectorPolicies.allow.join(\", \")}]`);\n console.log(` deny list: [${connectorPolicies.deny.join(\", \")}]`);\n console.log(` unknown endpoint policy: ${connectorPolicies.unknownPolicy}`);\n console.log(\"\");\n\n const isInAllow = connectorPolicies.allow.includes(permissionName);\n const isInDeny = connectorPolicies.deny.includes(permissionName);\n\n if (isInAllow) {\n console.log(\n `Result: \"${permissionName}\" is in the allow list. Requests matching this permission are allowed.`,\n );\n } else if (isInDeny) {\n console.log(\n `Result: \"${permissionName}\" is in the deny list. Requests matching this permission are denied.`,\n );\n } else {\n console.log(\n `Result: \"${permissionName}\" is not in any permission list. It will be handled by the unknown endpoint policy: ${connectorPolicies.unknownPolicy}.`,\n );\n }\n console.log(\"\");\n}\n\n/**\n * When --url is provided, auto-detect the matching permission by running\n * the URL's relative path against the connector's firewall rules.\n */\nfunction resolvePermissionFromUrl(\n connectorType: string,\n label: string,\n method: string,\n relativePath: string,\n matchedBase: string,\n networkPolicies: NetworkPolicies | null,\n): void {\n console.log(\"## Step 3: Permission policy check (auto-detected from URL)\");\n console.log(\"\");\n console.log(\n `Matching ${method} ${relativePath} (relative to base URL ${matchedBase}) against the ${label} connector's permission rules.`,\n );\n console.log(\"\");\n\n if (!isFirewallConnectorType(connectorType)) {\n console.log(\n `The ${label} connector does not have permission rules defined.`,\n );\n console.log(\"\");\n return;\n }\n\n const config = getConnectorFirewall(connectorType);\n const matchedPermissions = findMatchingPermissions(\n method,\n relativePath,\n config,\n );\n\n if (matchedPermissions.length === 0) {\n console.log(\n `No named permission matches ${method} ${relativePath}. This request falls through to the unknown-endpoint policy.`,\n );\n } else {\n console.log(`Matched permissions: [${matchedPermissions.join(\", \")}]`);\n }\n console.log(\"\");\n\n if (!networkPolicies) {\n console.log(\n \"Network policies are not available for this run — cannot check allow/deny status.\",\n );\n console.log(\"\");\n return;\n }\n\n const connectorPolicies = networkPolicies[connectorType];\n\n if (!connectorPolicies) {\n console.log(\n `No policy entry found for the ${label} connector. All requests are fully permissive (allowed).`,\n );\n console.log(\"\");\n return;\n }\n\n console.log(`Permission policies for the ${label} connector:`);\n console.log(` allow list: [${connectorPolicies.allow.join(\", \")}]`);\n console.log(` deny list: [${connectorPolicies.deny.join(\", \")}]`);\n console.log(` unknown endpoint policy: ${connectorPolicies.unknownPolicy}`);\n console.log(\"\");\n\n if (matchedPermissions.length === 0) {\n console.log(\n `Result: No permission matched. The unknown endpoint policy applies: ${connectorPolicies.unknownPolicy}.`,\n );\n } else {\n for (const perm of matchedPermissions) {\n const isInAllow = connectorPolicies.allow.includes(perm);\n const isInDeny = connectorPolicies.deny.includes(perm);\n if (isInAllow) {\n console.log(`Result: \"${perm}\" is in the allow list — allowed.`);\n } else if (isInDeny) {\n console.log(`Result: \"${perm}\" is in the deny list — denied.`);\n } else {\n console.log(\n `Result: \"${perm}\" is not in any list — falls through to unknown endpoint policy: ${connectorPolicies.unknownPolicy}.`,\n );\n }\n }\n }\n console.log(\"\");\n}\n\nexport const checkConnectorCommand = new Command()\n .name(\"check-connector\")\n .description(\n \"Diagnose connector health: environment variable, connector configuration, and permission policies\",\n )\n .addOption(\n new Option(\n \"--env-name <ENV_NAME>\",\n \"The environment variable name to check (e.g. GITHUB_TOKEN)\",\n ),\n )\n .addOption(\n new Option(\n \"--url <URL>\",\n \"A full URL to diagnose — auto-detects the connector, env var, and permission (e.g. https://api.github.com/repos/owner/repo)\",\n ),\n )\n .addOption(\n new Option(\n \"--method <METHOD>\",\n \"HTTP method to use when matching permissions with --url (default: GET)\",\n ).default(\"GET\"),\n )\n .addOption(\n new Option(\n \"--check-permission <name>\",\n \"Check whether a specific permission is allowed or denied (e.g. contents:read)\",\n ),\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n zero doctor check-connector --env-name GITHUB_TOKEN\n zero doctor check-connector --url https://api.github.com/repos/owner/repo\n zero doctor check-connector --url https://slack.com/api/chat.postMessage --method POST\n zero doctor check-connector --env-name SLACK_TOKEN --check-permission chat:write\n\nHow connectors work:\n A Connector holds the real credentials for an external service. These credentials\n are never injected into the sandbox. Instead, when the sandbox sends an HTTP\n request to a base URL registered by the Connector, the network boundary intercepts\n the request and replaces the auth headers with real credentials.\n\n This command checks each part of that pipeline and reports what it finds.`,\n )\n .action(\n withErrorHandler(async (opts: CheckConnectorOptions) => {\n if (!opts.envName && !opts.url) {\n throw new Error(\n \"Either --env-name or --url is required. Use --help for usage.\",\n );\n }\n\n let envName: string;\n let connectorType: string;\n let urlLookup: UrlLookupResult | null = null;\n\n if (opts.url) {\n urlLookup = resolveConnectorFromUrl(opts.url);\n if (!urlLookup) {\n throw new Error(\n `No connector found for URL: ${opts.url} — no registered base URL matches this URL`,\n );\n }\n connectorType = urlLookup.connectorType;\n envName = opts.envName ?? urlLookup.envName;\n console.log(\n `URL ${opts.url} matches the ${CONNECTOR_TYPES[connectorType as ConnectorType].label} connector (type: ${connectorType}).`,\n );\n console.log(` Matched base URL: ${urlLookup.matchedBase}`);\n console.log(` Relative path: ${urlLookup.relativePath}`);\n console.log(` Environment var: ${envName}`);\n } else {\n connectorType = getConnectorTypeForSecretName(\n (envName = opts.envName!),\n )!;\n if (!connectorType) {\n throw new Error(\n `Unknown environment variable: ${envName} — not managed by any connector`,\n );\n }\n console.log(\n `${envName} is managed by the ${CONNECTOR_TYPES[connectorType as ConnectorType].label} connector (type: ${connectorType}).`,\n );\n }\n console.log(\"\");\n\n const { label } = CONNECTOR_TYPES[connectorType as ConnectorType];\n const apiUrl = await getApiUrl();\n const platformUrl = toPlatformUrl(apiUrl);\n\n const ctx: DiagContext = {\n envName,\n connectorType,\n label,\n platformOrigin: platformUrl.origin,\n agentId: process.env.ZERO_AGENT_ID || undefined,\n };\n\n checkEnvVariable(ctx);\n const { isConnected, isExpired, hasPermission } =\n await checkConnectorStatus(ctx);\n const networkPolicies = await checkConnectorDomains(ctx);\n\n // Summary for Step 2\n if (isConnected && !isExpired && hasPermission) {\n console.log(\n `Steps 1-2 summary: The ${label} connector is connected, active, and authorized. Outbound requests to the registered base URLs will have credentials injected at the network boundary.`,\n );\n }\n console.log(\"\");\n\n // Step 3: Permission policy check\n if (urlLookup) {\n // --url mode: auto-detect permission from URL path\n resolvePermissionFromUrl(\n connectorType,\n label,\n opts.method,\n urlLookup.relativePath,\n urlLookup.matchedBase,\n networkPolicies,\n );\n } else if (opts.checkPermission) {\n // --env-name mode with explicit --check-permission\n checkPermissionPolicy(\n connectorType,\n label,\n opts.checkPermission,\n networkPolicies,\n );\n }\n\n // Re-diagnose hint\n const args: string[] = [];\n if (opts.url) {\n args.push(`--url ${opts.url}`);\n if (opts.method !== \"GET\") {\n args.push(`--method ${opts.method}`);\n }\n } else {\n args.push(`--env-name ${envName}`);\n }\n if (opts.checkPermission) {\n args.push(`--check-permission ${opts.checkPermission}`);\n }\n console.log(\n `To re-diagnose after changes, run: zero doctor check-connector ${args.join(\" \")}`,\n );\n }),\n );\n","import { Command, Option } from \"commander\";\nimport { CONNECTOR_TYPES } from \"@vm0/connectors/connectors\";\nimport { findMatchingPermissions } from \"@vm0/connectors/firewall-rule-matcher\";\nimport {\n getConnectorFirewall,\n isFirewallConnectorType,\n} from \"@vm0/connectors/firewalls\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const permissionDenyCommand = new Command()\n .name(\"permission-deny\")\n .description(\n \"Diagnose a permission denial and find the permission that covers it\",\n )\n .argument(\"<connector-ref>\", \"The connector type (e.g. github)\")\n .addOption(\n new Option(\n \"--method <method>\",\n \"The denied HTTP method\",\n ).makeOptionMandatory(),\n )\n .addOption(\n new Option(\"--path <path>\", \"The denied path\").makeOptionMandatory(),\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n zero doctor permission-deny github --method GET --path /repos/owner/repo/pulls\n zero doctor permission-deny slack --method POST --path /chat.postMessage\n\nNotes:\n - Identifies which named permission covers a denied request\n - Use permission-change to request or enable the permission`,\n )\n .action(\n withErrorHandler(\n async (connectorRef: string, opts: { method: string; path: string }) => {\n if (!isFirewallConnectorType(connectorRef)) {\n throw new Error(`Unknown connector type: ${connectorRef}`);\n }\n\n const { label } = CONNECTOR_TYPES[connectorRef];\n const config = getConnectorFirewall(connectorRef);\n const permissions = findMatchingPermissions(\n opts.method,\n opts.path,\n config,\n );\n\n console.log(\n `The ${label} permission filtered ${opts.method} ${opts.path}.`,\n );\n\n if (permissions.length === 0) {\n console.log(\"No named permission was found covering this request.\");\n return;\n }\n\n // Count total rules per permission name across all APIs\n const ruleCount = new Map<string, number>();\n for (const api of config.apis) {\n if (!api.permissions) continue;\n for (const perm of api.permissions) {\n ruleCount.set(\n perm.name,\n (ruleCount.get(perm.name) ?? 0) + perm.rules.length,\n );\n }\n }\n\n // Pick the permission with the fewest rules (most specific)\n const permission = permissions.reduce((narrowest, current) => {\n return (ruleCount.get(current) ?? Infinity) <\n (ruleCount.get(narrowest) ?? Infinity)\n ? current\n : narrowest;\n });\n console.log(`This is covered by the \"${permission}\" permission.`);\n console.log(\n `To request this permission, run: zero doctor permission-change ${connectorRef} --permission ${permission} --enable --reason \"why this is needed\"`,\n );\n },\n ),\n );\n","import { Command, Option } from \"commander\";\nimport { CONNECTOR_TYPES } from \"@vm0/connectors/connectors\";\nimport {\n getConnectorFirewall,\n isFirewallConnectorType,\n} from \"@vm0/connectors/firewalls\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { getPlatformOrigin } from \"./platform-url\";\nimport { resolveAgentRole } from \"./resolve-role\";\n\nfunction findPermissionInConfig(ref: string, permissionName: string): boolean {\n if (!isFirewallConnectorType(ref)) return false;\n const config = getConnectorFirewall(ref);\n for (const api of config.apis) {\n if (!api.permissions) continue;\n for (const p of api.permissions) {\n if (p.name === permissionName) return true;\n }\n }\n return false;\n}\n\n/**\n * Core logic for outputting a permission change message.\n * Shared by both `permission-change` and `permission-deny` commands.\n */\nconst REASON_MAX_LENGTH = 500;\n\nasync function outputPermissionChangeMessage(\n connectorRef: string,\n permission: string,\n action: \"enable\" | \"disable\",\n reason?: string,\n): Promise<void> {\n const { label } =\n CONNECTOR_TYPES[connectorRef as keyof typeof CONNECTOR_TYPES];\n\n const platformOrigin = await getPlatformOrigin();\n const agentId = process.env.ZERO_AGENT_ID;\n const role = agentId ? await resolveAgentRole(agentId) : \"unknown\";\n\n const urlParams = new URLSearchParams({\n ref: connectorRef,\n permission,\n action: action === \"enable\" ? \"allow\" : \"deny\",\n });\n\n // Only include reason for member role (admin/owner can change directly)\n if (role === \"member\" && reason) {\n const truncated =\n reason.length > REASON_MAX_LENGTH\n ? reason.slice(0, REASON_MAX_LENGTH)\n : reason;\n urlParams.set(\"reason\", truncated);\n }\n\n const pagePath = agentId ? `/agents/${agentId}/permissions` : \"/agents\";\n const url = `${platformOrigin}${pagePath}?${urlParams.toString()}`;\n\n // Slack chat:write: strongly recommend bot-based messaging over user identity\n if (\n connectorRef === \"slack\" &&\n permission === \"chat:write\" &&\n action === \"enable\"\n ) {\n console.log(\"\");\n console.log(\n \"IMPORTANT: Granting chat:write allows sending messages AS THE USER's identity, not as a bot.\",\n );\n console.log(\n \"Use `zero slack message send -c <channel> -t <text>` to send messages as the bot instead — this is the recommended approach for most use cases.\",\n );\n console.log(\n \"Only request user approval below if acting as the user is specifically required.\",\n );\n console.log(\"\");\n }\n\n // Gmail gmail.send: strongly recommend draft-based workflow over direct send\n if (\n connectorRef === \"gmail\" &&\n permission === \"gmail.send\" &&\n action === \"enable\"\n ) {\n console.log(\"\");\n console.log(\n \"IMPORTANT: Granting gmail.send allows the agent to send emails directly as the user.\",\n );\n console.log(\n \"Consider keeping gmail.send disabled and using gmail.compose instead — the agent can create drafts for the user to review and send manually.\",\n );\n console.log(\n \"Only request user approval below if direct sending is specifically required.\",\n );\n console.log(\"\");\n }\n\n if (role === \"admin\" || role === \"owner\") {\n console.log(\n `You can ${action} the \"${permission}\" permission directly: [Manage ${label} permissions](${url})`,\n );\n } else if (role === \"member\") {\n if (!reason) {\n console.log(\n `IMPORTANT: Re-run with \\`--reason \"one sentence why this is needed\"\\` so the admin can review your request faster.`,\n );\n } else if (action === \"enable\") {\n console.log(\n `Permission changes require admin approval. Request access at: [Request ${label} access](${url})`,\n );\n } else {\n console.log(\n `Permission changes require admin approval. Contact an org admin to disable this permission: [View ${label} permissions](${url})`,\n );\n }\n } else {\n console.log(\n `To ${action} the \"${permission}\" permission for ${label}: [Manage ${label} permissions](${url})`,\n );\n }\n}\n\nexport const permissionChangeCommand = new Command()\n .name(\"permission-change\")\n .description(\"Request a permission change (enable or disable)\")\n .argument(\"<connector-ref>\", \"The connector type (e.g. github)\")\n .addOption(\n new Option(\n \"--permission <name>\",\n \"The permission name to change\",\n ).makeOptionMandatory(),\n )\n .addOption(\n new Option(\"--enable\", \"Request to enable the permission\").conflicts(\n \"disable\",\n ),\n )\n .addOption(\n new Option(\"--disable\", \"Request to disable the permission\").conflicts(\n \"enable\",\n ),\n )\n .addOption(\n new Option(\n \"--reason <text>\",\n \"Brief reason why the permission is needed (max 500 chars)\",\n ),\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n zero doctor permission-change github --permission contents:read --enable\n zero doctor permission-change slack --permission chat:write --disable\n\nNotes:\n - Outputs a platform URL for the user to adjust the permission\n - Admins can change permissions directly; members must request approval`,\n )\n .action(\n withErrorHandler(\n async (\n connectorRef: string,\n opts: {\n permission: string;\n enable?: boolean;\n disable?: boolean;\n reason?: string;\n },\n ) => {\n if (!opts.enable && !opts.disable) {\n throw new Error(\"Either --enable or --disable is required\");\n }\n\n if (!isFirewallConnectorType(connectorRef)) {\n throw new Error(`Unknown connector type: ${connectorRef}`);\n }\n\n if (!findPermissionInConfig(connectorRef, opts.permission)) {\n throw new Error(\n `Unknown permission \"${opts.permission}\" for ${connectorRef}`,\n );\n }\n\n const action = opts.enable ? \"enable\" : \"disable\";\n await outputPermissionChangeMessage(\n connectorRef,\n opts.permission,\n action,\n opts.reason,\n );\n },\n ),\n );\n","import { getZeroOrg } from \"../../../lib/api/domains/zero-orgs\";\nimport { getZeroAgent } from \"../../../lib/api/domains/zero-agents\";\nimport { decodeZeroTokenPayload } from \"../../../lib/api/zero-token\";\nimport { decodeCliTokenPayload } from \"../../../lib/api/cli-token\";\nimport { getToken } from \"../../../lib/api/config\";\n\ntype AgentRole = \"admin\" | \"owner\" | \"member\" | \"unknown\";\n\n/**\n * Resolve the current user's userId from the available token.\n * Tries ZERO_TOKEN (sandbox) first, then CLI token.\n */\nasync function resolveUserId(): Promise<string | undefined> {\n const zeroPayload = decodeZeroTokenPayload();\n if (zeroPayload?.userId) return zeroPayload.userId;\n\n const token = await getToken();\n const cliPayload = decodeCliTokenPayload(token);\n return cliPayload?.userId;\n}\n\n/**\n * Best-effort role detection that also considers agent ownership.\n *\n * Returns \"admin\" if the user is an org admin (can manage any agent).\n * Returns \"owner\" if the user is a non-admin but owns the specified agent.\n * Returns \"member\" if the user is a non-admin, non-owner member.\n * Returns \"unknown\" on any API failure.\n */\nexport async function resolveAgentRole(agentId: string): Promise<AgentRole> {\n try {\n const org = await getZeroOrg();\n if (org.role === \"admin\") return \"admin\";\n\n if (org.role === \"member\") {\n // Check if the member owns this agent\n const userId = await resolveUserId();\n if (userId) {\n const agent = await getZeroAgent(agentId);\n if (agent.ownerId === userId) return \"owner\";\n }\n return \"member\";\n }\n\n return \"unknown\";\n } catch (error: unknown) {\n console.debug(\"resolveAgentRole failed, falling back to unknown:\", error);\n return \"unknown\";\n }\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n getZeroUserPreferences,\n updateZeroUserPreferences,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { isInteractive, promptText } from \"../../../lib/utils/prompt-utils\";\n\n/**\n * Detect system timezone using Intl API\n */\nfunction detectTimezone(): string {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n}\n\n/**\n * Validate timezone using Intl.DateTimeFormat\n */\nfunction isValidTimezone(timezone: string): boolean {\n try {\n Intl.DateTimeFormat(undefined, { timeZone: timezone });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Display current preferences\n */\nfunction displayPreferences(prefs: { timezone: string | null }): void {\n console.log(chalk.bold(\"Current preferences:\"));\n console.log(\n ` Timezone: ${prefs.timezone ? chalk.cyan(prefs.timezone) : chalk.dim(\"not set\")}`,\n );\n}\n\ninterface PreferenceOpts {\n timezone?: string;\n}\n\n/**\n * Build updates from CLI flags, exiting on invalid input\n */\nfunction buildUpdates(opts: PreferenceOpts): { timezone?: string } | null {\n if (opts.timezone === undefined) return null;\n\n if (!isValidTimezone(opts.timezone)) {\n throw new Error(`Invalid timezone: ${opts.timezone}`, {\n cause: new Error(\n \"Use an IANA timezone identifier (e.g., America/New_York, Asia/Shanghai)\",\n ),\n });\n }\n\n return { timezone: opts.timezone };\n}\n\n/**\n * Print confirmation after a successful update\n */\nfunction printUpdateResult(\n updates: { timezone?: string },\n result: { timezone: string | null },\n): void {\n if (updates.timezone !== undefined) {\n console.log(\n chalk.green(\n `Timezone set to ${chalk.cyan(result.timezone ?? updates.timezone)}`,\n ),\n );\n }\n}\n\n/**\n * Interactive prompts when no flags provided\n */\nasync function interactiveSetup(prefs: {\n timezone: string | null;\n}): Promise<void> {\n if (!prefs.timezone) {\n const detectedTz = detectTimezone();\n console.log(chalk.dim(`\\nSystem timezone detected: ${detectedTz}`));\n const tz = await promptText(\n \"Set timezone? (enter timezone or leave empty to skip)\",\n detectedTz,\n );\n if (tz?.trim()) {\n if (!isValidTimezone(tz.trim())) {\n throw new Error(`Invalid timezone: ${tz.trim()}`);\n }\n await updateZeroUserPreferences({ timezone: tz.trim() });\n console.log(chalk.green(`Timezone set to ${chalk.cyan(tz.trim())}`));\n }\n }\n}\n\n/**\n * zero preference\n *\n * View or update user preferences (timezone).\n */\nexport const zeroPreferenceCommand = new Command()\n .name(\"preference\")\n .description(\"View or update user preferences (timezone, notifications)\")\n .option(\"--timezone <timezone>\", \"IANA timezone (e.g., America/New_York)\")\n .action(\n withErrorHandler(async (opts: PreferenceOpts) => {\n const updates = buildUpdates(opts);\n\n if (updates) {\n const result = await updateZeroUserPreferences(updates);\n printUpdateResult(updates, result);\n return;\n }\n\n // No flags: display current preferences\n const prefs = await getZeroUserPreferences();\n displayPreferences(prefs);\n\n if (isInteractive()) {\n await interactiveSetup(prefs);\n } else if (!prefs.timezone) {\n console.log();\n console.log(\n `To set timezone: ${chalk.cyan(\"zero preference --timezone <timezone>\")}`,\n );\n console.log(\n chalk.dim(\"Example: zero preference --timezone America/New_York\"),\n );\n }\n }),\n );\n","import { mainRunCommand } from \"./run\";\nimport { continueCommand } from \"./continue\";\n\nmainRunCommand.addCommand(continueCommand);\n\nmainRunCommand.addHelpText(\n \"after\",\n `\nExamples:\n Discover teammates: zero agent list\n Delegate a task: zero run <agent-id> \"your task\"\n Continue delegation: zero run continue <session-id> \"follow up\"`,\n);\n\nexport const zeroRunCommand = mainRunCommand;\n","import { Command, Option } from \"commander\";\nimport { createZeroRun } from \"../../../lib/api\";\nimport { isUUID, renderRunCreated } from \"../../run/shared\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { pollZeroEvents, showZeroNextSteps } from \"./shared\";\n\nexport const mainRunCommand = new Command()\n .name(\"run\")\n .description(\"Delegate a task to a teammate agent\")\n .argument(\"<agent-id>\", \"Agent UUID (from `zero agent list`)\")\n .argument(\"<prompt>\", \"Task prompt for the agent\")\n .option(\n \"--model-provider <type>\",\n \"Override model provider (e.g., anthropic-api-key)\",\n )\n .option(\"--verbose\", \"Show full tool inputs and outputs\")\n .addOption(new Option(\"--debug-no-mock-claude\").hideHelp())\n .addOption(new Option(\"--debug-no-mock-codex\").hideHelp())\n .addHelpText(\n \"after\",\n `\nExamples:\n Delegate a task: zero run <agent-id> \"summarize the latest issues\"\n With verbose output: zero run <agent-id> \"fix the bug\" --verbose\n\nNotes:\n - Get agent IDs from \"zero agent list\"\n - The command streams events until the delegated run completes\n - On success, a session ID is printed for follow-up with \"zero run continue\"`,\n )\n .action(\n withErrorHandler(\n async (\n agentId: string,\n prompt: string,\n options: {\n modelProvider?: string;\n verbose?: boolean;\n debugNoMockClaude?: boolean;\n debugNoMockCodex?: boolean;\n },\n ) => {\n // 1. Validate agent-id is a UUID\n if (!isUUID(agentId)) {\n throw new Error(`Invalid agent ID format: ${agentId}`, {\n cause: new Error(\n \"Agent ID must be a valid UUID. Use `zero agent list` to find agent IDs.\",\n ),\n });\n }\n\n // 2. Create zero run\n const response = await createZeroRun({\n agentId,\n prompt,\n modelProvider: options.modelProvider,\n debugNoMockClaude: options.debugNoMockClaude,\n debugNoMockCodex: options.debugNoMockCodex,\n });\n\n // 3. Check for immediate failure\n if (response.status === \"failed\") {\n throw new Error(\n \"Run preparation failed\",\n response.error ? { cause: new Error(response.error) } : undefined,\n );\n }\n\n // 4. Display run started/queued info\n renderRunCreated(response);\n\n // 5. Poll for events\n const result = await pollZeroEvents(response.runId, {\n verbose: options.verbose,\n });\n if (!result.succeeded) {\n throw new Error(\"Run failed\");\n }\n\n // 6. Show next steps\n showZeroNextSteps(result);\n },\n ),\n );\n","import chalk from \"chalk\";\nimport { getZeroRunAgentEvents, getZeroRun } from \"../../../lib/api\";\nimport type { RunResult } from \"../../../lib/api\";\nimport { parseEvent } from \"../../../lib/events/event-parser-factory\";\nimport { EventRenderer } from \"../../../lib/events/event-renderer\";\nimport type { PollResult, EventRenderingOptions } from \"../../run/shared\";\n\ninterface SequencedEvent {\n sequenceNumber: number;\n}\n\ntype ZeroRunResponse = Awaited<ReturnType<typeof getZeroRun>>;\ntype TerminalRunStatus = \"completed\" | \"failed\" | \"timeout\" | \"cancelled\";\ntype TerminalRunResponse = ZeroRunResponse & { status: TerminalRunStatus };\n\nconst TERMINAL_RUN_STATUSES: readonly TerminalRunStatus[] = [\n \"completed\",\n \"failed\",\n \"timeout\",\n \"cancelled\",\n];\n\n/**\n * Safely narrow GetRunResponse.result to RunResult.\n * GetRunResponse.result has all fields optional (due to .passthrough()),\n * but RunResult requires checkpointId, agentSessionId, conversationId.\n * Extra fields (artifact, volumes) are preserved at runtime via passthrough.\n */\nfunction toRunResult(result: {\n output?: string;\n executionTimeMs?: number;\n agentSessionId?: string;\n checkpointId?: string;\n conversationId?: string;\n}): RunResult | undefined {\n const { checkpointId, agentSessionId, conversationId } = result;\n if (!checkpointId || !agentSessionId || !conversationId) {\n return undefined;\n }\n return { checkpointId, agentSessionId, conversationId };\n}\n\nfunction filterContiguousEvents<T extends SequencedEvent>(\n events: T[],\n lastSequence: number,\n): T[] {\n const contiguousEvents: T[] = [];\n let expectedSequence = lastSequence + 1;\n\n for (const event of events) {\n if (event.sequenceNumber < expectedSequence) {\n continue;\n }\n if (event.sequenceNumber !== expectedSequence) {\n break;\n }\n contiguousEvents.push(event);\n expectedSequence++;\n }\n\n return contiguousEvents;\n}\n\nconst POLL_INTERVAL_MS = 1000;\nconst TERMINAL_DRAIN_POLL_INTERVAL_MS = 500;\nconst TERMINAL_DRAIN_IDLE_MS = 1000;\nconst TERMINAL_DRAIN_MAX_MS = 3000;\n\nfunction isTerminalRunResponse(\n runResponse: ZeroRunResponse,\n): runResponse is TerminalRunResponse {\n return TERMINAL_RUN_STATUSES.includes(\n runResponse.status as TerminalRunStatus,\n );\n}\n\nfunction shouldDrainNextEventPage<T>(\n eventsResponse: { hasMore: boolean; events: T[] },\n contiguousEvents: T[],\n): boolean {\n return (\n eventsResponse.hasMore &&\n contiguousEvents.length > 0 &&\n contiguousEvents.length === eventsResponse.events.length\n );\n}\n\nfunction hasSequenceGap<T>(\n eventsResponse: { events: T[] },\n contiguousEvents: T[],\n): boolean {\n return (\n eventsResponse.events.length > 0 &&\n contiguousEvents.length < eventsResponse.events.length\n );\n}\n\nfunction shouldCompleteTerminalDrain(\n terminalSeenAt: number,\n lastTerminalProgressAt: number,\n blockedByGap: boolean,\n): boolean {\n const now = Date.now();\n const terminalElapsedMs = now - terminalSeenAt;\n const terminalIdleMs = now - lastTerminalProgressAt;\n return (\n terminalElapsedMs >= TERMINAL_DRAIN_MAX_MS ||\n (!blockedByGap && terminalIdleMs >= TERMINAL_DRAIN_IDLE_MS)\n );\n}\n\nfunction renderTerminalRunResult(\n runId: string,\n runResponse: TerminalRunResponse,\n): PollResult {\n if (runResponse.status === \"completed\") {\n EventRenderer.renderRunCompleted(\n runResponse.result ? toRunResult(runResponse.result) : undefined,\n );\n return {\n succeeded: true,\n runId,\n sessionId: runResponse.result?.agentSessionId,\n checkpointId: runResponse.result?.checkpointId,\n };\n }\n\n if (runResponse.status === \"failed\") {\n EventRenderer.renderRunFailed(runResponse.error, runId);\n return { succeeded: false, runId };\n }\n\n if (runResponse.status === \"timeout\") {\n console.error(chalk.red(\"\\n✗ Run timed out\"));\n return { succeeded: false, runId };\n }\n\n console.error(chalk.yellow(\"\\n✗ Run cancelled\"));\n return { succeeded: false, runId };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n return setTimeout(resolve, ms);\n });\n}\n\n/**\n * Poll for zero run events until run completes.\n * Uses dual-poll approach: telemetry endpoint for events, getById for status.\n */\nexport async function pollZeroEvents(\n runId: string,\n options?: EventRenderingOptions,\n): Promise<PollResult> {\n const renderer = new EventRenderer({ verbose: options?.verbose });\n\n let lastSequence = -1;\n let complete = false;\n let result: PollResult = { succeeded: true, runId };\n let terminalRunResponse: TerminalRunResponse | undefined;\n let terminalSeenAt = 0;\n let lastTerminalProgressAt = 0;\n\n while (!complete) {\n // 1. Fetch events from telemetry endpoint\n const eventsResponse = await getZeroRunAgentEvents(runId, {\n since: lastSequence,\n limit: 100,\n order: \"asc\",\n });\n\n const contiguousEvents = filterContiguousEvents(\n eventsResponse.events,\n lastSequence,\n );\n\n // 2. Parse and render each event\n for (const event of contiguousEvents) {\n const eventData = event.eventData as Record<string, unknown>;\n const parsed = parseEvent(eventData, eventsResponse.framework);\n if (parsed) {\n renderer.render(parsed);\n }\n }\n\n // 3. Track last sequence number for pagination\n if (contiguousEvents.length > 0) {\n lastSequence =\n contiguousEvents[contiguousEvents.length - 1]!.sequenceNumber;\n if (terminalRunResponse) {\n lastTerminalProgressAt = Date.now();\n }\n }\n\n const blockedByGap = hasSequenceGap(eventsResponse, contiguousEvents);\n\n // If this page is fully contiguous and the server says more are already\n // queryable, drain the next page before checking terminal status. Otherwise\n // a completed run with >100 unseen events would render only the final page's\n // first batch and then exit.\n if (shouldDrainNextEventPage(eventsResponse, contiguousEvents)) {\n continue;\n }\n\n // 4. Fetch run status separately. During terminal drain, keep the latest\n // terminal state because timeout runs can still be upgraded to completed.\n const runResponse = await getZeroRun(runId);\n if (isTerminalRunResponse(runResponse)) {\n if (!terminalRunResponse) {\n terminalSeenAt = Date.now();\n lastTerminalProgressAt = terminalSeenAt;\n }\n terminalRunResponse = runResponse;\n }\n\n if (terminalRunResponse) {\n if (\n shouldCompleteTerminalDrain(\n terminalSeenAt,\n lastTerminalProgressAt,\n blockedByGap,\n )\n ) {\n result = renderTerminalRunResult(runId, terminalRunResponse);\n complete = true;\n }\n }\n\n if (!complete) {\n await sleep(\n terminalRunResponse\n ? TERMINAL_DRAIN_POLL_INTERVAL_MS\n : POLL_INTERVAL_MS,\n );\n }\n }\n\n return result;\n}\n\n/**\n * Display next steps after successful zero run\n */\nexport function showZeroNextSteps(result: PollResult): void {\n const { sessionId } = result;\n\n console.log();\n\n if (sessionId) {\n console.log(\" Continue delegation:\");\n console.log(\n chalk.cyan(` zero run continue ${sessionId} \"your next prompt\"`),\n );\n }\n}\n","import { Command } from \"commander\";\nimport { createZeroRun } from \"../../../lib/api\";\nimport { isUUID, renderRunCreated } from \"../../run/shared\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { pollZeroEvents, showZeroNextSteps } from \"./shared\";\n\nexport const continueCommand = new Command()\n .name(\"continue\")\n .description(\"Continue a previous delegation from a session\")\n .argument(\"<session-id>\", \"Session ID from a previous run\")\n .argument(\"<prompt>\", \"Follow-up prompt for the agent\")\n .option(\n \"--model-provider <type>\",\n \"Override model provider (e.g., anthropic-api-key)\",\n )\n .option(\"--verbose\", \"Show full tool inputs and outputs\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero run continue <session-id> \"now deploy it\"\n zero run continue <session-id> \"add tests\" --verbose\n\nNotes:\n - The session ID is printed after a successful \"zero run\" delegation\n - Continues the same agent session with full prior context`,\n )\n .action(\n withErrorHandler(\n async (\n sessionId: string,\n prompt: string,\n options: {\n modelProvider?: string;\n verbose?: boolean;\n },\n ) => {\n // 1. Validate session-id is a UUID\n if (!isUUID(sessionId)) {\n throw new Error(`Invalid session ID format: ${sessionId}`, {\n cause: new Error(\"Session ID must be a valid UUID\"),\n });\n }\n\n // 2. Create zero run with sessionId (no agentId needed)\n const response = await createZeroRun({\n sessionId,\n prompt,\n modelProvider: options.modelProvider,\n });\n\n // 3. Check for immediate failure\n if (response.status === \"failed\") {\n throw new Error(\n \"Run preparation failed\",\n response.error ? { cause: new Error(response.error) } : undefined,\n );\n }\n\n // 4. Display run started/queued info\n renderRunCreated(response);\n\n // 5. Poll for events\n const result = await pollZeroEvents(response.runId, {\n verbose: options.verbose,\n });\n if (!result.succeeded) {\n throw new Error(\"Run failed\");\n }\n\n // 6. Show next steps\n showZeroNextSteps(result);\n },\n ),\n );\n","import { Command } from \"commander\";\nimport { setupCommand } from \"./setup\";\nimport { listCommand } from \"./list\";\nimport { statusCommand } from \"./status\";\nimport { deleteCommand } from \"./delete\";\nimport { enableCommand } from \"./enable\";\nimport { disableCommand } from \"./disable\";\n\nexport const zeroScheduleCommand = new Command()\n .name(\"schedule\")\n .description(\"Create or manage recurring scheduled tasks\")\n .addCommand(setupCommand)\n .addCommand(listCommand)\n .addCommand(statusCommand)\n .addCommand(deleteCommand)\n .addCommand(enableCommand)\n .addCommand(disableCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Create a schedule: zero schedule setup --help\n Check all schedules: zero schedule list\n Check schedule status: zero schedule status <agent-id>\n Pause a schedule: zero schedule disable <agent-id>\n Resume a schedule: zero schedule enable <agent-id>\n Delete a schedule: zero schedule delete <agent-id>`,\n );\n","import { Command } from \"commander\";\nimport { readFileSync } from \"node:fs\";\nimport chalk from \"chalk\";\nimport {\n isInteractive,\n promptText,\n promptSelect,\n promptConfirm,\n} from \"../../../lib/utils/prompt-utils\";\nimport {\n generateCronExpression,\n detectTimezone,\n validateTimeFormat,\n validateDateFormat,\n getTomorrowDateLocal,\n getCurrentTimeLocal,\n toISODateTime,\n type ScheduleFrequency,\n} from \"../../../lib/domain/schedule-utils\";\nimport {\n resolveCompose,\n deployZeroSchedule,\n listZeroSchedules,\n enableZeroSchedule,\n getZeroUserPreferences,\n ApiRequestError,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { parseModelFlag } from \"../../../lib/domain/model-provider/shared\";\n\nconst FREQUENCY_CHOICES = [\n { title: \"Daily\", value: \"daily\" as const, description: \"Run every day\" },\n {\n title: \"Weekly\",\n value: \"weekly\" as const,\n description: \"Run once per week\",\n },\n {\n title: \"Monthly\",\n value: \"monthly\" as const,\n description: \"Run once per month\",\n },\n {\n title: \"One-time\",\n value: \"once\" as const,\n description: \"Run once at specific time\",\n },\n {\n title: \"Loop\",\n value: \"loop\" as const,\n description: \"Run repeatedly at fixed intervals\",\n },\n];\n\nconst DAY_OF_WEEK_CHOICES = [\n { title: \"Monday\", value: 1 },\n { title: \"Tuesday\", value: 2 },\n { title: \"Wednesday\", value: 3 },\n { title: \"Thursday\", value: 4 },\n { title: \"Friday\", value: 5 },\n { title: \"Saturday\", value: 6 },\n { title: \"Sunday\", value: 0 },\n];\n\nfunction parseDayOption(\n day: string,\n frequency: ScheduleFrequency,\n): number | undefined {\n if (frequency === \"weekly\") {\n const dayMap: Record<string, number> = {\n sun: 0,\n mon: 1,\n tue: 2,\n wed: 3,\n thu: 4,\n fri: 5,\n sat: 6,\n };\n return dayMap[day.toLowerCase()];\n } else if (frequency === \"monthly\") {\n const num = parseInt(day, 10);\n if (num >= 1 && num <= 31) {\n return num;\n }\n }\n return undefined;\n}\n\nfunction formatInTimezone(isoDate: string, timezone: string): string {\n const date = new Date(isoDate);\n const parts = new Intl.DateTimeFormat(\"en-CA\", {\n timeZone: timezone,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n }).formatToParts(date);\n\n const get = (type: string) => {\n return (\n parts.find((p) => {\n return p.type === type;\n })?.value ?? \"\"\n );\n };\n return `${get(\"year\")}-${get(\"month\")}-${get(\"day\")} ${get(\"hour\")}:${get(\"minute\")}`;\n}\n\nfunction parseFrequencyFromCron(\n cron: string,\n): { frequency: ScheduleFrequency; day?: number; time: string } | null {\n const parts = cron.split(\" \");\n if (parts.length !== 5) return null;\n\n const [minute, hour, dayOfMonth, , dayOfWeek] = parts;\n const time = `${hour!.padStart(2, \"0\")}:${minute!.padStart(2, \"0\")}`;\n\n if (dayOfMonth === \"*\" && dayOfWeek === \"*\") {\n return { frequency: \"daily\", time };\n } else if (dayOfMonth === \"*\" && dayOfWeek !== \"*\") {\n return { frequency: \"weekly\", day: parseInt(dayOfWeek!, 10), time };\n } else if (dayOfMonth !== \"*\" && dayOfWeek === \"*\") {\n return { frequency: \"monthly\", day: parseInt(dayOfMonth!, 10), time };\n }\n\n return null;\n}\n\ninterface SetupOptions {\n name?: string;\n frequency?: string;\n time?: string;\n day?: string;\n interval?: string;\n timezone?: string;\n prompt?: string;\n promptFile?: string;\n enable?: boolean;\n modelProvider?: string;\n model?: string;\n}\n\ninterface ExistingScheduleDefaults {\n frequency?: ScheduleFrequency;\n day?: number;\n time?: string;\n intervalSeconds?: number;\n}\n\ninterface ScheduleListItem {\n name: string;\n agentId: string;\n triggerType?: \"cron\" | \"once\" | \"loop\";\n cronExpression?: string | null;\n atTime?: string | null;\n intervalSeconds?: number | null;\n timezone: string;\n prompt: string;\n enabled?: boolean;\n}\n\nfunction getExistingDefaults(\n existingSchedule: ScheduleListItem | undefined,\n): ExistingScheduleDefaults {\n const defaults: ExistingScheduleDefaults = {};\n\n if (existingSchedule?.triggerType === \"loop\") {\n defaults.frequency = \"loop\";\n defaults.intervalSeconds = existingSchedule.intervalSeconds ?? undefined;\n } else if (existingSchedule?.cronExpression) {\n const parsed = parseFrequencyFromCron(existingSchedule.cronExpression);\n if (parsed) {\n defaults.frequency = parsed.frequency;\n defaults.day = parsed.day;\n defaults.time = parsed.time;\n }\n } else if (existingSchedule?.atTime) {\n defaults.frequency = \"once\";\n }\n\n return defaults;\n}\n\nasync function gatherFrequency(\n optionFrequency: string | undefined,\n existingFrequency: ScheduleFrequency | undefined,\n): Promise<ScheduleFrequency | null> {\n let frequency = optionFrequency as ScheduleFrequency | undefined;\n\n if (\n frequency &&\n [\"daily\", \"weekly\", \"monthly\", \"once\", \"loop\"].includes(frequency)\n ) {\n return frequency;\n }\n\n if (!isInteractive()) {\n throw new Error(\"--frequency is required (daily|weekly|monthly|once|loop)\");\n }\n\n const defaultIndex = existingFrequency\n ? FREQUENCY_CHOICES.findIndex((c) => {\n return c.value === existingFrequency;\n })\n : 0;\n\n frequency = await promptSelect<ScheduleFrequency>(\n \"Schedule frequency\",\n FREQUENCY_CHOICES,\n defaultIndex >= 0 ? defaultIndex : 0,\n );\n\n return frequency || null;\n}\n\nasync function gatherDay(\n frequency: ScheduleFrequency,\n optionDay: string | undefined,\n existingDay: number | undefined,\n): Promise<number | null> {\n if (frequency !== \"weekly\" && frequency !== \"monthly\") {\n return null;\n }\n\n if (optionDay) {\n const day = parseDayOption(optionDay, frequency);\n if (day === undefined) {\n throw new Error(\n `Invalid day: ${optionDay}. Use mon-sun for weekly or 1-31 for monthly.`,\n );\n }\n return day;\n }\n\n if (!isInteractive()) {\n throw new Error(\"--day is required for weekly/monthly\");\n }\n\n if (frequency === \"weekly\") {\n const defaultDayIndex =\n existingDay !== undefined\n ? DAY_OF_WEEK_CHOICES.findIndex((c) => {\n return c.value === existingDay;\n })\n : 0;\n const day = await promptSelect(\n \"Day of week\",\n DAY_OF_WEEK_CHOICES,\n defaultDayIndex >= 0 ? defaultDayIndex : 0,\n );\n return day ?? null;\n }\n\n const dayStr = await promptText(\n \"Day of month (1-31)\",\n existingDay?.toString() || \"1\",\n );\n if (!dayStr) return null;\n\n const day = parseInt(dayStr, 10);\n if (isNaN(day) || day < 1 || day > 31) {\n throw new Error(\"Day must be between 1 and 31\");\n }\n return day;\n}\n\nasync function gatherRecurringTime(\n optionTime: string | undefined,\n existingTime: string | undefined,\n): Promise<string | undefined> {\n if (optionTime) {\n const validation = validateTimeFormat(optionTime);\n if (validation !== true) {\n throw new Error(`Invalid time: ${validation}`);\n }\n return optionTime;\n }\n\n if (!isInteractive()) {\n throw new Error(\"--time is required (HH:MM format)\");\n }\n\n return await promptText(\n \"Time (HH:MM)\",\n existingTime || \"09:00\",\n validateTimeFormat,\n );\n}\n\nasync function gatherOneTimeSchedule(\n optionDay: string | undefined,\n optionTime: string | undefined,\n existingTime: string | undefined,\n): Promise<string | null> {\n if (optionDay && optionTime) {\n if (!validateDateFormat(optionDay)) {\n throw new Error(\n `Invalid date format: ${optionDay}. Use YYYY-MM-DD format.`,\n );\n }\n if (!validateTimeFormat(optionTime)) {\n throw new Error(`Invalid time format: ${optionTime}. Use HH:MM format.`);\n }\n return `${optionDay} ${optionTime}`;\n }\n\n if (!isInteractive()) {\n throw new Error(\"One-time schedules require interactive mode\", {\n cause: new Error(\n \"Or provide --day (YYYY-MM-DD) and --time (HH:MM) flags\",\n ),\n });\n }\n\n const tomorrowDate = getTomorrowDateLocal();\n const date = await promptText(\n \"Date (YYYY-MM-DD, default tomorrow)\",\n tomorrowDate,\n validateDateFormat,\n );\n if (!date) return null;\n\n const currentTime = getCurrentTimeLocal();\n const time = await promptText(\n \"Time (HH:MM)\",\n existingTime || currentTime,\n validateTimeFormat,\n );\n if (!time) return null;\n\n return `${date} ${time}`;\n}\n\nasync function gatherTimezone(\n optionTimezone: string | undefined,\n existingTimezone: string | undefined | null,\n): Promise<string | undefined> {\n if (optionTimezone) return optionTimezone;\n\n let userTimezone: string | null = null;\n try {\n const prefs = await getZeroUserPreferences();\n userTimezone = prefs.timezone;\n } catch {\n console.log(\n chalk.dim(\"Could not fetch timezone preference, using detected timezone\"),\n );\n }\n\n const defaultTimezone = userTimezone || detectTimezone();\n\n if (!isInteractive()) {\n return defaultTimezone;\n }\n\n return await promptText(\"Timezone\", existingTimezone || defaultTimezone);\n}\n\nasync function gatherPromptText(\n optionPrompt: string | undefined,\n optionPromptFile: string | undefined,\n existingPrompt: string | undefined | null,\n): Promise<string | undefined> {\n if (optionPrompt && optionPromptFile) {\n throw new Error(\"Cannot use --prompt and --prompt-file together\");\n }\n\n if (optionPromptFile) {\n return readFileSync(optionPromptFile, \"utf-8\");\n }\n\n if (optionPrompt) return optionPrompt;\n\n if (!isInteractive()) {\n throw new Error(\"--prompt or --prompt-file is required\");\n }\n\n return await promptText(\n \"Prompt to run\",\n existingPrompt || \"let's start working.\",\n );\n}\n\nasync function gatherInterval(\n optionInterval: string | undefined,\n existingInterval: number | undefined,\n): Promise<number | null> {\n if (optionInterval) {\n const val = parseInt(optionInterval, 10);\n if (isNaN(val) || val < 0) {\n throw new Error(\n \"Invalid interval. Must be a non-negative integer (seconds)\",\n );\n }\n return val;\n }\n\n if (!isInteractive()) {\n throw new Error(\"--interval is required for loop schedules (seconds)\");\n }\n\n const defaultVal =\n existingInterval !== undefined ? String(existingInterval) : \"300\";\n const result = await promptText(\n \"Interval in seconds (time between runs)\",\n defaultVal,\n (v: string) => {\n const n = parseInt(v, 10);\n if (isNaN(n) || n < 0) return \"Must be a non-negative integer\";\n return true;\n },\n );\n if (!result) return null;\n return parseInt(result, 10);\n}\n\nasync function gatherTiming(\n frequency: ScheduleFrequency,\n options: SetupOptions,\n defaults: ExistingScheduleDefaults,\n): Promise<{\n day: number | undefined;\n time: string | undefined;\n atTime: string | undefined;\n intervalSeconds: number | undefined;\n} | null> {\n if (frequency === \"loop\") {\n const intervalSeconds = await gatherInterval(\n options.interval,\n defaults.intervalSeconds,\n );\n if (intervalSeconds === null) return null;\n return {\n day: undefined,\n time: undefined,\n atTime: undefined,\n intervalSeconds,\n };\n }\n\n if (frequency === \"once\") {\n const result = await gatherOneTimeSchedule(\n options.day,\n options.time,\n defaults.time,\n );\n if (!result) return null;\n return {\n day: undefined,\n time: undefined,\n atTime: result,\n intervalSeconds: undefined,\n };\n }\n\n const day =\n (await gatherDay(frequency, options.day, defaults.day)) ?? undefined;\n if (day === null && (frequency === \"weekly\" || frequency === \"monthly\")) {\n return null;\n }\n\n const time = await gatherRecurringTime(options.time, defaults.time);\n if (!time) return null;\n\n return { day, time, atTime: undefined, intervalSeconds: undefined };\n}\n\nasync function findExistingSchedule(\n agentId: string,\n scheduleName: string,\n): Promise<ScheduleListItem | undefined> {\n const { schedules } = await listZeroSchedules();\n return schedules.find((s) => {\n return s.agentId === agentId && s.name === scheduleName;\n });\n}\n\ninterface DeployResult {\n created: boolean;\n schedule: {\n triggerType?: \"cron\" | \"once\" | \"loop\";\n timezone: string;\n cronExpression?: string | null;\n nextRunAt?: string | null;\n atTime?: string | null;\n intervalSeconds?: number | null;\n };\n}\n\nasync function buildAndDeploy(params: {\n scheduleName: string;\n agentId: string;\n agentName: string;\n frequency: ScheduleFrequency;\n time: string | undefined;\n day: number | undefined;\n atTime: string | undefined;\n intervalSeconds: number | undefined;\n timezone: string;\n prompt: string;\n existingEnabled: boolean | undefined;\n modelProviderId: string | null | undefined;\n selectedModel: string | null | undefined;\n}): Promise<DeployResult> {\n let cronExpression: string | undefined;\n let atTimeISO: string | undefined;\n\n if (params.frequency === \"loop\") {\n // Loop mode: intervalSeconds is passed directly\n } else if (params.atTime) {\n atTimeISO = toISODateTime(params.atTime);\n } else if (params.time && params.frequency !== \"once\") {\n cronExpression = generateCronExpression(\n params.frequency,\n params.time,\n params.day,\n );\n }\n\n console.log(\n `\\nDeploying schedule for agent ${chalk.cyan(params.agentName)}...`,\n );\n\n // Preserve enabled state on update so loop schedules don't lose nextRunAt.\n // On create, existingEnabled is undefined → omit the field so the server\n // applies its default (disabled; enable happens later via the enable flow).\n const deployResult = await deployZeroSchedule({\n name: params.scheduleName,\n agentId: params.agentId,\n cronExpression,\n atTime: atTimeISO,\n intervalSeconds: params.intervalSeconds,\n timezone: params.timezone,\n prompt: params.prompt,\n ...(params.existingEnabled !== undefined && {\n enabled: params.existingEnabled,\n }),\n ...(params.modelProviderId !== undefined && {\n modelProviderId: params.modelProviderId,\n }),\n ...(params.selectedModel !== undefined && {\n selectedModel: params.selectedModel,\n }),\n });\n\n return deployResult;\n}\n\nfunction displayDeployResult(\n scheduleName: string,\n deployResult: DeployResult,\n): void {\n if (deployResult.created) {\n console.log(chalk.green(`✓ Schedule \"${scheduleName}\" created`));\n } else {\n console.log(chalk.green(`✓ Schedule \"${scheduleName}\" updated`));\n }\n\n console.log(chalk.dim(` Timezone: ${deployResult.schedule.timezone}`));\n\n if (\n deployResult.schedule.triggerType === \"loop\" &&\n deployResult.schedule.intervalSeconds != null\n ) {\n console.log(\n chalk.dim(\n ` Mode: Loop (interval ${deployResult.schedule.intervalSeconds}s)`,\n ),\n );\n } else if (deployResult.schedule.cronExpression) {\n console.log(chalk.dim(` Cron: ${deployResult.schedule.cronExpression}`));\n if (deployResult.schedule.nextRunAt) {\n const nextRun = formatInTimezone(\n deployResult.schedule.nextRunAt,\n deployResult.schedule.timezone,\n );\n console.log(chalk.dim(` Next run: ${nextRun}`));\n }\n } else if (deployResult.schedule.atTime) {\n const atTimeFormatted = formatInTimezone(\n deployResult.schedule.atTime,\n deployResult.schedule.timezone,\n );\n console.log(chalk.dim(` At: ${atTimeFormatted}`));\n }\n}\n\nasync function tryEnableSchedule(\n scheduleName: string,\n agentId: string,\n agentName: string,\n): Promise<void> {\n try {\n await enableZeroSchedule({ name: scheduleName, agentId });\n console.log(chalk.green(`✓ Schedule \"${scheduleName}\" enabled`));\n } catch (error) {\n console.error(chalk.yellow(\"⚠ Failed to enable schedule\"));\n if (error instanceof ApiRequestError) {\n if (error.code === \"SCHEDULE_PAST\") {\n console.error(chalk.dim(\" Scheduled time has already passed\"));\n } else {\n console.error(chalk.dim(` ${error.message}`));\n }\n } else if (error instanceof Error) {\n console.error(chalk.dim(` ${error.message}`));\n }\n console.log(\n ` To enable manually: ${chalk.cyan(`zero schedule enable ${agentName}`)}`,\n );\n }\n}\n\nfunction showEnableHint(agentName: string): void {\n console.log();\n console.log(\n ` To enable: ${chalk.cyan(`zero schedule enable ${agentName}`)}`,\n );\n}\n\nasync function handleScheduleEnabling(params: {\n scheduleName: string;\n agentId: string;\n agentName: string;\n enableFlag: boolean;\n shouldPromptEnable: boolean;\n}): Promise<void> {\n const { scheduleName, agentId, agentName, enableFlag, shouldPromptEnable } =\n params;\n\n if (enableFlag) {\n await tryEnableSchedule(scheduleName, agentId, agentName);\n return;\n }\n\n if (shouldPromptEnable && isInteractive()) {\n const enableNow = await promptConfirm(\"Enable this schedule?\", true);\n if (enableNow) {\n await tryEnableSchedule(scheduleName, agentId, agentName);\n } else {\n showEnableHint(agentName);\n }\n return;\n }\n\n if (shouldPromptEnable) {\n showEnableHint(agentName);\n }\n}\n\nexport const setupCommand = new Command()\n .name(\"setup\")\n .description(\"Create or edit a schedule for a zero agent\")\n .argument(\"<agent-id>\", \"Agent ID\")\n .option(\"-n, --name <schedule-name>\", 'Schedule name (default: \"default\")')\n .option(\"-f, --frequency <type>\", \"Frequency: daily|weekly|monthly|once|loop\")\n .option(\"-t, --time <HH:MM>\", \"Time to run (24-hour format)\")\n .option(\"-d, --day <day>\", \"Day of week (mon-sun) or day of month (1-31)\")\n .option(\"-i, --interval <seconds>\", \"Interval in seconds for loop mode\")\n .option(\"-z, --timezone <tz>\", \"IANA timezone\")\n .option(\"-p, --prompt <text>\", \"Prompt to run\")\n .option(\n \"--prompt-file <path>\",\n \"Read prompt from file (cannot be used with --prompt)\",\n )\n .option(\"-e, --enable\", \"Enable schedule immediately after creation\")\n .option(\n \"--model-provider <id>\",\n \"Model provider UUID, or 'default' to inherit from agent/org\",\n )\n .option(\n \"--model <name>\",\n \"Model name (e.g. claude-sonnet-4-6, MiniMax-M2.7), or 'default' to inherit\",\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n Daily at 9am: zero schedule setup <agent-id> -f daily -t 09:00 -p \"run report\"\n Weekly on Monday: zero schedule setup <agent-id> -f weekly -d mon -t 10:00 -p \"weekly sync\"\n Monthly on the 1st: zero schedule setup <agent-id> -f monthly -d 1 -t 08:00 -p \"monthly review\"\n One-time: zero schedule setup <agent-id> -f once -d 2026-04-01 -t 14:00 -p \"one-off task\"\n Loop every 5 minutes: zero schedule setup <agent-id> -f loop -i 300 -p \"poll for updates\"\n Prompt from file: zero schedule setup <agent-id> -f daily -t 09:00 --prompt-file ./prompt.md\n Create and enable: zero schedule setup <agent-id> -f daily -t 09:00 -p \"run report\" --enable\n Override model: zero schedule setup <agent-id> -f daily -t 09:00 -p \"...\" --model-provider <id> --model MiniMax-M2.7\n Reset model override: zero schedule setup <agent-id> -f daily -t 09:00 -p \"...\" --model-provider default --model default\n\nNotes:\n - Re-running setup with the same agent updates the existing \"default\" schedule\n - Use -n to manage multiple named schedules for the same agent\n - --model-provider and --model default to inheriting the agent's configuration\n - Use 'zero org model-provider list' to see available providers and models\n - All flags are required in non-interactive mode; interactive mode prompts for missing values\n - If the user wants to be notified when a schedule completes, ask them where they want to receive the notification: web chat or Slack, then include it in the prompt`,\n )\n .action(\n withErrorHandler(async (agentIdentifier: string, options: SetupOptions) => {\n // 1. Resolve agent identifier (UUID or name) to compose ID\n const compose = await resolveCompose(agentIdentifier);\n if (!compose) {\n throw new Error(`Agent not found: ${agentIdentifier}`);\n }\n const agentId = compose.id;\n const scheduleName = options.name || \"default\";\n\n // 2. Check for existing schedule\n const existingSchedule = await findExistingSchedule(\n agentId,\n scheduleName,\n );\n\n const agentName = compose.name;\n console.log(\n chalk.dim(\n existingSchedule\n ? `Editing existing schedule for agent ${agentName}`\n : `Creating new schedule for agent ${agentName}`,\n ),\n );\n\n const defaults = getExistingDefaults(existingSchedule);\n\n // 3. Gather frequency\n const frequency = await gatherFrequency(\n options.frequency,\n defaults.frequency,\n );\n if (!frequency) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n\n // 4. Gather day and time\n const timing = await gatherTiming(frequency, options, defaults);\n if (!timing) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n const { day, time, atTime, intervalSeconds } = timing;\n\n // 5. Gather timezone\n const timezone = await gatherTimezone(\n options.timezone,\n existingSchedule?.timezone,\n );\n if (!timezone) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n\n // 6. Gather prompt\n const promptText_ = await gatherPromptText(\n options.prompt,\n options.promptFile,\n existingSchedule?.prompt,\n );\n if (!promptText_) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n\n // 7. Build trigger and deploy\n const deployResult = await buildAndDeploy({\n scheduleName,\n agentId,\n agentName,\n frequency,\n time,\n day,\n atTime,\n intervalSeconds,\n timezone,\n prompt: promptText_,\n existingEnabled: existingSchedule?.enabled,\n modelProviderId: parseModelFlag(options.modelProvider),\n selectedModel: parseModelFlag(options.model),\n });\n\n // 8. Display deployment result\n displayDeployResult(scheduleName, deployResult);\n\n // 9. Handle schedule enabling\n const shouldPromptEnable =\n deployResult.created ||\n (existingSchedule !== undefined && !existingSchedule.enabled);\n\n await handleScheduleEnabling({\n scheduleName,\n agentId,\n agentName,\n enableFlag: options.enable ?? false,\n shouldPromptEnable,\n });\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroSchedules } from \"../../../lib/api\";\nimport { formatRelativeTime } from \"../../../lib/domain/schedule-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all zero schedules\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero schedule list`,\n )\n .action(\n withErrorHandler(async () => {\n const result = await listZeroSchedules();\n\n if (result.schedules.length === 0) {\n console.log(chalk.dim(\"No schedules found\"));\n console.log(\n chalk.dim(\" Create one with: zero schedule setup <agent-id>\"),\n );\n return;\n }\n\n const agentWidth = Math.max(\n 5,\n ...result.schedules.map((s) => {\n return s.agentId.length;\n }),\n );\n const scheduleWidth = Math.max(\n 8,\n ...result.schedules.map((s) => {\n return s.name.length;\n }),\n );\n const triggerWidth = Math.max(\n 7,\n ...result.schedules.map((s) => {\n return s.cronExpression\n ? s.cronExpression.length + s.timezone.length + 3\n : s.atTime?.length || 0;\n }),\n );\n\n const header = [\n \"AGENT\".padEnd(agentWidth),\n \"SCHEDULE\".padEnd(scheduleWidth),\n \"TRIGGER\".padEnd(triggerWidth),\n \"STATUS\".padEnd(8),\n \"NEXT RUN\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n for (const schedule of result.schedules) {\n const trigger = schedule.cronExpression\n ? `${schedule.cronExpression} (${schedule.timezone})`\n : schedule.atTime || \"-\";\n\n const status = schedule.enabled\n ? chalk.green(\"enabled\")\n : chalk.yellow(\"disabled\");\n\n const nextRun = schedule.enabled\n ? formatRelativeTime(schedule.nextRunAt)\n : \"-\";\n\n const row = [\n schedule.agentId.padEnd(agentWidth),\n schedule.name.padEnd(scheduleWidth),\n trigger.padEnd(triggerWidth),\n status.padEnd(8 + (schedule.enabled ? 0 : 2)),\n nextRun,\n ].join(\" \");\n console.log(row);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { resolveZeroScheduleByAgent } from \"../../../lib/api\";\nimport {\n formatDateTime,\n detectTimezone,\n} from \"../../../lib/domain/schedule-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport type { ScheduleResponse } from \"@vm0/api-contracts/contracts/zero-schedules\";\n\n/**\n * Format date with styled relative time (adds chalk formatting)\n */\nfunction formatDateTimeStyled(dateStr: string | null): string {\n if (!dateStr) return chalk.dim(\"-\");\n const formatted = formatDateTime(dateStr);\n return formatted.replace(/\\(([^)]+)\\)$/, chalk.dim(\"($1)\"));\n}\n\n/**\n * Format trigger (cron or at) - timezone shown separately\n */\nfunction formatTrigger(schedule: ScheduleResponse): string {\n if (schedule.triggerType === \"loop\" && schedule.intervalSeconds !== null) {\n return `interval ${schedule.intervalSeconds}s ${chalk.dim(\"(loop)\")}`;\n }\n if (schedule.cronExpression) {\n return schedule.cronExpression;\n }\n if (schedule.atTime) {\n return `${schedule.atTime} ${chalk.dim(\"(one-time)\")}`;\n }\n return chalk.dim(\"-\");\n}\n\n/**\n * Print run configuration section\n */\nfunction printRunConfiguration(\n schedule: ScheduleResponse,\n showFullPrompt: boolean,\n): void {\n const statusText = schedule.enabled\n ? chalk.green(\"enabled\")\n : chalk.yellow(\"disabled\");\n console.log(`${\"Status:\".padEnd(16)}${statusText}`);\n\n console.log(`${\"Agent:\".padEnd(16)}${schedule.agentId}`);\n\n if (showFullPrompt) {\n console.log(`${\"Prompt:\".padEnd(16)}${chalk.dim(schedule.prompt)}`);\n } else {\n const truncated = schedule.prompt.length > 60;\n const promptPreview = truncated\n ? schedule.prompt.slice(0, 57) + \"...\"\n : schedule.prompt;\n console.log(`${\"Prompt:\".padEnd(16)}${chalk.dim(promptPreview)}`);\n if (truncated) {\n console.log(\n chalk.dim(\" Run with --prompt (-p) to see full prompt\"),\n );\n }\n }\n\n if (schedule.vars && Object.keys(schedule.vars).length > 0) {\n console.log(\n `${\"Variables:\".padEnd(16)}${Object.keys(schedule.vars).join(\", \")}`,\n );\n }\n\n if (schedule.secretNames && schedule.secretNames.length > 0) {\n console.log(`${\"Secrets:\".padEnd(16)}${schedule.secretNames.join(\", \")}`);\n }\n\n if (\n schedule.volumeVersions &&\n Object.keys(schedule.volumeVersions).length > 0\n ) {\n console.log(\n `${\"Volumes:\".padEnd(16)}${Object.keys(schedule.volumeVersions).join(\", \")}`,\n );\n }\n}\n\n/**\n * Print time schedule section\n */\nfunction printTimeSchedule(schedule: ScheduleResponse): void {\n console.log();\n console.log(`${\"Trigger:\".padEnd(16)}${formatTrigger(schedule)}`);\n console.log(`${\"Timezone:\".padEnd(16)}${detectTimezone()}`);\n\n if (schedule.enabled) {\n console.log(\n `${\"Next Run:\".padEnd(16)}${formatDateTimeStyled(schedule.nextRunAt)}`,\n );\n }\n\n if (schedule.triggerType === \"loop\" || schedule.triggerType === \"cron\") {\n const failureText =\n schedule.consecutiveFailures > 0\n ? chalk.yellow(`${schedule.consecutiveFailures}/3`)\n : chalk.dim(\"0/3\");\n console.log(`${\"Failures:\".padEnd(16)}${failureText}`);\n }\n}\n\nexport const statusCommand = new Command()\n .name(\"status\")\n .description(\"Show detailed status of a zero schedule\")\n .argument(\"<agent-id>\", \"Agent ID\")\n .option(\n \"-n, --name <schedule-name>\",\n \"Schedule name (required when agent has multiple schedules)\",\n )\n .option(\"-p, --prompt\", \"Show full prompt content without truncation\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero schedule status <agent-id>\n zero schedule status <agent-id> -n my-schedule\n zero schedule status <agent-id> --prompt`,\n )\n .action(\n withErrorHandler(\n async (\n agentName: string,\n options: { name?: string; prompt?: boolean },\n ) => {\n const schedule = await resolveZeroScheduleByAgent(\n agentName,\n options.name,\n );\n\n console.log();\n console.log(`Schedule for agent: ${chalk.cyan(agentName)}`);\n console.log(chalk.dim(\"━\".repeat(50)));\n\n printRunConfiguration(schedule, options.prompt ?? false);\n printTimeSchedule(schedule);\n\n console.log();\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n deleteZeroSchedule,\n resolveZeroScheduleByAgent,\n} 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 schedule\")\n .argument(\"<agent-id>\", \"Agent ID\")\n .option(\n \"-n, --name <schedule-name>\",\n \"Schedule name (required when agent has multiple schedules)\",\n )\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero schedule delete <agent-id>\n zero schedule delete <agent-id> -n my-schedule -y\n\nNotes:\n - Use -y to skip confirmation in non-interactive mode`,\n )\n .action(\n withErrorHandler(\n async (agentName: string, options: { name?: string; yes?: boolean }) => {\n const resolved = await resolveZeroScheduleByAgent(\n agentName,\n options.name,\n );\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 schedule for agent ${chalk.cyan(agentName)}?`,\n false,\n );\n if (!confirmed) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n }\n\n await deleteZeroSchedule({\n name: resolved.name,\n agentId: resolved.agentId,\n });\n\n console.log(chalk.green(`✓ Schedule \"${resolved.name}\" deleted`));\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n enableZeroSchedule,\n resolveZeroScheduleByAgent,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const enableCommand = new Command()\n .name(\"enable\")\n .description(\"Enable a zero schedule\")\n .argument(\"<agent-id>\", \"Agent ID\")\n .option(\n \"-n, --name <schedule-name>\",\n \"Schedule name (required when agent has multiple schedules)\",\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n zero schedule enable <agent-id>\n zero schedule enable <agent-id> -n my-schedule`,\n )\n .action(\n withErrorHandler(async (agentName: string, options: { name?: string }) => {\n const resolved = await resolveZeroScheduleByAgent(\n agentName,\n options.name,\n );\n\n await enableZeroSchedule({\n name: resolved.name,\n agentId: resolved.agentId,\n });\n\n console.log(chalk.green(`✓ Schedule \"${resolved.name}\" enabled`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n disableZeroSchedule,\n resolveZeroScheduleByAgent,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const disableCommand = new Command()\n .name(\"disable\")\n .description(\"Disable a zero schedule\")\n .argument(\"<agent-id>\", \"Agent ID\")\n .option(\n \"-n, --name <schedule-name>\",\n \"Schedule name (required when agent has multiple schedules)\",\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n zero schedule disable <agent-id>\n zero schedule disable <agent-id> -n my-schedule`,\n )\n .action(\n withErrorHandler(async (agentName: string, options: { name?: string }) => {\n const resolved = await resolveZeroScheduleByAgent(\n agentName,\n options.name,\n );\n\n await disableZeroSchedule({\n name: resolved.name,\n agentId: resolved.agentId,\n });\n\n console.log(chalk.green(`✓ Schedule \"${resolved.name}\" disabled`));\n }),\n );\n","import { Command } from \"commander\";\nimport { listCommand } from \"./list\";\nimport { setCommand } from \"./set\";\nimport { deleteCommand } from \"./delete\";\n\nexport const zeroSecretCommand = new Command()\n .name(\"secret\")\n .description(\"Read or write secrets (API keys, tokens)\")\n .addCommand(listCommand)\n .addCommand(setCommand)\n .addCommand(deleteCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getConnectorDerivedNames } from \"@vm0/connectors/connector-utils\";\nimport { listZeroSecrets } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all secrets\")\n .action(\n withErrorHandler(async () => {\n const result = await listZeroSecrets();\n\n if (result.secrets.length === 0) {\n console.log(chalk.dim(\"No secrets found\"));\n console.log();\n console.log(\"To add a secret:\");\n console.log(chalk.cyan(\" zero secret set MY_API_KEY --body <value>\"));\n return;\n }\n\n console.log(chalk.bold(\"Secrets:\"));\n console.log();\n\n for (const secret of result.secrets) {\n let typeIndicator = \"\";\n let derivedLine: string | null = null;\n\n if (secret.type === \"model-provider\") {\n typeIndicator = chalk.dim(\" [model-provider]\");\n } else if (secret.type === \"connector\") {\n const derived = getConnectorDerivedNames(secret.name);\n if (derived) {\n typeIndicator = chalk.dim(` [${derived.connectorLabel} connector]`);\n derivedLine = chalk.dim(\n `Available as: ${derived.envVarNames.join(\", \")}`,\n );\n } else {\n typeIndicator = chalk.dim(\" [connector]\");\n }\n } else if (secret.type === \"user\") {\n const derived = getConnectorDerivedNames(secret.name);\n if (derived) {\n typeIndicator = chalk.dim(` [${derived.connectorLabel} connector]`);\n derivedLine = chalk.dim(\n `Available as: ${derived.envVarNames.join(\", \")}`,\n );\n }\n }\n\n console.log(` ${chalk.cyan(secret.name)}${typeIndicator}`);\n if (derivedLine) {\n console.log(` ${derivedLine}`);\n }\n if (secret.description) {\n console.log(` ${chalk.dim(secret.description)}`);\n }\n console.log(\n ` ${chalk.dim(`Updated: ${new Date(secret.updatedAt).toLocaleString()}`)}`,\n );\n console.log();\n }\n\n console.log(chalk.dim(`Total: ${result.secrets.length} secret(s)`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { setZeroSecret } from \"../../../lib/api\";\nimport { isInteractive, promptPassword } from \"../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const setCommand = new Command()\n .name(\"set\")\n .description(\"Create or update a secret\")\n .argument(\"<name>\", \"Secret name (uppercase, e.g., MY_API_KEY)\")\n .option(\n \"-b, --body <value>\",\n \"Secret value (required in non-interactive mode)\",\n )\n .option(\"-d, --description <description>\", \"Optional description\")\n .action(\n withErrorHandler(\n async (\n name: string,\n options: { body?: string; description?: string },\n ) => {\n let value: string;\n\n if (options.body !== undefined) {\n value = options.body;\n } else if (isInteractive()) {\n const prompted = await promptPassword(\"Enter secret value:\");\n if (prompted === undefined) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n value = prompted;\n } else {\n throw new Error(\"--body is required in non-interactive mode\", {\n cause: new Error(\n `Usage: zero secret set ${name} --body \"your-secret-value\"`,\n ),\n });\n }\n\n let secret;\n try {\n secret = await setZeroSecret({\n name,\n value,\n description: options.description,\n });\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\"must contain only uppercase\")\n ) {\n throw new Error(error.message, {\n cause: new Error(\n \"Examples of valid secret names: MY_API_KEY, GITHUB_TOKEN, AWS_ACCESS_KEY_ID\",\n ),\n });\n }\n throw error;\n }\n\n console.log(chalk.green(`✓ Secret \"${secret.name}\" saved`));\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { deleteZeroSecret } 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 .description(\"Delete a secret\")\n .argument(\"<name>\", \"Secret name to delete\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .action(\n withErrorHandler(async (name: string, options: { yes?: boolean }) => {\n if (!options.yes) {\n if (!isInteractive()) {\n throw new Error(\"--yes flag is required in non-interactive mode\");\n }\n\n const confirmed = await promptConfirm(\n `Are you sure you want to delete secret \"${name}\"?`,\n false,\n );\n\n if (!confirmed) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n }\n\n await deleteZeroSecret(name);\n console.log(chalk.green(`✓ Secret \"${name}\" deleted`));\n }),\n );\n","import { Command } from \"commander\";\nimport { zeroChatMessageCommand } from \"./message\";\n\nexport const zeroChatCommand = new Command()\n .name(\"chat\")\n .description(\"Send messages to web chat threads\")\n .addCommand(zeroChatMessageCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Send to thread: zero chat message send -t <thread-id> --text \"Hello!\"\n Send to agent: zero chat message send -a <agent-id> --text \"Hello!\"`,\n );\n","import { Command } from \"commander\";\nimport { sendCommand } from \"./send\";\n\nexport const zeroChatMessageCommand = new Command()\n .name(\"message\")\n .description(\"Manage chat messages\")\n .addCommand(sendCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n zero chat message send -t <thread-id> --text \"Hello!\"`,\n );\n","import { readFileSync } from \"fs\";\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { sendChatMessage } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const sendCommand = new Command()\n .name(\"send\")\n .description(\"Send a message to a web chat thread\")\n .option(\"-t, --thread <id>\", \"Existing chat thread ID\")\n .option(\"-a, --agent <agentId>\", \"Agent ID (creates a new thread)\")\n .option(\"--text <message>\", \"Message text\")\n .option(\"--title <title>\", \"Thread title (only with --agent)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Send to existing thread: zero chat message send -t <thread-id> --text \"Hello!\"\n Send to agent (new thread): zero chat message send -a <agent-id> --text \"Hello!\"\n\nNotes:\n - Either --thread or --agent is required; they are mutually exclusive\n - --text is required (or pipe via stdin)`,\n )\n .action(\n withErrorHandler(\n async (options: {\n thread?: string;\n agent?: string;\n text?: string;\n title?: string;\n }) => {\n let text = options.text;\n const { thread, agent, title } = options;\n\n // Validate mutual exclusion: exactly one of --thread or --agent\n if (!thread && !agent) {\n throw new Error(\"Either --thread or --agent must be provided\", {\n cause: new Error(\n 'Usage: zero chat message send -t THREAD_ID --text \"your message\"\\n zero chat message send -a AGENT_ID --text \"your message\"',\n ),\n });\n }\n if (thread && agent) {\n throw new Error(\"--thread and --agent are mutually exclusive\", {\n cause: new Error(\n \"Provide either --thread to send to an existing thread or --agent to create a new thread, not both\",\n ),\n });\n }\n\n // Read from stdin if text not provided and stdin is explicitly piped\n if (!text && process.stdin.isTTY === false) {\n text = readFileSync(\"/dev/stdin\", \"utf8\").trim();\n }\n\n if (!text) {\n throw new Error(\"--text is required\", {\n cause: new Error(\n 'Usage: zero chat message send -t THREAD_ID --text \"your message\"',\n ),\n });\n }\n\n const result = await sendChatMessage({\n thread: thread || undefined,\n agent: agent || undefined,\n text,\n title: title || undefined,\n });\n\n console.log(\n chalk.green(\n `✓ Message sent (id: ${result.messageId}, thread: ${result.threadId})`,\n ),\n );\n },\n ),\n );\n","import { Command } from \"commander\";\nimport { zeroSlackMessageCommand } from \"./message\";\nimport { uploadFileCommand } from \"./upload-file\";\nimport { downloadFileCommand } from \"./download-file\";\n\nexport const zeroSlackCommand = new Command()\n .name(\"slack\")\n .description(\n \"Send messages, upload files, and download files from Slack as the bot\",\n )\n .addCommand(zeroSlackMessageCommand)\n .addCommand(uploadFileCommand)\n .addCommand(downloadFileCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Send a message: zero slack message send -c <channel-id> -t \"Hello!\"\n Reply in a thread: zero slack message send -c <channel-id> --thread <ts> -t \"reply\"\n Upload a file: zero slack upload-file -f /tmp/report.pdf -c <channel-id>\n Download a file: zero slack download-file <file-id> -o /tmp/out.png`,\n );\n","import { Command } from \"commander\";\nimport { sendCommand } from \"./send\";\n\nexport const zeroSlackMessageCommand = new Command()\n .name(\"message\")\n .description(\"Manage Slack messages\")\n .addCommand(sendCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n zero slack message send -c <channel-id> -t \"Hello!\"`,\n );\n","import { readFileSync } from \"fs\";\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { sendSlackMessage } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const sendCommand = new Command()\n .name(\"send\")\n .description(\"Send a message to a Slack channel or DM a user\")\n .option(\"-c, --channel <id>\", \"Channel ID\")\n .option(\"-u, --user <id>\", 'Slack user ID for DM (use \"me\" for yourself)')\n .option(\"-t, --text <message>\", \"Message text\")\n .option(\"--thread <ts>\", \"Thread timestamp for replies\")\n .option(\"--blocks <json>\", \"Block Kit JSON string\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Simple message: zero slack message send -c C01234 -t \"Hello!\"\n DM a user: zero slack message send -u U0A8V9X98QJ -t \"Hello!\"\n DM yourself: zero slack message send -u me -t \"Hello!\"\n Reply in thread: zero slack message send -c C01234 --thread 1234567890.123456 -t \"reply\"\n Rich blocks: zero slack message send -c C01234 --blocks '[{\"type\":\"section\",\"text\":{\"type\":\"mrkdwn\",\"text\":\"*Bold*\"}}]'\n\nNotes:\n - Either --channel or --user is required; they are mutually exclusive\n - Either --text or --blocks is required; both can be used together`,\n )\n .action(\n withErrorHandler(\n async (options: {\n channel?: string;\n user?: string;\n text?: string;\n thread?: string;\n blocks?: string;\n }) => {\n let text = options.text;\n const { channel, user, thread, blocks: blocksStr } = options;\n\n // Validate mutual exclusion: exactly one of --channel or --user\n if (!channel && !user) {\n throw new Error(\"Either --channel or --user must be provided\", {\n cause: new Error(\n 'Usage: zero slack message send -c CHANNEL_ID -t \"your message\"\\n zero slack message send -u USER_ID -t \"your message\"',\n ),\n });\n }\n if (channel && user) {\n throw new Error(\"--channel and --user are mutually exclusive\", {\n cause: new Error(\n \"Provide either --channel to send to a channel or --user to DM a user, not both\",\n ),\n });\n }\n\n // Read from stdin if text not provided and stdin is explicitly piped\n // (isTTY is false when piped, undefined when no TTY context e.g. tests)\n if (!text && process.stdin.isTTY === false) {\n text = readFileSync(\"/dev/stdin\", \"utf8\").trim();\n }\n\n // Parse blocks JSON if provided\n let blocks: Array<{ type: string; [key: string]: unknown }> | undefined;\n if (blocksStr) {\n try {\n blocks = JSON.parse(blocksStr) as Array<{\n type: string;\n [key: string]: unknown;\n }>;\n } catch {\n throw new Error(\"Invalid JSON for --blocks flag\", {\n cause: new Error(\n \"Provide a valid JSON array of Block Kit blocks\",\n ),\n });\n }\n }\n\n // Validate at least one of text or blocks\n if (!text && !blocks) {\n throw new Error(\"Either --text or --blocks must be provided\", {\n cause: new Error(\n 'Usage: zero slack message send -c CHANNEL_ID -t \"your message\"',\n ),\n });\n }\n\n const result = await sendSlackMessage({\n channel: channel || undefined,\n user: user || undefined,\n text: text || undefined,\n threadTs: thread,\n blocks,\n });\n\n const tsInfo = result.ts ? ` (ts: ${result.ts})` : \"\";\n console.log(chalk.green(`✓ Message sent${tsInfo}`));\n },\n ),\n );\n","import { statSync, readFileSync } from \"fs\";\nimport { basename } from \"path\";\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { initSlackFileUpload, completeSlackFileUpload } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const uploadFileCommand = new Command()\n .name(\"upload-file\")\n .description(\"Upload a file to a Slack channel as the bot\")\n .requiredOption(\"-f, --file <path>\", \"Local file path to upload\")\n .requiredOption(\"-c, --channel <id>\", \"Slack channel ID\")\n .option(\"--thread <ts>\", \"Thread timestamp to post as a reply\")\n .option(\"--title <title>\", \"Display title for the file\")\n .option(\"--comment <text>\", \"Initial comment to accompany the file\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Upload a file: zero slack upload-file -f /tmp/report.pdf -c C01234\n Upload to thread: zero slack upload-file -f /tmp/log.txt -c C01234 --thread 1234567890.123456\n With title and comment: zero slack upload-file -f /tmp/data.csv -c C01234 --title \"Daily Report\" --comment \"Here's the report\"\n\nNotes:\n - Uses the bot token (not user SLACK_TOKEN), so no files:write permission is needed\n - Returns file_id and permalink for reference`,\n )\n .action(\n withErrorHandler(\n async (options: {\n file: string;\n channel: string;\n thread?: string;\n title?: string;\n comment?: string;\n }) => {\n // Validate file exists and get size\n let fileSize: number;\n try {\n const stat = statSync(options.file);\n fileSize = stat.size;\n } catch {\n throw new Error(`File not found: ${options.file}`);\n }\n\n if (fileSize === 0) {\n throw new Error(\"File is empty\");\n }\n\n const filename = basename(options.file);\n\n // Step 1: Get pre-signed upload URL from server\n const { uploadUrl, fileId } = await initSlackFileUpload({\n filename,\n length: fileSize,\n });\n\n // Step 2: Upload file directly to Slack's pre-signed URL\n const fileContent = readFileSync(options.file);\n const uploadResponse = await fetch(uploadUrl, {\n method: \"POST\",\n body: fileContent,\n });\n\n if (!uploadResponse.ok) {\n throw new Error(\n `File upload failed: ${uploadResponse.status} ${uploadResponse.statusText}`,\n );\n }\n\n // Step 3: Complete the upload and share to channel/thread\n const result = await completeSlackFileUpload({\n fileId,\n channel: options.channel,\n threadTs: options.thread,\n title: options.title,\n initialComment: options.comment,\n });\n\n console.log(chalk.green(`✓ File uploaded (file_id: ${result.fileId})`));\n console.log(chalk.dim(` permalink: ${result.permalink}`));\n },\n ),\n );\n","import { join } from \"path\";\nimport { tmpdir } from \"os\";\nimport { Command } from \"commander\";\nimport { downloadSlackFile } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\n/**\n * Derive a local output path for a Slack file id.\n * Uses the system temp directory; extension is appended later once the\n * mimetype is known.\n */\nfunction defaultOutPath(fileId: string): string {\n return join(tmpdir(), `slack-${fileId}`);\n}\n\nexport const downloadFileCommand = new Command()\n .name(\"download-file\")\n .description(\"Download a Slack file by id using the bot token\")\n .argument(\"<file-id>\", \"Slack file id (e.g. F01234ABCD)\")\n .option(\n \"-o, --out <path>\",\n \"Output path for the downloaded file (default: /tmp/slack-<file-id>)\",\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n Download to default temp path: zero slack download-file F01234ABCD\n Download to explicit path: zero slack download-file F01234ABCD -o /tmp/image.png\n\nOutput:\n Prints a JSON object to stdout on success:\n {\"path\":\"/tmp/slack-F01234ABCD\",\"mimetype\":\"image/png\",\"size\":12345}\n\nHow to read the downloaded file:\n - Images (png/jpg/gif/webp/svg): open the file path with your image viewing tool\n - Videos (mp4/mov/webm): extract frames first with\n ffmpeg -i <path> -vf \"fps=1\" -q:v 2 /tmp/<file-id>_frame_%03d.jpg\n then view the extracted frames\n - PDF/text/csv/json/markdown: read the file directly\n\nNotes:\n - Uses the bot token on the server side; no user Slack token is needed\n - Streams the file bytes directly to disk`,\n )\n .action(\n withErrorHandler(async (fileId: string, options: { out?: string }) => {\n const outPath = options.out ?? defaultOutPath(fileId);\n const result = await downloadSlackFile(fileId, outPath);\n console.log(JSON.stringify(result));\n }),\n );\n","import { Command } from \"commander\";\nimport { zeroTelegramBotCommand } from \"./bot\";\nimport { downloadFileCommand } from \"./download-file\";\nimport { zeroTelegramMessageCommand } from \"./message\";\nimport { uploadFileCommand } from \"./upload-file\";\n\nexport const zeroTelegramCommand = new Command()\n .name(\"telegram\")\n .description(\n \"Inspect bots, send messages, upload files, and download files from Telegram\",\n )\n .addCommand(zeroTelegramBotCommand)\n .addCommand(zeroTelegramMessageCommand)\n .addCommand(downloadFileCommand)\n .addCommand(uploadFileCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n List bots: zero telegram bot list\n Send a message: zero telegram message send --bot-id <bot-id> -c <chat-id> -t \"Hello!\"\n Upload a file: zero telegram upload-file -f /tmp/report.pdf --bot-id <bot-id> -c <chat-id>\n Download a file: zero telegram download-file <file-id> --bot-id <bot-id> -o /tmp/out.jpg`,\n );\n","import { Command } from \"commander\";\nimport { listCommand } from \"./list\";\n\nexport const zeroTelegramBotCommand = new Command()\n .name(\"bot\")\n .description(\"Inspect Telegram bots\")\n .addCommand(listCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n zero telegram bot list`,\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listTelegramBots } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\nimport type { TelegramBotListItem } from \"@vm0/api-contracts/contracts/integrations\";\n\nfunction usernameLabel(bot: TelegramBotListItem): string {\n if (!bot.username) return \"-\";\n return bot.username.startsWith(\"@\") ? bot.username : `@${bot.username}`;\n}\n\nfunction statusLabel(bot: TelegramBotListItem): string {\n if (bot.tokenStatus === \"valid\") return chalk.green(\"valid\");\n if (bot.tokenStatus === \"invalid\") return chalk.red(\"invalid\");\n return chalk.yellow(\"unknown\");\n}\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List Telegram bots available in the active organization\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero telegram bot list\n\nNotes:\n - Use this to find the --bot-id value before sending Telegram messages.`,\n )\n .action(\n withErrorHandler(async () => {\n const result = await listTelegramBots();\n const { bots } = result;\n\n if (bots.length === 0) {\n console.log(chalk.dim(\"No Telegram bots found\"));\n console.log(\n chalk.dim(\" Add one from Settings > Integrations > Telegram\"),\n );\n return;\n }\n\n const botIdWidth = Math.max(\n 6,\n ...bots.map((bot) => {\n return bot.id.length;\n }),\n );\n const usernameWidth = Math.max(\n 8,\n ...bots.map((bot) => {\n return usernameLabel(bot).length;\n }),\n );\n const agentWidth = Math.max(\n 5,\n ...bots.map((bot) => {\n return (bot.agent?.name ?? \"-\").length;\n }),\n );\n\n const header = [\n \"BOT ID\".padEnd(botIdWidth),\n \"USERNAME\".padEnd(usernameWidth),\n \"AGENT\".padEnd(agentWidth),\n \"CONNECTED\",\n \"TOKEN\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n for (const bot of bots) {\n const row = [\n bot.id.padEnd(botIdWidth),\n usernameLabel(bot).padEnd(usernameWidth),\n (bot.agent?.name ?? \"-\").padEnd(agentWidth),\n (bot.isConnected ? \"yes\" : \"no\").padEnd(9),\n statusLabel(bot),\n ].join(\" \");\n console.log(row);\n }\n }),\n );\n","import { join } from \"path\";\nimport { tmpdir } from \"os\";\nimport { Command } from \"commander\";\nimport { downloadTelegramFile } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\n/**\n * Derive a local output path for a Telegram file id.\n * Uses the system temp directory.\n */\nfunction defaultOutPath(fileId: string): string {\n return join(tmpdir(), `telegram-${fileId}`);\n}\n\nexport const downloadFileCommand = new Command()\n .name(\"download-file\")\n .description(\"Download a Telegram file by id using the bot token\")\n .argument(\"<file-id>\", \"Telegram file id from a [Telegram file] block\")\n .option(\n \"-o, --out <path>\",\n \"Output path for the downloaded file (default: /tmp/telegram-<file-id>)\",\n )\n .requiredOption(\n \"--bot-id <bot-id>\",\n \"Telegram bot id from the [Telegram file] block\",\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n Download to default temp path: zero telegram download-file AgACAgUAAxkBAA --bot-id 123456789\n Download to explicit path: zero telegram download-file AgACAgUAAxkBAA --bot-id 123456789 -o /tmp/photo.jpg\n\nOutput:\n Prints a JSON object to stdout on success:\n {\"path\":\"/tmp/telegram-AgACAgUAAxkBAA\",\"mimetype\":\"image/jpeg\",\"size\":12345}\n\nHow to read the downloaded file:\n - Images (png/jpg/gif/webp/svg): open the file path with your image viewing tool\n - Videos (mp4/mov/webm): extract frames first with\n ffmpeg -i <path> -vf \"fps=1\" -q:v 2 /tmp/<file-id>_frame_%03d.jpg\n then view the extracted frames\n - PDF/text/csv/json/markdown: read the file directly\n\nNotes:\n - Uses the Telegram bot token on the server side\n - Streams the file bytes directly to disk`,\n )\n .action(\n withErrorHandler(\n async (fileId: string, options: { out?: string; botId: string }) => {\n const outPath = options.out ?? defaultOutPath(fileId);\n const result = await downloadTelegramFile(\n fileId,\n options.botId,\n outPath,\n );\n console.log(JSON.stringify(result));\n },\n ),\n );\n","import { Command } from \"commander\";\nimport { sendCommand } from \"./send\";\n\nexport const zeroTelegramMessageCommand = new Command()\n .name(\"message\")\n .description(\"Manage Telegram messages\")\n .addCommand(sendCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n zero telegram message send --bot-id <bot-id> -c <chat-id> -t \"Hello!\"`,\n );\n","import { readFileSync } from \"fs\";\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { sendTelegramMessage } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nfunction parsePositiveInteger(value: string, flag: string): number {\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(`${flag} must be a positive integer`);\n }\n return parsed;\n}\n\nexport const sendCommand = new Command()\n .name(\"send\")\n .description(\"Send a message to a Telegram chat as the bot\")\n .requiredOption(\"--bot-id <id>\", \"Telegram bot ID\")\n .requiredOption(\"-c, --chat-id <id>\", \"Telegram chat ID\")\n .option(\"-t, --text <message>\", \"Message text\")\n .option(\"--reply-to-message-id <id>\", \"Message ID to reply to\")\n .option(\"--message-thread-id <id>\", \"Telegram forum topic thread ID\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Simple message: zero telegram message send --bot-id 123456789 -c -1001234567890 -t \"Hello!\"\n Reply to message: zero telegram message send --bot-id 123456789 -c -1001234567890 --reply-to-message-id 42 -t \"reply\"\n Forum topic message: zero telegram message send --bot-id 123456789 -c -1001234567890 --message-thread-id 7 -t \"topic update\"\n\nNotes:\n - Message text can be provided with --text or piped on stdin\n - Choose an explicit --bot-id. Run \"zero telegram bot list\" to inspect available bots.`,\n )\n .action(\n withErrorHandler(\n async (options: {\n botId: string;\n chatId: string;\n text?: string;\n replyToMessageId?: string;\n messageThreadId?: string;\n }) => {\n let text = options.text;\n if (!text && process.stdin.isTTY === false) {\n text = readFileSync(\"/dev/stdin\", \"utf8\").trim();\n }\n\n if (!text) {\n throw new Error(\"Either --text or piped stdin must be provided\", {\n cause: new Error(\n 'Usage: zero telegram message send --bot-id BOT_ID -c CHAT_ID -t \"your message\"',\n ),\n });\n }\n\n const result = await sendTelegramMessage({\n botId: options.botId,\n chatId: options.chatId,\n text,\n replyToMessageId: options.replyToMessageId\n ? parsePositiveInteger(\n options.replyToMessageId,\n \"reply-to-message-id\",\n )\n : undefined,\n messageThreadId: options.messageThreadId\n ? parsePositiveInteger(options.messageThreadId, \"message-thread-id\")\n : undefined,\n });\n\n console.log(\n chalk.green(`✓ Message sent (message_id: ${result.messageId})`),\n );\n },\n ),\n );\n","import { readFileSync, statSync } from \"fs\";\nimport { basename, extname } from \"path\";\nimport { Command } from \"commander\";\nimport {\n completeTelegramFileUpload,\n initTelegramFileUpload,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nconst MIME_BY_EXTENSION: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".svg\": \"image/svg+xml\",\n \".mp4\": \"video/mp4\",\n \".webm\": \"video/webm\",\n \".mov\": \"video/quicktime\",\n \".pdf\": \"application/pdf\",\n \".txt\": \"text/plain\",\n \".csv\": \"text/csv\",\n \".md\": \"text/markdown\",\n \".json\": \"application/json\",\n};\n\nfunction inferContentType(localPath: string): string {\n const ext = extname(localPath).toLowerCase();\n return MIME_BY_EXTENSION[ext] ?? \"application/octet-stream\";\n}\n\nfunction parseMessageThreadId(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const parsed = Number(value);\n if (!Number.isSafeInteger(parsed) || parsed <= 0) {\n throw new Error(\"message-thread-id must be a positive integer\");\n }\n return parsed;\n}\n\nexport const uploadFileCommand = new Command()\n .name(\"upload-file\")\n .description(\"Upload a local file to a Telegram chat as the bot\")\n .requiredOption(\"-f, --file <path>\", \"Local file path to upload\")\n .requiredOption(\"--bot-id <bot-id>\", \"Telegram bot id to send through\")\n .requiredOption(\"-c, --chat-id <chat-id>\", \"Telegram chat id or @channel\")\n .option(\"--caption <text>\", \"Caption to accompany the file\")\n .option(\"--message-thread-id <id>\", \"Forum topic message thread id\")\n .option(\"--content-type <mime>\", \"Override inferred content type\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Upload a file: zero telegram upload-file -f /tmp/report.pdf --bot-id 123456789 -c -1001234567890\n Upload to a topic: zero telegram upload-file -f /tmp/log.txt --bot-id 123456789 -c -1001234567890 --message-thread-id 42\n With a caption: zero telegram upload-file -f /tmp/data.csv --bot-id 123456789 -c @channel --caption \"Daily report\"\n\nOutput:\n Prints a JSON object to stdout on success:\n {\"messageId\":123,\"chatId\":\"-1001234567890\",\"fileId\":\"...\",\"filename\":\"report.pdf\",\"mimetype\":\"application/pdf\",\"size\":12345,\"url\":\"https://...\"}\n\nNotes:\n - Uses the Telegram bot token on the server side\n - Uploads through VM0 storage first, then asks Telegram to fetch the file URL\n - VM0 does not apply file type or size restrictions before calling Telegram`,\n )\n .action(\n withErrorHandler(\n async (options: {\n file: string;\n botId: string;\n chatId: string;\n caption?: string;\n messageThreadId?: string;\n contentType?: string;\n }) => {\n let fileSize: number;\n try {\n const stat = statSync(options.file);\n if (!stat.isFile()) {\n throw new Error(`Not a regular file: ${options.file}`);\n }\n fileSize = stat.size;\n } catch (error) {\n if (error instanceof Error && error.message.startsWith(\"Not \")) {\n throw error;\n }\n throw new Error(`File not found: ${options.file}`);\n }\n\n if (fileSize === 0) {\n throw new Error(\"File is empty\");\n }\n const filename = basename(options.file);\n const contentType =\n options.contentType ?? inferContentType(options.file);\n const messageThreadId = parseMessageThreadId(options.messageThreadId);\n\n const prepared = await initTelegramFileUpload({\n filename,\n contentType,\n length: fileSize,\n });\n\n const fileContent = readFileSync(options.file);\n const uploadResponse = await fetch(prepared.uploadUrl, {\n method: \"PUT\",\n headers: { \"Content-Type\": prepared.contentType },\n body: new Uint8Array(fileContent),\n });\n\n if (!uploadResponse.ok) {\n throw new Error(\n `File upload failed: ${uploadResponse.status} ${uploadResponse.statusText}`,\n );\n }\n\n const result = await completeTelegramFileUpload({\n uploadId: prepared.uploadId,\n botId: options.botId,\n chatId: options.chatId,\n contentType: prepared.contentType,\n caption: options.caption,\n messageThreadId,\n });\n\n console.log(JSON.stringify(result));\n },\n ),\n );\n","import { Command } from \"commander\";\nimport { listCommand } from \"./list\";\nimport { setCommand } from \"./set\";\nimport { deleteCommand } from \"./delete\";\n\nexport const zeroVariableCommand = new Command()\n .name(\"variable\")\n .description(\"Read or write non-sensitive configuration values\")\n .addCommand(listCommand)\n .addCommand(setCommand)\n .addCommand(deleteCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroVariables } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\n/**\n * Truncate value for display if too long\n */\nfunction truncateValue(value: string, maxLength: number = 60): string {\n if (value.length <= maxLength) {\n return value;\n }\n return value.slice(0, maxLength - 15) + \"... [truncated]\";\n}\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all variables\")\n .action(\n withErrorHandler(async () => {\n const result = await listZeroVariables();\n\n if (result.variables.length === 0) {\n console.log(chalk.dim(\"No variables found\"));\n console.log();\n console.log(\"To add a variable:\");\n console.log(chalk.cyan(\" zero variable set MY_VAR <value>\"));\n return;\n }\n\n console.log(chalk.bold(\"Variables:\"));\n console.log();\n\n for (const variable of result.variables) {\n const displayValue = truncateValue(variable.value);\n console.log(` ${chalk.cyan(variable.name)} = ${displayValue}`);\n if (variable.description) {\n console.log(` ${chalk.dim(variable.description)}`);\n }\n console.log(\n ` ${chalk.dim(`Updated: ${new Date(variable.updatedAt).toLocaleString()}`)}`,\n );\n console.log();\n }\n\n console.log(chalk.dim(`Total: ${result.variables.length} variable(s)`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { setZeroVariable } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const setCommand = new Command()\n .name(\"set\")\n .description(\"Create or update a variable\")\n .argument(\"<name>\", \"Variable name (uppercase, e.g., MY_VAR)\")\n .argument(\"<value>\", \"Variable value\")\n .option(\"-d, --description <description>\", \"Optional description\")\n .action(\n withErrorHandler(\n async (\n name: string,\n value: string,\n options: { description?: string },\n ) => {\n let variable;\n try {\n variable = await setZeroVariable({\n name,\n value,\n description: options.description,\n });\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\"must contain only uppercase\")\n ) {\n throw new Error(error.message, {\n cause: new Error(\n \"Examples of valid variable names: MY_VAR, API_URL, DEBUG_MODE\",\n ),\n });\n }\n throw error;\n }\n\n console.log(chalk.green(`✓ Variable \"${variable.name}\" saved`));\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { deleteZeroVariable } 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 .description(\"Delete a variable\")\n .argument(\"<name>\", \"Variable name to delete\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .action(\n withErrorHandler(async (name: string, options: { yes?: boolean }) => {\n if (!options.yes) {\n if (!isInteractive()) {\n throw new Error(\"--yes flag is required in non-interactive mode\");\n }\n\n const confirmed = await promptConfirm(\n `Are you sure you want to delete variable \"${name}\"?`,\n false,\n );\n\n if (!confirmed) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n }\n\n await deleteZeroVariable(name);\n console.log(chalk.green(`✓ Variable \"${name}\" deleted`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n getApiUrl,\n getActiveOrg,\n getToken,\n decodeZeroTokenPayload,\n} from \"../../lib/api/config\";\nimport {\n listZeroConnectors,\n getZeroAgent,\n getZeroAgentUserConnectors,\n} from \"../../lib/api\";\nimport { withErrorHandler } from \"../../lib/command\";\nimport {\n isFirewallConnectorType,\n getConnectorFirewall,\n resolveFirewallPolicies,\n} from \"@vm0/connectors/firewalls\";\nimport type { FirewallPolicies } from \"@vm0/connectors/firewall-types\";\nimport { policyIcon } from \"../../lib/utils/format-utils\";\n\n/**\n * Detect if running inside a zero sandbox (agent runtime).\n * Uses ZERO_AGENT_ID (not VM0_RUN_ID) because the zero CLI operates in the\n * zero agent context where ZERO_AGENT_ID is the canonical sandbox indicator.\n */\nfunction isInsideSandbox(): boolean {\n return !!process.env.ZERO_AGENT_ID;\n}\n\nfunction formatConnectorIdentity(connector: {\n externalUsername: string | null;\n externalEmail: string | null;\n needsReconnect: boolean;\n}): string {\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 (connector.needsReconnect) {\n identity += ` ${chalk.yellow(\"(needs reconnect)\")}`;\n }\n return identity;\n}\n\nfunction printConnectorPermissions(\n type: string,\n resolvedPolicies: FirewallPolicies | null,\n): void {\n if (!isFirewallConnectorType(type)) return;\n\n const refPolicy = resolvedPolicies?.[type];\n if (!refPolicy) {\n console.log(chalk.dim(\" full access — no permission rules configured\"));\n return;\n }\n\n const config = getConnectorFirewall(type);\n const permissions = config.apis.flatMap((a) => {\n return a.permissions ?? [];\n });\n\n if (\n permissions.length === 0 &&\n Object.keys(refPolicy.policies).length === 0\n ) {\n const unknownIcon = policyIcon(refPolicy.unknownPolicy ?? \"allow\");\n console.log(` ${unknownIcon} unknown endpoints`);\n return;\n }\n\n const nameWidth = Math.max(\n \"unknown endpoints\".length,\n ...permissions.map((p) => {\n return p.name.length;\n }),\n );\n\n for (const perm of permissions) {\n const policy = refPolicy.policies[perm.name] ?? \"deny\";\n const icon = policyIcon(policy);\n const desc = perm.description ?? \"\";\n console.log(` ${icon} ${perm.name.padEnd(nameWidth)} ${desc}`);\n }\n\n const unknownIcon = policyIcon(refPolicy.unknownPolicy ?? \"allow\");\n console.log(\n ` ${unknownIcon} ${\"unknown endpoints\".padEnd(nameWidth)} Endpoints not matching any rule`,\n );\n}\n\nasync function showSandboxInfo(showPermissions: boolean): Promise<void> {\n const agentId = process.env.ZERO_AGENT_ID;\n const payload = decodeZeroTokenPayload();\n\n console.log(`Agent ID: ${agentId}`);\n console.log(`Run ID: ${payload?.runId ?? chalk.dim(\"unavailable\")}`);\n console.log(`Org ID: ${payload?.orgId ?? chalk.dim(\"unavailable\")}`);\n\n // Capabilities section\n if (payload?.capabilities?.length) {\n console.log();\n console.log(chalk.bold(\"Capabilities:\"));\n console.log(` ${payload.capabilities.join(\", \")}`);\n }\n\n // Connected Services section\n try {\n if (showPermissions) {\n // Full mode: fetch all 3 APIs for permission details\n const [connectorsResult, agentResult, enabledResult] =\n await Promise.allSettled([\n listZeroConnectors(),\n getZeroAgent(agentId!),\n getZeroAgentUserConnectors(agentId!),\n ]);\n\n if (connectorsResult.status === \"rejected\") return;\n\n const identities = connectorsResult.value.connectors.filter((c) => {\n return c.externalUsername !== null || c.externalEmail !== null;\n });\n\n if (identities.length === 0) return;\n\n let resolvedPolicies: FirewallPolicies | null = null;\n const permissionDataAvailable =\n agentResult.status === \"fulfilled\" &&\n enabledResult.status === \"fulfilled\";\n if (permissionDataAvailable) {\n resolvedPolicies = resolveFirewallPolicies(\n agentResult.value.permissionPolicies,\n enabledResult.value,\n );\n }\n\n console.log();\n console.log(chalk.bold(\"Connectors:\"));\n for (const connector of identities) {\n const identity = formatConnectorIdentity(connector);\n console.log(` ${connector.type.padEnd(14)}${identity}`);\n\n if (permissionDataAvailable) {\n printConnectorPermissions(connector.type, resolvedPolicies);\n }\n }\n } else {\n // Default mode: only fetch connector identities (1 API call)\n const connectors = await listZeroConnectors();\n const identities = connectors.connectors.filter((c) => {\n return c.externalUsername !== null || c.externalEmail !== null;\n });\n\n if (identities.length === 0) return;\n\n console.log();\n console.log(chalk.bold(\"Connectors:\"));\n for (const connector of identities) {\n const identity = formatConnectorIdentity(connector);\n console.log(` ${connector.type.padEnd(14)}${identity}`);\n }\n }\n } catch {\n // Silently skip — connector info is supplementary\n }\n}\n\nasync function showLocalInfo(): Promise<void> {\n const token = await getToken();\n const apiUrl = await getApiUrl();\n const activeOrg = await getActiveOrg();\n\n // Auth section\n console.log(chalk.bold(\"Auth:\"));\n if (token) {\n const tokenSource = process.env.ZERO_TOKEN\n ? \"ZERO_TOKEN env var\"\n : process.env.VM0_TOKEN\n ? \"VM0_TOKEN env var\"\n : \"config file\";\n console.log(\n ` Status: ${chalk.green(\"Authenticated\")} (via ${tokenSource})`,\n );\n } else {\n console.log(` Status: ${chalk.dim(\"Not authenticated\")}`);\n }\n console.log(` API: ${apiUrl}`);\n console.log();\n\n // Org section\n if (activeOrg) {\n console.log(chalk.bold(\"Org:\"));\n console.log(` Active: ${activeOrg}`);\n }\n}\n\nexport const zeroWhoamiCommand = new Command()\n .name(\"whoami\")\n .description(\"Show agent identity, run ID, and capabilities\")\n .option(\"--permissions\", \"Show full permission details for each connector\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero whoami\n zero whoami --permissions\n\nNotes:\n - Inside sandbox: shows agent ID, run ID, org ID, and granted capabilities\n - Use --permissions to see detailed permission breakdown per connector\n - Your agent ID is also available as $ZERO_AGENT_ID`,\n )\n .action(\n withErrorHandler(async (options: { permissions?: boolean }) => {\n if (isInsideSandbox()) {\n await showSandboxInfo(options.permissions ?? false);\n } else {\n await showLocalInfo();\n }\n }),\n );\n","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 zeroSkillCommand = new Command(\"skill\")\n .description(\"Manage custom skills\")\n .addCommand(createCommand)\n .addCommand(editCommand)\n .addCommand(viewCommand)\n .addCommand(listCommand)\n .addCommand(deleteCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Create from directory: zero skill create my-skill --dir ./skills/my-skill/\n List all skills: zero skill list\n View skill content: zero skill view my-skill\n Update skill content: zero skill edit my-skill --dir ./skills/my-skill/\n Delete a skill: zero skill delete my-skill -y\n\nSkill Binding:\n Bind to agent: zero agent edit <id> --add-skill my-skill\n Unbind from agent: zero agent edit <id> --remove-skill my-skill\n Replace all skills: zero agent edit <id> --skills a,b,c`,\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { createSkill } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { readSkillDirectory } from \"../../../lib/skill-directory\";\n\nexport const createCommand = new Command()\n .name(\"create\")\n .description(\"Create a custom skill in the organization\")\n .argument(\"<name>\", \"Skill name (lowercase alphanumeric with hyphens)\")\n .requiredOption(\"--dir <path>\", \"Path to directory containing SKILL.md\")\n .option(\"--display-name <name>\", \"Skill display name\")\n .option(\"--description <text>\", \"Skill description\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero skill create my-skill --dir ./skills/my-skill/\n zero skill create my-skill --dir ./skills/my-skill/ --display-name \"My Skill\" --description \"Does things\"\n\nNotes:\n - The directory must contain a SKILL.md file\n - All files in the directory are uploaded (hidden files and node_modules excluded)\n - The skill is created in the organization but not bound to any agent\n - Use 'zero agent edit <id> --add-skill <name>' to bind a skill to an agent`,\n )\n .action(\n withErrorHandler(\n async (\n name: string,\n options: {\n dir: string;\n displayName?: string;\n description?: string;\n },\n ) => {\n const files = readSkillDirectory(options.dir);\n\n const skill = await createSkill({\n name,\n files,\n displayName: options.displayName,\n description: options.description,\n });\n\n console.log(chalk.green(`✓ Skill \"${skill.name}\" created`));\n console.log(` Name: ${skill.name}`);\n console.log(` Files: ${files.length} file(s)`);\n if (skill.displayName) {\n console.log(` Display Name: ${skill.displayName}`);\n }\n if (skill.description) {\n console.log(` Description: ${skill.description}`);\n }\n },\n ),\n );\n","import { readFileSync, readdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nconst IGNORED_NAMES = new Set([\"node_modules\", \".git\", \".DS_Store\"]);\n\n/**\n * Recursively read all files from a skill directory.\n *\n * Skips hidden files (starting with .), node_modules, and .git.\n * Throws if SKILL.md is not found at the root.\n */\nexport function readSkillDirectory(\n dirPath: string,\n): Array<{ path: string; content: string }> {\n const files: Array<{ path: string; content: string }> = [];\n\n function walk(dir: string, prefix: string) {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.name.startsWith(\".\") || IGNORED_NAMES.has(entry.name)) continue;\n\n const relPath = prefix ? `${prefix}/${entry.name}` : entry.name;\n if (entry.isDirectory()) {\n walk(join(dir, entry.name), relPath);\n } else {\n files.push({\n path: relPath,\n content: readFileSync(join(dir, entry.name), \"utf-8\"),\n });\n }\n }\n }\n\n walk(dirPath, \"\");\n\n if (\n !files.some((f) => {\n return f.path === \"SKILL.md\";\n })\n ) {\n throw new Error(`SKILL.md not found in ${dirPath}`);\n }\n\n return files;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { updateSkill } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { readSkillDirectory } from \"../../../lib/skill-directory\";\n\nexport const editCommand = new Command()\n .name(\"edit\")\n .description(\"Update a custom skill's content\")\n .argument(\"<name>\", \"Skill name\")\n .requiredOption(\n \"--dir <path>\",\n \"Path to directory containing updated skill files\",\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n zero skill edit my-skill --dir ./skills/my-skill/`,\n )\n .action(\n withErrorHandler(async (name: string, options: { dir: string }) => {\n const files = readSkillDirectory(options.dir);\n await updateSkill(name, { files });\n\n console.log(\n chalk.green(`✓ Skill \"${name}\" updated (${files.length} file(s))`),\n );\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getSkill } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const viewCommand = new Command()\n .name(\"view\")\n .description(\"View a custom skill\")\n .argument(\"<name>\", \"Skill name\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero skill view my-skill`,\n )\n .action(\n withErrorHandler(async (name: string) => {\n const skill = await getSkill(name);\n\n console.log(chalk.bold(skill.name));\n if (skill.displayName) console.log(chalk.dim(skill.displayName));\n console.log();\n console.log(`Name: ${skill.name}`);\n if (skill.displayName) console.log(`Display Name: ${skill.displayName}`);\n if (skill.description) console.log(`Description: ${skill.description}`);\n\n if (skill.files && skill.files.length > 0) {\n console.log();\n console.log(chalk.dim(\"── Files ──\"));\n for (const f of skill.files) {\n console.log(` ${f.path} (${f.size} bytes)`);\n }\n }\n\n console.log();\n if (skill.content) {\n console.log(chalk.dim(\"── SKILL.md ──\"));\n console.log(skill.content);\n } else {\n console.log(chalk.dim(\"No content\"));\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listSkills } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List custom skills in the organization\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero skill list`,\n )\n .action(\n withErrorHandler(async () => {\n const skills = await listSkills();\n\n if (skills.length === 0) {\n console.log(chalk.dim(\"No custom skills found\"));\n console.log(\n chalk.dim(\" Create one with: zero skill create <name> --dir <path>\"),\n );\n return;\n }\n\n const nameWidth = Math.max(\n 4,\n ...skills.map((s) => {\n return s.name.length;\n }),\n );\n const displayWidth = Math.max(\n 12,\n ...skills.map((s) => {\n return (s.displayName ?? \"\").length;\n }),\n );\n\n const header = [\n \"NAME\".padEnd(nameWidth),\n \"DISPLAY NAME\".padEnd(displayWidth),\n \"DESCRIPTION\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n for (const skill of skills) {\n const row = [\n skill.name.padEnd(nameWidth),\n (skill.displayName ?? \"-\").padEnd(displayWidth),\n skill.description ?? \"-\",\n ].join(\" \");\n console.log(row);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getSkill, deleteSkill } 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 custom skill from the organization\")\n .argument(\"<name>\", \"Skill name\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero skill delete my-skill\n zero skill delete my-skill -y\n\nNotes:\n - This removes the skill from the organization and unbinds it from all agents\n - Use -y to skip confirmation in non-interactive mode`,\n )\n .action(\n withErrorHandler(async (name: string, options: { yes?: boolean }) => {\n await getSkill(name);\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 skill '${name}'? This will unbind it from all agents.`,\n false,\n );\n if (!confirmed) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n }\n\n await deleteSkill(name);\n console.log(chalk.green(`✓ Skill \"${name}\" deleted`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getZeroRunAgentEvents, type RunEvent } from \"../../../lib/api\";\nimport { parseTime } from \"../../../lib/utils/time-parser\";\nimport { parseEvent } from \"../../../lib/events/event-parser-factory\";\nimport { EventRenderer } from \"../../../lib/events/event-renderer\";\nimport { paginate } from \"../../../lib/utils/paginate\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { isUUID } from \"../../run/shared\";\nimport { listCommand } from \"./list\";\nimport { searchCommand } from \"./search\";\n\nconst PAGE_LIMIT = 100;\n\nfunction renderAgentEvent(\n event: RunEvent,\n renderer: EventRenderer,\n framework: string,\n): void {\n const eventData = event.eventData as Record<string, unknown>;\n const parsed = parseEvent(eventData, framework);\n if (parsed) {\n parsed.timestamp = new Date(event.createdAt);\n renderer.render(parsed);\n }\n}\n\nasync function showAgentEvents(\n runId: string,\n options: {\n since?: number;\n targetCount: number | \"all\";\n order: \"asc\" | \"desc\";\n },\n): Promise<void> {\n const firstResponse = await getZeroRunAgentEvents(runId, {\n since: options.since,\n limit: PAGE_LIMIT,\n order: options.order,\n });\n\n if (firstResponse.events.length === 0) {\n console.log(chalk.yellow(\"No agent events found for this run\"));\n return;\n }\n\n let allEvents: RunEvent[];\n\n if (\n !firstResponse.hasMore ||\n (options.targetCount !== \"all\" &&\n firstResponse.events.length >= options.targetCount)\n ) {\n allEvents =\n options.targetCount === \"all\"\n ? firstResponse.events\n : firstResponse.events.slice(0, options.targetCount);\n } else {\n const lastEvent = firstResponse.events[firstResponse.events.length - 1];\n const firstPageTimestamp = lastEvent\n ? new Date(lastEvent.createdAt).getTime()\n : undefined;\n\n const remainingEvents = await paginate<RunEvent>({\n fetchPage: async (since) => {\n const response = await getZeroRunAgentEvents(runId, {\n since,\n limit: PAGE_LIMIT,\n order: options.order,\n });\n return { items: response.events, hasMore: response.hasMore };\n },\n getTimestamp: (event) => {\n return new Date(event.createdAt).getTime();\n },\n targetCount:\n options.targetCount === \"all\"\n ? \"all\"\n : options.targetCount - firstResponse.events.length,\n initialSince: firstPageTimestamp,\n });\n\n allEvents = [...firstResponse.events, ...remainingEvents];\n\n if (\n options.targetCount !== \"all\" &&\n allEvents.length > options.targetCount\n ) {\n allEvents = allEvents.slice(0, options.targetCount);\n }\n }\n\n const events =\n options.order === \"desc\" ? [...allEvents].reverse() : allEvents;\n\n const renderer = new EventRenderer({\n showTimestamp: true,\n verbose: true,\n });\n const framework = firstResponse.framework;\n\n for (const event of events) {\n renderAgentEvent(event, renderer, framework);\n }\n}\n\nexport const zeroLogsCommand = new Command()\n .name(\"logs\")\n .description(\"View and search agent run logs\")\n .argument(\"[runId]\", \"Run ID to view agent events for\")\n .addCommand(listCommand)\n .addCommand(searchCommand)\n .option(\n \"--since <time>\",\n \"Show logs since timestamp (e.g., 5m, 2h, 1d, 2024-01-15T10:30:00Z)\",\n )\n .option(\"--tail <n>\", \"Show last N entries (default: 5)\")\n .option(\"--head <n>\", \"Show first N entries\")\n .option(\"--all\", \"Fetch all log entries\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero logs list\n zero logs <runId>\n zero logs <runId> --tail 10\n zero logs <runId> --all\n zero logs search \"error\"`,\n )\n .action(\n withErrorHandler(\n async (\n runId: string | undefined,\n options: {\n since?: string;\n tail?: string;\n head?: string;\n all?: boolean;\n },\n ) => {\n if (!runId) {\n zeroLogsCommand.help();\n return;\n }\n\n if (!isUUID(runId)) {\n console.error(\n chalk.red(`✗ Invalid run ID \"${runId}\" — expected a UUID`),\n );\n console.error(chalk.dim(\" Run: zero logs list to find run IDs\"));\n process.exit(1);\n }\n\n const countModes = [\n options.tail !== undefined,\n options.head !== undefined,\n options.all === true,\n ].filter(Boolean).length;\n if (countModes > 1) {\n throw new Error(\n \"Options --tail, --head, and --all are mutually exclusive\",\n );\n }\n\n let since: number | undefined;\n if (options.since) {\n since = parseTime(options.since);\n }\n\n const isAll = options.all === true;\n const isHead = options.head !== undefined;\n const isTail = options.tail !== undefined;\n\n let targetCount: number | \"all\";\n if (isAll) {\n targetCount = \"all\";\n } else if (isHead) {\n targetCount = Math.max(1, parseInt(options.head!, 10));\n } else if (isTail) {\n targetCount = Math.max(1, parseInt(options.tail!, 10));\n } else {\n targetCount = 5;\n }\n\n const order: \"asc\" | \"desc\" = isHead ? \"asc\" : \"desc\";\n\n await showAgentEvents(runId, { since, targetCount, order });\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroLogs } from \"../../../lib/api\";\nimport { parseTime } from \"../../../lib/utils/time-parser\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nfunction formatStatus(status: string): string {\n switch (status) {\n case \"completed\":\n return chalk.green(status);\n case \"failed\":\n case \"timeout\":\n return chalk.red(status);\n case \"running\":\n case \"pending\":\n case \"queued\":\n return chalk.yellow(status);\n case \"cancelled\":\n return chalk.dim(status);\n default:\n return status;\n }\n}\n\nfunction formatTime(iso: string): string {\n return new Date(iso).toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n}\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List agent run logs\")\n .option(\"--agent <name>\", \"Filter by agent name\")\n .option(\n \"--status <status>\",\n \"Filter by status (queued|pending|running|completed|failed|timeout|cancelled)\",\n )\n .option(\n \"--since <time>\",\n \"Filter runs created since (e.g., 5m, 2h, 1d, 2024-01-15T10:30:00Z)\",\n )\n .option(\"--limit <n>\", \"Maximum number of results (default: 20)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero logs list\n zero logs list --agent my-agent\n zero logs list --status completed --limit 10\n zero logs list --since 1h\n zero logs list --since 1d --status completed`,\n )\n .action(\n withErrorHandler(\n async (options: {\n agent?: string;\n status?: string;\n since?: string;\n limit?: string;\n }) => {\n const limit = options.limit ? parseInt(options.limit, 10) : undefined;\n const since = options.since ? parseTime(options.since) : undefined;\n\n const result = await listZeroLogs({\n agent: options.agent,\n status: options.status,\n since,\n limit,\n });\n\n if (result.data.length === 0) {\n console.log(chalk.dim(\"No logs found\"));\n return;\n }\n\n const nameCol = Math.max(\n 5,\n ...result.data.map((r) => {\n return (r.displayName || r.agentId || \"-\").length;\n }),\n );\n const statusCol = Math.max(\n 6,\n ...result.data.map((r) => {\n return r.status.length;\n }),\n );\n\n const header = [\n \"RUN ID\".padEnd(38),\n \"AGENT\".padEnd(nameCol),\n \"STATUS\".padEnd(statusCol),\n \"CREATED\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n for (const entry of result.data) {\n const runId = entry.id;\n const name = entry.displayName || entry.agentId || \"-\";\n const row = [\n runId.padEnd(38),\n name.padEnd(nameCol),\n formatStatus(entry.status).padEnd(statusCol),\n formatTime(entry.createdAt),\n ].join(\" \");\n console.log(row);\n }\n\n if (result.pagination.hasMore) {\n console.log();\n console.log(\n chalk.dim(\n ` Showing ${result.data.length} of more results. Use --limit to adjust.`,\n ),\n );\n }\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n searchZeroLogs,\n type RunEvent,\n type LogsSearchResponse,\n} from \"../../../lib/api\";\nimport { parseTime } from \"../../../lib/utils/time-parser\";\nimport { parseEvent } from \"../../../lib/events/event-parser-factory\";\nimport { EventRenderer } from \"../../../lib/events/event-renderer\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { isUUID } from \"../../run/shared\";\n\nconst SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000;\n\nexport interface LogsSearchCliOptions {\n afterContext?: string;\n beforeContext?: string;\n context?: string;\n agent?: string;\n run?: string;\n since?: string;\n limit?: string;\n}\n\nfunction renderEvent(event: RunEvent, renderer: EventRenderer): void {\n const eventData = event.eventData as Record<string, unknown>;\n const parsed = parseEvent(eventData);\n if (parsed) {\n parsed.timestamp = new Date(event.createdAt);\n renderer.render(parsed);\n }\n}\n\nfunction formatRunHeader(\n runId: string,\n agentName: string,\n timestamp: string,\n): string {\n const time = new Date(timestamp).toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n return `── Run ${runId} (${agentName}, ${time}) ──────────`;\n}\n\nfunction parseContextOptions(options: LogsSearchCliOptions): {\n before: number;\n after: number;\n} {\n const contextN = options.context ? parseInt(options.context, 10) : 0;\n const before = options.beforeContext\n ? parseInt(options.beforeContext, 10)\n : contextN;\n const after = options.afterContext\n ? parseInt(options.afterContext, 10)\n : contextN;\n\n if (isNaN(before) || before < 0 || before > 10) {\n throw new Error(\"--before-context must be between 0 and 10\");\n }\n if (isNaN(after) || after < 0 || after > 10) {\n throw new Error(\"--after-context must be between 0 and 10\");\n }\n\n return { before, after };\n}\n\nfunction parseLimit(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const limit = parseInt(value, 10);\n if (isNaN(limit) || limit < 1 || limit > 50) {\n throw new Error(\"--limit must be between 1 and 50\");\n }\n return limit;\n}\n\nfunction renderResults(response: LogsSearchResponse): void {\n const grouped = new Map<\n string,\n { agentName: string; results: LogsSearchResponse[\"results\"] }\n >();\n for (const result of response.results) {\n const existing = grouped.get(result.runId);\n if (existing) {\n existing.results.push(result);\n } else {\n grouped.set(result.runId, {\n agentName: result.agentName,\n results: [result],\n });\n }\n }\n\n let isFirstGroup = true;\n for (const [runId, group] of grouped) {\n if (!isFirstGroup) {\n console.log();\n }\n isFirstGroup = false;\n\n const firstTimestamp = group.results[0]!.matchedEvent.createdAt;\n console.log(\n chalk.bold(formatRunHeader(runId, group.agentName, firstTimestamp)),\n );\n\n for (const result of group.results) {\n const renderer = new EventRenderer({\n showTimestamp: true,\n verbose: false,\n buffered: false,\n });\n\n for (const event of result.contextBefore) {\n renderEvent(event, renderer);\n }\n renderEvent(result.matchedEvent, renderer);\n for (const event of result.contextAfter) {\n renderEvent(event, renderer);\n }\n }\n }\n\n if (response.hasMore) {\n console.log();\n console.log(\n chalk.dim(\n ` Showing first ${response.results.length} matches. Use --limit to see more.`,\n ),\n );\n }\n}\n\nexport async function runLogsSearch(\n keyword: string,\n options: LogsSearchCliOptions,\n): Promise<void> {\n const { before, after } = parseContextOptions(options);\n\n if (options.run && !isUUID(options.run)) {\n console.error(\n chalk.red(`✗ Invalid run ID \"${options.run}\" — expected a UUID`),\n );\n console.error(chalk.dim(\" Run: zero logs list to find run IDs\"));\n process.exit(1);\n }\n\n const since = options.since\n ? parseTime(options.since)\n : Date.now() - SEVEN_DAYS_MS;\n const limit = parseLimit(options.limit);\n\n const response = await searchZeroLogs({\n keyword,\n agent: options.agent,\n runId: options.run,\n since,\n limit,\n before,\n after,\n });\n\n if (response.results.length === 0) {\n console.log(chalk.dim(\"No matches found\"));\n console.log(\n chalk.dim(\n \" Try a broader search with --since 30d or a different keyword\",\n ),\n );\n return;\n }\n\n renderResults(response);\n}\n\nexport const searchCommand = new Command()\n .name(\"search\")\n .description(\"Search agent events across runs\")\n .argument(\"<keyword>\", \"Search keyword\")\n .option(\"-A, --after-context <n>\", \"Show n events after each match\")\n .option(\"-B, --before-context <n>\", \"Show n events before each match\")\n .option(\"-C, --context <n>\", \"Show n events before and after each match\")\n .option(\"--agent <name>\", \"Filter by agent name\")\n .option(\"--run <id>\", \"Filter by specific run ID\")\n .option(\"--since <time>\", \"Search logs since (default: 7d)\")\n .option(\"--limit <n>\", \"Maximum number of matches (default: 20)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero logs search \"error\"\n zero logs search \"timeout\" --agent my-agent -C 2\n zero logs search \"failed\" --since 30d --limit 50`,\n )\n .action(\n withErrorHandler(async (keyword: string, options: LogsSearchCliOptions) => {\n await runLogsSearch(keyword, options);\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { runLogsSearch, type LogsSearchCliOptions } from \"../logs/search\";\nimport { searchZeroChat } from \"../../../lib/api\";\nimport type {\n ChatSearchMessage,\n ChatSearchResponse,\n} from \"@vm0/api-contracts/contracts/chat-threads\";\nimport { parseTime } from \"../../../lib/utils/time-parser\";\n\nconst SUPPORTED_SOURCES = [\"logs\", \"chat\", \"slack\"] as const;\ntype Source = (typeof SUPPORTED_SOURCES)[number];\n\nconst SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000;\n\nexport const SEARCH_EXPLAINER = `\nAvailable sources:\n logs full agent event stream (tool calls, tokens, system events) from agent runs\n chat user/assistant text messages as shown in the web chat UI\n slack returns a recipe for calling the Slack API directly; requires the Slack connector\n\nUsage: zero search <query> --source <logs|chat|slack> [flags]\nRun 'zero search --help' for all flags.`;\n\nexport function buildSlackRecipe(query: string): string {\n const encoded = encodeURIComponent(query);\n return `The \\`slack\\` source does not call Slack from this CLI. Run the\nfollowing inside an agent sandbox that has $SLACK_TOKEN available:\n\n curl -H \"Authorization: Bearer $SLACK_TOKEN\" \\\\\n \"https://slack.com/api/search.messages?query=${encoded}\"\n\nIf you don't have $SLACK_TOKEN, check the connector status:\n zero connector status slack\n\nTo verify the token and network policy end-to-end:\n zero doctor check-connector --env-name SLACK_TOKEN\n\nSlack API docs: https://api.slack.com/methods/search.messages\n\nNote: CLI-local flags (--limit, --since, -A/-B/-C) are ignored for the\nslack source. Pass equivalents to Slack's API via count= / highlight=\nquery parameters instead.`;\n}\n\ninterface SearchOptions {\n source: string[];\n agent?: string;\n run?: string;\n since?: string;\n limit?: string;\n afterContext?: string;\n beforeContext?: string;\n context?: string;\n}\n\nfunction collectSource(value: string, previous: string[]): string[] {\n return [...previous, value];\n}\n\nfunction parseContextOptions(options: SearchOptions): {\n before: number;\n after: number;\n} {\n const contextN = options.context ? parseInt(options.context, 10) : 0;\n const before = options.beforeContext\n ? parseInt(options.beforeContext, 10)\n : contextN;\n const after = options.afterContext\n ? parseInt(options.afterContext, 10)\n : contextN;\n\n if (isNaN(before) || before < 0 || before > 10) {\n throw new Error(\"--before-context must be between 0 and 10\");\n }\n if (isNaN(after) || after < 0 || after > 10) {\n throw new Error(\"--after-context must be between 0 and 10\");\n }\n\n return { before, after };\n}\n\nfunction parseLimit(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const limit = parseInt(value, 10);\n if (isNaN(limit) || limit < 1 || limit > 50) {\n throw new Error(\"--limit must be between 1 and 50\");\n }\n return limit;\n}\n\nasync function runLogsSource(\n query: string,\n options: SearchOptions,\n): Promise<void> {\n const logsOptions: LogsSearchCliOptions = {\n afterContext: options.afterContext,\n beforeContext: options.beforeContext,\n context: options.context,\n agent: options.agent,\n run: options.run,\n since: options.since,\n limit: options.limit,\n };\n await runLogsSearch(query, logsOptions);\n}\n\nfunction formatTimestamp(iso: string): string {\n return new Date(iso).toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n}\n\nfunction renderChatMessage(msg: ChatSearchMessage, isMatch: boolean): void {\n const marker = isMatch ? chalk.yellow(\"▸\") : chalk.dim(\"·\");\n const header = `${marker} ${chalk.dim(msg.role)} ${chalk.dim(formatTimestamp(msg.createdAt))}`;\n console.log(header);\n console.log(isMatch ? msg.content : chalk.dim(msg.content));\n}\n\nfunction renderChatResults(response: ChatSearchResponse): void {\n let isFirst = true;\n for (const result of response.results) {\n if (!isFirst) console.log();\n isFirst = false;\n\n console.log(\n chalk.bold(\n `── Thread ${result.chatThreadId} (${result.agentName}) ──────────`,\n ),\n );\n for (const msg of result.contextBefore) {\n renderChatMessage(msg, false);\n }\n renderChatMessage(result.matchedMessage, true);\n for (const msg of result.contextAfter) {\n renderChatMessage(msg, false);\n }\n }\n\n if (response.hasMore) {\n console.log();\n console.log(\n chalk.dim(\n ` Showing first ${response.results.length} matches. Use --limit to see more.`,\n ),\n );\n }\n}\n\nasync function runChatSource(\n query: string,\n options: SearchOptions,\n): Promise<void> {\n if (options.run) {\n throw new Error(\"--run is not supported with --source chat\");\n }\n\n const { before, after } = parseContextOptions(options);\n const limit = parseLimit(options.limit);\n const since = options.since\n ? parseTime(options.since)\n : Date.now() - SEVEN_DAYS_MS;\n\n const response = await searchZeroChat({\n keyword: query,\n agent: options.agent,\n since,\n limit,\n before,\n after,\n });\n\n if (response.results.length === 0) {\n console.log(chalk.dim(\"No matches found\"));\n console.log(\n chalk.dim(\n \" Try a broader search with --since 30d or a different keyword\",\n ),\n );\n return;\n }\n\n renderChatResults(response);\n}\n\nasync function runSlackSource(\n query: string,\n _options: SearchOptions,\n): Promise<void> {\n console.log(buildSlackRecipe(query));\n}\n\nexport const zeroSearchCommand = new Command()\n .name(\"search\")\n .description(\"Search logs, chat, or get a recipe for external sources\")\n .argument(\"<query>\", \"Search query\")\n .option(\n \"--source <type>\",\n \"Source to search: logs | chat | slack (pass once)\",\n collectSource,\n [] as string[],\n )\n .option(\"--agent <name>\", \"Filter by agent name\")\n .option(\"--run <id>\", \"Filter by run ID\")\n .option(\"--since <time>\", \"Time window (e.g., 7d, 2h)\")\n .option(\"--limit <n>\", \"Maximum number of matches\")\n .option(\"-A, --after-context <n>\", \"Show n items after each match\")\n .option(\"-B, --before-context <n>\", \"Show n items before each match\")\n .option(\"-C, --context <n>\", \"Show n items before and after each match\")\n .addHelpText(\"after\", SEARCH_EXPLAINER)\n .action(\n withErrorHandler(async (query: string, options: SearchOptions) => {\n const sources = options.source;\n\n if (sources.length === 0) {\n console.log(SEARCH_EXPLAINER);\n return;\n }\n\n if (sources.length > 1) {\n throw new Error(\"Only one --source is allowed.\");\n }\n\n const source = sources[0]!;\n if (!SUPPORTED_SOURCES.includes(source as Source)) {\n throw new Error(\n `Unknown --source \"${source}\". Expected one of: ${SUPPORTED_SOURCES.join(\", \")}`,\n );\n }\n\n switch (source as Source) {\n case \"logs\":\n await runLogsSource(query, options);\n return;\n case \"chat\":\n await runChatSource(query, options);\n return;\n case \"slack\":\n await runSlackSource(query, options);\n return;\n }\n }),\n );\n","import { Command } from \"commander\";\nimport { withErrorHandler } from \"../../lib/command\";\nimport {\n requestDeveloperSupportConsent,\n submitDeveloperSupport,\n} from \"../../lib/api\";\n\nexport const zeroDeveloperSupportCommand = new Command()\n .name(\"developer-support\")\n .description(\"Submit a diagnostic report to the dev team\")\n .requiredOption(\"--title <text>\", \"Issue title\")\n .requiredOption(\"--description <text>\", \"Diagnostic description\")\n .option(\"--consent-code <code>\", \"User-provided verification code\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Step 1 — Get consent code:\n zero developer-support --title \"GitHub 403 error\" --description \"Connector connected but API returns 403\"\n\n Step 2 — Submit with code:\n zero developer-support --title \"GitHub 403 error\" --description \"Connector connected but API returns 403\" --consent-code A7X3\n\nNotes:\n - The consent code must be provided by the user to confirm sharing their conversation\n - The dev team will receive a diagnostic bundle with conversation, environment, and connector info`,\n )\n .action(\n withErrorHandler(\n async (options: {\n title: string;\n description: string;\n consentCode?: string;\n }) => {\n if (!options.consentCode) {\n const { consentCode } = await requestDeveloperSupportConsent({\n title: options.title,\n description: options.description,\n });\n console.log(\n \"Consent required to share chat history with developers.\",\n );\n console.log(`Code: ${consentCode}`);\n console.log(\"Ask the user to confirm by providing this code.\");\n } else {\n const { reference } = await submitDeveloperSupport({\n title: options.title,\n description: options.description,\n consentCode: options.consentCode,\n });\n console.log(\"Developer support request submitted successfully.\");\n console.log(`Reference: ${reference}`);\n }\n },\n ),\n );\n","import { Command } from \"commander\";\nimport { hostStartCommand, hostStopCommand } from \"./host\";\nimport {\n clientScreenshotCommand,\n clientZoomCommand,\n clientInfoCommand,\n clientLeftClickCommand,\n clientRightClickCommand,\n clientMiddleClickCommand,\n clientDoubleClickCommand,\n clientTripleClickCommand,\n clientLeftClickDragCommand,\n clientLeftMouseDownCommand,\n clientLeftMouseUpCommand,\n clientScrollCommand,\n clientReadClipboardCommand,\n clientWriteClipboardCommand,\n clientKeyCommand,\n clientHoldKeyCommand,\n clientTypeCommand,\n clientOpenAppCommand,\n clientMouseMoveCommand,\n clientCursorPositionCommand,\n} from \"./client\";\n\nconst hostCommand = new Command()\n .name(\"host\")\n .description(\"Manage computer-use host daemon\")\n .addCommand(hostStartCommand)\n .addCommand(hostStopCommand);\n\nconst clientCommand = new Command()\n .name(\"client\")\n .description(\"Interact with remote computer-use host\")\n .addCommand(clientScreenshotCommand)\n .addCommand(clientZoomCommand)\n .addCommand(clientInfoCommand)\n .addCommand(clientLeftClickCommand)\n .addCommand(clientRightClickCommand)\n .addCommand(clientMiddleClickCommand)\n .addCommand(clientDoubleClickCommand)\n .addCommand(clientTripleClickCommand)\n .addCommand(clientLeftClickDragCommand)\n .addCommand(clientLeftMouseDownCommand)\n .addCommand(clientLeftMouseUpCommand)\n .addCommand(clientScrollCommand)\n .addCommand(clientReadClipboardCommand)\n .addCommand(clientWriteClipboardCommand)\n .addCommand(clientKeyCommand)\n .addCommand(clientHoldKeyCommand)\n .addCommand(clientTypeCommand)\n .addCommand(clientOpenAppCommand)\n .addCommand(clientMouseMoveCommand)\n .addCommand(clientCursorPositionCommand);\n\nclientCommand.addHelpText(\n \"after\",\n `\nCoordinate System:\n All coordinates use macOS logical points, not physical pixels.\n On Retina displays, logical size = physical size / scaleFactor.\n Run \"info\" to check your screen's logical dimensions.\n\nExamples:\n zero computer-use client screenshot\n zero computer-use client zoom --x 0 --y 0 --width 500 --height 500\n zero computer-use client info\n zero computer-use client left-click 500 300\n zero computer-use client scroll 500 300 down 5\n zero computer-use client key \"cmd+c\"`,\n);\n\nexport const zeroComputerUseCommand = new Command()\n .name(\"computer-use\")\n .description(\"Remote desktop control for cloud agents\")\n .addCommand(hostCommand)\n .addCommand(clientCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\nimport {\n registerComputerUseHost,\n unregisterComputerUseHost,\n ApiRequestError,\n} from \"../../../lib/api\";\nimport {\n getRandomPort,\n startDesktopServer,\n} from \"../../../lib/computer-use/desktop-server\";\nimport { isCliclickInstalled } from \"../../../lib/computer-use/cliclick\";\nimport {\n startDesktopTunnel,\n stopDesktopTunnel,\n} from \"../../../lib/computer-use/ngrok\";\n\nexport const hostStartCommand = new Command()\n .name(\"start\")\n .description(\"Start the computer-use host daemon (macOS only)\")\n .action(\n withErrorHandler(async () => {\n if (process.platform !== \"darwin\") {\n throw new Error(\n \"Computer-use host requires macOS\\n\\n\" +\n \"The host daemon uses macOS-specific commands (screencapture, system_profiler).\",\n );\n }\n\n if (!(await isCliclickInstalled())) {\n console.log(\n chalk.yellow(\n \"⚠ cliclick not found. Mouse and keyboard operations will not be available.\\n\" +\n \" Install with: brew install cliclick\",\n ),\n );\n console.log();\n }\n\n console.log(chalk.cyan(\"Registering computer-use host...\"));\n const credentials = await registerComputerUseHost();\n\n const port = await getRandomPort();\n const server = await startDesktopServer(credentials.token, port);\n\n try {\n await startDesktopTunnel(\n credentials.ngrokToken,\n credentials.endpointPrefix,\n port,\n );\n\n console.log();\n console.log(chalk.green(\"✓ Computer-use host active\"));\n console.log(` Desktop: desktop.${credentials.domain}`);\n console.log();\n console.log(chalk.dim(\"Press ^C twice to disconnect\"));\n console.log();\n\n let sigintCount = 0;\n await new Promise<void>((resolve) => {\n const keepAlive = setInterval(() => {}, 60_000);\n const done = () => {\n clearInterval(keepAlive);\n process.removeListener(\"SIGINT\", onSigint);\n resolve();\n };\n const onSigint = () => {\n sigintCount++;\n if (sigintCount === 1) {\n console.log(\n chalk.dim(\"\\nPress ^C again to disconnect and exit...\"),\n );\n } else {\n done();\n }\n };\n process.on(\"SIGINT\", onSigint);\n process.once(\"SIGTERM\", done);\n });\n } finally {\n console.log();\n console.log(chalk.cyan(\"Stopping computer-use host...\"));\n server.close();\n await stopDesktopTunnel();\n await unregisterComputerUseHost().catch(() => {});\n console.log(chalk.green(\"✓ Host stopped\"));\n }\n }),\n );\n\nexport const hostStopCommand = new Command()\n .name(\"stop\")\n .description(\"Stop and unregister the computer-use host\")\n .action(\n withErrorHandler(async () => {\n console.log(chalk.cyan(\"Unregistering computer-use host...\"));\n try {\n await unregisterComputerUseHost();\n console.log(chalk.green(\"✓ Host unregistered\"));\n } catch (error) {\n if (error instanceof ApiRequestError && error.status === 404) {\n console.log(chalk.yellow(\"No active host registration found\"));\n return;\n }\n throw error;\n }\n }),\n );\n","import {\n createServer,\n type Server,\n type IncomingMessage,\n type ServerResponse,\n} from \"http\";\nimport { createServer as createNetServer } from \"net\";\nimport type { AddressInfo } from \"net\";\nimport {\n captureScreenshot,\n captureRegionScreenshot,\n getScreenInfo,\n} from \"./screencapture\";\nimport {\n leftClickDrag,\n leftMouseDown,\n leftMouseUp,\n executeMouseAction,\n getCursorPosition,\n VALID_ACTIONS,\n pressKey,\n holdKey,\n typeText,\n} from \"./cliclick\";\nimport type { MouseAction } from \"./cliclick\";\nimport { scroll, type ScrollDirection } from \"./scroll\";\nimport { readClipboard, writeClipboard } from \"./clipboard\";\nimport { openApplication } from \"./application\";\n\n/**\n * Read the full request body as a string.\n */\nfunction readBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => {\n chunks.push(chunk);\n });\n req.on(\"end\", () => {\n resolve(Buffer.concat(chunks).toString());\n });\n req.on(\"error\", reject);\n });\n}\n\ninterface MouseDragBody {\n action: \"left_click_drag\";\n startX: number;\n startY: number;\n endX: number;\n endY: number;\n}\n\ninterface MouseDownBody {\n action: \"left_mouse_down\";\n x: number;\n y: number;\n}\n\ninterface MouseUpBody {\n action: \"left_mouse_up\";\n x: number;\n y: number;\n}\n\ninterface MouseScrollBody {\n action: \"scroll\";\n x: number;\n y: number;\n direction: ScrollDirection;\n amount?: number;\n}\n\ntype MouseRequestBody =\n | MouseDragBody\n | MouseDownBody\n | MouseUpBody\n | MouseScrollBody;\n\nasync function handleZoom(\n searchParams: URLSearchParams,\n res: ServerResponse,\n): Promise<void> {\n const x = Number(searchParams.get(\"x\"));\n const y = Number(searchParams.get(\"y\"));\n const width = Number(searchParams.get(\"width\"));\n const height = Number(searchParams.get(\"height\"));\n\n if (\n [x, y, width, height].some((v) => {\n return !Number.isFinite(v);\n })\n ) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\n \"Missing or invalid query parameters: x, y, width, height are required numbers\",\n );\n return;\n }\n if (width <= 0 || height <= 0) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"width and height must be positive\");\n return;\n }\n if (x < 0 || y < 0) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"x and y must be non-negative\");\n return;\n }\n\n const info = await getScreenInfo();\n if (x + width > info.width || y + height > info.height) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(`Region exceeds screen bounds (${info.width}x${info.height})`);\n return;\n }\n\n const result = await captureRegionScreenshot({ x, y, width, height });\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(result));\n}\n\nfunction parseJsonBody(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n let size = 0;\n req.on(\"data\", (chunk: Buffer) => {\n size += chunk.length;\n if (size > 1024) {\n reject(new Error(\"Request body too large\"));\n req.destroy();\n return;\n }\n chunks.push(chunk);\n });\n req.on(\"end\", () => {\n try {\n resolve(JSON.parse(Buffer.concat(chunks).toString()));\n } catch {\n reject(new Error(\"Invalid JSON body\"));\n }\n });\n req.on(\"error\", reject);\n });\n}\n\nasync function handleMouseRequest(\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<void> {\n const body = await parseJsonBody(req);\n if (typeof body !== \"object\" || body === null || !(\"action\" in body)) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"Missing required fields: action, x, y\");\n return;\n }\n\n const { action } = body as { action: unknown };\n\n if (typeof action !== \"string\") {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"Invalid action\");\n return;\n }\n\n // Click actions with validation\n if (VALID_ACTIONS.has(action)) {\n if (!(\"x\" in body) || !(\"y\" in body)) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"Missing required fields: action, x, y\");\n return;\n }\n\n const { x, y } = body as { x: unknown; y: unknown };\n\n if (\n typeof x !== \"number\" ||\n typeof y !== \"number\" ||\n !Number.isFinite(x) ||\n !Number.isFinite(y)\n ) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"Coordinates x and y must be finite numbers\");\n return;\n }\n\n const info = await getScreenInfo();\n if (x < 0 || x >= info.width || y < 0 || y >= info.height) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\n `Coordinates out of bounds. Screen size: ${info.width}x${info.height} (points)`,\n );\n return;\n }\n\n await executeMouseAction(action as MouseAction, x, y);\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true }));\n return;\n }\n\n // Drag, mouse-down, mouse-up, scroll actions\n const typedBody = body as MouseRequestBody;\n switch (typedBody.action) {\n case \"left_click_drag\":\n await leftClickDrag(\n typedBody.startX,\n typedBody.startY,\n typedBody.endX,\n typedBody.endY,\n );\n break;\n case \"left_mouse_down\":\n await leftMouseDown(typedBody.x, typedBody.y);\n break;\n case \"left_mouse_up\":\n await leftMouseUp(typedBody.x, typedBody.y);\n break;\n case \"scroll\":\n await scroll(\n typedBody.x,\n typedBody.y,\n typedBody.direction,\n typedBody.amount,\n );\n break;\n default:\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\n `Unknown mouse action: ${(body as unknown as Record<string, unknown>).action}`,\n );\n return;\n }\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true }));\n}\n\ninterface KeyPressBody {\n action: \"key\";\n keys: string;\n}\n\ninterface HoldKeyBody {\n action: \"hold_key\";\n keys: string;\n durationMs: number;\n}\n\ninterface TypeTextBody {\n action: \"type\";\n text: string;\n}\n\ntype KeyboardRequestBody = KeyPressBody | HoldKeyBody | TypeTextBody;\n\nasync function handleKeyboard(\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<void> {\n const raw = await readBody(req);\n const body = JSON.parse(raw) as KeyboardRequestBody;\n\n switch (body.action) {\n case \"key\":\n await pressKey(body.keys);\n break;\n case \"hold_key\":\n if (\n typeof body.durationMs !== \"number\" ||\n !Number.isFinite(body.durationMs) ||\n body.durationMs <= 0\n ) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"durationMs must be a positive number\");\n return;\n }\n await holdKey(body.keys, body.durationMs);\n break;\n case \"type\":\n if (typeof body.text !== \"string\" || body.text.length === 0) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"text must be a non-empty string\");\n return;\n }\n await typeText(body.text);\n break;\n default:\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\n `Unknown keyboard action: ${(body as Record<string, unknown>).action}`,\n );\n return;\n }\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true }));\n}\n\nasync function handleClipboard(\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<void> {\n if (req.method === \"GET\") {\n const text = await readClipboard();\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ text }));\n } else if (req.method === \"POST\") {\n const raw = await readBody(req);\n const body = JSON.parse(raw) as { text: string };\n await writeClipboard(body.text);\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true }));\n } else {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"Not found\");\n }\n}\n\nasync function handleOpenApplication(\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<void> {\n const raw = await readBody(req);\n const body = JSON.parse(raw) as { nameOrBundleId: unknown };\n\n if (\n typeof body.nameOrBundleId !== \"string\" ||\n body.nameOrBundleId.length === 0\n ) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"nameOrBundleId must be a non-empty string\");\n return;\n }\n\n await openApplication(body.nameOrBundleId);\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true }));\n}\n\n/**\n * Allocate a random available port on localhost.\n */\nexport async function getRandomPort(): Promise<number> {\n return new Promise((resolve, reject) => {\n const server = createNetServer();\n server.listen(0, \"127.0.0.1\", () => {\n const { port } = server.address() as AddressInfo;\n server.close(() => {\n resolve(port);\n });\n });\n server.on(\"error\", reject);\n });\n}\n\nasync function handleCursorPosition(res: ServerResponse): Promise<void> {\n const position = await getCursorPosition();\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(position));\n}\n\nfunction routeKey(method: string, pathname: string): string {\n return `${method} ${pathname}`;\n}\n\nasync function handleRequest(\n token: string,\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<void> {\n if (req.headers[\"x-vm0-token\"] !== token) {\n res.writeHead(403, { \"Content-Type\": \"text/plain\" });\n res.end(\"Forbidden\");\n return;\n }\n\n const url = new URL(req.url ?? \"/\", \"http://localhost\");\n const { pathname, searchParams } = url;\n const key = routeKey(req.method ?? \"GET\", pathname);\n\n try {\n switch (key) {\n case \"GET /screenshot\": {\n const result = await captureScreenshot();\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(result));\n break;\n }\n case \"GET /info\": {\n const info = await getScreenInfo();\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(info));\n break;\n }\n case \"GET /zoom\":\n await handleZoom(searchParams, res);\n break;\n case \"POST /mouse\":\n await handleMouseRequest(req, res);\n break;\n case \"GET /clipboard\":\n case \"POST /clipboard\":\n await handleClipboard(req, res);\n break;\n case \"POST /keyboard\":\n await handleKeyboard(req, res);\n break;\n case \"POST /open-application\":\n await handleOpenApplication(req, res);\n break;\n case \"GET /cursor-position\":\n await handleCursorPosition(res);\n break;\n default:\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"Not found\");\n }\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Internal server error\";\n res.writeHead(500, { \"Content-Type\": \"text/plain\" });\n res.end(message);\n }\n}\n\n/**\n * Start the desktop HTTP server.\n * Validates x-vm0-token on every request and serves /screenshot and /info endpoints.\n */\nexport function startDesktopServer(\n token: string,\n port: number,\n): Promise<Server> {\n return new Promise((resolve, reject) => {\n const server = createServer((req, res) => {\n handleRequest(token, req, res).catch(() => {\n if (!res.headersSent) {\n res.writeHead(500, { \"Content-Type\": \"text/plain\" });\n res.end(\"Internal server error\");\n }\n });\n });\n\n server.on(\"error\", reject);\n server.listen(port, \"127.0.0.1\", () => {\n resolve(server);\n });\n });\n}\n","import { execFile } from \"child_process\";\nimport { readFile, unlink } from \"fs/promises\";\nimport { randomUUID } from \"crypto\";\nimport { join } from \"path\";\nimport { tmpdir } from \"os\";\nimport { promisify } from \"util\";\n\nconst execFileAsync = promisify(execFile);\n\ninterface ScreenInfo {\n width: number;\n height: number;\n scaleFactor: number;\n}\n\ninterface ScreenshotResult extends ScreenInfo {\n image: string;\n format: string;\n}\n\ninterface RegionParams {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/**\n * Capture a screenshot on macOS using the screencapture command.\n * Returns the image as a base64 string at logical resolution along with screen metadata.\n */\nexport async function captureScreenshot(): Promise<ScreenshotResult> {\n const tmpPath = join(tmpdir(), `vm0-screenshot-${randomUUID()}.jpg`);\n\n try {\n await execFileAsync(\"screencapture\", [\"-x\", \"-t\", \"jpg\", tmpPath]);\n const info = await getScreenInfo();\n\n if (info.scaleFactor > 1) {\n await execFileAsync(\"sips\", [\n \"-z\",\n String(info.height),\n String(info.width),\n \"-s\",\n \"formatOptions\",\n \"80\",\n tmpPath,\n ]);\n }\n\n const buffer = await readFile(tmpPath);\n\n return {\n image: buffer.toString(\"base64\"),\n width: info.width,\n height: info.height,\n scaleFactor: info.scaleFactor,\n format: \"jpg\",\n };\n } finally {\n await unlink(tmpPath).catch(() => {});\n }\n}\n\n/**\n * Capture a screenshot of a specific screen region on macOS.\n * Uses screencapture -R x,y,w,h to crop to the given rectangle (logical coordinates).\n * Returns the image at logical resolution to match the coordinate space.\n */\nexport async function captureRegionScreenshot(\n region: RegionParams,\n): Promise<ScreenshotResult> {\n const tmpPath = join(tmpdir(), `vm0-zoom-${randomUUID()}.jpg`);\n\n try {\n const regionArg = `${region.x},${region.y},${region.width},${region.height}`;\n await execFileAsync(\"screencapture\", [\n \"-x\",\n \"-t\",\n \"jpg\",\n \"-R\",\n regionArg,\n tmpPath,\n ]);\n\n const info = await getScreenInfo();\n\n if (info.scaleFactor > 1) {\n await execFileAsync(\"sips\", [\n \"-z\",\n String(region.height),\n String(region.width),\n \"-s\",\n \"formatOptions\",\n \"80\",\n tmpPath,\n ]);\n }\n\n const buffer = await readFile(tmpPath);\n\n return {\n image: buffer.toString(\"base64\"),\n width: region.width,\n height: region.height,\n scaleFactor: info.scaleFactor,\n format: \"jpg\",\n };\n } finally {\n await unlink(tmpPath).catch(() => {});\n }\n}\n\ninterface DisplayResolution {\n _spdisplays_pixels?: string;\n _spdisplays_resolution?: string;\n spdisplays_resolution?: string;\n}\n\ninterface DisplayData {\n spdisplays_ndrvs?: DisplayResolution[];\n}\n\n/**\n * Get screen logical resolution and scale factor on macOS using system_profiler.\n * Returns logical (point) dimensions that match the coordinate space used by all operations.\n */\nexport async function getScreenInfo(): Promise<ScreenInfo> {\n const { stdout } = await execFileAsync(\"system_profiler\", [\n \"SPDisplaysDataType\",\n \"-json\",\n ]);\n\n const data = JSON.parse(stdout) as { SPDisplaysDataType?: DisplayData[] };\n const displays = data.SPDisplaysDataType ?? [];\n\n for (const gpu of displays) {\n const screens = gpu.spdisplays_ndrvs ?? [];\n for (const screen of screens) {\n const pixelStr = screen._spdisplays_pixels;\n if (pixelStr) {\n const pixelMatch = pixelStr.match(/(\\d+)\\s*x\\s*(\\d+)/);\n if (pixelMatch?.[1] && pixelMatch[2]) {\n const physicalWidth = parseInt(pixelMatch[1], 10);\n const physicalHeight = parseInt(pixelMatch[2], 10);\n\n const resStr =\n screen._spdisplays_resolution ?? screen.spdisplays_resolution ?? \"\";\n const resMatch = resStr.match(/(\\d+)\\s*x\\s*(\\d+)/);\n\n let scaleFactor: number;\n let logicalWidth: number;\n let logicalHeight: number;\n\n if (resMatch?.[1] && resMatch[2]) {\n logicalWidth = parseInt(resMatch[1], 10);\n logicalHeight = parseInt(resMatch[2], 10);\n scaleFactor = Math.round(physicalWidth / logicalWidth);\n } else {\n const isRetina = /retina/i.test(resStr);\n scaleFactor = isRetina ? 2 : 1;\n logicalWidth = Math.floor(physicalWidth / scaleFactor);\n logicalHeight = Math.floor(physicalHeight / scaleFactor);\n }\n\n return {\n width: logicalWidth,\n height: logicalHeight,\n scaleFactor,\n };\n }\n }\n }\n }\n\n return { width: 1920, height: 1080, scaleFactor: 1 };\n}\n","import { execFile } from \"child_process\";\nimport { promisify } from \"util\";\nimport { setTimeout as sleep } from \"timers/promises\";\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Drag from (startX, startY) to (endX, endY) using cliclick.\n * Sends dd (drag down) at start, then du (drag up) at end.\n */\nexport async function leftClickDrag(\n startX: number,\n startY: number,\n endX: number,\n endY: number,\n): Promise<void> {\n await execFileAsync(\"cliclick\", [\n `dd:${startX},${startY}`,\n `du:${endX},${endY}`,\n ]);\n}\n\n/**\n * Press and hold the left mouse button at (x, y).\n */\nexport async function leftMouseDown(x: number, y: number): Promise<void> {\n await execFileAsync(\"cliclick\", [`dd:${x},${y}`]);\n}\n\n/**\n * Release the left mouse button at (x, y).\n */\nexport async function leftMouseUp(x: number, y: number): Promise<void> {\n await execFileAsync(\"cliclick\", [`du:${x},${y}`]);\n}\n\nexport type MouseAction =\n | \"left_click\"\n | \"right_click\"\n | \"middle_click\"\n | \"double_click\"\n | \"triple_click\"\n | \"move\";\n\nconst ACTION_COMMANDS: Record<MouseAction, string> = {\n left_click: \"c\",\n right_click: \"rc\",\n middle_click: \"mc\",\n double_click: \"dc\",\n triple_click: \"tc\",\n move: \"m\",\n};\n\nexport const VALID_ACTIONS = new Set<string>(Object.keys(ACTION_COMMANDS));\n\n/**\n * Check whether cliclick is available on the system.\n * Returns true if installed, false otherwise.\n */\nexport async function isCliclickInstalled(): Promise<boolean> {\n try {\n await execFileAsync(\"which\", [\"cliclick\"]);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Verify that cliclick is installed on the system.\n * Throws with install instructions if not found.\n */\nasync function checkCliclickInstalled(): Promise<void> {\n try {\n await execFileAsync(\"which\", [\"cliclick\"]);\n } catch {\n throw new Error(\"cliclick not found. Install with: brew install cliclick\");\n }\n}\n\n/**\n * Execute a mouse action at the given coordinates using cliclick.\n */\nexport async function executeMouseAction(\n action: MouseAction,\n x: number,\n y: number,\n): Promise<void> {\n await checkCliclickInstalled();\n const prefix = ACTION_COMMANDS[action];\n await execFileAsync(\"cliclick\", [`${prefix}:${x},${y}`]);\n}\n\n/**\n * Get the current cursor position using cliclick.\n * Returns coordinates in points.\n */\nexport async function getCursorPosition(): Promise<{\n x: number;\n y: number;\n}> {\n await checkCliclickInstalled();\n const { stdout } = await execFileAsync(\"cliclick\", [\"p\"]);\n const parts = stdout.trim().split(\",\");\n const xStr = parts[0];\n const yStr = parts[1];\n if (parts.length !== 2 || xStr === undefined || yStr === undefined) {\n throw new Error(`Unexpected cliclick output: ${stdout.trim()}`);\n }\n const x = parseInt(xStr, 10);\n const y = parseInt(yStr, 10);\n if (Number.isNaN(x) || Number.isNaN(y)) {\n throw new Error(`Failed to parse cursor position: ${stdout.trim()}`);\n }\n return { x, y };\n}\n\nconst VALID_SPECIAL_KEYS = new Set([\n \"cmd\",\n \"ctrl\",\n \"alt\",\n \"shift\",\n \"fn\",\n \"arrow-up\",\n \"arrow-down\",\n \"arrow-left\",\n \"arrow-right\",\n \"tab\",\n \"esc\",\n \"space\",\n \"delete\",\n \"return\",\n \"enter\",\n \"home\",\n \"end\",\n \"page-up\",\n \"page-down\",\n ...Array.from({ length: 19 }, (_, i) => {\n return `f${i + 1}`;\n }),\n]);\n\nfunction isValidKeyName(key: string): boolean {\n return VALID_SPECIAL_KEYS.has(key) || key.length === 1;\n}\n\nfunction parseKeyCombo(keys: string): {\n modifiers: string[];\n mainKey: string;\n} {\n const parts = keys.split(\"+\");\n if (\n parts.length === 0 ||\n parts.some((p) => {\n return p === \"\";\n })\n ) {\n throw new Error(`Invalid key combo: \"${keys}\"`);\n }\n\n const mainKey = parts[parts.length - 1]!;\n const modifiers = parts.slice(0, -1);\n\n for (const key of parts) {\n if (!isValidKeyName(key)) {\n throw new Error(\n `Unknown key: \"${key}\". Valid keys: single characters, or special keys like cmd, ctrl, alt, shift, tab, esc, return, arrow-up, f1-f19, etc.`,\n );\n }\n }\n\n return { modifiers, mainKey };\n}\n\n/**\n * Build the cliclick command to press or type a key.\n * Special keys (return, tab, arrow-up, etc.) use `kp:`, regular characters use `t:`.\n */\nfunction keyAction(key: string): string {\n return VALID_SPECIAL_KEYS.has(key) ? `kp:${key}` : `t:${key}`;\n}\n\n/**\n * Press a key combination using cliclick.\n * Accepts combo strings like \"cmd+c\", \"ctrl+shift+s\", or single keys like \"return\".\n */\nexport async function pressKey(keys: string): Promise<void> {\n const { modifiers, mainKey } = parseKeyCombo(keys);\n\n if (modifiers.length === 0) {\n await execFileAsync(\"cliclick\", [keyAction(mainKey)]);\n return;\n }\n\n const args: string[] = [];\n for (const mod of modifiers) {\n args.push(`kd:${mod}`);\n }\n args.push(keyAction(mainKey));\n for (let i = modifiers.length - 1; i >= 0; i--) {\n args.push(`ku:${modifiers[i]}`);\n }\n await execFileAsync(\"cliclick\", args);\n}\n\n/**\n * Hold key(s) down for a specified duration then release.\n * Accepts combo strings like \"shift\" or \"cmd+shift\".\n */\nexport async function holdKey(keys: string, durationMs: number): Promise<void> {\n const { modifiers, mainKey } = parseKeyCombo(keys);\n const allKeys = [...modifiers, mainKey];\n\n const downArgs = allKeys.map((k) => {\n return `kd:${k}`;\n });\n const upArgs = [...allKeys].reverse().map((k) => {\n return `ku:${k}`;\n });\n\n await execFileAsync(\"cliclick\", downArgs);\n await sleep(durationMs);\n await execFileAsync(\"cliclick\", upArgs);\n}\n\n/**\n * Type text at the current cursor position using cliclick.\n */\nexport async function typeText(text: string): Promise<void> {\n await execFileAsync(\"cliclick\", [`t:${text}`]);\n}\n","import { execFile } from \"child_process\";\nimport { promisify } from \"util\";\n\nconst execFileAsync = promisify(execFile);\n\nexport type ScrollDirection = \"up\" | \"down\" | \"left\" | \"right\";\n\nconst DEFAULT_SCROLL_AMOUNT = 3;\n\n/**\n * Scroll at the given screen position using cliclick (mouse move) + osascript (CGEvent scroll).\n *\n * cliclick handles cursor positioning; osascript with CoreGraphics CGEvent API\n * handles the scroll wheel event (cliclick has no native scroll support).\n */\nexport async function scroll(\n x: number,\n y: number,\n direction: ScrollDirection,\n amount: number = DEFAULT_SCROLL_AMOUNT,\n): Promise<void> {\n // Move cursor to target position\n await execFileAsync(\"cliclick\", [`m:${x},${y}`]);\n\n // CGEvent scroll: positive dy = scroll up, negative dy = scroll down\n // Second wheel axis: positive dx = scroll left, negative dx = scroll right\n let dy = 0;\n let dx = 0;\n switch (direction) {\n case \"up\":\n dy = amount;\n break;\n case \"down\":\n dy = -amount;\n break;\n case \"left\":\n dx = amount;\n break;\n case \"right\":\n dx = -amount;\n break;\n }\n\n const script = [\n \"ObjC.import('CoreGraphics');\",\n `var e = $.CGEventCreateScrollWheelEvent(null, 0, 2, ${dy}, ${dx});`,\n \"$.CGEventPost($.kCGHIDEventTap, e);\",\n ].join(\" \");\n\n await execFileAsync(\"osascript\", [\"-l\", \"JavaScript\", \"-e\", script]);\n}\n","import { execFile, spawn } from \"child_process\";\nimport { promisify } from \"util\";\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Read text content from the macOS clipboard using pbpaste.\n */\nexport async function readClipboard(): Promise<string> {\n const { stdout } = await execFileAsync(\"pbpaste\");\n return stdout;\n}\n\n/**\n * Write text content to the macOS clipboard using pbcopy.\n */\nexport async function writeClipboard(text: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const proc = spawn(\"pbcopy\", { stdio: [\"pipe\", \"ignore\", \"ignore\"] });\n proc.on(\"error\", reject);\n proc.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`pbcopy exited with code ${code}`));\n }\n });\n proc.stdin.end(text);\n });\n}\n","import { execFile } from \"child_process\";\nimport { promisify } from \"util\";\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Open or activate a macOS application by name or bundle ID.\n * Detects bundle IDs by the presence of dots (e.g., com.apple.Safari).\n */\nexport async function openApplication(nameOrBundleId: string): Promise<void> {\n const isBundleId = nameOrBundleId.includes(\".\");\n const flag = isBundleId ? \"-b\" : \"-a\";\n await execFileAsync(\"open\", [flag, nameOrBundleId]);\n}\n","// Dynamic import is intentional: @ngrok/ngrok contains native binaries that\n// crash on systems with GLIBC version mismatches. Lazy-loading ensures the\n// crash only affects the command that needs ngrok, not the entire CLI.\n// See: https://github.com/vm0-ai/vm0/issues/6825\nasync function loadNgrok(): Promise<typeof import(\"@ngrok/ngrok\")> {\n try {\n const mod = await import(\"@ngrok/ngrok\");\n return mod.default;\n } catch (cause) {\n throw new Error(\n \"Failed to load ngrok tunnel module. \" +\n \"This may be caused by a system library (GLIBC) incompatibility. \" +\n \"See: https://github.com/vm0-ai/vm0/issues/6825\",\n { cause },\n );\n }\n}\n\nexport async function startDesktopTunnel(\n ngrokToken: string,\n endpointPrefix: string,\n port: number,\n): Promise<void> {\n const ngrok = await loadNgrok();\n\n await ngrok.forward({\n addr: `localhost:${port}`,\n authtoken: ngrokToken,\n domain: `desktop.${endpointPrefix}.internal`,\n });\n}\n\nexport async function stopDesktopTunnel(): Promise<void> {\n const ngrok = await loadNgrok();\n await ngrok.kill();\n}\n","import { Command } from \"commander\";\nimport { writeFile, mkdir } from \"fs/promises\";\nimport { join } from \"path\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\nimport { callHost } from \"../../../lib/computer-use/client\";\n\nfunction mouseClickCommand(\n name: string,\n action: string,\n description: string,\n): Command {\n return new Command()\n .name(name)\n .description(description)\n .argument(\"<x>\", \"X coordinate (points)\")\n .argument(\"<y>\", \"Y coordinate (points)\")\n .action(\n withErrorHandler(async (xStr: string, yStr: string) => {\n const x = parseInt(xStr, 10);\n const y = parseInt(yStr, 10);\n if (Number.isNaN(x) || Number.isNaN(y)) {\n throw new Error(\"Coordinates must be integers\");\n }\n const response = await callHost(\"/mouse\", {\n method: \"POST\",\n body: { action, x, y },\n });\n const data = await response.json();\n process.stdout.write(JSON.stringify(data) + \"\\n\");\n }),\n );\n}\n\nexport const clientScreenshotCommand = new Command()\n .name(\"screenshot\")\n .description(\"Capture a screenshot from the remote host\")\n .action(\n withErrorHandler(async () => {\n const response = await callHost(\"/screenshot\");\n const data = (await response.json()) as {\n width: number;\n height: number;\n scaleFactor: number;\n format: string;\n image: string;\n };\n\n const dir = \"/tmp/computer-use\";\n await mkdir(dir, { recursive: true });\n\n const timestamp = Date.now();\n const filePath = join(dir, `screenshot-${timestamp}.${data.format}`);\n const buffer = Buffer.from(data.image, \"base64\");\n await writeFile(filePath, buffer);\n\n // Path to stdout for programmatic consumption\n process.stdout.write(`${filePath}\\n`);\n\n // Metadata to stderr for human/debug consumption\n process.stderr.write(\n JSON.stringify({\n width: data.width,\n height: data.height,\n scaleFactor: data.scaleFactor,\n }) + \"\\n\",\n );\n }),\n );\n\nexport const clientZoomCommand = new Command()\n .name(\"zoom\")\n .description(\"Capture a region screenshot from the remote host\")\n .requiredOption(\"--x <number>\", \"X coordinate of the region\")\n .requiredOption(\"--y <number>\", \"Y coordinate of the region\")\n .requiredOption(\"--width <number>\", \"Width of the region\")\n .requiredOption(\"--height <number>\", \"Height of the region\")\n .action(\n withErrorHandler(\n async (opts: { x: string; y: string; width: string; height: string }) => {\n const params = new URLSearchParams({\n x: opts.x,\n y: opts.y,\n width: opts.width,\n height: opts.height,\n });\n const response = await callHost(`/zoom?${params.toString()}`);\n const data = (await response.json()) as {\n width: number;\n height: number;\n scaleFactor: number;\n format: string;\n image: string;\n };\n\n const dir = \"/tmp/computer-use\";\n await mkdir(dir, { recursive: true });\n\n const timestamp = Date.now();\n const filePath = join(dir, `zoom-${timestamp}.${data.format}`);\n const buffer = Buffer.from(data.image, \"base64\");\n await writeFile(filePath, buffer);\n\n process.stdout.write(`${filePath}\\n`);\n\n process.stderr.write(\n JSON.stringify({\n width: data.width,\n height: data.height,\n scaleFactor: data.scaleFactor,\n }) + \"\\n\",\n );\n },\n ),\n );\n\nexport const clientInfoCommand = new Command()\n .name(\"info\")\n .description(\"Get screen info from the remote host\")\n .action(\n withErrorHandler(async () => {\n const response = await callHost(\"/info\");\n const data = (await response.json()) as {\n width: number;\n height: number;\n scaleFactor: number;\n };\n\n process.stdout.write(JSON.stringify(data) + \"\\n\");\n }),\n );\n\nexport const clientLeftClickCommand = mouseClickCommand(\n \"left-click\",\n \"left_click\",\n \"Perform a left click at coordinates\",\n);\n\nexport const clientRightClickCommand = mouseClickCommand(\n \"right-click\",\n \"right_click\",\n \"Perform a right click at coordinates\",\n);\n\nexport const clientMiddleClickCommand = mouseClickCommand(\n \"middle-click\",\n \"middle_click\",\n \"Perform a middle click at coordinates\",\n);\n\nexport const clientDoubleClickCommand = mouseClickCommand(\n \"double-click\",\n \"double_click\",\n \"Perform a double click at coordinates\",\n);\n\nexport const clientTripleClickCommand = mouseClickCommand(\n \"triple-click\",\n \"triple_click\",\n \"Perform a triple click at coordinates\",\n);\n\nexport const clientLeftClickDragCommand = new Command()\n .name(\"left-click-drag\")\n .description(\"Drag from (startX, startY) to (endX, endY)\")\n .argument(\"<startX>\", \"Start X coordinate\")\n .argument(\"<startY>\", \"Start Y coordinate\")\n .argument(\"<endX>\", \"End X coordinate\")\n .argument(\"<endY>\", \"End Y coordinate\")\n .action(\n withErrorHandler(\n async (startX: string, startY: string, endX: string, endY: string) => {\n await callHost(\"/mouse\", {\n method: \"POST\",\n body: {\n action: \"left_click_drag\",\n startX: Number(startX),\n startY: Number(startY),\n endX: Number(endX),\n endY: Number(endY),\n },\n });\n process.stdout.write(\"ok\\n\");\n },\n ),\n );\n\nexport const clientLeftMouseDownCommand = new Command()\n .name(\"left-mouse-down\")\n .description(\"Press and hold the left mouse button at (x, y)\")\n .argument(\"<x>\", \"X coordinate\")\n .argument(\"<y>\", \"Y coordinate\")\n .action(\n withErrorHandler(async (x: string, y: string) => {\n await callHost(\"/mouse\", {\n method: \"POST\",\n body: { action: \"left_mouse_down\", x: Number(x), y: Number(y) },\n });\n process.stdout.write(\"ok\\n\");\n }),\n );\n\nexport const clientLeftMouseUpCommand = new Command()\n .name(\"left-mouse-up\")\n .description(\"Release the left mouse button at (x, y)\")\n .argument(\"<x>\", \"X coordinate\")\n .argument(\"<y>\", \"Y coordinate\")\n .action(\n withErrorHandler(async (x: string, y: string) => {\n await callHost(\"/mouse\", {\n method: \"POST\",\n body: { action: \"left_mouse_up\", x: Number(x), y: Number(y) },\n });\n process.stdout.write(\"ok\\n\");\n }),\n );\n\nexport const clientScrollCommand = new Command()\n .name(\"scroll\")\n .description(\"Scroll at the given screen position\")\n .argument(\"<x>\", \"X coordinate\")\n .argument(\"<y>\", \"Y coordinate\")\n .argument(\"<direction>\", \"Scroll direction: up, down, left, right\")\n .argument(\"[amount]\", \"Scroll amount in lines (default 3)\")\n .action(\n withErrorHandler(\n async (x: string, y: string, direction: string, amount?: string) => {\n await callHost(\"/mouse\", {\n method: \"POST\",\n body: {\n action: \"scroll\",\n x: Number(x),\n y: Number(y),\n direction,\n ...(amount !== undefined && { amount: Number(amount) }),\n },\n });\n process.stdout.write(\"ok\\n\");\n },\n ),\n );\n\nexport const clientReadClipboardCommand = new Command()\n .name(\"read-clipboard\")\n .description(\"Read text content from the remote clipboard\")\n .action(\n withErrorHandler(async () => {\n const response = await callHost(\"/clipboard\");\n const data = (await response.json()) as { text: string };\n process.stdout.write(data.text);\n }),\n );\n\nexport const clientWriteClipboardCommand = new Command()\n .name(\"write-clipboard\")\n .description(\"Write text content to the remote clipboard\")\n .argument(\"<text>\", \"Text to write to clipboard\")\n .action(\n withErrorHandler(async (text: string) => {\n await callHost(\"/clipboard\", {\n method: \"POST\",\n body: { text },\n });\n process.stdout.write(\"ok\\n\");\n }),\n );\n\nexport const clientKeyCommand = new Command()\n .name(\"key\")\n .description(\"Press a key or key combination (e.g., cmd+c, return)\")\n .argument(\"<combo>\", \"Key combo string (e.g., cmd+c, ctrl+shift+s, return)\")\n .action(\n withErrorHandler(async (combo: string) => {\n await callHost(\"/keyboard\", {\n method: \"POST\",\n body: { action: \"key\", keys: combo },\n });\n process.stdout.write(\"ok\\n\");\n }),\n );\n\nexport const clientHoldKeyCommand = new Command()\n .name(\"hold-key\")\n .description(\"Hold a key or key combination for a duration\")\n .argument(\"<combo>\", \"Key combo string (e.g., shift, cmd+shift)\")\n .argument(\"<durationMs>\", \"Duration to hold in milliseconds\")\n .action(\n withErrorHandler(async (combo: string, durationStr: string) => {\n const durationMs = parseInt(durationStr, 10);\n if (Number.isNaN(durationMs) || durationMs <= 0) {\n throw new Error(\"durationMs must be a positive integer\");\n }\n await callHost(\"/keyboard\", {\n method: \"POST\",\n body: { action: \"hold_key\", keys: combo, durationMs },\n });\n process.stdout.write(\"ok\\n\");\n }),\n );\n\nexport const clientTypeCommand = new Command()\n .name(\"type\")\n .description(\"Type text at the current cursor position\")\n .argument(\"<text>\", \"Text to type\")\n .action(\n withErrorHandler(async (text: string) => {\n await callHost(\"/keyboard\", {\n method: \"POST\",\n body: { action: \"type\", text },\n });\n process.stdout.write(\"ok\\n\");\n }),\n );\n\nexport const clientOpenAppCommand = new Command()\n .name(\"open-app\")\n .description(\"Open or activate a macOS application by name or bundle ID\")\n .argument(\n \"<nameOrBundleId>\",\n \"App name (e.g., Safari) or bundle ID (e.g., com.apple.Safari)\",\n )\n .action(\n withErrorHandler(async (nameOrBundleId: string) => {\n await callHost(\"/open-application\", {\n method: \"POST\",\n body: { nameOrBundleId },\n });\n process.stdout.write(\"ok\\n\");\n }),\n );\n\nexport const clientMouseMoveCommand = mouseClickCommand(\n \"mouse-move\",\n \"move\",\n \"Move mouse pointer to coordinates\",\n);\n\nexport const clientCursorPositionCommand = new Command()\n .name(\"cursor-position\")\n .description(\"Get current cursor position from the remote host\")\n .action(\n withErrorHandler(async () => {\n const response = await callHost(\"/cursor-position\");\n const data = (await response.json()) as { x: number; y: number };\n process.stdout.write(JSON.stringify(data) + \"\\n\");\n }),\n );\n","import { getComputerUseHost } from \"../api\";\n\nlet cachedHost: { domain: string; token: string; cachedAt: number } | null =\n null;\nconst CACHE_TTL_MS = 30_000;\n\n/**\n * Discover the active computer-use host for the current org/user.\n * Results are cached for 30 seconds.\n */\nasync function discoverHost(): Promise<{\n domain: string;\n token: string;\n}> {\n if (cachedHost && Date.now() - cachedHost.cachedAt < CACHE_TTL_MS) {\n return { domain: cachedHost.domain, token: cachedHost.token };\n }\n\n const host = await getComputerUseHost();\n if (!host) {\n throw new Error(\n \"No active computer-use host found\\n\\n\" +\n \"Start a host with: zero computer-use host start\",\n );\n }\n\n cachedHost = { ...host, cachedAt: Date.now() };\n return host;\n}\n\n/**\n * Make an HTTP request to the computer-use host.\n */\nexport async function callHost(\n path: string,\n options?: { method?: string; body?: unknown },\n): Promise<Response> {\n const { domain, token } = await discoverHost();\n const url = `https://desktop.${domain}${path}`;\n\n const headers: Record<string, string> = { \"x-vm0-token\": token };\n const init: RequestInit = { headers };\n\n if (options?.method) {\n init.method = options.method;\n }\n if (options?.body !== undefined) {\n headers[\"content-type\"] = \"application/json\";\n init.body = JSON.stringify(options.body);\n }\n\n const response = await fetch(url, init);\n\n if (!response.ok) {\n const body = await response.text().catch(() => {\n return \"\";\n });\n throw new Error(\n `Host returned ${response.status}: ${body || response.statusText}`,\n );\n }\n\n return response;\n}\n","import { Command } from \"commander\";\nimport { downloadFileCommand } from \"./download-file\";\nimport { uploadFileCommand } from \"./upload-file\";\n\nexport const zeroWebCommand = new Command()\n .name(\"web\")\n .description(\"Upload and download files via the web chat endpoint\")\n .addCommand(downloadFileCommand)\n .addCommand(uploadFileCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Upload a file: zero web upload-file -f /tmp/report.pdf\n Download a file: zero web download-file <file-id> -o /tmp/out.pdf`,\n );\n","import { join } from \"path\";\nimport { tmpdir } from \"os\";\nimport { Command } from \"commander\";\nimport { downloadWebFile } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\n/**\n * Derive a local output path for a web-uploaded file id.\n * Uses the system temp directory.\n */\nfunction defaultOutPath(fileId: string): string {\n return join(tmpdir(), `web-${fileId}`);\n}\n\nexport const downloadFileCommand = new Command()\n .name(\"download-file\")\n .description(\"Download a web-uploaded file by id\")\n .argument(\"<file-id>\", \"File id (UUID returned by the upload API)\")\n .option(\n \"-o, --out <path>\",\n \"Output path for the downloaded file (default: /tmp/web-<file-id>)\",\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n Download to default temp path: zero web download-file abc-123-def\n Download to explicit path: zero web download-file abc-123-def -o /tmp/report.pdf\n\nOutput:\n Prints a JSON object to stdout on success:\n {\"path\":\"/tmp/web-abc-123-def\",\"mimetype\":\"application/pdf\",\"size\":12345}\n\nHow to read the downloaded file:\n - Images (png/jpg/gif/webp/svg): open the file path with your image viewing tool\n - Videos (mp4/mov/webm): extract frames first with\n ffmpeg -i <path> -vf \"fps=1\" -q:v 2 /tmp/<file-id>_frame_%03d.jpg\n then view the extracted frames\n - PDF/text/csv/json/markdown: read the file directly\n\nNotes:\n - Authenticates via ZERO_TOKEN\n - Streams the file bytes directly to disk`,\n )\n .action(\n withErrorHandler(async (fileId: string, options: { out?: string }) => {\n const outPath = options.out ?? defaultOutPath(fileId);\n const result = await downloadWebFile(fileId, outPath);\n console.log(JSON.stringify(result));\n }),\n );\n","import { Command } from \"commander\";\nimport { uploadWebFile } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const uploadFileCommand = new Command()\n .name(\"upload-file\")\n .description(\"Upload a local file and print a permanent URL\")\n .requiredOption(\"-f, --file <path>\", \"Local file path to upload\")\n .option(\"--content-type <mime>\", \"Override inferred content type\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Upload a file: zero web upload-file -f /tmp/report.pdf\n Override content-type: zero web upload-file -f /tmp/data --content-type text/csv\n\nOutput:\n Prints a JSON object to stdout on success:\n {\"id\":\"...\",\"filename\":\"...\",\"contentType\":\"...\",\"size\":N,\"url\":\"https://...\"}\n\nNotes:\n - Authenticates via ZERO_TOKEN (requires file:write capability)\n - Returned URL is permanent (serves a short-lived signed redirect on access)\n - Safe to persist in chat messages or share over external channels\n - Max file size: 1 GB\n - Allowed types: png / jpeg / gif / webp / svg / mp4 / webm / mov / pdf / txt / csv / md / html / json`,\n )\n .action(\n withErrorHandler(\n async (options: { file: string; contentType?: string }) => {\n const result = await uploadWebFile(options.file, {\n contentType: options.contentType,\n });\n console.log(JSON.stringify(result));\n },\n ),\n );\n"],"mappings":"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","names":["listCommand","setCommand","removeCommand","listCommand","setCommand","removeCommand","listCommand","setCommand","removeCommand","listCommand","setCommand","removeCommand","listCommand","import_prompts","prompts","type","config","prompts","selectedModel","provider","defaultNote","modelNote","removeCommand","listCommand","removeCommand","readFileSync","readFileSync","listCommand","deleteCommand","listCommand","deleteCommand","listCommand","statusCommand","listCommand","statusCommand","detectTimezone","readFileSync","day","readFileSync","setupCommand","listCommand","statusCommand","deleteCommand","setupCommand","listCommand","statusCommand","deleteCommand","listCommand","setCommand","deleteCommand","listCommand","setCommand","deleteCommand","readFileSync","readFileSync","readFileSync","sendCommand","readFileSync","sendCommand","readFileSync","readFileSync","listCommand","listCommand","join","tmpdir","defaultOutPath","join","tmpdir","downloadFileCommand","readFileSync","sendCommand","readFileSync","sendCommand","readFileSync","statSync","basename","uploadFileCommand","statSync","basename","readFileSync","downloadFileCommand","uploadFileCommand","truncateValue","listCommand","setCommand","deleteCommand","listCommand","setCommand","deleteCommand","formatConnectorIdentity","unknownIcon","readFileSync","join","createCommand","editCommand","viewCommand","listCommand","deleteCommand","createCommand","editCommand","viewCommand","listCommand","deleteCommand","listCommand","parseLimit","searchCommand","listCommand","searchCommand","SEVEN_DAYS_MS","parseContextOptions","parseLimit","join","tmpdir","execFile","promisify","sleep","execFileAsync","execFile","promisify","execFileAsync","execFile","promisify","execFileAsync","execFile","promisify","execFileAsync","join","join","join","tmpdir","defaultOutPath","join","tmpdir","downloadFileCommand","uploadFileCommand","downloadFileCommand","uploadFileCommand"]}
|