@vm0/cli 9.249.0 → 9.249.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/{agent-J7UZFWFE.js → agent-TOFXTWYP.js} +11 -10
  2. package/{agent-J7UZFWFE.js.map → agent-TOFXTWYP.js.map} +1 -1
  3. package/{banking-TLHPJBS5.js → banking-U7I6EJUO.js} +8 -7
  4. package/{banking-TLHPJBS5.js.map → banking-U7I6EJUO.js.map} +1 -1
  5. package/{chat-PWHG42AL.js → chat-77EDGFMS.js} +9 -8
  6. package/{chat-PWHG42AL.js.map → chat-77EDGFMS.js.map} +1 -1
  7. package/{chunk-DIRAZ3YX.js → chunk-3VVCUQPB.js} +3 -3
  8. package/{chunk-DIRAZ3YX.js.map → chunk-3VVCUQPB.js.map} +1 -1
  9. package/{chunk-LDQPMTQY.js → chunk-4HN7U3JF.js} +103 -625
  10. package/chunk-4HN7U3JF.js.map +1 -0
  11. package/{chunk-ZJENFGWZ.js → chunk-5CZNUTFF.js} +3 -3
  12. package/chunk-A2NKQGRI.js +491 -0
  13. package/chunk-A2NKQGRI.js.map +1 -0
  14. package/{chunk-6IFIMWPY.js → chunk-AFNSFKAH.js} +5 -5
  15. package/{chunk-XE764T2N.js → chunk-BQOOTJNB.js} +27 -672
  16. package/chunk-BQOOTJNB.js.map +1 -0
  17. package/{chunk-KLIW3XK7.js → chunk-GPF7NSX7.js} +2 -2
  18. package/{chunk-HJOW32CJ.js → chunk-HSGQT7LT.js} +3 -3
  19. package/{chunk-PD3A7MGG.js → chunk-JCLLQRCI.js} +3 -3
  20. package/{chunk-B3W2RUBP.js → chunk-LD4ZVU4O.js} +2 -2
  21. package/chunk-N6TDQYGF.js +678 -0
  22. package/chunk-N6TDQYGF.js.map +1 -0
  23. package/{chunk-3QXK5RR7.js → chunk-ROB3OE37.js} +17 -113
  24. package/chunk-ROB3OE37.js.map +1 -0
  25. package/{chunk-LTDQISD7.js → chunk-SB7EZ2ZO.js} +2 -2
  26. package/{chunk-RTYT3CSZ.js → chunk-UG5XA6KU.js} +2 -2
  27. package/{chunk-ZKWCFMDV.js → chunk-UNQJRTJQ.js} +3 -3
  28. package/chunk-W75R7EZF.js +17 -0
  29. package/chunk-W75R7EZF.js.map +1 -0
  30. package/chunk-WDDZJGWL.js +32 -0
  31. package/chunk-WDDZJGWL.js.map +1 -0
  32. package/{chunk-JFY6GK7Y.js → chunk-X2545RBX.js} +2 -2
  33. package/{chunk-ZE2VIESK.js → chunk-X4DBCBU4.js} +2 -2
  34. package/{computer-use-EE6NPCXS.js → computer-use-BCGPVGWS.js} +7 -6
  35. package/{computer-use-EE6NPCXS.js.map → computer-use-BCGPVGWS.js.map} +1 -1
  36. package/{connector-SCLSWTMT.js → connector-CHZSI2LW.js} +14 -13
  37. package/{connector-SCLSWTMT.js.map → connector-CHZSI2LW.js.map} +1 -1
  38. package/credit-RWFBPKOS.js +166 -0
  39. package/credit-RWFBPKOS.js.map +1 -0
  40. package/{developer-support-V3N3BOYC.js → developer-support-IVR3HIP7.js} +8 -7
  41. package/{developer-support-V3N3BOYC.js.map → developer-support-IVR3HIP7.js.map} +1 -1
  42. package/{doctor-AQLFJCC6.js → doctor-KGWTXW2Q.js} +39 -13
  43. package/doctor-KGWTXW2Q.js.map +1 -0
  44. package/{esm-PZKPCIYJ.js → esm-GOCEMHJO.js} +3 -3
  45. package/{feishu-XHOLF32I.js → feishu-PLF4P5OG.js} +8 -7
  46. package/{feishu-XHOLF32I.js.map → feishu-PLF4P5OG.js.map} +1 -1
  47. package/{finance-TF5RU7FD.js → finance-LVFG3WWP.js} +8 -7
  48. package/{finance-TF5RU7FD.js.map → finance-LVFG3WWP.js.map} +1 -1
  49. package/{generate-GFFAZX7Y.js → generate-4FIBMMJO.js} +77 -22
  50. package/generate-4FIBMMJO.js.map +1 -0
  51. package/{getMachineId-bsd-L73QENVB.js → getMachineId-bsd-SB7C44VX.js} +4 -4
  52. package/{getMachineId-darwin-TCCWKQ2S.js → getMachineId-darwin-R4BWY3CQ.js} +4 -4
  53. package/{getMachineId-linux-TJYYUZVM.js → getMachineId-linux-BR4HVNPW.js} +3 -3
  54. package/{getMachineId-unsupported-DPRVLH4Y.js → getMachineId-unsupported-FPGM635L.js} +3 -3
  55. package/{getMachineId-win-7EE436CJ.js → getMachineId-win-RB4JMF33.js} +4 -4
  56. package/{github-V4ZW6TI4.js → github-WHNAVVG3.js} +8 -7
  57. package/{github-V4ZW6TI4.js.map → github-WHNAVVG3.js.map} +1 -1
  58. package/{goal-TED5FUYM.js → goal-G4J2BQ5Z.js} +8 -7
  59. package/{goal-TED5FUYM.js.map → goal-G4J2BQ5Z.js.map} +1 -1
  60. package/{host-HKDD3CHD.js → host-3W6U2ZUP.js} +8 -7
  61. package/{host-HKDD3CHD.js.map → host-3W6U2ZUP.js.map} +1 -1
  62. package/{intro-MIVVJG7M.js → intro-PMHOBGDL.js} +3 -3
  63. package/{logs-SBMQQM46.js → logs-P7JLTGXY.js} +10 -9
  64. package/{logs-SBMQQM46.js.map → logs-P7JLTGXY.js.map} +1 -1
  65. package/{mail-SF5JKA2F.js → mail-LIAOXDD4.js} +12 -11
  66. package/{mail-SF5JKA2F.js.map → mail-LIAOXDD4.js.map} +1 -1
  67. package/{maps-D5NKFEAD.js → maps-C4NOXSE7.js} +8 -7
  68. package/{maps-D5NKFEAD.js.map → maps-C4NOXSE7.js.map} +1 -1
  69. package/{model-S7CMGRIH.js → model-I2MNQ5KC.js} +9 -8
  70. package/{model-S7CMGRIH.js.map → model-I2MNQ5KC.js.map} +1 -1
  71. package/{model-provider-ATXIDNKM.js → model-provider-AOCCHEMP.js} +9 -8
  72. package/{model-provider-ATXIDNKM.js.map → model-provider-AOCCHEMP.js.map} +1 -1
  73. package/{org-6JBRK5NL.js → org-MVBG3WXZ.js} +9 -8
  74. package/{org-6JBRK5NL.js.map → org-MVBG3WXZ.js.map} +1 -1
  75. package/package.json +1 -1
  76. package/{phone-B3UWRGWF.js → phone-4OZQFYHU.js} +8 -7
  77. package/{phone-B3UWRGWF.js.map → phone-4OZQFYHU.js.map} +1 -1
  78. package/{preference-HRRRUEP3.js → preference-H2A3WBGQ.js} +9 -8
  79. package/{preference-HRRRUEP3.js.map → preference-H2A3WBGQ.js.map} +1 -1
  80. package/{resource-65P5D2LT.js → resource-CPCQ6V6M.js} +9 -8
  81. package/{resource-65P5D2LT.js.map → resource-CPCQ6V6M.js.map} +1 -1
  82. package/{scrape-N3AWNV2R.js → scrape-6RMFDYAT.js} +8 -7
  83. package/{scrape-N3AWNV2R.js.map → scrape-6RMFDYAT.js.map} +1 -1
  84. package/{search-T76RE67L.js → search-HSQVSQZY.js} +10 -9
  85. package/{search-T76RE67L.js.map → search-HSQVSQZY.js.map} +1 -1
  86. package/{secret-WALMH6S2.js → secret-S4D6CNOX.js} +9 -8
  87. package/{secret-WALMH6S2.js.map → secret-S4D6CNOX.js.map} +1 -1
  88. package/{slack-WXDCNAI2.js → slack-E3E2NIDZ.js} +50 -175
  89. package/slack-E3E2NIDZ.js.map +1 -0
  90. package/{teams-LAQBLRUR.js → teams-CLEWT2LQ.js} +8 -7
  91. package/{teams-LAQBLRUR.js.map → teams-CLEWT2LQ.js.map} +1 -1
  92. package/{telegram-5BASFBEA.js → telegram-35FKKA4K.js} +8 -7
  93. package/{telegram-5BASFBEA.js.map → telegram-35FKKA4K.js.map} +1 -1
  94. package/{undici-ZMFN7TNU.js → undici-YXSVPIYI.js} +2 -2
  95. package/upgrade-DNGUR42E.js +50 -0
  96. package/upgrade-DNGUR42E.js.map +1 -0
  97. package/{variable-GBVHKR6I.js → variable-C7RWUPV6.js} +9 -8
  98. package/{variable-GBVHKR6I.js.map → variable-C7RWUPV6.js.map} +1 -1
  99. package/{video-3FXQGBYB.js → video-JS5VOA2S.js} +9 -7
  100. package/{video-3FXQGBYB.js.map → video-JS5VOA2S.js.map} +1 -1
  101. package/{weather-JNMUODGJ.js → weather-5R2N5OX4.js} +8 -7
  102. package/{weather-JNMUODGJ.js.map → weather-5R2N5OX4.js.map} +1 -1
  103. package/{web-DZT26X4I.js → web-FXIIYCZ7.js} +10 -8
  104. package/{web-DZT26X4I.js.map → web-FXIIYCZ7.js.map} +1 -1
  105. package/{web-search-36UUSSUX.js → web-search-SZP7J4UM.js} +8 -7
  106. package/{web-search-36UUSSUX.js.map → web-search-SZP7J4UM.js.map} +1 -1
  107. package/{whoami-NXYCNII4.js → whoami-J4FRN67A.js} +10 -9
  108. package/{whoami-NXYCNII4.js.map → whoami-J4FRN67A.js.map} +1 -1
  109. package/{workflow-WHTBJCEF.js → workflow-HQHZKXB2.js} +9 -8
  110. package/{workflow-WHTBJCEF.js.map → workflow-HQHZKXB2.js.map} +1 -1
  111. package/zero.js +88 -61
  112. package/zero.js.map +1 -1
  113. package/chunk-3QXK5RR7.js.map +0 -1
  114. package/chunk-LDQPMTQY.js.map +0 -1
  115. package/chunk-LRHXR7JT.js +0 -33
  116. package/chunk-LRHXR7JT.js.map +0 -1
  117. package/chunk-XE764T2N.js.map +0 -1
  118. package/credit-2VN2PYRE.js +0 -128
  119. package/credit-2VN2PYRE.js.map +0 -1
  120. package/doctor-AQLFJCC6.js.map +0 -1
  121. package/generate-GFFAZX7Y.js.map +0 -1
  122. package/slack-WXDCNAI2.js.map +0 -1
  123. /package/{chunk-ZJENFGWZ.js.map → chunk-5CZNUTFF.js.map} +0 -0
  124. /package/{chunk-6IFIMWPY.js.map → chunk-AFNSFKAH.js.map} +0 -0
  125. /package/{chunk-KLIW3XK7.js.map → chunk-GPF7NSX7.js.map} +0 -0
  126. /package/{chunk-HJOW32CJ.js.map → chunk-HSGQT7LT.js.map} +0 -0
  127. /package/{chunk-PD3A7MGG.js.map → chunk-JCLLQRCI.js.map} +0 -0
  128. /package/{chunk-B3W2RUBP.js.map → chunk-LD4ZVU4O.js.map} +0 -0
  129. /package/{chunk-LTDQISD7.js.map → chunk-SB7EZ2ZO.js.map} +0 -0
  130. /package/{chunk-RTYT3CSZ.js.map → chunk-UG5XA6KU.js.map} +0 -0
  131. /package/{chunk-ZKWCFMDV.js.map → chunk-UNQJRTJQ.js.map} +0 -0
  132. /package/{chunk-JFY6GK7Y.js.map → chunk-X2545RBX.js.map} +0 -0
  133. /package/{chunk-ZE2VIESK.js.map → chunk-X4DBCBU4.js.map} +0 -0
  134. /package/{esm-PZKPCIYJ.js.map → esm-GOCEMHJO.js.map} +0 -0
  135. /package/{getMachineId-bsd-L73QENVB.js.map → getMachineId-bsd-SB7C44VX.js.map} +0 -0
  136. /package/{getMachineId-darwin-TCCWKQ2S.js.map → getMachineId-darwin-R4BWY3CQ.js.map} +0 -0
  137. /package/{getMachineId-linux-TJYYUZVM.js.map → getMachineId-linux-BR4HVNPW.js.map} +0 -0
  138. /package/{getMachineId-unsupported-DPRVLH4Y.js.map → getMachineId-unsupported-FPGM635L.js.map} +0 -0
  139. /package/{getMachineId-win-7EE436CJ.js.map → getMachineId-win-RB4JMF33.js.map} +0 -0
  140. /package/{intro-MIVVJG7M.js.map → intro-PMHOBGDL.js.map} +0 -0
  141. /package/{undici-ZMFN7TNU.js.map → undici-YXSVPIYI.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/zero/connector/index.ts","../src/commands/zero/connector/check.ts","../src/commands/zero/connector/computer-use-guidance.ts","../src/commands/zero/connector/action-url.ts","../src/commands/zero/connector/connect.ts","../src/commands/zero/connector/list.ts","../src/commands/zero/connector/connected-as.ts","../src/commands/zero/connector/search.ts","../src/commands/zero/connector/status.ts","../src/commands/zero/connector/custom/index.ts","../src/commands/zero/connector/permission-request.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { checkConnectorCommand } from \"./check\";\nimport { connectCommand } from \"./connect\";\nimport { listCommand } from \"./list\";\nimport { searchCommand } from \"./search\";\nimport { statusCommand } from \"./status\";\nimport { customConnectorCommand } from \"./custom\";\nimport { permissionRequestCommand } from \"./permission-request\";\n\nexport const zeroConnectorCommand = new Command()\n .name(\"connector\")\n .description(\"Manage and diagnose third-party service connections\")\n .addCommand(checkConnectorCommand)\n .addCommand(customConnectorCommand)\n .addCommand(connectCommand)\n .addCommand(listCommand)\n .addCommand(searchCommand)\n .addCommand(statusCommand)\n .addCommand(permissionRequestCommand);\n","import { Command, Option } from \"commander\";\nimport type { ConnectorRef } from \"@vm0/api-contracts/contracts/connector-identity\";\nimport type {\n ConnectorCheckDiagnosticResult,\n ConnectorCheckPolicy,\n ConnectorCheckRequest,\n} from \"@vm0/api-contracts/contracts/zero-connector-check\";\n\nimport { getApiUrl } from \"../../../lib/api/config\";\nimport {\n diagnoseZeroConnectorCheck,\n getZeroConnector,\n} from \"../../../lib/api/domains/zero-connectors\";\nimport { getZeroAgentUserConnectors } from \"../../../lib/api/domains/zero-agents\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { toPlatformUrl } from \"../doctor/platform-url\";\nimport {\n isComputerUsePermissionTarget,\n printComputerUsePermissionGuidance,\n} from \"./computer-use-guidance\";\nimport {\n CALLBACK_PROMPT_PLACEHOLDER,\n connectorActionUrl,\n currentChatSupportsActionCallback,\n printCallbackActionUrlExample,\n} from \"./action-url\";\n\ninterface CheckConnectorOptions {\n readonly connector?: string;\n readonly envName?: string;\n readonly url?: string;\n readonly method: string;\n readonly checkPermission?: string;\n}\n\ntype ValidatedCheckConnectorOptions = CheckConnectorOptions &\n (\n | { readonly url: string }\n | { readonly url?: undefined; readonly envName: string }\n );\n\ntype ResolvedDiagnostic = Extract<\n ConnectorCheckDiagnosticResult,\n { readonly outcome: \"resolved\" }\n>;\ntype ResolvedUrlDiagnostic = Extract<\n ResolvedDiagnostic,\n { readonly mode: \"url\" }\n>;\ntype ResolvedEnvironmentDiagnostic = Extract<\n ResolvedDiagnostic,\n { readonly mode: \"environment\" }\n>;\ntype UrlDiagnosticRequest = Extract<\n ConnectorCheckRequest,\n { readonly mode: \"url\" }\n>;\n\ninterface DiagContext {\n readonly environmentNames: readonly string[] | null;\n readonly connectorRef: ConnectorRef;\n readonly label: string;\n readonly connectorAvailable: boolean;\n readonly credentialResolution: \"network-boundary\" | \"none\";\n readonly run: ResolvedDiagnostic[\"run\"];\n readonly platformOrigin: string;\n readonly agentId: string | undefined;\n}\n\nfunction stripUrlQueryAndFragment(url: string): string {\n const queryIndex = url.indexOf(\"?\");\n const fragmentIndex = url.indexOf(\"#\");\n let end = url.length;\n if (queryIndex !== -1) end = Math.min(end, queryIndex);\n if (fragmentIndex !== -1) end = Math.min(end, fragmentIndex);\n return url.slice(0, end);\n}\n\nfunction rawUrlAuthorityHasUserinfo(url: string): boolean {\n const schemeEnd = url.indexOf(\"://\");\n if (schemeEnd === -1) return false;\n\n const authorityStart = schemeEnd + 3;\n let authorityEnd = url.length;\n for (const delimiter of [\"/\", \"?\", \"#\"]) {\n const delimiterIndex = url.indexOf(delimiter, authorityStart);\n if (delimiterIndex !== -1) {\n authorityEnd = Math.min(authorityEnd, delimiterIndex);\n }\n }\n return url.slice(authorityStart, authorityEnd).includes(\"@\");\n}\n\nfunction shellQuoteArg(value: string): string {\n return `'${value.replaceAll(\"'\", \"'\\\\''\")}'`;\n}\n\nfunction connectorSelectionCommand(\n url: string,\n method: string,\n connectorRef: string,\n): string {\n const args = [\n `--url ${shellQuoteArg(url)}`,\n `--connector ${shellQuoteArg(connectorRef)}`,\n ];\n if (method !== \"GET\") {\n args.push(`--method ${shellQuoteArg(method)}`);\n }\n return `zero connector check ${args.join(\" \")}`;\n}\n\nfunction rawPathFromUrl(url: string): string | undefined {\n const sanitizedUrl = stripUrlQueryAndFragment(url);\n const schemeEnd = sanitizedUrl.indexOf(\"://\");\n if (schemeEnd === -1) return undefined;\n\n const pathStart = sanitizedUrl.indexOf(\"/\", schemeEnd + 3);\n return pathStart === -1 ? \"/\" : sanitizedUrl.slice(pathStart);\n}\n\nfunction isComputerUseCheckTarget(opts: CheckConnectorOptions): boolean {\n return isComputerUsePermissionTarget({\n connectorRef: opts.connector ?? \"\",\n path: opts.url === undefined ? undefined : rawPathFromUrl(opts.url),\n permission: opts.checkPermission,\n });\n}\n\nfunction validateCheckConnectorOptions(\n opts: CheckConnectorOptions,\n command: Command,\n): asserts opts is ValidatedCheckConnectorOptions {\n const hasUrl = opts.url !== undefined;\n // Reject embedded credentials before the diagnostic request leaves the client.\n if (opts.url !== undefined && rawUrlAuthorityHasUserinfo(opts.url)) {\n throw unsafeInputError(\"invalid-url\");\n }\n if (opts.connector !== undefined && !hasUrl) {\n throw new Error(\n \"--connector can only be used with --url. Add --url <URL> or remove --connector.\",\n );\n }\n if (opts.checkPermission !== undefined && hasUrl) {\n throw new Error(\n \"--check-permission cannot be used with --url because the permission is derived from the request. Remove --check-permission.\",\n );\n }\n if (opts.checkPermission?.trim() === \"\") {\n throw new Error(\"--check-permission requires a non-empty permission name.\");\n }\n if (!hasUrl && command.getOptionValueSource(\"method\") === \"cli\") {\n throw new Error(\n \"--method can only be used with --url. Add --url <URL> or remove --method.\",\n );\n }\n if (opts.envName === undefined && !hasUrl) {\n throw new Error(\n \"Either --env-name or --url is required. Use --help for usage.\",\n );\n }\n}\n\nfunction buildDiagnosticRequest(\n opts: ValidatedCheckConnectorOptions,\n method: string,\n): ConnectorCheckRequest {\n if (opts.url !== undefined) {\n return {\n mode: \"url\",\n method,\n url: stripUrlQueryAndFragment(opts.url),\n ...(opts.connector !== undefined ? { connectorRef: opts.connector } : {}),\n ...(opts.envName !== undefined ? { environmentName: opts.envName } : {}),\n };\n }\n\n return {\n mode: \"environment\",\n environmentName: opts.envName,\n ...(opts.checkPermission !== undefined\n ? { permission: opts.checkPermission }\n : {}),\n };\n}\n\nfunction requireUrlRequest(\n request: ConnectorCheckRequest,\n): UrlDiagnosticRequest {\n if (request.mode !== \"url\") {\n throw new Error(\n \"Connector diagnostic returned a URL-only outcome for an environment request.\",\n );\n }\n return request;\n}\n\nfunction requestedEnvironmentName(request: ConnectorCheckRequest): string {\n if (request.environmentName === undefined) {\n throw new Error(\n \"Connector diagnostic returned an environment outcome without an environment name.\",\n );\n }\n return request.environmentName;\n}\n\nfunction unsafeInputError(\n reason: Extract<\n ConnectorCheckDiagnosticResult,\n { readonly outcome: \"unsafe-input\" }\n >[\"reason\"],\n): Error {\n switch (reason) {\n case \"invalid-method\":\n return new Error(\n \"connector check requires --method to be a supported HTTP method.\",\n );\n case \"invalid-url\":\n return new Error(\n \"connector check requires --url to be a valid absolute http or https URL.\",\n );\n case \"unsafe-path\":\n return new Error(\n \"connector check cannot diagnose unsafe URL paths because they are blocked before permission policy evaluation.\",\n );\n }\n}\n\nfunction ambiguousConnectorError(\n request: UrlDiagnosticRequest,\n result: Extract<\n ConnectorCheckDiagnosticResult,\n { readonly outcome: \"ambiguous\" }\n >,\n): Error {\n const candidates = [...result.candidates].sort((left, right) => {\n return left.connectorRef.localeCompare(right.connectorRef);\n });\n const commands = candidates.map((candidate) => {\n return ` ${connectorSelectionCommand(request.url, request.method, candidate.connectorRef)}`;\n });\n return new Error(\n `Multiple connectors match ${request.method} ${request.url}: ${candidates\n .map((candidate) => {\n return candidate.connectorRef;\n })\n .join(\", \")}\\nSelect one explicitly:\\n${commands.join(\"\\n\")}`,\n );\n}\n\nfunction unknownConnectorError(request: ConnectorCheckRequest): Error {\n if (request.mode === \"url\" && request.connectorRef !== undefined) {\n return new Error(\n `Unknown connector type: ${request.connectorRef}\\nRun: zero connector search ${shellQuoteArg(request.connectorRef)}`,\n );\n }\n return new Error(\"The requested connector is unknown.\");\n}\n\nfunction noMatchError(\n result: Extract<\n ConnectorCheckDiagnosticResult,\n { readonly outcome: \"no-match\" }\n >,\n): Error {\n return new Error(\n result.scope === \"run\"\n ? \"No connector found for provided URL — no connector configured for the current run matches this URL\"\n : \"No connector found for provided URL — no registered connector base URL matches this URL\",\n );\n}\n\nfunction connectorMismatchError(\n request: UrlDiagnosticRequest,\n result: Extract<\n ConnectorCheckDiagnosticResult,\n { readonly outcome: \"connector-mismatch\" }\n >,\n): Error {\n const requestedRef = request.connectorRef ?? \"the requested connector\";\n return new Error(\n `Connector ${requestedRef} does not own ${request.method} ${request.url}; the matching connector is ${result.connector.connectorRef}\\nRun: ${connectorSelectionCommand(request.url, request.method, result.connector.connectorRef)}`,\n );\n}\n\nfunction environmentNotOwnedError(\n request: ConnectorCheckRequest,\n result: Extract<\n ConnectorCheckDiagnosticResult,\n { readonly outcome: \"environment-not-owned\" }\n >,\n): Error {\n const environmentName = requestedEnvironmentName(request);\n return new Error(\n `${environmentName} is not an environment name for the ${result.connector.label} connector. Remove --env-name to use the matched route metadata.`,\n );\n}\n\nfunction environmentNotUsedError(\n request: ConnectorCheckRequest,\n result: Extract<\n ConnectorCheckDiagnosticResult,\n { readonly outcome: \"environment-not-used\" }\n >,\n): Error {\n const environmentName = requestedEnvironmentName(request);\n return new Error(\n `${environmentName} is not used by the matched API route. Expected one of: ${result.environmentNames.join(\", \") || \"none\"}. Remove --env-name to use the matched route metadata.`,\n );\n}\n\nfunction resolvedDiagnostic(\n request: ConnectorCheckRequest,\n result: ConnectorCheckDiagnosticResult,\n): ResolvedDiagnostic {\n switch (result.outcome) {\n case \"resolved\":\n return result;\n case \"unsafe-input\":\n throw unsafeInputError(result.reason);\n case \"unknown-connector\":\n throw unknownConnectorError(request);\n case \"unknown-environment\":\n throw new Error(\n `Unknown environment name: ${requestedEnvironmentName(request)} — not managed by any connector`,\n );\n case \"no-match\":\n throw noMatchError(result);\n case \"ambiguous\":\n throw ambiguousConnectorError(requireUrlRequest(request), result);\n case \"connector-mismatch\":\n throw connectorMismatchError(requireUrlRequest(request), result);\n case \"environment-not-owned\":\n throw environmentNotOwnedError(request, result);\n case \"environment-not-used\":\n throw environmentNotUsedError(request, result);\n case \"unresolved-dynamic-base\":\n throw new Error(\n `No authoritative ${result.connector.label} base URL is available for this diagnostic. Verify the ${result.connector.connectorRef} connector configuration for the affected context and retry.`,\n );\n case \"run-context-unavailable\":\n throw new Error(\n \"The current run context is unavailable for connector diagnosis. Retry from an active run or start a new run.\",\n );\n }\n}\n\nfunction printDiagnosticSummary(\n request: ConnectorCheckRequest,\n result: ResolvedDiagnostic,\n): void {\n if (result.mode === \"url\") {\n const urlRequest = requireUrlRequest(request);\n console.log(\n `URL ${urlRequest.url} matches the ${result.connector.label} connector (type: ${result.connector.connectorRef}).`,\n );\n console.log(` Matched base URL: ${result.base}`);\n console.log(` Relative path: ${result.relativePath}`);\n if (result.environmentNames === null) {\n console.log(\" Environment names: unavailable\");\n } else {\n console.log(\n ` Environment names: [${result.environmentNames.join(\", \")}]`,\n );\n }\n return;\n }\n\n console.log(\n `${result.environmentName} is managed by the ${result.connector.label} connector (type: ${result.connector.connectorRef}).`,\n );\n}\n\nfunction diagnosticEnvironmentNames(\n result: ResolvedDiagnostic,\n): readonly string[] | null {\n return result.mode === \"url\"\n ? result.environmentNames\n : [result.environmentName];\n}\n\nfunction printConnectorConnectionStatus(\n ctx: DiagContext,\n isConnected: boolean,\n isExpired: boolean,\n hasPermission: boolean,\n): void {\n console.log(\n \"### 2a: Connector status (user must configure via OAuth login or API key)\",\n );\n console.log(\"\");\n if (!ctx.connectorAvailable) {\n console.log(\n `The ${ctx.label} connector is not available for this account.`,\n );\n } else if (!isConnected) {\n console.log(`The ${ctx.label} connector is not connected.`);\n if (ctx.agentId && hasPermission) {\n const connectUrl = connectorActionUrl({\n origin: ctx.platformOrigin,\n path: `/connectors/${ctx.connectorRef}/connect`,\n agentId: ctx.agentId,\n });\n console.log(`Connect it at: [Connect ${ctx.label}](${connectUrl})`);\n printCallbackActionUrlExample(connectUrl, ctx.agentId);\n } else if (!ctx.agentId) {\n const connectUrl = connectorActionUrl({\n origin: ctx.platformOrigin,\n path: `/connectors/${ctx.connectorRef}/connect`,\n });\n console.log(`Connect it at: [Connect ${ctx.label}](${connectUrl})`);\n }\n } else if (isExpired) {\n const url = connectorActionUrl({\n origin: ctx.platformOrigin,\n path: `/connectors/${ctx.connectorRef}/connect`,\n agentId: ctx.agentId,\n });\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 printCallbackActionUrlExample(url, ctx.agentId);\n } else {\n console.log(`The ${ctx.label} connector is connected and active.`);\n }\n console.log(\"\");\n}\n\nfunction printAgentAuthorizationStatus(\n ctx: DiagContext,\n isConnected: boolean,\n isExpired: boolean,\n hasPermission: boolean,\n): void {\n if (!ctx.agentId) {\n console.log(\"ZERO_AGENT_ID is not set — cannot check agent authorization.\");\n } else if (isExpired) {\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(\n isConnected\n ? `The ${ctx.label} connector is authorized for this agent.`\n : `The ${ctx.label} connector is authorized for this agent, but it is not connected.`,\n );\n } else {\n const url = connectorActionUrl({\n origin: ctx.platformOrigin,\n path: `/connectors/${ctx.connectorRef}/authorize`,\n agentId: ctx.agentId,\n });\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 printCallbackActionUrlExample(url, ctx.agentId);\n }\n}\n\nfunction printConnectorAuthorizationStatus(\n ctx: DiagContext,\n isConnected: boolean,\n isExpired: boolean,\n hasPermission: boolean,\n): void {\n console.log(\n \"### 2b: Agent authorization (user must authorize agent to use this connector)\",\n );\n console.log(\"\");\n if (!ctx.connectorAvailable) {\n console.log(\n `Skipped — the ${ctx.label} connector is not available for this account.`,\n );\n } else {\n printAgentAuthorizationStatus(ctx, isConnected, isExpired, hasPermission);\n }\n console.log(\n `This run uses agent-scoped connector authorization for ${ctx.label} access.`,\n );\n console.log(\"\");\n}\n\nfunction checkEnvironmentNames(ctx: DiagContext): void {\n console.log(\"## Step 1: Sandbox environment name\");\n console.log(\"\");\n if (ctx.environmentNames === null) {\n console.log(\n \"Environment metadata is unavailable for this run's sanitized firewall entry, so no environment name was guessed.\",\n );\n console.log(\"\");\n return;\n }\n if (ctx.environmentNames.length === 0) {\n console.log(\n \"The matched API route does not use a sandbox environment name.\",\n );\n console.log(\"\");\n return;\n }\n\n let environmentPresent = false;\n for (const environmentName of ctx.environmentNames) {\n const present = Boolean(process.env[environmentName]);\n environmentPresent ||= present;\n console.log(\n `Checking process.env.${environmentName}: ${present ? \"present\" : \"not present\"}`,\n );\n }\n if (environmentPresent) {\n console.log(\n \"At least one connector value is present in the sandbox environment. These values may be non-secret connector settings or credential placeholders; real credentials are never injected and are resolved at the network boundary for registered base URLs.\",\n );\n } else {\n console.log(\n \"No value found for these environment names. Note: credential replacement at the network boundary is independent of these names — the proxy injects auth headers based on the destination URL.\",\n );\n }\n console.log(\"\");\n}\n\nasync function checkConnectorStatus(ctx: DiagContext): Promise<{\n readonly isConnected: boolean;\n readonly isExpired: boolean;\n readonly 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.connectorRef),\n ctx.agentId\n ? getZeroAgentUserConnectors(ctx.agentId)\n : Promise.resolve(null),\n ]);\n\n const isConnected = connector !== null;\n const isExpired = connector?.connectionStatus === \"reconnect-required\";\n const hasPermission =\n enabledTypes !== null && enabledTypes.includes(ctx.connectorRef);\n\n printConnectorConnectionStatus(ctx, isConnected, isExpired, hasPermission);\n printConnectorAuthorizationStatus(ctx, isConnected, isExpired, hasPermission);\n\n return { isConnected, isExpired, hasPermission };\n}\n\nfunction checkConnectorDomains(ctx: DiagContext): boolean | null {\n console.log(\n \"### 2c: Registered base URLs (credential replacement only applies to URLs matching these prefixes)\",\n );\n console.log(\"\");\n\n switch (ctx.run.status) {\n case \"not-scoped\":\n console.log(\n \"This diagnostic is not scoped to a run — skipping the run base URL check.\",\n );\n console.log(\"\");\n return null;\n case \"not-configured\":\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 console.log(\"\");\n return false;\n case \"configured\":\n console.log(\n `The ${ctx.label} connector is configured for this run with the following base URLs:`,\n );\n for (const base of ctx.run.bases) {\n console.log(` - ${base}`);\n }\n console.log(\"\");\n if (ctx.credentialResolution === \"network-boundary\") {\n console.log(\n \"Credentials are resolved at the network boundary for requests matching these registered base URLs.\",\n );\n }\n console.log(\"\");\n return true;\n }\n}\n\nfunction printUnavailablePolicy(\n policy: Extract<\n ConnectorCheckPolicy,\n {\n readonly outcome: \"unavailable\";\n }\n >,\n): void {\n switch (policy.basis) {\n case \"not-run-scoped\":\n console.log(\n \"Result: Permission policy is unavailable because this diagnostic is not scoped to a run.\",\n );\n return;\n case \"policies-unavailable\":\n console.log(\n \"Result: Network policies are unavailable for this run, so the permission status cannot be determined.\",\n );\n return;\n case \"connector-not-configured\":\n console.log(\n \"Result: The connector is not configured for this run, so requests cannot receive credentials.\",\n );\n return;\n }\n}\n\nfunction printNamedPolicyResult(\n connectorRef: string,\n permission: string,\n policy: ConnectorCheckPolicy,\n agentId: string | undefined,\n): void {\n switch (policy.outcome) {\n case \"allow\": {\n switch (policy.basis) {\n case \"allow-list\":\n console.log(\n `Result: \"${permission}\" is in the allow list — allowed.`,\n );\n return;\n case \"not-blocked\":\n console.log(\n `Result: \"${permission}\" is not blocked by the deny or ask list — allowed.`,\n );\n return;\n case \"no-policy\":\n console.log(\n `Result: No policy entry exists for this connector — \"${permission}\" is allowed.`,\n );\n return;\n case \"unknown-policy\":\n console.log(\n `Result: The server policy allows \"${permission}\" through the unknown-endpoint policy.`,\n );\n return;\n }\n break;\n }\n case \"deny\":\n console.log(\n policy.basis === \"deny-list\"\n ? `Result: \"${permission}\" is in the deny list — denied.`\n : `Result: The unknown-endpoint policy denies \"${permission}\".`,\n );\n printPermissionRequestCommands(\n connectorRef,\n permission,\n agentId,\n \"To request this permission, run\",\n );\n return;\n case \"ask\":\n console.log(\n policy.basis === \"ask-list\"\n ? `Result: \"${permission}\" is in the ask list — blocked until approval.`\n : `Result: The unknown-endpoint policy blocks \"${permission}\" until approval.`,\n );\n printPermissionRequestCommands(\n connectorRef,\n permission,\n agentId,\n \"To request this permission, run\",\n );\n return;\n case \"unavailable\":\n printUnavailablePolicy(policy);\n return;\n }\n}\n\nfunction permissionRequestCommand(\n connectorRef: string,\n permission: string,\n): string {\n return `zero connector permission-request ${connectorRef} --permission ${permission}`;\n}\n\nfunction printPermissionRequestCommands(\n connectorRef: string,\n permission: string,\n agentId: string | undefined,\n introduction: string,\n): void {\n const command = permissionRequestCommand(connectorRef, permission);\n console.log(`${introduction}: ${command}`);\n if (!currentChatSupportsActionCallback(agentId)) {\n return;\n }\n\n console.log(\"\");\n console.log(\n \"Or, if this is the only connector or permission action needed, run the callback command below. After the user completes this action, Zero will automatically start the next round with the callback prompt:\",\n );\n console.log(`${command} --callback-prompt \"${CALLBACK_PROMPT_PLACEHOLDER}\"`);\n}\n\nfunction printUnknownEndpointPolicy(\n connectorRef: string,\n policy: ConnectorCheckPolicy,\n agentId: string | undefined,\n): void {\n switch (policy.outcome) {\n case \"allow\":\n console.log(\n policy.basis === \"no-policy\"\n ? \"Result: No policy entry exists for this connector, so the request is allowed.\"\n : \"Result: No permission matched. The unknown endpoint policy allows this request.\",\n );\n return;\n case \"deny\":\n console.log(\n \"Result: No permission matched. The unknown endpoint policy denies this request.\",\n );\n printPermissionRequestCommands(\n connectorRef,\n \"__unknown__\",\n agentId,\n \"To request access to unknown endpoints, run\",\n );\n return;\n case \"ask\":\n console.log(\n \"Result: No permission matched. The unknown endpoint policy requires approval.\",\n );\n printPermissionRequestCommands(\n connectorRef,\n \"__unknown__\",\n agentId,\n \"To request access to unknown endpoints, run\",\n );\n return;\n case \"unavailable\":\n printUnavailablePolicy(policy);\n return;\n }\n}\n\nfunction printUrlPermissionDiagnostic(\n result: ResolvedUrlDiagnostic,\n agentId: string | undefined,\n): void {\n console.log(\"## Step 3: Permission policy check (auto-detected from URL)\");\n console.log(\"\");\n console.log(\n `Matching ${result.method} ${result.relativePath} (relative to base URL ${result.base}) against the ${result.connector.label} connector's permission rules.`,\n );\n console.log(\"\");\n\n if (result.permission.kind === \"matched\") {\n console.log(\n `Matched permissions: [${result.permission.permissions\n .map((permission) => {\n return permission.name;\n })\n .join(\", \")}]`,\n );\n console.log(\"\");\n for (const permission of result.permission.permissions) {\n printNamedPolicyResult(\n result.connector.connectorRef,\n permission.name,\n permission.policy,\n agentId,\n );\n }\n } else {\n console.log(\n `No named permission matches ${result.method} ${result.relativePath}. This request falls through to the unknown-endpoint policy.`,\n );\n console.log(\"\");\n printUnknownEndpointPolicy(\n result.connector.connectorRef,\n result.permission.policy,\n agentId,\n );\n }\n console.log(\"\");\n}\n\nfunction printEnvironmentPermissionDiagnostic(\n result: ResolvedEnvironmentDiagnostic,\n permissionName: string | undefined,\n agentId: string | undefined,\n): void {\n if (result.permission === null) {\n return;\n }\n if (permissionName === undefined) {\n throw new Error(\n \"Connector diagnostic returned a permission outcome without a requested permission.\",\n );\n }\n console.log(\"## Step 3: Permission policy check\");\n console.log(\"\");\n console.log(\n `Checking permission: \"${permissionName}\" for the ${result.connector.label} connector.`,\n );\n console.log(\"\");\n printNamedPolicyResult(\n result.connector.connectorRef,\n permissionName,\n result.permission,\n agentId,\n );\n console.log(\"\");\n}\n\nfunction printRediagnoseHint(\n opts: CheckConnectorOptions,\n method: string,\n): void {\n const args: string[] = [];\n if (opts.url !== undefined) {\n args.push(`--url ${shellQuoteArg(stripUrlQueryAndFragment(opts.url))}`);\n if (opts.connector !== undefined) {\n args.push(`--connector ${shellQuoteArg(opts.connector)}`);\n }\n if (opts.envName !== undefined) {\n args.push(`--env-name ${shellQuoteArg(opts.envName)}`);\n }\n if (method !== \"GET\") {\n args.push(`--method ${shellQuoteArg(method)}`);\n }\n } else if (opts.envName !== undefined) {\n args.push(`--env-name ${shellQuoteArg(opts.envName)}`);\n }\n if (opts.checkPermission !== undefined) {\n args.push(`--check-permission ${shellQuoteArg(opts.checkPermission)}`);\n }\n console.log(\n `To re-diagnose after changes, run: zero connector check ${args.join(\" \")}`,\n );\n}\n\nexport const checkConnectorCommand = new Command()\n .name(\"check\")\n .description(\n \"Diagnose connector health: environment names, connector configuration, and permission policies\",\n )\n .addOption(\n new Option(\n \"--env-name <ENV_NAME>\",\n \"The connector environment name to check (e.g. GITHUB_TOKEN)\",\n ),\n )\n .addOption(\n new Option(\n \"--url <URL>\",\n \"A full URL to diagnose — matches connector ownership, route environment names, and permission (e.g. https://api.github.com/repos/owner/repo)\",\n ),\n )\n .addOption(\n new Option(\n \"--connector <type>\",\n \"Select the connector when multiple connectors own the same URL route\",\n ),\n )\n .addOption(\n new Option(\n \"--method <METHOD>\",\n \"HTTP method to use when matching permissions with --url\",\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 connector check --env-name GITHUB_TOKEN\n zero connector check --url https://api.github.com/repos/owner/repo\n zero connector check --url https://api.accounts.nintendo.com/2.0.0/users/me --connector nintendo-store\n zero connector check --url https://slack.com/api/chat.postMessage --method POST\n zero connector check --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, command: Command) => {\n validateCheckConnectorOptions(opts, command);\n if (isComputerUseCheckTarget(opts)) {\n printComputerUsePermissionGuidance();\n return;\n }\n const method = opts.method.toUpperCase();\n const request = buildDiagnosticRequest(opts, method);\n const diagnostic = await diagnoseZeroConnectorCheck(request);\n const result = resolvedDiagnostic(request, diagnostic);\n\n printDiagnosticSummary(request, result);\n console.log(\"\");\n\n const platformUrl = toPlatformUrl(await getApiUrl());\n const ctx: DiagContext = {\n environmentNames: diagnosticEnvironmentNames(result),\n connectorRef: result.connector.connectorRef,\n label: result.connector.label,\n connectorAvailable: result.connector.visibility === \"available\",\n credentialResolution: result.connector.credentialResolution,\n run: result.run,\n platformOrigin: platformUrl.origin,\n agentId: process.env.ZERO_AGENT_ID || undefined,\n };\n\n checkEnvironmentNames(ctx);\n const { isConnected, isExpired, hasPermission } =\n await checkConnectorStatus(ctx);\n const configuredForRun = checkConnectorDomains(ctx);\n\n if (configuredForRun === false) {\n console.log(\n `Steps 1-2 summary: The ${ctx.label} connector is not configured for this run. Check the agent authorization settings, then start a new run after updating them.`,\n );\n } else if (isConnected && !isExpired && hasPermission) {\n console.log(\n `Steps 1-2 summary: The ${ctx.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 if (result.mode === \"url\") {\n printUrlPermissionDiagnostic(result, ctx.agentId);\n } else {\n printEnvironmentPermissionDiagnostic(\n result,\n request.mode === \"environment\" ? request.permission : undefined,\n ctx.agentId,\n );\n }\n\n printRediagnoseHint(opts, method);\n }),\n );\n","const COMPUTER_USE_CONNECTOR_REF = \"computer-use\";\nconst COMPUTER_USE_CAPABILITY = \"computer-use:write\";\nconst COMPUTER_USE_PATH_PREFIX = \"/computer-use\";\nconst COMPUTER_USE_PATH_PREFIX_WITH_SLASH = `${COMPUTER_USE_PATH_PREFIX}/`;\n\ninterface ComputerUsePermissionTarget {\n readonly connectorRef: string;\n readonly path?: string;\n readonly permission?: string;\n}\n\nexport function isComputerUsePermissionTarget(\n target: ComputerUsePermissionTarget,\n): boolean {\n return (\n target.connectorRef === COMPUTER_USE_CONNECTOR_REF ||\n target.permission === COMPUTER_USE_CAPABILITY ||\n target.path === COMPUTER_USE_PATH_PREFIX ||\n target.path?.startsWith(COMPUTER_USE_PATH_PREFIX_WITH_SLASH) === true\n );\n}\n\nexport function printComputerUsePermissionGuidance(): void {\n console.log(\"Computer Use access is not managed as a connector permission.\");\n console.log(\n \"The current run token needs computer-use:write, which is issued only when a Zero Desktop Computer Use host is selected for the chat or thread before the run starts.\",\n );\n console.log(\n \"Open Zero Desktop, make sure Computer Use is online, select the Computer Use host for this chat/thread, then start a new run. Existing run tokens cannot be upgraded in place.\",\n );\n console.log(\n \"Run `zero whoami` to confirm whether the current ZERO_TOKEN includes computer-use:write.\",\n );\n}\n","export const CALLBACK_PROMPT_PLACEHOLDER =\n \"SOMETHING_AGENT_WANT_TO_BE_CALLBACK\";\n\nexport function connectorActionCallbackAvailable(): boolean {\n return Boolean(process.env.ZERO_CHAT_THREAD_ID?.trim());\n}\n\nfunction currentChatThreadId(agentId: string | undefined): string | null {\n const threadId = process.env.ZERO_CHAT_THREAD_ID?.trim();\n const currentAgentId = process.env.ZERO_AGENT_ID?.trim();\n if (!threadId || !currentAgentId || agentId !== currentAgentId) {\n return null;\n }\n return threadId;\n}\n\nexport function currentChatSupportsActionCallback(\n agentId: string | undefined,\n): boolean {\n return currentChatThreadId(agentId) !== null;\n}\n\nfunction addCallbackSearchParams(\n params: URLSearchParams,\n threadId: string,\n callbackPrompt: string,\n): void {\n params.set(\"threadId\", threadId);\n params.set(\"callbackPrompt\", callbackPrompt);\n}\n\nexport function addRequestedCallbackSearchParams(\n params: URLSearchParams,\n callbackPrompt: string | undefined,\n agentId: string | undefined,\n): void {\n if (callbackPrompt === undefined) {\n return;\n }\n\n const normalizedPrompt = callbackPrompt.trim();\n if (!normalizedPrompt) {\n throw new Error(\"--callback-prompt cannot be empty\");\n }\n\n const threadId = currentChatThreadId(agentId);\n if (!threadId) {\n throw new Error(\n \"--callback-prompt can only target the current Zero web chat thread and agent\",\n );\n }\n addCallbackSearchParams(params, threadId, normalizedPrompt);\n}\n\nexport function connectorActionUrl(args: {\n readonly origin: string;\n readonly path: string;\n readonly agentId?: string;\n}): string {\n const url = new URL(args.path, args.origin);\n if (args.agentId) {\n url.searchParams.set(\"agentId\", args.agentId);\n }\n return url.toString();\n}\n\nfunction callbackActionUrlExample(\n actionUrl: string,\n agentId: string | undefined,\n): string | null {\n const threadId = currentChatThreadId(agentId);\n if (!threadId) {\n return null;\n }\n\n const url = new URL(actionUrl);\n addCallbackSearchParams(\n url.searchParams,\n threadId,\n CALLBACK_PROMPT_PLACEHOLDER,\n );\n return url.toString();\n}\n\nexport function printCallbackActionUrlExample(\n actionUrl: string,\n agentId: string | undefined,\n): void {\n const callbackUrl = callbackActionUrlExample(actionUrl, agentId);\n if (!callbackUrl) {\n return;\n }\n\n console.log(\"\");\n console.log(\n \"Or, if this is the only connector or permission action needed, use the callback URL below. After the user completes this action, Zero will automatically start the next round with the callback prompt:\",\n );\n console.log(callbackUrl);\n}\n\nexport function printCallbackTurnInstruction(): void {\n console.log(\"\");\n console.log(\n \"After sharing this callback URL, end the current turn. When the user completes the action, Zero will automatically start the next round with the callback prompt.\",\n );\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n connectZeroConnectorManualGrant,\n listZeroConnectorCatalogStatus,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport {\n availableConnectorRefs,\n findConnectorStatusItem,\n resolveManualGrantAuthMethod,\n} from \"./public-catalog\";\n\ninterface ConnectOptions {\n readonly authMethod?: string;\n readonly value?: readonly string[];\n readonly json?: boolean;\n}\n\nfunction collectValue(value: string, previous: string[]): string[] {\n return [...previous, value];\n}\n\nfunction parseConnectorValues(rawValues: readonly string[] | undefined) {\n if (!rawValues || rawValues.length === 0) {\n throw new Error(\"At least one --value NAME=VALUE is required\", {\n cause: new Error(\n \"Example: zero connector connect zendesk --value apiToken=token\",\n ),\n });\n }\n\n const values: Record<string, string> = {};\n for (const rawValue of rawValues) {\n const separatorIndex = rawValue.indexOf(\"=\");\n if (separatorIndex <= 0) {\n throw new Error(\"Invalid --value format\", {\n cause: new Error(\"Use --value NAME=VALUE\"),\n });\n }\n\n const name = rawValue.slice(0, separatorIndex);\n if (!name.trim()) {\n throw new Error(\"Invalid --value format\", {\n cause: new Error(\"Field name cannot be empty\"),\n });\n }\n\n values[name] = rawValue.slice(separatorIndex + 1);\n }\n\n return values;\n}\n\nexport const connectCommand = new Command()\n .name(\"connect\")\n .description(\"Connect a connector with manual grant values\")\n .argument(\"<type>\", \"Connector type (e.g., zendesk)\")\n .option(\"--auth-method <method>\", \"Connector auth method to use\")\n .option(\n \"--value <name=value>\",\n \"Connector field value; repeat for multiple fields\",\n collectValue,\n [],\n )\n .option(\"--json\", \"Print the connector response as JSON\")\n .action(\n withErrorHandler(async (type: string, options: ConnectOptions) => {\n const values = parseConnectorValues(options.value);\n const catalog = await listZeroConnectorCatalogStatus();\n const connectorMetadata = findConnectorStatusItem(\n catalog.connectors,\n type,\n );\n if (!connectorMetadata) {\n throw new Error(`Unknown or unavailable connector: ${type}`, {\n cause: new Error(\n `Available connectors: ${availableConnectorRefs(catalog.connectors)}`,\n ),\n });\n }\n\n const authMethod = resolveManualGrantAuthMethod(\n connectorMetadata,\n options.authMethod,\n );\n const connector = await connectZeroConnectorManualGrant(\n connectorMetadata.connectorRef,\n authMethod.id,\n values,\n );\n\n if (options.json) {\n console.log(JSON.stringify(connector, null, 2));\n return;\n }\n\n console.log(chalk.green(`✓ ${connectorMetadata.label} connected`));\n console.log(chalk.dim(` Type: ${connector.type}`));\n console.log(chalk.dim(` Auth Method: ${connector.authMethod}`));\n console.log(chalk.dim(` Run: zero connector status ${connector.type}`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroConnectorCatalogStatus } from \"../../../lib/api\";\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 }, agentCtx] = await Promise.all([\n listZeroConnectorCatalogStatus(),\n resolveAgentContext(options.agent),\n ]);\n\n const allTypes = connectors.map((connector) => {\n return connector.connectorRef;\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 = connectors.map((connector) => {\n return renderConnectedAsCell(connector);\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 chalk from \"chalk\";\nimport type { PublicConnectorStatus } from \"./public-catalog\";\n\nfunction renderIdentity(connector: PublicConnectorStatus): string {\n if (connector.connection?.externalUsername) {\n return `@${connector.connection.externalUsername}`;\n }\n if (connector.connection?.externalEmail)\n return connector.connection.externalEmail;\n return \"-\";\n}\n\nexport function renderConnectedAsCell(\n connector: PublicConnectorStatus | undefined,\n): string {\n if (!connector || connector.connectionStatus === \"not-connected\") {\n return chalk.dim(\"(not connected)\");\n }\n const identity = renderIdentity(connector);\n if (connector.connectionStatus === \"reconnect-required\") {\n return chalk.yellow(`${identity} (reconnect needed)`);\n }\n if (\n connector.scopeMismatch ||\n connector.connectionStatus === \"scope-mismatch\"\n ) {\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 { listZeroConnectorCatalogStatus } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { resolveAgentContext } from \"./agent-context\";\nimport { padEndAnsi, renderConnectedAsCell, stripAnsi } from \"./connected-as\";\nimport { searchPublicConnectorCatalog } from \"./public-catalog\";\n\nconst DEFAULT_LIMIT = 5;\nconst EXACT_MATCH_THRESHOLD = 80;\n\nfunction parseLimit(raw: string): number {\n const trimmed = raw.trim();\n const n = Number(trimmed);\n if (!/^\\d+$/.test(trimmed) || !Number.isSafeInteger(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(\n \"Search connectors by type, label, category, generation type, or tag\",\n )\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 }, agentCtx] = await Promise.all([\n listZeroConnectorCatalogStatus(),\n resolveAgentContext(options.agent),\n ]);\n const { results, total } = searchPublicConnectorCatalog(\n connectors,\n trimmed,\n options.limit,\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(r.connector);\n });\n\n const typeWidth = Math.max(\n typeHeader.length,\n ...results.map((r) => {\n return r.connector.connectorRef.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.connector.connectorRef.padEnd(typeWidth),\n padEndAnsi(connectedCells[i]!, connectedAsWidth),\n ];\n if (agentCtx) {\n parts.push(\n agentCtx.authorizedTypes.has(result.connector.connectorRef)\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 { listZeroConnectorCatalogStatus } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { resolveAgentContext } from \"./agent-context\";\nimport { getPlatformOrigin } from \"../doctor/platform-url\";\nimport {\n availableConnectorRefs,\n findConnectorStatusItem,\n type PublicConnectorStatus,\n} from \"./public-catalog\";\nimport {\n connectorActionUrl,\n printCallbackActionUrlExample,\n} from \"./action-url\";\n\nconst LABEL_WIDTH = 16;\n\ntype AgentContext = NonNullable<\n Awaited<ReturnType<typeof resolveAgentContext>>\n>;\n\nfunction printConnectorDetails(connector: PublicConnectorStatus): void {\n if (connector.connectionStatus === \"not-connected\") {\n console.log(\n `${\"Status:\".padEnd(LABEL_WIDTH)}${chalk.dim(\"not connected\")}`,\n );\n return;\n }\n\n console.log(\n `${\"Status:\".padEnd(LABEL_WIDTH)}${\n connector.connectionStatus === \"reconnect-required\"\n ? chalk.yellow(\"reconnect needed\")\n : chalk.green(\"connected\")\n }`,\n );\n if (connector.connection?.externalUsername) {\n console.log(\n `${\"Account:\".padEnd(LABEL_WIDTH)}@${connector.connection.externalUsername}`,\n );\n } else if (connector.connection?.externalEmail) {\n console.log(\n `${\"Account:\".padEnd(LABEL_WIDTH)}${connector.connection.externalEmail}`,\n );\n }\n if (connector.connection?.authMethod) {\n console.log(\n `${\"Auth Method:\".padEnd(LABEL_WIDTH)}${connector.connection.authMethod}`,\n );\n }\n if (connector.scopeMismatch) {\n console.log(\n `${\"Permissions:\".padEnd(LABEL_WIDTH)}${chalk.yellow(\"update available\")}`,\n );\n }\n if (connector.tokenExpiresAt) {\n console.log(\n `${\"Token Expires:\".padEnd(LABEL_WIDTH)}${connector.tokenExpiresAt}`,\n );\n }\n}\n\nasync function printAgentAction(\n connector: PublicConnectorStatus,\n agentCtx: AgentContext,\n): Promise<void> {\n const connectorRef = connector.connectorRef;\n const authorized = agentCtx.authorizedTypes.has(connectorRef);\n const isConnected = connector.connected;\n const needsReconnect = connector.connectionStatus === \"reconnect-required\";\n const agentLabel =\n agentCtx.displayName === agentCtx.agentId\n ? agentCtx.agentId\n : `${agentCtx.displayName} (${agentCtx.agentId})`;\n\n console.log();\n if (needsReconnect) {\n const origin = await getPlatformOrigin();\n const url = connectorActionUrl({\n origin,\n path: `/connectors/${connectorRef}/connect`,\n agentId: agentCtx.agentId,\n });\n console.log(\n `The ${connectorRef} connector is connected but needs to be reconnected before agent ${agentLabel} can use it.`,\n );\n console.log(`Reconnect it at: [Reconnect ${connectorRef}](${url})`);\n printCallbackActionUrlExample(url, agentCtx.agentId);\n } else if (authorized && !isConnected) {\n const origin = await getPlatformOrigin();\n const url = connectorActionUrl({\n origin,\n path: `/connectors/${connectorRef}/connect`,\n agentId: agentCtx.agentId,\n });\n console.log(\n `The ${connectorRef} connector is authorized for agent ${agentLabel}, but it is not connected.`,\n );\n console.log(`Connect it at: [Connect ${connectorRef}](${url})`);\n printCallbackActionUrlExample(url, agentCtx.agentId);\n } else if (authorized) {\n console.log(\n `The ${connectorRef} connector is authorized for agent ${agentLabel}.`,\n );\n } else if (!isConnected) {\n const origin = await getPlatformOrigin();\n const url = connectorActionUrl({\n origin,\n path: `/connectors/${connectorRef}/connect`,\n agentId: agentCtx.agentId,\n });\n console.log(\n `The ${connectorRef} connector is not connected. Once connected, it will be authorized for agent ${agentLabel}.`,\n );\n console.log(\n `Connect and authorize it at: [Connect ${connectorRef}](${url})`,\n );\n printCallbackActionUrlExample(url, agentCtx.agentId);\n } else {\n const origin = await getPlatformOrigin();\n const url = connectorActionUrl({\n origin,\n path: `/connectors/${connectorRef}/authorize`,\n agentId: agentCtx.agentId,\n });\n console.log(\n `The ${connectorRef} connector is not authorized for agent ${agentLabel}.`,\n );\n console.log(`Authorize it at: [Authorize ${connectorRef}](${url})`);\n printCallbackActionUrlExample(url, agentCtx.agentId);\n }\n}\n\nasync function printStandaloneAction(\n connector: PublicConnectorStatus,\n): Promise<void> {\n const connectorRef = connector.connectorRef;\n if (\n connector.connectionStatus === \"connected\" ||\n connector.connectionStatus === \"scope-mismatch\"\n ) {\n return;\n }\n\n const origin = await getPlatformOrigin();\n console.log();\n if (connector.connectionStatus === \"reconnect-required\") {\n const url = `${origin}/connectors`;\n console.log(\n `The ${connectorRef} connector is connected but needs to be reconnected.`,\n );\n console.log(`Reconnect it at: [Reconnect ${connectorRef}](${url})`);\n } else {\n const url = `${origin}/connectors/${connectorRef}/connect`;\n console.log(`Connect it at: [Connect ${connectorRef}](${url})`);\n }\n}\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 [catalog, agentCtx] = await Promise.all([\n listZeroConnectorCatalogStatus(),\n resolveAgentContext(options.agent),\n ]);\n const connector = findConnectorStatusItem(catalog.connectors, type);\n if (!connector) {\n throw new Error(`Unknown or unavailable connector: ${type}`, {\n cause: new Error(\n `Available connectors: ${availableConnectorRefs(catalog.connectors)}`,\n ),\n });\n }\n\n console.log(`Connector: ${chalk.cyan(connector.connectorRef)}`);\n console.log();\n\n printConnectorDetails(connector);\n\n if (agentCtx) {\n await printAgentAction(connector, agentCtx);\n } else {\n await printStandaloneAction(connector);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { readFile } from \"node:fs/promises\";\nimport { customConnectorProposalSchema } from \"@vm0/api-contracts/contracts/zero-custom-connectors\";\nimport {\n getZeroAgent,\n getZeroAgentCustomConnectors,\n getZeroCustomConnector,\n listZeroCustomConnectors,\n} from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\nimport { getPlatformOrigin } from \"../../doctor/platform-url\";\n\nconst LABEL_WIDTH = 18;\n\nfunction renderConnected(connector: {\n readonly connected: boolean;\n readonly missingRequiredFields: readonly string[];\n}): string {\n if (connector.connected) {\n return chalk.green(\"connected\");\n }\n if (connector.missingRequiredFields.length === 0) {\n return chalk.dim(\"not connected\");\n }\n return chalk.yellow(`missing ${connector.missingRequiredFields.join(\", \")}`);\n}\n\nfunction encodeBase64UrlJson(value: unknown): string {\n return Buffer.from(JSON.stringify(value), \"utf8\").toString(\"base64url\");\n}\n\nfunction isJsonObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nasync function resolveCustomAgentContext(agentId: string | undefined): Promise<{\n readonly agentId: string;\n readonly displayName: string;\n readonly authorizedIds: Set<string>;\n} | null> {\n const resolvedAgentId = agentId ?? process.env.ZERO_AGENT_ID;\n if (!resolvedAgentId) {\n return null;\n }\n const [agent, enabledIds] = await Promise.all([\n getZeroAgent(resolvedAgentId),\n getZeroAgentCustomConnectors(resolvedAgentId),\n ]);\n return {\n agentId: agent.agentId,\n displayName: agent.displayName ?? agent.agentId,\n authorizedIds: new Set(enabledIds),\n };\n}\n\nconst listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List org custom connectors\")\n .option(\"--agent <id>\", \"Show per-agent authorization column\")\n .action(\n withErrorHandler(async (options: { agent?: string }) => {\n const [connectors, agentCtx] = await Promise.all([\n listZeroCustomConnectors(),\n resolveCustomAgentContext(options.agent),\n ]);\n const idWidth = Math.max(\n 2,\n ...connectors.map((connector) => {\n return connector.id.length;\n }),\n );\n const nameWidth = Math.max(\n 4,\n ...connectors.map((connector) => {\n return connector.displayName.length;\n }),\n );\n const header = [\"ID\".padEnd(idWidth), \"NAME\".padEnd(nameWidth), \"STATUS\"];\n if (agentCtx) {\n header.push(`AUTHORIZED FOR ${agentCtx.displayName}`);\n }\n console.log(chalk.dim(header.join(\" \")));\n for (const connector of connectors) {\n const row = [\n connector.id.padEnd(idWidth),\n connector.displayName.padEnd(nameWidth),\n renderConnected(connector),\n ];\n if (agentCtx) {\n row.push(\n agentCtx.authorizedIds.has(connector.id)\n ? chalk.green(\"✓\")\n : chalk.dim(\"-\"),\n );\n }\n console.log(row.join(\" \"));\n }\n }),\n );\n\nconst statusCommand = new Command()\n .name(\"status\")\n .description(\"Show detailed status of a custom connector\")\n .argument(\"<connector-id>\", \"Custom connector id\")\n .option(\"--agent <id>\", \"Show authorization state for the given agent\")\n .action(\n withErrorHandler(\n async (connectorId: string, options: { agent?: string }) => {\n const [connector, agentCtx] = await Promise.all([\n getZeroCustomConnector(connectorId),\n resolveCustomAgentContext(options.agent),\n ]);\n if (!connector) {\n throw new Error(`Custom connector not found: ${connectorId}`);\n }\n console.log(`Custom connector: ${chalk.cyan(connector.displayName)}`);\n console.log();\n console.log(`${\"ID:\".padEnd(LABEL_WIDTH)}${connector.id}`);\n console.log(\n `${\"Status:\".padEnd(LABEL_WIDTH)}${renderConnected(connector)}`,\n );\n console.log(\n `${\"Prefixes:\".padEnd(LABEL_WIDTH)}${connector.prefixTemplates.join(\", \")}`,\n );\n console.log(\n `${\"Fields:\".padEnd(LABEL_WIDTH)}${connector.fields\n .map((field) => {\n return `${field.kind}:${field.key}${field.required ? \"\" : \"?\"}`;\n })\n .join(\", \")}`,\n );\n if (connector.headerInjections.length > 0) {\n console.log(\n `${\"Headers:\".padEnd(LABEL_WIDTH)}${connector.headerInjections\n .map((header) => {\n return header.name;\n })\n .join(\", \")}`,\n );\n }\n if (connector.queryInjections.length > 0) {\n console.log(\n `${\"Query params:\".padEnd(LABEL_WIDTH)}${connector.queryInjections\n .map((query) => {\n return query.name;\n })\n .join(\", \")}`,\n );\n }\n if (agentCtx) {\n console.log(\n `${\"Authorized:\".padEnd(LABEL_WIDTH)}${\n agentCtx.authorizedIds.has(connector.id)\n ? chalk.green(\"yes\")\n : chalk.yellow(\"no\")\n }`,\n );\n }\n },\n ),\n );\n\nconst proposeCommand = new Command()\n .name(\"propose\")\n .description(\"Create a browser save link for a custom connector proposal\")\n .requiredOption(\"--proposal-file <path>\", \"JSON proposal file\")\n .option(\"--connector-id <id>\", \"Override connector id for update proposals\")\n .option(\"--agent <id>\", \"Authorize this agent when the proposal is saved\")\n .action(\n withErrorHandler(\n async (options: {\n proposalFile: string;\n connectorId?: string;\n agent?: string;\n }) => {\n const raw = await readFile(options.proposalFile, \"utf8\");\n const proposalJson: unknown = JSON.parse(raw);\n if (!isJsonObject(proposalJson)) {\n throw new Error(\"Proposal file must contain a JSON object\");\n }\n const parsed = customConnectorProposalSchema.parse({\n ...proposalJson,\n ...(options.connectorId ? { connectorId: options.connectorId } : {}),\n });\n const origin = await getPlatformOrigin();\n const params = new URLSearchParams({\n p: encodeBase64UrlJson(parsed),\n });\n const agentId = options.agent ?? process.env.ZERO_AGENT_ID;\n if (agentId) {\n params.set(\"agentId\", agentId);\n }\n const url = `${origin}/connectors/custom/proposal?${params.toString()}`;\n console.log(`[Configure ${parsed.displayName}](${url})`);\n console.log();\n console.log(\n \"Open this link to review, save values, and authorize the connector.\",\n );\n },\n ),\n );\n\nexport const customConnectorCommand = new Command()\n .name(\"custom\")\n .description(\"Inspect and propose org custom connectors\")\n .addCommand(listCommand)\n .addCommand(statusCommand)\n .addCommand(proposeCommand);\n","import { Command, Option } from \"commander\";\nimport { findFirewallMetadataPermission } from \"@vm0/connectors/firewall-metadata/policy\";\nimport { UNKNOWN_PERMISSION_GRANT } from \"@vm0/connectors/firewall-types\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { getPlatformOrigin } from \"../doctor/platform-url\";\nimport {\n isComputerUsePermissionTarget,\n printComputerUsePermissionGuidance,\n} from \"./computer-use-guidance\";\nimport {\n ApiRequestError,\n createComputerUseAuthorizationRequest,\n getZeroConnectorCatalogPermissions,\n} from \"../../../lib/api\";\nimport {\n addRequestedCallbackSearchParams,\n connectorActionCallbackAvailable,\n printCallbackTurnInstruction,\n} from \"./action-url\";\n\nfunction permissionDescription(permission: string): string {\n return permission === UNKNOWN_PERMISSION_GRANT\n ? \"unknown endpoints\"\n : `the \"${permission}\" permission`;\n}\n\nfunction printSensitivePermissionGuidance(\n connectorRef: string,\n permission: string,\n): void {\n // Slack chat:write: strongly recommend bot-based messaging over user identity\n if (connectorRef === \"slack\" && permission === \"chat:write\") {\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 allow this permission below if acting as the user is specifically required.\",\n );\n console.log(\"\");\n }\n\n // Gmail send permissions: strongly recommend draft-based workflow over direct send.\n if (\n connectorRef === \"gmail\" &&\n (permission === \"messages.send\" || permission === \"drafts.send\")\n ) {\n console.log(\"\");\n console.log(\n \"IMPORTANT: Granting Gmail send permissions allows the agent to send emails directly as the user.\",\n );\n console.log(\n \"Consider keeping messages.send and drafts.send disabled and using drafts.write instead — the agent can create drafts for the user to review and send manually.\",\n );\n console.log(\n \"Only allow this permission below if direct sending is specifically required.\",\n );\n console.log(\"\");\n }\n}\n\nfunction printPermissionRequestMessage(args: {\n readonly permission: string;\n readonly label: string;\n readonly url: string;\n}): void {\n console.log(\n `You can allow ${permissionDescription(args.permission)} for your connector access: [Manage ${args.label} permissions](${args.url})`,\n );\n}\n\nfunction printComputerUseAuthorizationLink(args: {\n readonly authorizationUrl: string;\n readonly expiresAt: string;\n}): void {\n console.log(\n \"Computer Use needs a Zero Desktop host selected before a run starts.\",\n );\n console.log(\n \"Ask the user to authorize a host for future runs in this chat or Slack thread:\",\n );\n console.log(args.authorizationUrl);\n console.log(\n `This link expires at ${args.expiresAt}. Existing run tokens cannot be upgraded in place; start a new run after authorization.`,\n );\n}\n\nasync function printComputerUsePermissionRequestMessage(): Promise<void> {\n if (!process.env.ZERO_TOKEN) {\n printComputerUsePermissionGuidance();\n return;\n }\n\n try {\n const request = await createComputerUseAuthorizationRequest();\n printComputerUseAuthorizationLink({\n authorizationUrl: request.authorizationUrl,\n expiresAt: request.expiresAt,\n });\n } catch (error) {\n if (error instanceof ApiRequestError) {\n console.log(\n `Computer Use authorization link unavailable: ${error.message}`,\n );\n printComputerUsePermissionGuidance();\n return;\n }\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.log(`Computer Use authorization link unavailable: ${message}`);\n printComputerUsePermissionGuidance();\n }\n}\n\nasync function outputPermissionRequestMessage(\n connectorRef: string,\n label: string,\n permission: string,\n agentId: string | undefined,\n callbackPrompt: string | undefined,\n): Promise<void> {\n const platformOrigin = await getPlatformOrigin();\n\n const urlParams = new URLSearchParams({\n ref: connectorRef,\n permission,\n action: \"allow\",\n });\n addRequestedCallbackSearchParams(urlParams, callbackPrompt, agentId);\n\n const pagePath = agentId ? `/agents/${agentId}/permissions` : \"/agents\";\n const url = `${platformOrigin}${pagePath}?${urlParams.toString()}`;\n\n printSensitivePermissionGuidance(connectorRef, permission);\n printPermissionRequestMessage({\n permission,\n label,\n url,\n });\n if (callbackPrompt !== undefined) {\n printCallbackTurnInstruction();\n }\n}\n\nconst callbackPromptOption = new Option(\n \"--callback-prompt <prompt>\",\n \"Start the next web chat round with this prompt after the permission is granted\",\n);\nconst callbackPromptAvailable = connectorActionCallbackAvailable();\nif (!callbackPromptAvailable) {\n callbackPromptOption.hideHelp();\n}\nconst callbackPromptExample = callbackPromptAvailable\n ? ' zero connector permission-request github --permission contents:write --callback-prompt \"Re-check the permission, then continue the previous task\"\\n'\n : \"\";\nconst callbackPromptNotes = callbackPromptAvailable\n ? \" - Use --callback-prompt only when this turn needs exactly one connector or permission action\\n - Callback prompts are included in the URL; keep them concise and do not include secrets\\n\"\n : \"\";\n\nexport const permissionRequestCommand = new Command()\n .name(\"permission-request\")\n .description(\"Request permission to use a connector capability\")\n .argument(\"<connector-ref>\", \"The connector type (e.g. github)\")\n .addOption(\n new Option(\n \"--permission <name>\",\n \"The permission name to request\",\n ).makeOptionMandatory(),\n )\n .addOption(\n new Option(\n \"--agent <id>\",\n \"Agent ID whose permission page should be opened (defaults to ZERO_AGENT_ID)\",\n ),\n )\n .addOption(callbackPromptOption)\n .addHelpText(\n \"after\",\n `\nExamples:\n zero connector permission-request github --permission contents:read\n${callbackPromptExample} zero connector permission-request gmail --permission messages.write --agent <agent-id>\n zero connector permission-request cloudflare --permission __unknown__\n zero connector permission-request computer-use --permission computer-use:write\n\nNotes:\n - Outputs a platform URL for the user to allow the permission\n - Use --permission __unknown__ to request access to unknown endpoints\n - Use --agent to request a permission for another agent; defaults to ZERO_AGENT_ID\n - The user chooses the permission duration on the confirmation page\n${callbackPromptNotes} - Permission requests update the current user's connector grants after confirmation`,\n )\n .action(\n withErrorHandler(\n async (\n connectorRef: string,\n opts: {\n permission: string;\n agent?: string;\n callbackPrompt?: string;\n },\n ) => {\n if (\n isComputerUsePermissionTarget({\n connectorRef,\n permission: opts.permission,\n })\n ) {\n if (opts.callbackPrompt !== undefined) {\n throw new Error(\n \"--callback-prompt is not supported for Computer Use authorization requests\",\n );\n }\n await printComputerUsePermissionRequestMessage();\n return;\n }\n\n const agentId = opts.agent ?? process.env.ZERO_AGENT_ID;\n\n const metadata = await getZeroConnectorCatalogPermissions(connectorRef);\n if (!metadata) {\n throw new Error(`Unknown connector type: ${connectorRef}`);\n }\n\n if (\n opts.permission !== UNKNOWN_PERMISSION_GRANT &&\n !findFirewallMetadataPermission(metadata, opts.permission)\n ) {\n throw new Error(\n `Unknown permission \"${opts.permission}\" for ${connectorRef}`,\n );\n }\n\n await outputPermissionRequestMessage(\n connectorRef,\n metadata.label,\n opts.permission,\n agentId,\n opts.callbackPrompt,\n );\n },\n ),\n );\n"],"mappings":"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","names":["LABEL_WIDTH","listCommand","statusCommand","permissionRequestCommand","permissionRequestCommand"]}
1
+ {"version":3,"sources":["../src/commands/zero/connector/index.ts","../src/commands/zero/connector/check.ts","../src/commands/zero/connector/computer-use-guidance.ts","../src/commands/zero/connector/action-url.ts","../src/commands/zero/connector/connect.ts","../src/commands/zero/connector/list.ts","../src/commands/zero/connector/connected-as.ts","../src/commands/zero/connector/search.ts","../src/commands/zero/connector/status.ts","../src/commands/zero/connector/custom/index.ts","../src/commands/zero/connector/permission-request.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { checkConnectorCommand } from \"./check\";\nimport { connectCommand } from \"./connect\";\nimport { listCommand } from \"./list\";\nimport { searchCommand } from \"./search\";\nimport { statusCommand } from \"./status\";\nimport { customConnectorCommand } from \"./custom\";\nimport { permissionRequestCommand } from \"./permission-request\";\n\nexport const zeroConnectorCommand = new Command()\n .name(\"connector\")\n .description(\"Manage and diagnose third-party service connections\")\n .addCommand(checkConnectorCommand)\n .addCommand(customConnectorCommand)\n .addCommand(connectCommand)\n .addCommand(listCommand)\n .addCommand(searchCommand)\n .addCommand(statusCommand)\n .addCommand(permissionRequestCommand);\n","import { Command, Option } from \"commander\";\nimport type { ConnectorRef } from \"@vm0/api-contracts/contracts/connector-identity\";\nimport type {\n ConnectorCheckDiagnosticResult,\n ConnectorCheckPolicy,\n ConnectorCheckRequest,\n} from \"@vm0/api-contracts/contracts/zero-connector-check\";\n\nimport { getApiUrl } from \"../../../lib/api/config\";\nimport {\n diagnoseZeroConnectorCheck,\n getZeroConnector,\n} from \"../../../lib/api/domains/zero-connectors\";\nimport { getZeroAgentUserConnectors } from \"../../../lib/api/domains/zero-agents\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { toPlatformUrl } from \"../doctor/platform-url\";\nimport {\n isComputerUsePermissionTarget,\n printComputerUsePermissionGuidance,\n} from \"./computer-use-guidance\";\nimport {\n CALLBACK_PROMPT_PLACEHOLDER,\n connectorActionUrl,\n currentChatSupportsActionCallback,\n printCallbackActionUrlExample,\n} from \"./action-url\";\n\ninterface CheckConnectorOptions {\n readonly connector?: string;\n readonly envName?: string;\n readonly url?: string;\n readonly method: string;\n readonly checkPermission?: string;\n}\n\ntype ValidatedCheckConnectorOptions = CheckConnectorOptions &\n (\n | { readonly url: string }\n | { readonly url?: undefined; readonly envName: string }\n );\n\ntype ResolvedDiagnostic = Extract<\n ConnectorCheckDiagnosticResult,\n { readonly outcome: \"resolved\" }\n>;\ntype ResolvedUrlDiagnostic = Extract<\n ResolvedDiagnostic,\n { readonly mode: \"url\" }\n>;\ntype ResolvedEnvironmentDiagnostic = Extract<\n ResolvedDiagnostic,\n { readonly mode: \"environment\" }\n>;\ntype UrlDiagnosticRequest = Extract<\n ConnectorCheckRequest,\n { readonly mode: \"url\" }\n>;\n\ninterface DiagContext {\n readonly environmentNames: readonly string[] | null;\n readonly connectorRef: ConnectorRef;\n readonly label: string;\n readonly connectorAvailable: boolean;\n readonly credentialResolution: \"network-boundary\" | \"none\";\n readonly run: ResolvedDiagnostic[\"run\"];\n readonly platformOrigin: string;\n readonly agentId: string | undefined;\n}\n\nfunction stripUrlQueryAndFragment(url: string): string {\n const queryIndex = url.indexOf(\"?\");\n const fragmentIndex = url.indexOf(\"#\");\n let end = url.length;\n if (queryIndex !== -1) end = Math.min(end, queryIndex);\n if (fragmentIndex !== -1) end = Math.min(end, fragmentIndex);\n return url.slice(0, end);\n}\n\nfunction rawUrlAuthorityHasUserinfo(url: string): boolean {\n const schemeEnd = url.indexOf(\"://\");\n if (schemeEnd === -1) return false;\n\n const authorityStart = schemeEnd + 3;\n let authorityEnd = url.length;\n for (const delimiter of [\"/\", \"?\", \"#\"]) {\n const delimiterIndex = url.indexOf(delimiter, authorityStart);\n if (delimiterIndex !== -1) {\n authorityEnd = Math.min(authorityEnd, delimiterIndex);\n }\n }\n return url.slice(authorityStart, authorityEnd).includes(\"@\");\n}\n\nfunction shellQuoteArg(value: string): string {\n return `'${value.replaceAll(\"'\", \"'\\\\''\")}'`;\n}\n\nfunction connectorSelectionCommand(\n url: string,\n method: string,\n connectorRef: string,\n): string {\n const args = [\n `--url ${shellQuoteArg(url)}`,\n `--connector ${shellQuoteArg(connectorRef)}`,\n ];\n if (method !== \"GET\") {\n args.push(`--method ${shellQuoteArg(method)}`);\n }\n return `zero connector check ${args.join(\" \")}`;\n}\n\nfunction rawPathFromUrl(url: string): string | undefined {\n const sanitizedUrl = stripUrlQueryAndFragment(url);\n const schemeEnd = sanitizedUrl.indexOf(\"://\");\n if (schemeEnd === -1) return undefined;\n\n const pathStart = sanitizedUrl.indexOf(\"/\", schemeEnd + 3);\n return pathStart === -1 ? \"/\" : sanitizedUrl.slice(pathStart);\n}\n\nfunction isComputerUseCheckTarget(opts: CheckConnectorOptions): boolean {\n return isComputerUsePermissionTarget({\n connectorRef: opts.connector ?? \"\",\n path: opts.url === undefined ? undefined : rawPathFromUrl(opts.url),\n permission: opts.checkPermission,\n });\n}\n\nfunction validateCheckConnectorOptions(\n opts: CheckConnectorOptions,\n command: Command,\n): asserts opts is ValidatedCheckConnectorOptions {\n const hasUrl = opts.url !== undefined;\n // Reject embedded credentials before the diagnostic request leaves the client.\n if (opts.url !== undefined && rawUrlAuthorityHasUserinfo(opts.url)) {\n throw unsafeInputError(\"invalid-url\");\n }\n if (opts.connector !== undefined && !hasUrl) {\n throw new Error(\n \"--connector can only be used with --url. Add --url <URL> or remove --connector.\",\n );\n }\n if (opts.checkPermission !== undefined && hasUrl) {\n throw new Error(\n \"--check-permission cannot be used with --url because the permission is derived from the request. Remove --check-permission.\",\n );\n }\n if (opts.checkPermission?.trim() === \"\") {\n throw new Error(\"--check-permission requires a non-empty permission name.\");\n }\n if (!hasUrl && command.getOptionValueSource(\"method\") === \"cli\") {\n throw new Error(\n \"--method can only be used with --url. Add --url <URL> or remove --method.\",\n );\n }\n if (opts.envName === undefined && !hasUrl) {\n throw new Error(\n \"Either --env-name or --url is required. Use --help for usage.\",\n );\n }\n}\n\nfunction buildDiagnosticRequest(\n opts: ValidatedCheckConnectorOptions,\n method: string,\n): ConnectorCheckRequest {\n if (opts.url !== undefined) {\n return {\n mode: \"url\",\n method,\n url: stripUrlQueryAndFragment(opts.url),\n ...(opts.connector !== undefined ? { connectorRef: opts.connector } : {}),\n ...(opts.envName !== undefined ? { environmentName: opts.envName } : {}),\n };\n }\n\n return {\n mode: \"environment\",\n environmentName: opts.envName,\n ...(opts.checkPermission !== undefined\n ? { permission: opts.checkPermission }\n : {}),\n };\n}\n\nfunction requireUrlRequest(\n request: ConnectorCheckRequest,\n): UrlDiagnosticRequest {\n if (request.mode !== \"url\") {\n throw new Error(\n \"Connector diagnostic returned a URL-only outcome for an environment request.\",\n );\n }\n return request;\n}\n\nfunction requestedEnvironmentName(request: ConnectorCheckRequest): string {\n if (request.environmentName === undefined) {\n throw new Error(\n \"Connector diagnostic returned an environment outcome without an environment name.\",\n );\n }\n return request.environmentName;\n}\n\nfunction unsafeInputError(\n reason: Extract<\n ConnectorCheckDiagnosticResult,\n { readonly outcome: \"unsafe-input\" }\n >[\"reason\"],\n): Error {\n switch (reason) {\n case \"invalid-method\":\n return new Error(\n \"connector check requires --method to be a supported HTTP method.\",\n );\n case \"invalid-url\":\n return new Error(\n \"connector check requires --url to be a valid absolute http or https URL.\",\n );\n case \"unsafe-path\":\n return new Error(\n \"connector check cannot diagnose unsafe URL paths because they are blocked before permission policy evaluation.\",\n );\n }\n}\n\nfunction ambiguousConnectorError(\n request: UrlDiagnosticRequest,\n result: Extract<\n ConnectorCheckDiagnosticResult,\n { readonly outcome: \"ambiguous\" }\n >,\n): Error {\n const candidates = [...result.candidates].sort((left, right) => {\n return left.connectorRef.localeCompare(right.connectorRef);\n });\n const commands = candidates.map((candidate) => {\n return ` ${connectorSelectionCommand(request.url, request.method, candidate.connectorRef)}`;\n });\n return new Error(\n `Multiple connectors match ${request.method} ${request.url}: ${candidates\n .map((candidate) => {\n return candidate.connectorRef;\n })\n .join(\", \")}\\nSelect one explicitly:\\n${commands.join(\"\\n\")}`,\n );\n}\n\nfunction unknownConnectorError(request: ConnectorCheckRequest): Error {\n if (request.mode === \"url\" && request.connectorRef !== undefined) {\n return new Error(\n `Unknown connector type: ${request.connectorRef}\\nRun: zero connector search ${shellQuoteArg(request.connectorRef)}`,\n );\n }\n return new Error(\"The requested connector is unknown.\");\n}\n\nfunction noMatchError(\n result: Extract<\n ConnectorCheckDiagnosticResult,\n { readonly outcome: \"no-match\" }\n >,\n): Error {\n return new Error(\n result.scope === \"run\"\n ? \"No connector found for provided URL — no connector configured for the current run matches this URL\"\n : \"No connector found for provided URL — no registered connector base URL matches this URL\",\n );\n}\n\nfunction connectorMismatchError(\n request: UrlDiagnosticRequest,\n result: Extract<\n ConnectorCheckDiagnosticResult,\n { readonly outcome: \"connector-mismatch\" }\n >,\n): Error {\n const requestedRef = request.connectorRef ?? \"the requested connector\";\n return new Error(\n `Connector ${requestedRef} does not own ${request.method} ${request.url}; the matching connector is ${result.connector.connectorRef}\\nRun: ${connectorSelectionCommand(request.url, request.method, result.connector.connectorRef)}`,\n );\n}\n\nfunction environmentNotOwnedError(\n request: ConnectorCheckRequest,\n result: Extract<\n ConnectorCheckDiagnosticResult,\n { readonly outcome: \"environment-not-owned\" }\n >,\n): Error {\n const environmentName = requestedEnvironmentName(request);\n return new Error(\n `${environmentName} is not an environment name for the ${result.connector.label} connector. Remove --env-name to use the matched route metadata.`,\n );\n}\n\nfunction environmentNotUsedError(\n request: ConnectorCheckRequest,\n result: Extract<\n ConnectorCheckDiagnosticResult,\n { readonly outcome: \"environment-not-used\" }\n >,\n): Error {\n const environmentName = requestedEnvironmentName(request);\n return new Error(\n `${environmentName} is not used by the matched API route. Expected one of: ${result.environmentNames.join(\", \") || \"none\"}. Remove --env-name to use the matched route metadata.`,\n );\n}\n\nfunction resolvedDiagnostic(\n request: ConnectorCheckRequest,\n result: ConnectorCheckDiagnosticResult,\n): ResolvedDiagnostic {\n switch (result.outcome) {\n case \"resolved\":\n return result;\n case \"unsafe-input\":\n throw unsafeInputError(result.reason);\n case \"unknown-connector\":\n throw unknownConnectorError(request);\n case \"unknown-environment\":\n throw new Error(\n `Unknown environment name: ${requestedEnvironmentName(request)} — not managed by any connector`,\n );\n case \"no-match\":\n throw noMatchError(result);\n case \"ambiguous\":\n throw ambiguousConnectorError(requireUrlRequest(request), result);\n case \"connector-mismatch\":\n throw connectorMismatchError(requireUrlRequest(request), result);\n case \"environment-not-owned\":\n throw environmentNotOwnedError(request, result);\n case \"environment-not-used\":\n throw environmentNotUsedError(request, result);\n case \"unresolved-dynamic-base\":\n throw new Error(\n `No authoritative ${result.connector.label} base URL is available for this diagnostic. Verify the ${result.connector.connectorRef} connector configuration for the affected context and retry.`,\n );\n case \"run-context-unavailable\":\n throw new Error(\n \"The current run context is unavailable for connector diagnosis. Retry from an active run or start a new run.\",\n );\n }\n}\n\nfunction printDiagnosticSummary(\n request: ConnectorCheckRequest,\n result: ResolvedDiagnostic,\n): void {\n if (result.mode === \"url\") {\n const urlRequest = requireUrlRequest(request);\n console.log(\n `URL ${urlRequest.url} matches the ${result.connector.label} connector (type: ${result.connector.connectorRef}).`,\n );\n console.log(` Matched base URL: ${result.base}`);\n console.log(` Relative path: ${result.relativePath}`);\n if (result.environmentNames === null) {\n console.log(\" Environment names: unavailable\");\n } else {\n console.log(\n ` Environment names: [${result.environmentNames.join(\", \")}]`,\n );\n }\n return;\n }\n\n console.log(\n `${result.environmentName} is managed by the ${result.connector.label} connector (type: ${result.connector.connectorRef}).`,\n );\n}\n\nfunction diagnosticEnvironmentNames(\n result: ResolvedDiagnostic,\n): readonly string[] | null {\n return result.mode === \"url\"\n ? result.environmentNames\n : [result.environmentName];\n}\n\nfunction printConnectorConnectionStatus(\n ctx: DiagContext,\n isConnected: boolean,\n isExpired: boolean,\n hasPermission: boolean,\n): void {\n console.log(\n \"### 2a: Connector status (user must configure via OAuth login or API key)\",\n );\n console.log(\"\");\n if (!ctx.connectorAvailable) {\n console.log(\n `The ${ctx.label} connector is not available for this account.`,\n );\n } else if (!isConnected) {\n console.log(`The ${ctx.label} connector is not connected.`);\n if (ctx.agentId && hasPermission) {\n const connectUrl = connectorActionUrl({\n origin: ctx.platformOrigin,\n path: `/connectors/${ctx.connectorRef}/connect`,\n agentId: ctx.agentId,\n });\n console.log(`Connect it at: [Connect ${ctx.label}](${connectUrl})`);\n printCallbackActionUrlExample(connectUrl, ctx.agentId);\n } else if (!ctx.agentId) {\n const connectUrl = connectorActionUrl({\n origin: ctx.platformOrigin,\n path: `/connectors/${ctx.connectorRef}/connect`,\n });\n console.log(`Connect it at: [Connect ${ctx.label}](${connectUrl})`);\n }\n } else if (isExpired) {\n const url = connectorActionUrl({\n origin: ctx.platformOrigin,\n path: `/connectors/${ctx.connectorRef}/connect`,\n agentId: ctx.agentId,\n });\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 printCallbackActionUrlExample(url, ctx.agentId);\n } else {\n console.log(`The ${ctx.label} connector is connected and active.`);\n }\n console.log(\"\");\n}\n\nfunction printAgentAuthorizationStatus(\n ctx: DiagContext,\n isConnected: boolean,\n isExpired: boolean,\n hasPermission: boolean,\n): void {\n if (!ctx.agentId) {\n console.log(\"ZERO_AGENT_ID is not set — cannot check agent authorization.\");\n } else if (isExpired) {\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(\n isConnected\n ? `The ${ctx.label} connector is authorized for this agent.`\n : `The ${ctx.label} connector is authorized for this agent, but it is not connected.`,\n );\n } else {\n const url = connectorActionUrl({\n origin: ctx.platformOrigin,\n path: `/connectors/${ctx.connectorRef}/authorize`,\n agentId: ctx.agentId,\n });\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 printCallbackActionUrlExample(url, ctx.agentId);\n }\n}\n\nfunction printConnectorAuthorizationStatus(\n ctx: DiagContext,\n isConnected: boolean,\n isExpired: boolean,\n hasPermission: boolean,\n): void {\n console.log(\n \"### 2b: Agent authorization (user must authorize agent to use this connector)\",\n );\n console.log(\"\");\n if (!ctx.connectorAvailable) {\n console.log(\n `Skipped — the ${ctx.label} connector is not available for this account.`,\n );\n } else {\n printAgentAuthorizationStatus(ctx, isConnected, isExpired, hasPermission);\n }\n console.log(\n `This run uses agent-scoped connector authorization for ${ctx.label} access.`,\n );\n console.log(\"\");\n}\n\nfunction checkEnvironmentNames(ctx: DiagContext): void {\n console.log(\"## Step 1: Sandbox environment name\");\n console.log(\"\");\n if (ctx.environmentNames === null) {\n console.log(\n \"Environment metadata is unavailable for this run's sanitized firewall entry, so no environment name was guessed.\",\n );\n console.log(\"\");\n return;\n }\n if (ctx.environmentNames.length === 0) {\n console.log(\n \"The matched API route does not use a sandbox environment name.\",\n );\n console.log(\"\");\n return;\n }\n\n let environmentPresent = false;\n for (const environmentName of ctx.environmentNames) {\n const present = Boolean(process.env[environmentName]);\n environmentPresent ||= present;\n console.log(\n `Checking process.env.${environmentName}: ${present ? \"present\" : \"not present\"}`,\n );\n }\n if (environmentPresent) {\n console.log(\n \"At least one connector value is present in the sandbox environment. These values may be non-secret connector settings or credential placeholders; real credentials are never injected and are resolved at the network boundary for registered base URLs.\",\n );\n } else {\n console.log(\n \"No value found for these environment names. Note: credential replacement at the network boundary is independent of these names — the proxy injects auth headers based on the destination URL.\",\n );\n }\n console.log(\"\");\n}\n\nasync function checkConnectorStatus(ctx: DiagContext): Promise<{\n readonly isConnected: boolean;\n readonly isExpired: boolean;\n readonly 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.connectorRef),\n ctx.agentId\n ? getZeroAgentUserConnectors(ctx.agentId)\n : Promise.resolve(null),\n ]);\n\n const isConnected = connector !== null;\n const isExpired = connector?.connectionStatus === \"reconnect-required\";\n const hasPermission =\n enabledTypes !== null && enabledTypes.includes(ctx.connectorRef);\n\n printConnectorConnectionStatus(ctx, isConnected, isExpired, hasPermission);\n printConnectorAuthorizationStatus(ctx, isConnected, isExpired, hasPermission);\n\n return { isConnected, isExpired, hasPermission };\n}\n\nfunction checkConnectorDomains(ctx: DiagContext): boolean | null {\n console.log(\n \"### 2c: Registered base URLs (credential replacement only applies to URLs matching these prefixes)\",\n );\n console.log(\"\");\n\n switch (ctx.run.status) {\n case \"not-scoped\":\n console.log(\n \"This diagnostic is not scoped to a run — skipping the run base URL check.\",\n );\n console.log(\"\");\n return null;\n case \"not-configured\":\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 console.log(\"\");\n return false;\n case \"configured\":\n console.log(\n `The ${ctx.label} connector is configured for this run with the following base URLs:`,\n );\n for (const base of ctx.run.bases) {\n console.log(` - ${base}`);\n }\n console.log(\"\");\n if (ctx.credentialResolution === \"network-boundary\") {\n console.log(\n \"Credentials are resolved at the network boundary for requests matching these registered base URLs.\",\n );\n }\n console.log(\"\");\n return true;\n }\n}\n\nfunction printUnavailablePolicy(\n policy: Extract<\n ConnectorCheckPolicy,\n {\n readonly outcome: \"unavailable\";\n }\n >,\n): void {\n switch (policy.basis) {\n case \"not-run-scoped\":\n console.log(\n \"Result: Permission policy is unavailable because this diagnostic is not scoped to a run.\",\n );\n return;\n case \"policies-unavailable\":\n console.log(\n \"Result: Network policies are unavailable for this run, so the permission status cannot be determined.\",\n );\n return;\n case \"connector-not-configured\":\n console.log(\n \"Result: The connector is not configured for this run, so requests cannot receive credentials.\",\n );\n return;\n }\n}\n\nfunction printNamedPolicyResult(\n connectorRef: string,\n permission: string,\n policy: ConnectorCheckPolicy,\n agentId: string | undefined,\n): void {\n switch (policy.outcome) {\n case \"allow\": {\n switch (policy.basis) {\n case \"allow-list\":\n console.log(\n `Result: \"${permission}\" is in the allow list — allowed.`,\n );\n return;\n case \"not-blocked\":\n console.log(\n `Result: \"${permission}\" is not blocked by the deny or ask list — allowed.`,\n );\n return;\n case \"no-policy\":\n console.log(\n `Result: No policy entry exists for this connector — \"${permission}\" is allowed.`,\n );\n return;\n case \"unknown-policy\":\n console.log(\n `Result: The server policy allows \"${permission}\" through the unknown-endpoint policy.`,\n );\n return;\n }\n break;\n }\n case \"deny\":\n console.log(\n policy.basis === \"deny-list\"\n ? `Result: \"${permission}\" is in the deny list — denied.`\n : `Result: The unknown-endpoint policy denies \"${permission}\".`,\n );\n printPermissionRequestCommands(\n connectorRef,\n permission,\n agentId,\n \"To request this permission, run\",\n );\n return;\n case \"ask\":\n console.log(\n policy.basis === \"ask-list\"\n ? `Result: \"${permission}\" is in the ask list — blocked until approval.`\n : `Result: The unknown-endpoint policy blocks \"${permission}\" until approval.`,\n );\n printPermissionRequestCommands(\n connectorRef,\n permission,\n agentId,\n \"To request this permission, run\",\n );\n return;\n case \"unavailable\":\n printUnavailablePolicy(policy);\n return;\n }\n}\n\nfunction permissionRequestCommand(\n connectorRef: string,\n permission: string,\n): string {\n return `zero connector permission-request ${connectorRef} --permission ${permission}`;\n}\n\nfunction printPermissionRequestCommands(\n connectorRef: string,\n permission: string,\n agentId: string | undefined,\n introduction: string,\n): void {\n const command = permissionRequestCommand(connectorRef, permission);\n console.log(`${introduction}: ${command}`);\n if (!currentChatSupportsActionCallback(agentId)) {\n return;\n }\n\n console.log(\"\");\n console.log(\n \"Or, if this is the only connector or permission action needed, run the callback command below. After the user completes this action, Zero will automatically start the next round with the callback prompt:\",\n );\n console.log(`${command} --callback-prompt \"${CALLBACK_PROMPT_PLACEHOLDER}\"`);\n}\n\nfunction printUnknownEndpointPolicy(\n connectorRef: string,\n policy: ConnectorCheckPolicy,\n agentId: string | undefined,\n): void {\n switch (policy.outcome) {\n case \"allow\":\n console.log(\n policy.basis === \"no-policy\"\n ? \"Result: No policy entry exists for this connector, so the request is allowed.\"\n : \"Result: No permission matched. The unknown endpoint policy allows this request.\",\n );\n return;\n case \"deny\":\n console.log(\n \"Result: No permission matched. The unknown endpoint policy denies this request.\",\n );\n printPermissionRequestCommands(\n connectorRef,\n \"__unknown__\",\n agentId,\n \"To request access to unknown endpoints, run\",\n );\n return;\n case \"ask\":\n console.log(\n \"Result: No permission matched. The unknown endpoint policy requires approval.\",\n );\n printPermissionRequestCommands(\n connectorRef,\n \"__unknown__\",\n agentId,\n \"To request access to unknown endpoints, run\",\n );\n return;\n case \"unavailable\":\n printUnavailablePolicy(policy);\n return;\n }\n}\n\nfunction printUrlPermissionDiagnostic(\n result: ResolvedUrlDiagnostic,\n agentId: string | undefined,\n): void {\n console.log(\"## Step 3: Permission policy check (auto-detected from URL)\");\n console.log(\"\");\n console.log(\n `Matching ${result.method} ${result.relativePath} (relative to base URL ${result.base}) against the ${result.connector.label} connector's permission rules.`,\n );\n console.log(\"\");\n\n if (result.permission.kind === \"matched\") {\n console.log(\n `Matched permissions: [${result.permission.permissions\n .map((permission) => {\n return permission.name;\n })\n .join(\", \")}]`,\n );\n console.log(\"\");\n for (const permission of result.permission.permissions) {\n printNamedPolicyResult(\n result.connector.connectorRef,\n permission.name,\n permission.policy,\n agentId,\n );\n }\n } else {\n console.log(\n `No named permission matches ${result.method} ${result.relativePath}. This request falls through to the unknown-endpoint policy.`,\n );\n console.log(\"\");\n printUnknownEndpointPolicy(\n result.connector.connectorRef,\n result.permission.policy,\n agentId,\n );\n }\n console.log(\"\");\n}\n\nfunction printEnvironmentPermissionDiagnostic(\n result: ResolvedEnvironmentDiagnostic,\n permissionName: string | undefined,\n agentId: string | undefined,\n): void {\n if (result.permission === null) {\n return;\n }\n if (permissionName === undefined) {\n throw new Error(\n \"Connector diagnostic returned a permission outcome without a requested permission.\",\n );\n }\n console.log(\"## Step 3: Permission policy check\");\n console.log(\"\");\n console.log(\n `Checking permission: \"${permissionName}\" for the ${result.connector.label} connector.`,\n );\n console.log(\"\");\n printNamedPolicyResult(\n result.connector.connectorRef,\n permissionName,\n result.permission,\n agentId,\n );\n console.log(\"\");\n}\n\nfunction printRediagnoseHint(\n opts: CheckConnectorOptions,\n method: string,\n): void {\n const args: string[] = [];\n if (opts.url !== undefined) {\n args.push(`--url ${shellQuoteArg(stripUrlQueryAndFragment(opts.url))}`);\n if (opts.connector !== undefined) {\n args.push(`--connector ${shellQuoteArg(opts.connector)}`);\n }\n if (opts.envName !== undefined) {\n args.push(`--env-name ${shellQuoteArg(opts.envName)}`);\n }\n if (method !== \"GET\") {\n args.push(`--method ${shellQuoteArg(method)}`);\n }\n } else if (opts.envName !== undefined) {\n args.push(`--env-name ${shellQuoteArg(opts.envName)}`);\n }\n if (opts.checkPermission !== undefined) {\n args.push(`--check-permission ${shellQuoteArg(opts.checkPermission)}`);\n }\n console.log(\n `To re-diagnose after changes, run: zero connector check ${args.join(\" \")}`,\n );\n}\n\nexport const checkConnectorCommand = new Command()\n .name(\"check\")\n .description(\n \"Diagnose connector health: environment names, connector configuration, and permission policies\",\n )\n .addOption(\n new Option(\n \"--env-name <ENV_NAME>\",\n \"The connector environment name to check (e.g. GITHUB_TOKEN)\",\n ),\n )\n .addOption(\n new Option(\n \"--url <URL>\",\n \"A full URL to diagnose — matches connector ownership, route environment names, and permission (e.g. https://api.github.com/repos/owner/repo)\",\n ),\n )\n .addOption(\n new Option(\n \"--connector <type>\",\n \"Select the connector when multiple connectors own the same URL route\",\n ),\n )\n .addOption(\n new Option(\n \"--method <METHOD>\",\n \"HTTP method to use when matching permissions with --url\",\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 connector check --env-name GITHUB_TOKEN\n zero connector check --url https://api.github.com/repos/owner/repo\n zero connector check --url https://api.accounts.nintendo.com/2.0.0/users/me --connector nintendo-store\n zero connector check --url https://slack.com/api/chat.postMessage --method POST\n zero connector check --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, command: Command) => {\n validateCheckConnectorOptions(opts, command);\n if (isComputerUseCheckTarget(opts)) {\n printComputerUsePermissionGuidance();\n return;\n }\n const method = opts.method.toUpperCase();\n const request = buildDiagnosticRequest(opts, method);\n const diagnostic = await diagnoseZeroConnectorCheck(request);\n const result = resolvedDiagnostic(request, diagnostic);\n\n printDiagnosticSummary(request, result);\n console.log(\"\");\n\n const platformUrl = toPlatformUrl(await getApiUrl());\n const ctx: DiagContext = {\n environmentNames: diagnosticEnvironmentNames(result),\n connectorRef: result.connector.connectorRef,\n label: result.connector.label,\n connectorAvailable: result.connector.visibility === \"available\",\n credentialResolution: result.connector.credentialResolution,\n run: result.run,\n platformOrigin: platformUrl.origin,\n agentId: process.env.ZERO_AGENT_ID || undefined,\n };\n\n checkEnvironmentNames(ctx);\n const { isConnected, isExpired, hasPermission } =\n await checkConnectorStatus(ctx);\n const configuredForRun = checkConnectorDomains(ctx);\n\n if (configuredForRun === false) {\n console.log(\n `Steps 1-2 summary: The ${ctx.label} connector is not configured for this run. Check the agent authorization settings, then start a new run after updating them.`,\n );\n } else if (isConnected && !isExpired && hasPermission) {\n console.log(\n `Steps 1-2 summary: The ${ctx.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 if (result.mode === \"url\") {\n printUrlPermissionDiagnostic(result, ctx.agentId);\n } else {\n printEnvironmentPermissionDiagnostic(\n result,\n request.mode === \"environment\" ? request.permission : undefined,\n ctx.agentId,\n );\n }\n\n printRediagnoseHint(opts, method);\n }),\n );\n","const COMPUTER_USE_CONNECTOR_REF = \"computer-use\";\nconst COMPUTER_USE_CAPABILITY = \"computer-use:write\";\nconst COMPUTER_USE_PATH_PREFIX = \"/computer-use\";\nconst COMPUTER_USE_PATH_PREFIX_WITH_SLASH = `${COMPUTER_USE_PATH_PREFIX}/`;\n\ninterface ComputerUsePermissionTarget {\n readonly connectorRef: string;\n readonly path?: string;\n readonly permission?: string;\n}\n\nexport function isComputerUsePermissionTarget(\n target: ComputerUsePermissionTarget,\n): boolean {\n return (\n target.connectorRef === COMPUTER_USE_CONNECTOR_REF ||\n target.permission === COMPUTER_USE_CAPABILITY ||\n target.path === COMPUTER_USE_PATH_PREFIX ||\n target.path?.startsWith(COMPUTER_USE_PATH_PREFIX_WITH_SLASH) === true\n );\n}\n\nexport function printComputerUsePermissionGuidance(): void {\n console.log(\"Computer Use access is not managed as a connector permission.\");\n console.log(\n \"The current run token needs computer-use:write, which is issued only when a Zero Desktop Computer Use host is selected for the chat or thread before the run starts.\",\n );\n console.log(\n \"Open Zero Desktop, make sure Computer Use is online, select the Computer Use host for this chat/thread, then start a new run. Existing run tokens cannot be upgraded in place.\",\n );\n console.log(\n \"Run `zero whoami` to confirm whether the current ZERO_TOKEN includes computer-use:write.\",\n );\n}\n","export const CALLBACK_PROMPT_PLACEHOLDER =\n \"SOMETHING_AGENT_WANT_TO_BE_CALLBACK\";\n\nexport function connectorActionCallbackAvailable(): boolean {\n return Boolean(process.env.ZERO_CHAT_THREAD_ID?.trim());\n}\n\nfunction currentChatThreadId(agentId: string | undefined): string | null {\n const threadId = process.env.ZERO_CHAT_THREAD_ID?.trim();\n const currentAgentId = process.env.ZERO_AGENT_ID?.trim();\n if (!threadId || !currentAgentId || agentId !== currentAgentId) {\n return null;\n }\n return threadId;\n}\n\nexport function currentChatSupportsActionCallback(\n agentId: string | undefined,\n): boolean {\n return currentChatThreadId(agentId) !== null;\n}\n\nfunction addCallbackSearchParams(\n params: URLSearchParams,\n threadId: string,\n callbackPrompt: string,\n): void {\n params.set(\"threadId\", threadId);\n params.set(\"callbackPrompt\", callbackPrompt);\n}\n\nexport function addRequestedCallbackSearchParams(\n params: URLSearchParams,\n callbackPrompt: string | undefined,\n agentId: string | undefined,\n): void {\n if (callbackPrompt === undefined) {\n return;\n }\n\n const normalizedPrompt = callbackPrompt.trim();\n if (!normalizedPrompt) {\n throw new Error(\"--callback-prompt cannot be empty\");\n }\n\n const threadId = currentChatThreadId(agentId);\n if (!threadId) {\n throw new Error(\n \"--callback-prompt can only target the current Zero web chat thread and agent\",\n );\n }\n addCallbackSearchParams(params, threadId, normalizedPrompt);\n}\n\nexport function connectorActionUrl(args: {\n readonly origin: string;\n readonly path: string;\n readonly agentId?: string;\n}): string {\n const url = new URL(args.path, args.origin);\n if (args.agentId) {\n url.searchParams.set(\"agentId\", args.agentId);\n }\n return url.toString();\n}\n\nfunction callbackActionUrlExample(\n actionUrl: string,\n agentId: string | undefined,\n): string | null {\n const threadId = currentChatThreadId(agentId);\n if (!threadId) {\n return null;\n }\n\n const url = new URL(actionUrl);\n addCallbackSearchParams(\n url.searchParams,\n threadId,\n CALLBACK_PROMPT_PLACEHOLDER,\n );\n return url.toString();\n}\n\nexport function printCallbackActionUrlExample(\n actionUrl: string,\n agentId: string | undefined,\n): void {\n const callbackUrl = callbackActionUrlExample(actionUrl, agentId);\n if (!callbackUrl) {\n return;\n }\n\n console.log(\"\");\n console.log(\n \"Or, if this is the only connector or permission action needed, use the callback URL below. After the user completes this action, Zero will automatically start the next round with the callback prompt:\",\n );\n console.log(callbackUrl);\n}\n\nexport function printCallbackTurnInstruction(): void {\n console.log(\"\");\n console.log(\n \"After sharing this callback URL, end the current turn. When the user completes the action, Zero will automatically start the next round with the callback prompt.\",\n );\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n connectZeroConnectorManualGrant,\n listZeroConnectorCatalogStatus,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport {\n availableConnectorRefs,\n findConnectorStatusItem,\n resolveManualGrantAuthMethod,\n} from \"./public-catalog\";\n\ninterface ConnectOptions {\n readonly authMethod?: string;\n readonly value?: readonly string[];\n readonly json?: boolean;\n}\n\nfunction collectValue(value: string, previous: string[]): string[] {\n return [...previous, value];\n}\n\nfunction parseConnectorValues(rawValues: readonly string[] | undefined) {\n if (!rawValues || rawValues.length === 0) {\n throw new Error(\"At least one --value NAME=VALUE is required\", {\n cause: new Error(\n \"Example: zero connector connect zendesk --value apiToken=token\",\n ),\n });\n }\n\n const values: Record<string, string> = {};\n for (const rawValue of rawValues) {\n const separatorIndex = rawValue.indexOf(\"=\");\n if (separatorIndex <= 0) {\n throw new Error(\"Invalid --value format\", {\n cause: new Error(\"Use --value NAME=VALUE\"),\n });\n }\n\n const name = rawValue.slice(0, separatorIndex);\n if (!name.trim()) {\n throw new Error(\"Invalid --value format\", {\n cause: new Error(\"Field name cannot be empty\"),\n });\n }\n\n values[name] = rawValue.slice(separatorIndex + 1);\n }\n\n return values;\n}\n\nexport const connectCommand = new Command()\n .name(\"connect\")\n .description(\"Connect a connector with manual grant values\")\n .argument(\"<type>\", \"Connector type (e.g., zendesk)\")\n .option(\"--auth-method <method>\", \"Connector auth method to use\")\n .option(\n \"--value <name=value>\",\n \"Connector field value; repeat for multiple fields\",\n collectValue,\n [],\n )\n .option(\"--json\", \"Print the connector response as JSON\")\n .action(\n withErrorHandler(async (type: string, options: ConnectOptions) => {\n const values = parseConnectorValues(options.value);\n const catalog = await listZeroConnectorCatalogStatus();\n const connectorMetadata = findConnectorStatusItem(\n catalog.connectors,\n type,\n );\n if (!connectorMetadata) {\n throw new Error(`Unknown or unavailable connector: ${type}`, {\n cause: new Error(\n `Available connectors: ${availableConnectorRefs(catalog.connectors)}`,\n ),\n });\n }\n\n const authMethod = resolveManualGrantAuthMethod(\n connectorMetadata,\n options.authMethod,\n );\n const connector = await connectZeroConnectorManualGrant(\n connectorMetadata.connectorRef,\n authMethod.id,\n values,\n );\n\n if (options.json) {\n console.log(JSON.stringify(connector, null, 2));\n return;\n }\n\n console.log(chalk.green(`✓ ${connectorMetadata.label} connected`));\n console.log(chalk.dim(` Type: ${connector.type}`));\n console.log(chalk.dim(` Auth Method: ${connector.authMethod}`));\n console.log(chalk.dim(` Run: zero connector status ${connector.type}`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroConnectorCatalogStatus } from \"../../../lib/api\";\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 }, agentCtx] = await Promise.all([\n listZeroConnectorCatalogStatus(),\n resolveAgentContext(options.agent),\n ]);\n\n const allTypes = connectors.map((connector) => {\n return connector.connectorRef;\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 = connectors.map((connector) => {\n return renderConnectedAsCell(connector);\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 chalk from \"chalk\";\nimport type { PublicConnectorStatus } from \"./public-catalog\";\n\nfunction renderIdentity(connector: PublicConnectorStatus): string {\n if (connector.connection?.externalUsername) {\n return `@${connector.connection.externalUsername}`;\n }\n if (connector.connection?.externalEmail)\n return connector.connection.externalEmail;\n return \"-\";\n}\n\nexport function renderConnectedAsCell(\n connector: PublicConnectorStatus | undefined,\n): string {\n if (!connector || connector.connectionStatus === \"not-connected\") {\n return chalk.dim(\"(not connected)\");\n }\n const identity = renderIdentity(connector);\n if (connector.connectionStatus === \"reconnect-required\") {\n return chalk.yellow(`${identity} (reconnect needed)`);\n }\n if (\n connector.scopeMismatch ||\n connector.connectionStatus === \"scope-mismatch\"\n ) {\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 { listZeroConnectorCatalogStatus } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { resolveAgentContext } from \"./agent-context\";\nimport { padEndAnsi, renderConnectedAsCell, stripAnsi } from \"./connected-as\";\nimport { searchPublicConnectorCatalog } from \"./public-catalog\";\n\nconst DEFAULT_LIMIT = 5;\nconst EXACT_MATCH_THRESHOLD = 80;\n\nfunction parseLimit(raw: string): number {\n const trimmed = raw.trim();\n const n = Number(trimmed);\n if (!/^\\d+$/.test(trimmed) || !Number.isSafeInteger(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(\n \"Search connectors by type, label, category, generation type, or tag\",\n )\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 }, agentCtx] = await Promise.all([\n listZeroConnectorCatalogStatus(),\n resolveAgentContext(options.agent),\n ]);\n const { results, total } = searchPublicConnectorCatalog(\n connectors,\n trimmed,\n options.limit,\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(r.connector);\n });\n\n const typeWidth = Math.max(\n typeHeader.length,\n ...results.map((r) => {\n return r.connector.connectorRef.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.connector.connectorRef.padEnd(typeWidth),\n padEndAnsi(connectedCells[i]!, connectedAsWidth),\n ];\n if (agentCtx) {\n parts.push(\n agentCtx.authorizedTypes.has(result.connector.connectorRef)\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 { listZeroConnectorCatalogStatus } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { resolveAgentContext } from \"./agent-context\";\nimport { getPlatformOrigin } from \"../doctor/platform-url\";\nimport {\n availableConnectorRefs,\n findConnectorStatusItem,\n type PublicConnectorStatus,\n} from \"./public-catalog\";\nimport {\n connectorActionUrl,\n printCallbackActionUrlExample,\n} from \"./action-url\";\n\nconst LABEL_WIDTH = 16;\n\ntype AgentContext = NonNullable<\n Awaited<ReturnType<typeof resolveAgentContext>>\n>;\n\nfunction printConnectorDetails(connector: PublicConnectorStatus): void {\n if (connector.connectionStatus === \"not-connected\") {\n console.log(\n `${\"Status:\".padEnd(LABEL_WIDTH)}${chalk.dim(\"not connected\")}`,\n );\n return;\n }\n\n console.log(\n `${\"Status:\".padEnd(LABEL_WIDTH)}${\n connector.connectionStatus === \"reconnect-required\"\n ? chalk.yellow(\"reconnect needed\")\n : chalk.green(\"connected\")\n }`,\n );\n if (connector.connection?.externalUsername) {\n console.log(\n `${\"Account:\".padEnd(LABEL_WIDTH)}@${connector.connection.externalUsername}`,\n );\n } else if (connector.connection?.externalEmail) {\n console.log(\n `${\"Account:\".padEnd(LABEL_WIDTH)}${connector.connection.externalEmail}`,\n );\n }\n if (connector.connection?.authMethod) {\n console.log(\n `${\"Auth Method:\".padEnd(LABEL_WIDTH)}${connector.connection.authMethod}`,\n );\n }\n if (connector.scopeMismatch) {\n console.log(\n `${\"Permissions:\".padEnd(LABEL_WIDTH)}${chalk.yellow(\"update available\")}`,\n );\n }\n if (connector.tokenExpiresAt) {\n console.log(\n `${\"Token Expires:\".padEnd(LABEL_WIDTH)}${connector.tokenExpiresAt}`,\n );\n }\n}\n\nasync function printAgentAction(\n connector: PublicConnectorStatus,\n agentCtx: AgentContext,\n): Promise<void> {\n const connectorRef = connector.connectorRef;\n const authorized = agentCtx.authorizedTypes.has(connectorRef);\n const isConnected = connector.connected;\n const needsReconnect = connector.connectionStatus === \"reconnect-required\";\n const agentLabel =\n agentCtx.displayName === agentCtx.agentId\n ? agentCtx.agentId\n : `${agentCtx.displayName} (${agentCtx.agentId})`;\n\n console.log();\n if (needsReconnect) {\n const origin = await getPlatformOrigin();\n const url = connectorActionUrl({\n origin,\n path: `/connectors/${connectorRef}/connect`,\n agentId: agentCtx.agentId,\n });\n console.log(\n `The ${connectorRef} connector is connected but needs to be reconnected before agent ${agentLabel} can use it.`,\n );\n console.log(`Reconnect it at: [Reconnect ${connectorRef}](${url})`);\n printCallbackActionUrlExample(url, agentCtx.agentId);\n } else if (authorized && !isConnected) {\n const origin = await getPlatformOrigin();\n const url = connectorActionUrl({\n origin,\n path: `/connectors/${connectorRef}/connect`,\n agentId: agentCtx.agentId,\n });\n console.log(\n `The ${connectorRef} connector is authorized for agent ${agentLabel}, but it is not connected.`,\n );\n console.log(`Connect it at: [Connect ${connectorRef}](${url})`);\n printCallbackActionUrlExample(url, agentCtx.agentId);\n } else if (authorized) {\n console.log(\n `The ${connectorRef} connector is authorized for agent ${agentLabel}.`,\n );\n } else if (!isConnected) {\n const origin = await getPlatformOrigin();\n const url = connectorActionUrl({\n origin,\n path: `/connectors/${connectorRef}/connect`,\n agentId: agentCtx.agentId,\n });\n console.log(\n `The ${connectorRef} connector is not connected. Once connected, it will be authorized for agent ${agentLabel}.`,\n );\n console.log(\n `Connect and authorize it at: [Connect ${connectorRef}](${url})`,\n );\n printCallbackActionUrlExample(url, agentCtx.agentId);\n } else {\n const origin = await getPlatformOrigin();\n const url = connectorActionUrl({\n origin,\n path: `/connectors/${connectorRef}/authorize`,\n agentId: agentCtx.agentId,\n });\n console.log(\n `The ${connectorRef} connector is not authorized for agent ${agentLabel}.`,\n );\n console.log(`Authorize it at: [Authorize ${connectorRef}](${url})`);\n printCallbackActionUrlExample(url, agentCtx.agentId);\n }\n}\n\nasync function printStandaloneAction(\n connector: PublicConnectorStatus,\n): Promise<void> {\n const connectorRef = connector.connectorRef;\n if (\n connector.connectionStatus === \"connected\" ||\n connector.connectionStatus === \"scope-mismatch\"\n ) {\n return;\n }\n\n const origin = await getPlatformOrigin();\n console.log();\n if (connector.connectionStatus === \"reconnect-required\") {\n const url = `${origin}/connectors`;\n console.log(\n `The ${connectorRef} connector is connected but needs to be reconnected.`,\n );\n console.log(`Reconnect it at: [Reconnect ${connectorRef}](${url})`);\n } else {\n const url = `${origin}/connectors/${connectorRef}/connect`;\n console.log(`Connect it at: [Connect ${connectorRef}](${url})`);\n }\n}\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 [catalog, agentCtx] = await Promise.all([\n listZeroConnectorCatalogStatus(),\n resolveAgentContext(options.agent),\n ]);\n const connector = findConnectorStatusItem(catalog.connectors, type);\n if (!connector) {\n throw new Error(`Unknown or unavailable connector: ${type}`, {\n cause: new Error(\n `Available connectors: ${availableConnectorRefs(catalog.connectors)}`,\n ),\n });\n }\n\n console.log(`Connector: ${chalk.cyan(connector.connectorRef)}`);\n console.log();\n\n printConnectorDetails(connector);\n\n if (agentCtx) {\n await printAgentAction(connector, agentCtx);\n } else {\n await printStandaloneAction(connector);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { readFile } from \"node:fs/promises\";\nimport { customConnectorProposalSchema } from \"@vm0/api-contracts/contracts/zero-custom-connectors\";\nimport {\n getZeroAgent,\n getZeroAgentCustomConnectors,\n getZeroCustomConnector,\n listZeroCustomConnectors,\n} from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\nimport { getPlatformOrigin } from \"../../doctor/platform-url\";\n\nconst LABEL_WIDTH = 18;\n\nfunction renderConnected(connector: {\n readonly connected: boolean;\n readonly missingRequiredFields: readonly string[];\n}): string {\n if (connector.connected) {\n return chalk.green(\"connected\");\n }\n if (connector.missingRequiredFields.length === 0) {\n return chalk.dim(\"not connected\");\n }\n return chalk.yellow(`missing ${connector.missingRequiredFields.join(\", \")}`);\n}\n\nfunction encodeBase64UrlJson(value: unknown): string {\n return Buffer.from(JSON.stringify(value), \"utf8\").toString(\"base64url\");\n}\n\nfunction isJsonObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nasync function resolveCustomAgentContext(agentId: string | undefined): Promise<{\n readonly agentId: string;\n readonly displayName: string;\n readonly authorizedIds: Set<string>;\n} | null> {\n const resolvedAgentId = agentId ?? process.env.ZERO_AGENT_ID;\n if (!resolvedAgentId) {\n return null;\n }\n const [agent, enabledIds] = await Promise.all([\n getZeroAgent(resolvedAgentId),\n getZeroAgentCustomConnectors(resolvedAgentId),\n ]);\n return {\n agentId: agent.agentId,\n displayName: agent.displayName ?? agent.agentId,\n authorizedIds: new Set(enabledIds),\n };\n}\n\nconst listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List org custom connectors\")\n .option(\"--agent <id>\", \"Show per-agent authorization column\")\n .action(\n withErrorHandler(async (options: { agent?: string }) => {\n const [connectors, agentCtx] = await Promise.all([\n listZeroCustomConnectors(),\n resolveCustomAgentContext(options.agent),\n ]);\n const idWidth = Math.max(\n 2,\n ...connectors.map((connector) => {\n return connector.id.length;\n }),\n );\n const nameWidth = Math.max(\n 4,\n ...connectors.map((connector) => {\n return connector.displayName.length;\n }),\n );\n const header = [\"ID\".padEnd(idWidth), \"NAME\".padEnd(nameWidth), \"STATUS\"];\n if (agentCtx) {\n header.push(`AUTHORIZED FOR ${agentCtx.displayName}`);\n }\n console.log(chalk.dim(header.join(\" \")));\n for (const connector of connectors) {\n const row = [\n connector.id.padEnd(idWidth),\n connector.displayName.padEnd(nameWidth),\n renderConnected(connector),\n ];\n if (agentCtx) {\n row.push(\n agentCtx.authorizedIds.has(connector.id)\n ? chalk.green(\"✓\")\n : chalk.dim(\"-\"),\n );\n }\n console.log(row.join(\" \"));\n }\n }),\n );\n\nconst statusCommand = new Command()\n .name(\"status\")\n .description(\"Show detailed status of a custom connector\")\n .argument(\"<connector-id>\", \"Custom connector id\")\n .option(\"--agent <id>\", \"Show authorization state for the given agent\")\n .action(\n withErrorHandler(\n async (connectorId: string, options: { agent?: string }) => {\n const [connector, agentCtx] = await Promise.all([\n getZeroCustomConnector(connectorId),\n resolveCustomAgentContext(options.agent),\n ]);\n if (!connector) {\n throw new Error(`Custom connector not found: ${connectorId}`);\n }\n console.log(`Custom connector: ${chalk.cyan(connector.displayName)}`);\n console.log();\n console.log(`${\"ID:\".padEnd(LABEL_WIDTH)}${connector.id}`);\n console.log(\n `${\"Status:\".padEnd(LABEL_WIDTH)}${renderConnected(connector)}`,\n );\n console.log(\n `${\"Prefixes:\".padEnd(LABEL_WIDTH)}${connector.prefixTemplates.join(\", \")}`,\n );\n console.log(\n `${\"Fields:\".padEnd(LABEL_WIDTH)}${connector.fields\n .map((field) => {\n return `${field.kind}:${field.key}${field.required ? \"\" : \"?\"}`;\n })\n .join(\", \")}`,\n );\n if (connector.headerInjections.length > 0) {\n console.log(\n `${\"Headers:\".padEnd(LABEL_WIDTH)}${connector.headerInjections\n .map((header) => {\n return header.name;\n })\n .join(\", \")}`,\n );\n }\n if (connector.queryInjections.length > 0) {\n console.log(\n `${\"Query params:\".padEnd(LABEL_WIDTH)}${connector.queryInjections\n .map((query) => {\n return query.name;\n })\n .join(\", \")}`,\n );\n }\n if (agentCtx) {\n console.log(\n `${\"Authorized:\".padEnd(LABEL_WIDTH)}${\n agentCtx.authorizedIds.has(connector.id)\n ? chalk.green(\"yes\")\n : chalk.yellow(\"no\")\n }`,\n );\n }\n },\n ),\n );\n\nconst proposeCommand = new Command()\n .name(\"propose\")\n .description(\"Create a browser save link for a custom connector proposal\")\n .requiredOption(\"--proposal-file <path>\", \"JSON proposal file\")\n .option(\"--connector-id <id>\", \"Override connector id for update proposals\")\n .option(\"--agent <id>\", \"Authorize this agent when the proposal is saved\")\n .action(\n withErrorHandler(\n async (options: {\n proposalFile: string;\n connectorId?: string;\n agent?: string;\n }) => {\n const raw = await readFile(options.proposalFile, \"utf8\");\n const proposalJson: unknown = JSON.parse(raw);\n if (!isJsonObject(proposalJson)) {\n throw new Error(\"Proposal file must contain a JSON object\");\n }\n const parsed = customConnectorProposalSchema.parse({\n ...proposalJson,\n ...(options.connectorId ? { connectorId: options.connectorId } : {}),\n });\n const origin = await getPlatformOrigin();\n const params = new URLSearchParams({\n p: encodeBase64UrlJson(parsed),\n });\n const agentId = options.agent ?? process.env.ZERO_AGENT_ID;\n if (agentId) {\n params.set(\"agentId\", agentId);\n }\n const url = `${origin}/connectors/custom/proposal?${params.toString()}`;\n console.log(`[Configure ${parsed.displayName}](${url})`);\n console.log();\n console.log(\n \"Open this link to review, save values, and authorize the connector.\",\n );\n },\n ),\n );\n\nexport const customConnectorCommand = new Command()\n .name(\"custom\")\n .description(\"Inspect and propose org custom connectors\")\n .addCommand(listCommand)\n .addCommand(statusCommand)\n .addCommand(proposeCommand);\n","import { Command, Option } from \"commander\";\nimport { findFirewallMetadataPermission } from \"@vm0/connectors/firewall-metadata/policy\";\nimport { UNKNOWN_PERMISSION_GRANT } from \"@vm0/connectors/firewall-types\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { getPlatformOrigin } from \"../doctor/platform-url\";\nimport {\n isComputerUsePermissionTarget,\n printComputerUsePermissionGuidance,\n} from \"./computer-use-guidance\";\nimport {\n ApiRequestError,\n createComputerUseAuthorizationRequest,\n getZeroConnectorCatalogPermissions,\n} from \"../../../lib/api\";\nimport {\n addRequestedCallbackSearchParams,\n connectorActionCallbackAvailable,\n printCallbackTurnInstruction,\n} from \"./action-url\";\n\nfunction permissionDescription(permission: string): string {\n return permission === UNKNOWN_PERMISSION_GRANT\n ? \"unknown endpoints\"\n : `the \"${permission}\" permission`;\n}\n\nfunction printSensitivePermissionGuidance(\n connectorRef: string,\n permission: string,\n): void {\n // Slack chat:write: strongly recommend bot-based messaging over user identity\n if (connectorRef === \"slack\" && permission === \"chat:write\") {\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 allow this permission below if acting as the user is specifically required.\",\n );\n console.log(\"\");\n }\n\n // Gmail send permissions: strongly recommend draft-based workflow over direct send.\n if (\n connectorRef === \"gmail\" &&\n (permission === \"messages.send\" || permission === \"drafts.send\")\n ) {\n console.log(\"\");\n console.log(\n \"IMPORTANT: Granting Gmail send permissions allows the agent to send emails directly as the user.\",\n );\n console.log(\n \"Consider keeping messages.send and drafts.send disabled and using drafts.write instead — the agent can create drafts for the user to review and send manually.\",\n );\n console.log(\n \"Only allow this permission below if direct sending is specifically required.\",\n );\n console.log(\"\");\n }\n}\n\nfunction printPermissionRequestMessage(args: {\n readonly permission: string;\n readonly label: string;\n readonly url: string;\n}): void {\n console.log(\n `You can allow ${permissionDescription(args.permission)} for your connector access: [Manage ${args.label} permissions](${args.url})`,\n );\n}\n\nfunction printComputerUseAuthorizationLink(args: {\n readonly authorizationUrl: string;\n readonly expiresAt: string;\n}): void {\n console.log(\n \"Computer Use needs a Zero Desktop host selected before a run starts.\",\n );\n console.log(\n \"Ask the user to authorize a host for future runs in this chat or Slack thread:\",\n );\n console.log(args.authorizationUrl);\n console.log(\n `This link expires at ${args.expiresAt}. Existing run tokens cannot be upgraded in place; start a new run after authorization.`,\n );\n}\n\nasync function printComputerUsePermissionRequestMessage(): Promise<void> {\n if (!process.env.ZERO_TOKEN) {\n printComputerUsePermissionGuidance();\n return;\n }\n\n try {\n const request = await createComputerUseAuthorizationRequest();\n printComputerUseAuthorizationLink({\n authorizationUrl: request.authorizationUrl,\n expiresAt: request.expiresAt,\n });\n } catch (error) {\n if (error instanceof ApiRequestError) {\n console.log(\n `Computer Use authorization link unavailable: ${error.message}`,\n );\n printComputerUsePermissionGuidance();\n return;\n }\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.log(`Computer Use authorization link unavailable: ${message}`);\n printComputerUsePermissionGuidance();\n }\n}\n\nasync function outputPermissionRequestMessage(\n connectorRef: string,\n label: string,\n permission: string,\n agentId: string | undefined,\n callbackPrompt: string | undefined,\n): Promise<void> {\n const platformOrigin = await getPlatformOrigin();\n\n const urlParams = new URLSearchParams({\n ref: connectorRef,\n permission,\n action: \"allow\",\n });\n addRequestedCallbackSearchParams(urlParams, callbackPrompt, agentId);\n\n const pagePath = agentId ? `/agents/${agentId}/permissions` : \"/agents\";\n const url = `${platformOrigin}${pagePath}?${urlParams.toString()}`;\n\n printSensitivePermissionGuidance(connectorRef, permission);\n printPermissionRequestMessage({\n permission,\n label,\n url,\n });\n if (callbackPrompt !== undefined) {\n printCallbackTurnInstruction();\n }\n}\n\nconst callbackPromptOption = new Option(\n \"--callback-prompt <prompt>\",\n \"Start the next web chat round with this prompt after the permission is granted\",\n);\nconst callbackPromptAvailable = connectorActionCallbackAvailable();\nif (!callbackPromptAvailable) {\n callbackPromptOption.hideHelp();\n}\nconst callbackPromptExample = callbackPromptAvailable\n ? ' zero connector permission-request github --permission contents:write --callback-prompt \"Re-check the permission, then continue the previous task\"\\n'\n : \"\";\nconst callbackPromptNotes = callbackPromptAvailable\n ? \" - Use --callback-prompt only when this turn needs exactly one connector or permission action\\n - Callback prompts are included in the URL; keep them concise and do not include secrets\\n\"\n : \"\";\n\nexport const permissionRequestCommand = new Command()\n .name(\"permission-request\")\n .description(\"Request permission to use a connector capability\")\n .argument(\"<connector-ref>\", \"The connector type (e.g. github)\")\n .addOption(\n new Option(\n \"--permission <name>\",\n \"The permission name to request\",\n ).makeOptionMandatory(),\n )\n .addOption(\n new Option(\n \"--agent <id>\",\n \"Agent ID whose permission page should be opened (defaults to ZERO_AGENT_ID)\",\n ),\n )\n .addOption(callbackPromptOption)\n .addHelpText(\n \"after\",\n `\nExamples:\n zero connector permission-request github --permission contents:read\n${callbackPromptExample} zero connector permission-request gmail --permission messages.write --agent <agent-id>\n zero connector permission-request cloudflare --permission __unknown__\n zero connector permission-request computer-use --permission computer-use:write\n\nNotes:\n - Outputs a platform URL for the user to allow the permission\n - Use --permission __unknown__ to request access to unknown endpoints\n - Use --agent to request a permission for another agent; defaults to ZERO_AGENT_ID\n - The user chooses the permission duration on the confirmation page\n${callbackPromptNotes} - Permission requests update the current user's connector grants after confirmation`,\n )\n .action(\n withErrorHandler(\n async (\n connectorRef: string,\n opts: {\n permission: string;\n agent?: string;\n callbackPrompt?: string;\n },\n ) => {\n if (\n isComputerUsePermissionTarget({\n connectorRef,\n permission: opts.permission,\n })\n ) {\n if (opts.callbackPrompt !== undefined) {\n throw new Error(\n \"--callback-prompt is not supported for Computer Use authorization requests\",\n );\n }\n await printComputerUsePermissionRequestMessage();\n return;\n }\n\n const agentId = opts.agent ?? process.env.ZERO_AGENT_ID;\n\n const metadata = await getZeroConnectorCatalogPermissions(connectorRef);\n if (!metadata) {\n throw new Error(`Unknown connector type: ${connectorRef}`);\n }\n\n if (\n opts.permission !== UNKNOWN_PERMISSION_GRANT &&\n !findFirewallMetadataPermission(metadata, opts.permission)\n ) {\n throw new Error(\n `Unknown permission \"${opts.permission}\" for ${connectorRef}`,\n );\n }\n\n await outputPermissionRequestMessage(\n connectorRef,\n metadata.label,\n opts.permission,\n agentId,\n opts.callbackPrompt,\n );\n },\n ),\n );\n"],"mappings":"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","names":["LABEL_WIDTH","listCommand","statusCommand","permissionRequestCommand","permissionRequestCommand"]}