@vm0/cli 9.274.10 → 9.274.12

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 (105) hide show
  1. package/{agent-FLAWLBHS.js → agent-SJPXFCY2.js} +7 -9
  2. package/{agent-FLAWLBHS.js.map → agent-SJPXFCY2.js.map} +1 -1
  3. package/{banking-YAVKAKZG.js → banking-JFQN7LVP.js} +4 -4
  4. package/{browser-TQCR4QO2.js → browser-Y45XHNLP.js} +4 -4
  5. package/{chat-FHJ2ISVP.js → chat-VGV4X4P6.js} +5 -5
  6. package/{chunk-55OOIO3Y.js → chunk-3C4OVVAG.js} +2 -2
  7. package/{chunk-SS35GZL5.js → chunk-FCA3SHQR.js} +15 -12
  8. package/chunk-FCA3SHQR.js.map +1 -0
  9. package/{chunk-2T64ACFV.js → chunk-GNT5CELD.js} +7 -21
  10. package/chunk-GNT5CELD.js.map +1 -0
  11. package/{chunk-T7KKAPXV.js → chunk-NU4QI6YS.js} +2 -2
  12. package/{chunk-U4SI4F5E.js → chunk-O4QQXFOU.js} +2 -2
  13. package/{chunk-WHGCJQBT.js → chunk-PTH6CS2U.js} +2 -2
  14. package/{chunk-EUZGV3TS.js → chunk-R6YSBKNW.js} +2 -2
  15. package/{chunk-TFNZKFHF.js → chunk-UMJS5E7A.js} +16 -4
  16. package/{chunk-TFNZKFHF.js.map → chunk-UMJS5E7A.js.map} +1 -1
  17. package/{chunk-Y7RLOQPB.js → chunk-UST46T62.js} +13 -5
  18. package/{chunk-Y7RLOQPB.js.map → chunk-UST46T62.js.map} +1 -1
  19. package/{computer-use-RQFEXMNN.js → computer-use-EX7NUHO6.js} +4 -4
  20. package/{connector-6X7OUT7E.js → connector-CJAQUQ2Y.js} +167 -46
  21. package/connector-CJAQUQ2Y.js.map +1 -0
  22. package/{credit-2EDFXE7L.js → credit-5E3T27Q5.js} +5 -5
  23. package/{developer-support-4VTZP26I.js → developer-support-A4QV7VNK.js} +4 -4
  24. package/{doctor-X6VYBUMF.js → doctor-QVV4Y2R7.js} +5 -5
  25. package/{feishu-ZAJ6DMM2.js → feishu-2JGDX7Y2.js} +4 -4
  26. package/{finance-CQCJPGEN.js → finance-H5IQQC6J.js} +4 -4
  27. package/{generate-IENVOMAL.js → generate-DV6USGFJ.js} +6 -6
  28. package/{github-PW7YAJWN.js → github-XLESF6RQ.js} +4 -4
  29. package/{goal-KRA6TDDS.js → goal-ZPC7PCZJ.js} +4 -4
  30. package/{host-LVFXSZXE.js → host-IFEXU6CT.js} +4 -4
  31. package/{logs-EVEAQBQS.js → logs-LWVYA5M5.js} +6 -6
  32. package/{mail-VIFM7OQC.js → mail-S4TY6S5F.js} +6 -6
  33. package/{maps-M3QEVTF7.js → maps-MF5TNF3I.js} +4 -4
  34. package/{model-JRYQATDZ.js → model-N7BJ6UJZ.js} +5 -5
  35. package/{model-provider-CECCURPK.js → model-provider-DOGJE3JW.js} +5 -5
  36. package/{org-HRQLRSLW.js → org-FY4AJSGQ.js} +4 -4
  37. package/package.json +1 -1
  38. package/{people-search-HCJ57TUJ.js → people-search-WOZJFEK5.js} +4 -4
  39. package/{phone-I34UAINK.js → phone-XHAJ2AES.js} +4 -4
  40. package/{preference-KUNORDNU.js → preference-R5UX5KBL.js} +4 -4
  41. package/{recognize-GP5GEFH2.js → recognize-BIGJNW5H.js} +4 -4
  42. package/{resource-PDE7V6KO.js → resource-O42P5MLK.js} +4 -4
  43. package/{scrape-GLPSOR2T.js → scrape-K4T4EMPC.js} +4 -4
  44. package/{search-OJFN36GD.js → search-YKKUZUGO.js} +6 -6
  45. package/{secret-JNBSMTLG.js → secret-CN4PPKFG.js} +4 -4
  46. package/{slack-EWNDIJ6E.js → slack-2C32JESK.js} +4 -4
  47. package/{teams-OEF65MIB.js → teams-QAFZ4V7H.js} +4 -4
  48. package/{telegram-6S3DYPVD.js → telegram-L73T7GI2.js} +4 -4
  49. package/{upgrade-JTWU4NHS.js → upgrade-CCRFWNS2.js} +3 -3
  50. package/{variable-NCKBKGFF.js → variable-UK6VNJOX.js} +4 -4
  51. package/{video-A5CSCJUP.js → video-PTYXK3VC.js} +3 -3
  52. package/{weather-SQVSJWS6.js → weather-TMQGK6VE.js} +4 -4
  53. package/{web-XRD3IC4O.js → web-IQN3B5EF.js} +4 -4
  54. package/{web-search-DZYEO7UD.js → web-search-CQOCUSUM.js} +4 -4
  55. package/{whoami-BP4VAGA7.js → whoami-ZITONHAH.js} +7 -9
  56. package/{whoami-BP4VAGA7.js.map → whoami-ZITONHAH.js.map} +1 -1
  57. package/{workflow-2ZO3HLD6.js → workflow-G474Q6PL.js} +5 -5
  58. package/zero.js +44 -44
  59. package/chunk-2T64ACFV.js.map +0 -1
  60. package/chunk-SS35GZL5.js.map +0 -1
  61. package/chunk-TAY6RIUI.js +0 -22
  62. package/chunk-TAY6RIUI.js.map +0 -1
  63. package/connector-6X7OUT7E.js.map +0 -1
  64. /package/{banking-YAVKAKZG.js.map → banking-JFQN7LVP.js.map} +0 -0
  65. /package/{browser-TQCR4QO2.js.map → browser-Y45XHNLP.js.map} +0 -0
  66. /package/{chat-FHJ2ISVP.js.map → chat-VGV4X4P6.js.map} +0 -0
  67. /package/{chunk-55OOIO3Y.js.map → chunk-3C4OVVAG.js.map} +0 -0
  68. /package/{chunk-T7KKAPXV.js.map → chunk-NU4QI6YS.js.map} +0 -0
  69. /package/{chunk-U4SI4F5E.js.map → chunk-O4QQXFOU.js.map} +0 -0
  70. /package/{chunk-WHGCJQBT.js.map → chunk-PTH6CS2U.js.map} +0 -0
  71. /package/{chunk-EUZGV3TS.js.map → chunk-R6YSBKNW.js.map} +0 -0
  72. /package/{computer-use-RQFEXMNN.js.map → computer-use-EX7NUHO6.js.map} +0 -0
  73. /package/{credit-2EDFXE7L.js.map → credit-5E3T27Q5.js.map} +0 -0
  74. /package/{developer-support-4VTZP26I.js.map → developer-support-A4QV7VNK.js.map} +0 -0
  75. /package/{doctor-X6VYBUMF.js.map → doctor-QVV4Y2R7.js.map} +0 -0
  76. /package/{feishu-ZAJ6DMM2.js.map → feishu-2JGDX7Y2.js.map} +0 -0
  77. /package/{finance-CQCJPGEN.js.map → finance-H5IQQC6J.js.map} +0 -0
  78. /package/{generate-IENVOMAL.js.map → generate-DV6USGFJ.js.map} +0 -0
  79. /package/{github-PW7YAJWN.js.map → github-XLESF6RQ.js.map} +0 -0
  80. /package/{goal-KRA6TDDS.js.map → goal-ZPC7PCZJ.js.map} +0 -0
  81. /package/{host-LVFXSZXE.js.map → host-IFEXU6CT.js.map} +0 -0
  82. /package/{logs-EVEAQBQS.js.map → logs-LWVYA5M5.js.map} +0 -0
  83. /package/{mail-VIFM7OQC.js.map → mail-S4TY6S5F.js.map} +0 -0
  84. /package/{maps-M3QEVTF7.js.map → maps-MF5TNF3I.js.map} +0 -0
  85. /package/{model-JRYQATDZ.js.map → model-N7BJ6UJZ.js.map} +0 -0
  86. /package/{model-provider-CECCURPK.js.map → model-provider-DOGJE3JW.js.map} +0 -0
  87. /package/{org-HRQLRSLW.js.map → org-FY4AJSGQ.js.map} +0 -0
  88. /package/{people-search-HCJ57TUJ.js.map → people-search-WOZJFEK5.js.map} +0 -0
  89. /package/{phone-I34UAINK.js.map → phone-XHAJ2AES.js.map} +0 -0
  90. /package/{preference-KUNORDNU.js.map → preference-R5UX5KBL.js.map} +0 -0
  91. /package/{recognize-GP5GEFH2.js.map → recognize-BIGJNW5H.js.map} +0 -0
  92. /package/{resource-PDE7V6KO.js.map → resource-O42P5MLK.js.map} +0 -0
  93. /package/{scrape-GLPSOR2T.js.map → scrape-K4T4EMPC.js.map} +0 -0
  94. /package/{search-OJFN36GD.js.map → search-YKKUZUGO.js.map} +0 -0
  95. /package/{secret-JNBSMTLG.js.map → secret-CN4PPKFG.js.map} +0 -0
  96. /package/{slack-EWNDIJ6E.js.map → slack-2C32JESK.js.map} +0 -0
  97. /package/{teams-OEF65MIB.js.map → teams-QAFZ4V7H.js.map} +0 -0
  98. /package/{telegram-6S3DYPVD.js.map → telegram-L73T7GI2.js.map} +0 -0
  99. /package/{upgrade-JTWU4NHS.js.map → upgrade-CCRFWNS2.js.map} +0 -0
  100. /package/{variable-NCKBKGFF.js.map → variable-UK6VNJOX.js.map} +0 -0
  101. /package/{video-A5CSCJUP.js.map → video-PTYXK3VC.js.map} +0 -0
  102. /package/{weather-SQVSJWS6.js.map → weather-TMQGK6VE.js.map} +0 -0
  103. /package/{web-XRD3IC4O.js.map → web-IQN3B5EF.js.map} +0 -0
  104. /package/{web-search-DZYEO7UD.js.map → web-search-CQOCUSUM.js.map} +0 -0
  105. /package/{workflow-2ZO3HLD6.js.map → workflow-G474Q6PL.js.map} +0 -0
@@ -12,12 +12,12 @@ import {
12
12
  fetchComputerUseScreenshot,
13
13
  getComputerUseCommand,
14
14
  listComputerUseHosts
15
- } from "./chunk-Y7RLOQPB.js";
16
- import "./chunk-T7KKAPXV.js";
15
+ } from "./chunk-UST46T62.js";
16
+ import "./chunk-NU4QI6YS.js";
17
17
  import {
18
18
  ApiRequestError,
19
19
  withErrorHandler
20
- } from "./chunk-EUZGV3TS.js";
20
+ } from "./chunk-R6YSBKNW.js";
21
21
  import "./chunk-KLI6K4VO.js";
22
22
  import {
23
23
  Command
@@ -970,4 +970,4 @@ export {
970
970
  formatComputerUseResultForConsole,
971
971
  zeroComputerUseCommand
972
972
  };
973
- //# sourceMappingURL=computer-use-RQFEXMNN.js.map
973
+ //# sourceMappingURL=computer-use-EX7NUHO6.js.map
@@ -1,9 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire as __createRequire } from "node:module";
3
3
  const require = __createRequire(import.meta.url);
4
- import {
5
- hasConnectorFirewallMetadataPermission
6
- } from "./chunk-SS35GZL5.js";
7
4
  import {
8
5
  CALLBACK_PROMPT_PLACEHOLDER,
9
6
  addRequestedCallbackSearchParams,
@@ -18,7 +15,7 @@ import {
18
15
  resolveConnectorDiscoveryAgentContext,
19
16
  resolveManualGrantAuthMethod,
20
17
  searchConnectorCatalog
21
- } from "./chunk-WHGCJQBT.js";
18
+ } from "./chunk-PTH6CS2U.js";
22
19
  import {
23
20
  UNKNOWN_PERMISSION_GRANT,
24
21
  addZeroAgentCustomConnector,
@@ -34,26 +31,25 @@ import {
34
31
  getZeroAgentCustomConnectors,
35
32
  getZeroAgentUserConnectors,
36
33
  getZeroConnector,
37
- getZeroConnectorCatalogPermissions,
38
34
  getZeroCustomConnector,
39
35
  listZeroConnectorCatalogStatus,
40
36
  listZeroCustomConnectors,
41
37
  setZeroCustomConnectorValues,
42
38
  startZeroCustomConnectorOAuth2,
43
39
  updateCustomConnectorBodySchema
44
- } from "./chunk-Y7RLOQPB.js";
45
- import "./chunk-T7KKAPXV.js";
40
+ } from "./chunk-UST46T62.js";
41
+ import "./chunk-NU4QI6YS.js";
46
42
  import {
47
43
  getPlatformOrigin,
48
44
  toPlatformUrl
49
- } from "./chunk-55OOIO3Y.js";
45
+ } from "./chunk-3C4OVVAG.js";
50
46
  import "./chunk-IPJJ6SPP.js";
51
47
  import {
52
48
  ApiRequestError,
53
49
  getApiUrl,
54
50
  source_default,
55
51
  withErrorHandler
56
- } from "./chunk-EUZGV3TS.js";
52
+ } from "./chunk-R6YSBKNW.js";
57
53
  import {
58
54
  decodeZeroTokenPayload
59
55
  } from "./chunk-KLI6K4VO.js";
@@ -171,15 +167,26 @@ function validateCheckConnectorOptions(opts, command) {
171
167
  );
172
168
  }
173
169
  }
170
+ function buildConnectorUrlDiagnosticRequest(args) {
171
+ if (rawUrlAuthorityHasUserinfo(args.url)) {
172
+ throw unsafeInputError("invalid-url");
173
+ }
174
+ return {
175
+ mode: "url",
176
+ method: args.method.toUpperCase(),
177
+ url: stripUrlQueryAndFragment(args.url),
178
+ ...args.connectorSlug !== void 0 ? { connectorSlug: args.connectorSlug } : {},
179
+ ...args.environmentName !== void 0 ? { environmentName: args.environmentName } : {}
180
+ };
181
+ }
174
182
  function buildDiagnosticRequest(opts, method) {
175
183
  if (opts.url !== void 0) {
176
- return {
177
- mode: "url",
184
+ return buildConnectorUrlDiagnosticRequest({
178
185
  method,
179
- url: stripUrlQueryAndFragment(opts.url),
180
- ...opts.connector !== void 0 ? { connectorSlug: opts.connector } : {},
181
- ...opts.envName !== void 0 ? { environmentName: opts.envName } : {}
182
- };
186
+ url: opts.url,
187
+ connectorSlug: opts.connector,
188
+ environmentName: opts.envName
189
+ });
183
190
  }
184
191
  return {
185
192
  mode: "environment",
@@ -267,7 +274,7 @@ function environmentNotUsedError(request, result) {
267
274
  `${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.`
268
275
  );
269
276
  }
270
- function resolvedDiagnostic(request, result) {
277
+ function resolveConnectorCheckDiagnostic(request, result) {
271
278
  switch (result.outcome) {
272
279
  case "resolved":
273
280
  return result;
@@ -517,7 +524,7 @@ function printUnavailablePolicy(policy) {
517
524
  return;
518
525
  }
519
526
  }
520
- function printNamedPolicyResult(connectorSlug, permission, policy, agentId) {
527
+ function printNamedPolicyResult(connectorSlug, permission, policy, agentId, request) {
521
528
  switch (policy.outcome) {
522
529
  case "allow": {
523
530
  switch (policy.basis) {
@@ -552,7 +559,8 @@ function printNamedPolicyResult(connectorSlug, permission, policy, agentId) {
552
559
  connectorSlug,
553
560
  permission,
554
561
  agentId,
555
- "To request this permission, run"
562
+ "To request this permission, run",
563
+ request
556
564
  );
557
565
  return;
558
566
  case "ask":
@@ -563,7 +571,8 @@ function printNamedPolicyResult(connectorSlug, permission, policy, agentId) {
563
571
  connectorSlug,
564
572
  permission,
565
573
  agentId,
566
- "To request this permission, run"
574
+ "To request this permission, run",
575
+ request
567
576
  );
568
577
  return;
569
578
  case "unavailable":
@@ -571,11 +580,17 @@ function printNamedPolicyResult(connectorSlug, permission, policy, agentId) {
571
580
  return;
572
581
  }
573
582
  }
574
- function permissionRequestCommand(connectorSlug, permission) {
575
- return `zero connector permission-request ${connectorSlug} --permission ${permission}`;
583
+ function permissionRequestCommand(connectorSlug, permission, request) {
584
+ return `zero connector permission-request ${shellQuoteArg(connectorSlug)} --permission ${shellQuoteArg(permission)} --url ${shellQuoteArg(request.url)} --method ${shellQuoteArg(request.method)}`;
576
585
  }
577
- function printPermissionRequestCommands(connectorSlug, permission, agentId, introduction) {
578
- const command = permissionRequestCommand(connectorSlug, permission);
586
+ function printPermissionRequestCommands(connectorSlug, permission, agentId, introduction, request) {
587
+ if (request === void 0) {
588
+ console.log(
589
+ "Diagnose the failed request with zero connector check --url <FAILED_URL> --method <METHOD> before requesting this permission."
590
+ );
591
+ return;
592
+ }
593
+ const command = permissionRequestCommand(connectorSlug, permission, request);
579
594
  console.log(`${introduction}: ${command}`);
580
595
  if (!currentChatSupportsActionCallback(agentId)) {
581
596
  return;
@@ -586,7 +601,7 @@ function printPermissionRequestCommands(connectorSlug, permission, agentId, intr
586
601
  );
587
602
  console.log(`${command} --callback-prompt "${CALLBACK_PROMPT_PLACEHOLDER}"`);
588
603
  }
589
- function printUnknownEndpointPolicy(connectorSlug, policy, agentId) {
604
+ function printUnknownEndpointPolicy(connectorSlug, policy, agentId, request) {
590
605
  switch (policy.outcome) {
591
606
  case "allow":
592
607
  console.log(
@@ -601,7 +616,8 @@ function printUnknownEndpointPolicy(connectorSlug, policy, agentId) {
601
616
  connectorSlug,
602
617
  "__unknown__",
603
618
  agentId,
604
- "To request access to unknown endpoints, run"
619
+ "To request access to unknown endpoints, run",
620
+ request
605
621
  );
606
622
  return;
607
623
  case "ask":
@@ -612,7 +628,8 @@ function printUnknownEndpointPolicy(connectorSlug, policy, agentId) {
612
628
  connectorSlug,
613
629
  "__unknown__",
614
630
  agentId,
615
- "To request access to unknown endpoints, run"
631
+ "To request access to unknown endpoints, run",
632
+ request
616
633
  );
617
634
  return;
618
635
  case "unavailable":
@@ -620,7 +637,7 @@ function printUnknownEndpointPolicy(connectorSlug, policy, agentId) {
620
637
  return;
621
638
  }
622
639
  }
623
- function printUrlPermissionDiagnostic(result, agentId) {
640
+ function printUrlPermissionDiagnostic(request, result, agentId) {
624
641
  console.log("## Step 3: Permission policy check (auto-detected from URL)");
625
642
  console.log("");
626
643
  console.log(
@@ -639,7 +656,8 @@ function printUrlPermissionDiagnostic(result, agentId) {
639
656
  result.connector.connectorSlug,
640
657
  permission.name,
641
658
  permission.policy,
642
- agentId
659
+ agentId,
660
+ request
643
661
  );
644
662
  }
645
663
  } else {
@@ -650,7 +668,8 @@ function printUrlPermissionDiagnostic(result, agentId) {
650
668
  printUnknownEndpointPolicy(
651
669
  result.connector.connectorSlug,
652
670
  result.permission.policy,
653
- agentId
671
+ agentId,
672
+ request
654
673
  );
655
674
  }
656
675
  console.log("");
@@ -674,7 +693,8 @@ function printEnvironmentPermissionDiagnostic(result, permissionName, agentId) {
674
693
  result.connector.connectorSlug,
675
694
  permissionName,
676
695
  result.permission,
677
- agentId
696
+ agentId,
697
+ void 0
678
698
  );
679
699
  console.log("");
680
700
  }
@@ -755,7 +775,7 @@ How connectors work:
755
775
  const method = opts.method.toUpperCase();
756
776
  const request = buildDiagnosticRequest(opts, method);
757
777
  const diagnostic = await diagnoseZeroConnectorCheck(request);
758
- const result = resolvedDiagnostic(request, diagnostic);
778
+ const result = resolveConnectorCheckDiagnostic(request, diagnostic);
759
779
  printDiagnosticSummary(request, result);
760
780
  console.log("");
761
781
  const platformUrl = toPlatformUrl(await getApiUrl());
@@ -783,7 +803,11 @@ How connectors work:
783
803
  }
784
804
  console.log("");
785
805
  if (result.mode === "url") {
786
- printUrlPermissionDiagnostic(result, ctx.agentId);
806
+ printUrlPermissionDiagnostic(
807
+ requireUrlRequest(request),
808
+ result,
809
+ ctx.agentId
810
+ );
787
811
  } else {
788
812
  printEnvironmentPermissionDiagnostic(
789
813
  result,
@@ -1634,6 +1658,74 @@ function printBrowserPermissionGuidance() {
1634
1658
  function permissionDescription(permission) {
1635
1659
  return permission === UNKNOWN_PERMISSION_GRANT ? "unknown endpoints" : `the "${permission}" permission`;
1636
1660
  }
1661
+ function permissionPolicyForDiagnostic(args) {
1662
+ if (args.result.mode !== "url") {
1663
+ throw new Error(
1664
+ "Connector diagnostic returned an environment result for a URL request."
1665
+ );
1666
+ }
1667
+ if (args.permission === UNKNOWN_PERMISSION_GRANT) {
1668
+ if (args.result.permission.kind === "unknown-endpoint") {
1669
+ return args.result.permission.policy;
1670
+ }
1671
+ throw permissionMismatchError({
1672
+ permission: args.permission,
1673
+ method: args.method,
1674
+ url: args.url,
1675
+ matchedPermissions: args.result.permission.permissions.map(
1676
+ (permission) => {
1677
+ return permission.name;
1678
+ }
1679
+ )
1680
+ });
1681
+ }
1682
+ if (args.result.permission.kind === "unknown-endpoint") {
1683
+ throw permissionMismatchError({
1684
+ permission: args.permission,
1685
+ method: args.method,
1686
+ url: args.url,
1687
+ matchedPermissions: [UNKNOWN_PERMISSION_GRANT]
1688
+ });
1689
+ }
1690
+ const matchedPermission = args.result.permission.permissions.find(
1691
+ (permission) => {
1692
+ return permission.name === args.permission;
1693
+ }
1694
+ );
1695
+ if (matchedPermission === void 0) {
1696
+ throw permissionMismatchError({
1697
+ permission: args.permission,
1698
+ method: args.method,
1699
+ url: args.url,
1700
+ matchedPermissions: args.result.permission.permissions.map(
1701
+ (permission) => {
1702
+ return permission.name;
1703
+ }
1704
+ )
1705
+ });
1706
+ }
1707
+ return matchedPermission.policy;
1708
+ }
1709
+ function permissionMismatchError(args) {
1710
+ return new Error(
1711
+ `Permission "${args.permission}" does not match ${args.method} ${args.url}. The request maps to: ${args.matchedPermissions.join(", ")}. Use the exact permission-request command printed by zero connector check; provider OAuth scopes and missing_scope/needed values cannot be granted here.`
1712
+ );
1713
+ }
1714
+ function assertRequestablePolicy(args) {
1715
+ switch (args.policy.outcome) {
1716
+ case "deny":
1717
+ case "ask":
1718
+ return;
1719
+ case "allow":
1720
+ throw new Error(
1721
+ `${permissionDescription(args.permission)} is already allowed by Zero for ${args.method} ${args.url}. Provider authorization failures cannot be fixed with a Zero permission request.`
1722
+ );
1723
+ case "unavailable":
1724
+ throw new Error(
1725
+ `Zero permission policy is unavailable for ${args.method} ${args.url}. Retry zero connector check from an active run before requesting access.`
1726
+ );
1727
+ }
1728
+ }
1637
1729
  function printSensitivePermissionGuidance(connectorSlug, permission) {
1638
1730
  if (connectorSlug === "slack" && permission === "chat:write") {
1639
1731
  console.log("");
@@ -1764,7 +1856,7 @@ var callbackPromptAvailable = connectorActionCallbackAvailable();
1764
1856
  if (!callbackPromptAvailable) {
1765
1857
  callbackPromptOption.hideHelp();
1766
1858
  }
1767
- var callbackPromptExample = callbackPromptAvailable ? ' zero connector permission-request github --permission contents:write --callback-prompt "Re-check the permission, then continue the previous task"\n' : "";
1859
+ var callbackPromptExample = callbackPromptAvailable ? ' zero connector permission-request github --permission contents:write --url https://api.github.com/repos/vm0-ai/vm0 --method POST --callback-prompt "Re-check the permission, then continue the previous task"\n' : "";
1768
1860
  var callbackPromptNotes = callbackPromptAvailable ? " - 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" : "";
1769
1861
  var permissionRequestCommand2 = new Command().name("permission-request").description("Request permission to use a connector capability").argument("<slug>", "The connector slug (e.g. github)").addOption(
1770
1862
  new Option(
@@ -1776,18 +1868,29 @@ var permissionRequestCommand2 = new Command().name("permission-request").descrip
1776
1868
  "--agent <id>",
1777
1869
  "Agent ID whose permission page should be opened (defaults to ZERO_AGENT_ID)"
1778
1870
  )
1871
+ ).addOption(
1872
+ new Option(
1873
+ "--url <URL>",
1874
+ "The failed request URL reported to zero connector check"
1875
+ )
1876
+ ).addOption(
1877
+ new Option("--method <METHOD>", "The failed request HTTP method").default(
1878
+ "GET"
1879
+ )
1779
1880
  ).addOption(callbackPromptOption).addHelpText(
1780
1881
  "after",
1781
1882
  `
1782
1883
  Examples:
1783
- zero connector permission-request github --permission contents:read
1784
- ${callbackPromptExample} zero connector permission-request gmail --permission messages.write --agent <agent-id>
1785
- zero connector permission-request cloudflare --permission __unknown__
1884
+ zero connector permission-request github --permission contents:read --url https://api.github.com/repos/vm0-ai/vm0 --method GET
1885
+ ${callbackPromptExample} zero connector permission-request gmail --permission messages.write --url https://gmail.googleapis.com/gmail/v1/users/me/messages --method POST --agent <agent-id>
1886
+ zero connector permission-request cloudflare --permission __unknown__ --url https://api.cloudflare.com/client/v4/example --method POST
1786
1887
  zero connector permission-request computer-use --permission computer-use:write
1787
1888
  zero connector permission-request browser --permission browser:write
1788
1889
 
1789
1890
  Notes:
1790
- - Outputs a platform URL for the user to allow the permission
1891
+ - First run zero connector check --url <FAILED_URL> --method <METHOD>
1892
+ - Use the exact permission-request command printed by connector check
1893
+ - A platform URL is output only when that request maps to a denied or approval-required permission
1791
1894
  - Use --permission __unknown__ to request access to unknown endpoints
1792
1895
  - Use --agent to request a permission for another agent; defaults to ZERO_AGENT_ID
1793
1896
  - The user chooses the permission duration on the confirmation page
@@ -1820,18 +1923,36 @@ ${callbackPromptNotes} - Permission requests update the current user's connecto
1820
1923
  return;
1821
1924
  }
1822
1925
  const agentId = opts.agent ?? process.env.ZERO_AGENT_ID;
1823
- const metadata = await getZeroConnectorCatalogPermissions(connectorSlug);
1824
- if (!metadata) {
1825
- throw new Error(`Unknown connector slug: ${connectorSlug}`);
1826
- }
1827
- if (opts.permission !== UNKNOWN_PERMISSION_GRANT && !hasConnectorFirewallMetadataPermission(metadata, opts.permission)) {
1926
+ if (opts.url === void 0) {
1828
1927
  throw new Error(
1829
- `Unknown permission "${opts.permission}" for ${connectorSlug}`
1928
+ "--url is required for connector permission requests. Run zero connector check --url <FAILED_URL> --method <METHOD> and use the permission-request command it prints."
1830
1929
  );
1831
1930
  }
1931
+ const diagnosticRequest = buildConnectorUrlDiagnosticRequest({
1932
+ url: opts.url,
1933
+ method: opts.method,
1934
+ connectorSlug
1935
+ });
1936
+ const diagnostic = await diagnoseZeroConnectorCheck(diagnosticRequest);
1937
+ const result = resolveConnectorCheckDiagnostic(
1938
+ diagnosticRequest,
1939
+ diagnostic
1940
+ );
1941
+ const policy = permissionPolicyForDiagnostic({
1942
+ result,
1943
+ permission: opts.permission,
1944
+ method: diagnosticRequest.method,
1945
+ url: diagnosticRequest.url
1946
+ });
1947
+ assertRequestablePolicy({
1948
+ policy,
1949
+ permission: opts.permission,
1950
+ method: diagnosticRequest.method,
1951
+ url: diagnosticRequest.url
1952
+ });
1832
1953
  await outputPermissionRequestMessage(
1833
- connectorSlug,
1834
- metadata.label,
1954
+ result.connector.connectorSlug,
1955
+ result.connector.label,
1835
1956
  opts.permission,
1836
1957
  agentId,
1837
1958
  opts.callbackPrompt
@@ -1845,4 +1966,4 @@ var zeroConnectorCommand = new Command().name("connector").description("Manage a
1845
1966
  export {
1846
1967
  zeroConnectorCommand
1847
1968
  };
1848
- //# sourceMappingURL=connector-6X7OUT7E.js.map
1969
+ //# sourceMappingURL=connector-CJAQUQ2Y.js.map